OSDN Git Service

first commit master
authorpolygraphene <polygraphene@gmail.com>
Sun, 17 Oct 2010 11:19:33 +0000 (20:19 +0900)
committerpolygraphene <polygraphene@gmail.com>
Sun, 17 Oct 2010 11:19:33 +0000 (20:19 +0900)
232 files changed:
.gdbinit [new file with mode: 0644]
.gitignore [new file with mode: 0644]
Makefile [new file with mode: 0644]
bin.pl [new file with mode: 0644]
cd/iplcd.bin [new file with mode: 0644]
curtain_m.bmp [new file with mode: 0644]
diskimg [new file with mode: 0644]
fat.fatdef [new file with mode: 0644]
fatmgr.exe [new file with mode: 0644]
fatmgr/Debug/fatmgr.exe.embed.manifest [new file with mode: 0644]
fatmgr/Debug/fatmgr.exe.embed.manifest.res [new file with mode: 0644]
fatmgr/Debug/fatmgr.exe.intermediate.manifest [new file with mode: 0644]
fatmgr/Debug/fatmgr.lastbuildstate [new file with mode: 0644]
fatmgr/Debug/fatmgr_manifest.rc [new file with mode: 0644]
fatmgr/ReadMe.txt [new file with mode: 0644]
fatmgr/fatmgr.cpp [new file with mode: 0644]
fatmgr/fatmgr.vcxproj [new file with mode: 0644]
fatmgr/stdafx.cpp [new file with mode: 0644]
fatmgr/stdafx.h [new file with mode: 0644]
fatmgr/targetver.h [new file with mode: 0644]
golibc/Makefile [new file with mode: 0644]
golibc/abs.c [new file with mode: 0644]
golibc/atof.c [new file with mode: 0644]
golibc/atoi.c [new file with mode: 0644]
golibc/charset.cpp [new file with mode: 0644]
golibc/errno.c [new file with mode: 0644]
golibc/errno.h [new file with mode: 0644]
golibc/float.h [new file with mode: 0644]
golibc/frexp.c [new file with mode: 0644]
golibc/golibc.lib [new file with mode: 0644]
golibc/ldexp.c [new file with mode: 0644]
golibc/limits.h [new file with mode: 0644]
golibc/math.h [new file with mode: 0644]
golibc/memchr.c [new file with mode: 0644]
golibc/memcmp.c [new file with mode: 0644]
golibc/memcpy.c [new file with mode: 0644]
golibc/memmove.c [new file with mode: 0644]
golibc/memset.c [new file with mode: 0644]
golibc/qsort.c [new file with mode: 0644]
golibc/rand.c [new file with mode: 0644]
golibc/setjmp.h [new file with mode: 0644]
golibc/sprintf.c [new file with mode: 0644]
golibc/stdarg.h [new file with mode: 0644]
golibc/stddef.h [new file with mode: 0644]
golibc/stdio.h [new file with mode: 0644]
golibc/stdlib.h [new file with mode: 0644]
golibc/strcat.c [new file with mode: 0644]
golibc/strchr.c [new file with mode: 0644]
golibc/strcmp.c [new file with mode: 0644]
golibc/strcpy.c [new file with mode: 0644]
golibc/strcspn.c [new file with mode: 0644]
golibc/strdup.c [new file with mode: 0644]
golibc/string.h [new file with mode: 0644]
golibc/strlen.c [new file with mode: 0644]
golibc/strncat.c [new file with mode: 0644]
golibc/strncmp.c [new file with mode: 0644]
golibc/strncpy.c [new file with mode: 0644]
golibc/strpbrk.c [new file with mode: 0644]
golibc/strrchr.c [new file with mode: 0644]
golibc/strspn.c [new file with mode: 0644]
golibc/strstr.c [new file with mode: 0644]
golibc/strtol.c [new file with mode: 0644]
golibc/strtoul.c [new file with mode: 0644]
golibc/strtoul0.c [new file with mode: 0644]
golibc/vsprintf.c [new file with mode: 0644]
haribote.img [new file with mode: 0644]
haribote.vhd [new file with mode: 0644]
haribote/Debug/fatmgr.exe [new file with mode: 0644]
haribote/Debug/fatmgr.ilk [new file with mode: 0644]
haribote/Debug/ntdll.dll [new file with mode: 0644]
haribote/Debug/ntdll.exp [new file with mode: 0644]
haribote/Debug/ntdll.ilk [new file with mode: 0644]
haribote/Debug/ntdll.lib [new file with mode: 0644]
haribote/Makefile [new file with mode: 0644]
haribote/Makefile.bak [new file with mode: 0644]
haribote/MemMan.cpp [new file with mode: 0644]
haribote/MemMan.h [new file with mode: 0644]
haribote/ProcessMan.cpp [new file with mode: 0644]
haribote/ProcessMan.h [new file with mode: 0644]
haribote/ProcessMem.cpp [new file with mode: 0644]
haribote/ProcessMem.h [new file with mode: 0644]
haribote/ThreadMan.cpp [new file with mode: 0644]
haribote/ThreadMan.h [new file with mode: 0644]
haribote/Vector.cpp [new file with mode: 0644]
haribote/Vector.h [new file with mode: 0644]
haribote/asmhead.asm [new file with mode: 0644]
haribote/asmhead.bin [new file with mode: 0644]
haribote/asmhead.lst [new file with mode: 0644]
haribote/ata/ATAIO.H [new file with mode: 0644]
haribote/ata/ATAIOINT.C [new file with mode: 0644]
haribote/ata/ATAIOISA.C [new file with mode: 0644]
haribote/ata/ATAIOPCI.C [new file with mode: 0644]
haribote/ata/ATAIOPIO.C [new file with mode: 0644]
haribote/ata/ATAIOREG.C [new file with mode: 0644]
haribote/ata/ATAIOSUB.C [new file with mode: 0644]
haribote/ata/ATAIOTMR.C [new file with mode: 0644]
haribote/ata/ATAIOTRC.C [new file with mode: 0644]
haribote/ata/DOSFUNC.C [new file with mode: 0644]
haribote/ata/Makefile [new file with mode: 0644]
haribote/ata/TEST.C [new file with mode: 0644]
haribote/ata/ataio.lib [new file with mode: 0644]
haribote/ata/dos.h [new file with mode: 0644]
haribote/bootpack.cpp [new file with mode: 0644]
haribote/bootpack.exe [new file with mode: 0644]
haribote/bootpack.h [new file with mode: 0644]
haribote/bootpack.sln [new file with mode: 0644]
haribote/bootpack.suo [new file with mode: 0644]
haribote/bootpack.sys [new file with mode: 0644]
haribote/bootpack.vcxproj [new file with mode: 0644]
haribote/c.bin [new file with mode: 0644]
haribote/c.gas [new file with mode: 0644]
haribote/console.c [new file with mode: 0644]
haribote/console.lst [new file with mode: 0644]
haribote/debug.cpp [new file with mode: 0644]
haribote/debug.h [new file with mode: 0644]
haribote/desctable.cpp [new file with mode: 0644]
haribote/desctable.h [new file with mode: 0644]
haribote/fat32.h [new file with mode: 0644]
haribote/fifo.c [new file with mode: 0644]
haribote/fifo.lst [new file with mode: 0644]
haribote/file.c [new file with mode: 0644]
haribote/file.lst [new file with mode: 0644]
haribote/filesyste.s [new file with mode: 0644]
haribote/filesystem.cpp [new file with mode: 0644]
haribote/filesystem.h [new file with mode: 0644]
haribote/graphic.c [new file with mode: 0644]
haribote/graphic.lst [new file with mode: 0644]
haribote/hankaku.bin [new file with mode: 0644]
haribote/hankaku.h [new file with mode: 0644]
haribote/hankaku.pl [new file with mode: 0644]
haribote/hankaku.txt [new file with mode: 0644]
haribote/haribote.sys [new file with mode: 0644]
haribote/int.lst [new file with mode: 0644]
haribote/iplhd.asm [new file with mode: 0644]
haribote/iplhd.bin [new file with mode: 0644]
haribote/iplhd.lst [new file with mode: 0644]
haribote/keyboard.c [new file with mode: 0644]
haribote/keyboard.lst [new file with mode: 0644]
haribote/mbr.asm [new file with mode: 0644]
haribote/mbr.bin [new file with mode: 0644]
haribote/mbr.lst [new file with mode: 0644]
haribote/mbr.pl [new file with mode: 0644]
haribote/memory.c [new file with mode: 0644]
haribote/memory.lst [new file with mode: 0644]
haribote/mouse.c [new file with mode: 0644]
haribote/mouse.gas [new file with mode: 0644]
haribote/mouse.lst [new file with mode: 0644]
haribote/mtask.c [new file with mode: 0644]
haribote/mtask.lst [new file with mode: 0644]
haribote/naskfunc.asm [new file with mode: 0644]
haribote/naskfunc.h [new file with mode: 0644]
haribote/naskfunc.lst [new file with mode: 0644]
haribote/new3.txt [new file with mode: 0644]
haribote/pic.cpp [new file with mode: 0644]
haribote/pic.h [new file with mode: 0644]
haribote/screen.cpp [new file with mode: 0644]
haribote/screen.h [new file with mode: 0644]
haribote/screen.s [new file with mode: 0644]
haribote/sheet.c [new file with mode: 0644]
haribote/sheet.lst [new file with mode: 0644]
haribote/startup.cpp [new file with mode: 0644]
haribote/t.c [new file with mode: 0644]
haribote/t.gas [new file with mode: 0644]
haribote/tek.c [new file with mode: 0644]
haribote/tek.lst [new file with mode: 0644]
haribote/tek.nas [new file with mode: 0644]
haribote/test.sec [new file with mode: 0644]
haribote/timer.cpp [new file with mode: 0644]
haribote/timer.h [new file with mode: 0644]
haribote/timer.lst [new file with mode: 0644]
haribote/typedefs.h [new file with mode: 0644]
haribote/window.c [new file with mode: 0644]
haribote/window.lst [new file with mode: 0644]
haribote2.img [new file with mode: 0644]
imgconv.bat [new file with mode: 0644]
include/CP932.TXT [new file with mode: 0644]
include/CP932.h2 [new file with mode: 0644]
include/_mingw.h [new file with mode: 0644]
include/algorithm [new file with mode: 0644]
include/assert.h [new file with mode: 0644]
include/cctype [new file with mode: 0644]
include/cstddef [new file with mode: 0644]
include/ctype.h [new file with mode: 0644]
include/errno.h [new file with mode: 0644]
include/exception [new file with mode: 0644]
include/float.h [new file with mode: 0644]
include/functional [new file with mode: 0644]
include/haribote.rul [new file with mode: 0644]
include/harilibc.lib [new file with mode: 0644]
include/iosfwd [new file with mode: 0644]
include/limits.h [new file with mode: 0644]
include/math.h [new file with mode: 0644]
include/memory [new file with mode: 0644]
include/new [new file with mode: 0644]
include/random [new file with mode: 0644]
include/random.h [new file with mode: 0644]
include/setjmp.h [new file with mode: 0644]
include/stdarg.h [new file with mode: 0644]
include/stddef.h [new file with mode: 0644]
include/stdio.h [new file with mode: 0644]
include/stdlib.h [new file with mode: 0644]
include/stl_algo.h [new file with mode: 0644]
include/string.h [new file with mode: 0644]
include/typeid [new file with mode: 0644]
include/typeinfo [new file with mode: 0644]
include/utility [new file with mode: 0644]
intmemo [new file with mode: 0644]
makefat.pl [new file with mode: 0644]
new2.txt [new file with mode: 0644]
ntdll.dll [new file with mode: 0644]
ntdll/Debug/.gitignore [new file with mode: 0644]
ntdll/Debug/ntdll.dll.embed.manifest [new file with mode: 0644]
ntdll/Debug/ntdll.dll.embed.manifest.res [new file with mode: 0644]
ntdll/Debug/ntdll.dll.intermediate.manifest [new file with mode: 0644]
ntdll/Debug/ntdll.lastbuildstate [new file with mode: 0644]
ntdll/Debug/ntdll_manifest.rc [new file with mode: 0644]
ntdll/ReadMe.txt [new file with mode: 0644]
ntdll/dllmain.cpp [new file with mode: 0644]
ntdll/ntdll.cpp [new file with mode: 0644]
ntdll/ntdll.def [new file with mode: 0644]
ntdll/ntdll.vcxproj [new file with mode: 0644]
ntdll/stdafx.cpp [new file with mode: 0644]
ntdll/stdafx.h [new file with mode: 0644]
ntdll/targetver.h [new file with mode: 0644]
ostestapp.cpp [new file with mode: 0644]
ostestapp.exe [new file with mode: 0644]
partback.cpp [new file with mode: 0644]
partback.exe [new file with mode: 0644]
qlaunch.cpp [new file with mode: 0644]
qlaunch.exe [new file with mode: 0644]
readmbr.cpp [new file with mode: 0644]
readmbr.exe [new file with mode: 0644]

diff --git a/.gdbinit b/.gdbinit
new file mode 100644 (file)
index 0000000..2be9c70
--- /dev/null
+++ b/.gdbinit
@@ -0,0 +1,41 @@
+define sw
+x /20i 0x280000+$eip
+end
+define sw2
+x /40i 0x280000+$eip
+end
+define sw3
+x /200i 0x280000+$eip
+end
+define sd
+x /20i 0x280000+$eip-20
+end
+
+define bw
+x /20i $eip
+end
+define bw2
+x /40i $eip
+end
+define bw3
+x /200i $eip
+end
+define bd
+x /20i $eip-20
+end
+
+define re
+info reg
+end
+
+define bb
+break *(0x280000 + 0x0002DB8)
+c
+disable 1
+end
+
+define t
+target remote :1234
+end
+
+set disassembly-flavor intel
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..ed6f93b
--- /dev/null
@@ -0,0 +1,14 @@
+
+*.bxrc
+*.tlog
+*.obj
+*.pdb
+*.idb
+*.sdf
+*.user
+*.log
+*.pch
+*.filters
+*.vsmdi
+*.OBJ
+*.opensdf
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..d763e43
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,86 @@
+TOOLPATH = ../z_tools/
+INCPATH  = ../z_tools/haribote/
+
+MAKE     = make.exe -r
+EDIMG    = $(TOOLPATH)edimg.exe
+IMGTOL   = $(TOOLPATH)imgtol.com
+MKISOFS  = cdrtools-1.11a12-win32-bin/mkisofs
+COPY     = cp
+DEL      = rm
+
+# \83f\83t\83H\83\8b\83g\93®\8dì
+
+default :
+       cd haribote && $(MAKE)
+       $(MAKE) haribote.img
+
+# \83t\83@\83C\83\8b\90\90¬\8bK\91¥
+
+haribote.iso : Makefile
+       cd haribote && $(MAKE)
+       $(COPY) haribote/iplcd.bin cd/
+       $(MKISOFS) -hard-disk-boot -b iplcd.bin -o ./haribote.iso  ./cd
+
+#haribote.img : Makefile
+#      cd haribote && $(MAKE)
+#      perl makefat.pl > fatrootdir
+#      perl hdimage.pl -i=0,haribote/mbr.bin -i=0x3f,haribote/iplhd.bin -i=0x281,haribote/haribote.sys -i=0x27f,fatrootdir -s=0x372 -o $@
+
+haribote.img : Makefile fat.fatdef
+       cd haribote && $(MAKE)
+       ./fatmgr.exe
+
+
+
+haribote.img : haribote/mbr.bin haribote/iplhd.bin haribote/haribote.sys
+
+# \83R\83}\83\93\83h
+
+run :
+       $(MAKE)
+#      $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
+       $(MAKE) -C ../z_tools/qemu
+
+install :
+       $(MAKE) haribote.img
+       $(IMGTOL) w a: haribote.img
+
+full :
+       $(MAKE) clean
+       $(MAKE)
+
+run_full :
+       $(MAKE) full
+       $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
+       $(MAKE) -C ../z_tools/qemu
+
+install_full :
+       $(MAKE) full
+       $(IMGTOL) w a: haribote.img
+
+run_os :
+       $(MAKE) -C haribote
+       $(MAKE) run
+
+clean :
+       cd haribote && $(MAKE) clean
+       -$(DEL) haribote.img
+# \89½\82à\82µ\82È\82¢
+
+src_only :
+       $(MAKE) clean
+       -$(DEL) haribote.img
+
+clean_full :
+       $(MAKE) -C haribote             clean
+       $(MAKE) -C apilib               clean
+
+src_only_full :
+       $(MAKE) -C haribote             src_only
+       $(MAKE) -C apilib               src_only
+       -$(DEL) haribote.img
+
+refresh :
+       $(MAKE) full
+       $(MAKE) clean_full
+       -$(DEL) haribote.img
diff --git a/bin.pl b/bin.pl
new file mode 100644 (file)
index 0000000..8a319ed
--- /dev/null
+++ b/bin.pl
@@ -0,0 +1,39 @@
+
+my $FileName = $ARGV[0];
+if($FileName eq ''){
+       $FileName = "binout";
+}
+
+while(1){
+       print ">";chomp(my $arg1 = <STDIN>);
+       if($arg1 eq 'q'){
+               last;
+       }
+       
+       if($arg1 eq 'c'){
+               unlink($FileName);
+               print "Cleared\n";
+               next;
+       }
+       my $tmp = "tmpfile" . rand();
+       open(OUT, ">", $tmp) or die("$tmp open error");
+       binmode(OUT);
+       print OUT (&de(\$arg1));
+       close(OUT);
+
+       print `G:\\c\\os\\cd\\omake\\tolsrc\\aksa1a\\a.exe $tmp 0 0x7c00 0 30`;
+
+       unlink($tmp);
+}
+sub de{
+       my $data = shift;
+       my $outdata = '';
+       
+       $data =~ s/0x[^ ]*://g;
+
+       my @l = grep {length($_)!=0 && $_ ne ' '} split(//, $$data);
+       for(my $i = 0; $i < scalar(@l); $i+=2){
+               $outdata .= (chr(hex($l[$i].$l[$i+1])));
+       }
+       return $outdata;
+}
diff --git a/cd/iplcd.bin b/cd/iplcd.bin
new file mode 100644 (file)
index 0000000..8153012
Binary files /dev/null and b/cd/iplcd.bin differ
diff --git a/curtain_m.bmp b/curtain_m.bmp
new file mode 100644 (file)
index 0000000..1765057
Binary files /dev/null and b/curtain_m.bmp differ
diff --git a/diskimg b/diskimg
new file mode 100644 (file)
index 0000000..fd8eef6
Binary files /dev/null and b/diskimg differ
diff --git a/fat.fatdef b/fat.fatdef
new file mode 100644 (file)
index 0000000..c96a83a
--- /dev/null
@@ -0,0 +1,8 @@
+bootsector "haribote/iplhd.bin"
+o "haribote.img"
+r "haribote/mbr.bin"
+m "haribote/haribote.sys"
+f "curtain_m.bmp"
+f "ntdll.dll" "windows/system32/"
+f "ostestapp.exe"
+s 2
diff --git a/fatmgr.exe b/fatmgr.exe
new file mode 100644 (file)
index 0000000..8121226
Binary files /dev/null and b/fatmgr.exe differ
diff --git a/fatmgr/Debug/fatmgr.exe.embed.manifest b/fatmgr/Debug/fatmgr.exe.embed.manifest
new file mode 100644 (file)
index 0000000..11bb704
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+</assembly>
\ No newline at end of file
diff --git a/fatmgr/Debug/fatmgr.exe.embed.manifest.res b/fatmgr/Debug/fatmgr.exe.embed.manifest.res
new file mode 100644 (file)
index 0000000..9c8df0e
Binary files /dev/null and b/fatmgr/Debug/fatmgr.exe.embed.manifest.res differ
diff --git a/fatmgr/Debug/fatmgr.exe.intermediate.manifest b/fatmgr/Debug/fatmgr.exe.intermediate.manifest
new file mode 100644 (file)
index 0000000..ecea6f7
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
+<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+</assembly>
diff --git a/fatmgr/Debug/fatmgr.lastbuildstate b/fatmgr/Debug/fatmgr.lastbuildstate
new file mode 100644 (file)
index 0000000..34d8ccb
--- /dev/null
@@ -0,0 +1,2 @@
+#v4.0:v100
+Debug|Win32|G:\c\os\winexe-harib\haribote\|
diff --git a/fatmgr/Debug/fatmgr_manifest.rc b/fatmgr/Debug/fatmgr_manifest.rc
new file mode 100644 (file)
index 0000000..b85526f
Binary files /dev/null and b/fatmgr/Debug/fatmgr_manifest.rc differ
diff --git a/fatmgr/ReadMe.txt b/fatmgr/ReadMe.txt
new file mode 100644 (file)
index 0000000..fd38edb
--- /dev/null
@@ -0,0 +1,45 @@
+========================================================================
+    コンソール アプリケーション: fatmgr プロジェクトの概要
+========================================================================
+
+この fatmgr アプリケーションは、AppWizard により作成されました。
+
+このファイルには、fatmgr 
+アプリケーションを構成する各ファイルの内容の概要が含まれています。
+
+
+fatmgr.vcxproj
+    これは、アプリケーション ウィザードを使用して生成された VC++ 
+    プロジェクトのメイン プロジェクト ファイルです。
+    ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション 
+    ウィザードで選択されたプラットフォーム、
+    構成、およびプロジェクト機能に関する情報が含まれています。
+
+fatmgr.vcxproj.filters
+    これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター 
+    ファイルです。 
+    このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する
+    情報が含まれています。 この関連付けは、特定のノー
+    ドで同様の拡張子を持つファイルのグループ化を
+    示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" 
+    フィルターに関連付けられています)。
+
+fatmgr.cpp
+    これは、メインのアプリケーション ソース ファイルです。
+
+/////////////////////////////////////////////////////////////////////////////
+その他の標準ファイル :
+
+StdAfx.h、StdAfx.cpp
+    これらのファイルは、fatmgr.pch 
+    という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj 
+    という名前のプリコンパイル済みの型ファイルを構築するために使用されます。
+
+/////////////////////////////////////////////////////////////////////////////
+その他のメモ :
+
+AppWizard では "TODO:" 
+コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース 
+コードを示します。
+
+/////////////////////////////////////////////////////////////////////////////
diff --git a/fatmgr/fatmgr.cpp b/fatmgr/fatmgr.cpp
new file mode 100644 (file)
index 0000000..f5beb87
--- /dev/null
@@ -0,0 +1,621 @@
+#include "stdafx.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <deque>
+#include <list>
+#include <assert.h>
+#include <time.h>
+#include <math.h>
+#include <iostream>
+#include <fstream>
+#include <complex>
+#include <windows.h>
+//#include <udis86.h>
+#include <io.h>
+#include <fcntl.h>
+#include <boost/scoped_array.hpp>
+using namespace std;
+
+const int BOOTSECTOR_JUMPINST = 3;
+
+#pragma pack(push, 1)
+
+struct FAT32_BOOTSECTOR
+{
+       //BYTE BS_jmpBoot[3]; // Jump Instruction to boot code
+       char BS_OEMName[8]; // "MSWIN4.1" is recommended setting
+       WORD BPB_BytsPerSec; // Count of bytes per Sector
+       BYTE BPB_SecPerClus; // Number of Sectors per Allocation Unit which must be a power of 2
+       WORD BPB_RsvdSecCnt; // Number of Reserved Sectors in the Reserved Region of the volume starting at the first sector of the volume
+       BYTE BPB_NumFATs; // Count of FAT data structures on the volume
+       WORD BPB_RootEntCnt; // Count of 32byte directory entries in the root directory for FAT12 and FAT16 volumes
+       WORD BPB_TotSec16; // Old 16-bit total count of sectors on the volume
+       BYTE BPB_Media; // 0xF8 for fixed media, 0xF0 for removable media
+       WORD BPB_FATSz16; //@ FAT12/FAT16 16bit-count of sectors occupied by ONE FAT
+
+       WORD BPB_SecPerTrk; // Sectors per Track for interrupt 0x13 (um... it is Wintel culture... x_x;)
+       WORD BPB_NumHeads; // Number of Heads for interrupt 0x13 (um... it is Wintel culture... x_x;)
+       DWORD BPB_HiddSec; // Count of Hidden Sectors preceding the partition that contains this FAT volume
+       DWORD BPB_TotSec32; // New 32-bit total count of sectors on the volume
+       // Following structure is prepared for FAT12 and FAT16 (not for FAT32)
+       DWORD BPB_FATSz32; //@ FAT32 32bit-count of sectors occupied by ONE FAT\81©\82±\82±\82ð\92Ç\89Á
+       WORD BPB_ExtFlags;
+       WORD BPB_FSVer;
+       DWORD BPB_RootClus;
+       WORD BPB_FSInfo;
+       WORD BPB_BkBootSec;
+       BYTE BPB_Reserved[12];
+       BYTE BS_DrvNum; // Int0x13 drive number (um... it is Wintel culture... x_x;)
+       BYTE BS_Reserved1; // Reserved for WindowsNT (um... it is MS culture... x_x;)
+       BYTE BS_BootSig; // Extended Boot Signature (0x29) which indicates following three fields in the boot sector are present
+       DWORD BS_VolID; // Volume Serial Number
+       BYTE BS_VolLab[11]; // Volume Label
+       BYTE BS_FilSysType[8]; // Type of File System (it is no more than a hint)
+} ;
+
+struct DIRENT{
+       char DIR_Name[11];
+       BYTE DIR_Attr;
+       BYTE DIR_NTRes;
+       BYTE DIR_CrtTimeTenth;
+       WORD DIR_CrtTime;
+       WORD DIR_CrtDate;
+       WORD DIR_LstAccDate;
+       WORD DIR_FstClusHI;
+       WORD DIR_WrtTime;
+       WORD DIR_WrtDate;
+       WORD DIR_FstClusLO;
+       DWORD DIR_FileSize;
+       
+       DWORD getfirstclus(){
+               return DIR_FstClusHI << 16 | DIR_FstClusLO;
+       }
+       void setfirstclus(DWORD clus){
+               DIR_FstClusHI = (clus & 0xffff0000) >> 16;
+               DIR_FstClusLO = clus & 0x0000ffff;
+       }
+};
+
+enum FAT_ATTR{
+       ATTR_READ_ONLY = 0x01,
+       ATTR_HIDDEN = 0x02,
+       ATTR_SYSTEM = 0x04,
+       ATTR_VOLUME_ID = 0x08,
+       ATTR_DIRECTORY = 0x10,
+       ATTR_ARCHIVE = 0x20,
+       ATTR_LONG_NAME = ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID
+};
+
+struct PAT_TABLE{
+       BYTE flag;
+       BYTE begin_chs[3];
+       BYTE type;
+       BYTE end_chs[3];
+       DWORD begin_lba;
+       DWORD size_lba;
+};
+
+struct FSINFO{
+       DWORD LeadSig;
+       BYTE Reserved1[480];
+       DWORD StrucSig;
+       DWORD Free_Count;
+       DWORD Nxt_Free;
+       BYTE Reserved2[12];
+       DWORD TrailSig;
+};
+
+#pragma pack(pop)
+
+bool islegalch(char c){
+       return isalnum(c) || c > 127
+                       || c == '$' || c == '\'' || c == '%'
+                        || c == '-' || c == '_' || c == '@'
+                        || c == '~' || c == '`' || c == '!'
+                        || c == '(' || c == ')' || c == '{'
+                        || c == '}' || c == '^' || c == '#'
+                         || c == '&';
+}
+
+bool toshort(char *s, string l){
+       memset(s, 0x20, 11);
+       int r = l.find('.');
+       if(r == -1){
+               int np = 0;
+               for(size_t i = 0; i < l.length(); i++){
+                       if(islegalch(l[i])){
+                               s[np++] = toupper(l[i]);
+                               if(np >= 8){
+                                       break;
+                               }
+                       }
+               }
+               if(np == 0){
+                       return false;
+               }
+               return true;
+       }
+       string name = l.substr(0, r);
+       string ext = l.substr(r + 1);
+       int np = 0;
+       for(size_t i = 0; i < name.length(); i++){
+               if(islegalch(name[i])){
+                       s[np++] = toupper(name[i]);
+                       if(np >= 8){
+                               break;
+                       }
+               }
+       }
+       if(np == 0){
+               return false;
+       }
+       int ep = 8;
+       for(size_t i = 0; i < ext.length(); i++){
+               if(islegalch(ext[i])){
+                       s[ep++] = toupper(ext[i]);
+                       if(ep >= 11){
+                               break;
+                       }
+               }
+       }
+       return true;
+}
+
+const char *DEFAULT_DEF_FILE = "fat.fatdef";
+const DWORD sectorsize = 512;
+const DWORD sectorperclus = 2;
+const DWORD clussize = sectorperclus * sectorsize;
+const DWORD EOC = 0x0FFFFFF8;
+const DWORD fatreserved = 0x80;
+const DWORD fatnum = 2;
+
+string getelem(const string& text, int *pos){
+       string ret = "";
+       for(; (text[*pos] == ' ' || text[*pos] == '\t'); (*pos)++);
+       if(*pos == text.length()){
+               return "";
+       }
+       if(isalnum(text[*pos])){
+               for(; isalnum(text[*pos]); (*pos)++){
+                       ret += text[*pos];
+               }
+               return ret;
+       }else if(text[*pos] == ':'){
+               (*pos)++;
+               return ":";
+       }else if(text[*pos] == '"'){
+               (*pos)++;
+               int n = text.find('"', *pos);
+               if(n == -1){
+                       ret = text.substr(*pos);
+                       *pos = text.length();
+                       return ret;
+               }
+               ret = text.substr(*pos, n - *pos);
+               *pos = n + 1;
+               return ret;
+       }else{
+               char buf[2] = {0};
+               buf[0] = text[(*pos)++];
+               return buf;
+       }
+}
+
+bool getfilesize(string f, DWORD *s){
+       HANDLE hFile = CreateFile(f.c_str(), GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
+       if( hFile != INVALID_HANDLE_VALUE ){
+               DWORD size = GetFileSize( hFile, NULL );
+               if( size == -1 )
+               {
+                       if( GetLastError() == NO_ERROR )
+                       {
+                               // GetFileSize()\82Í\8e¸\94s\82µ\82½\82Ì\82Å\82Í\82È\82¢
+                               CloseHandle( hFile );
+                               *s = size;
+                               return true;
+                       }
+                       else
+                       {
+                               // \96{\93\96\82ÉGetFileSize()\82ª\8e¸\94s\82µ\82½
+                               CloseHandle( hFile );
+                               return false;
+                       }
+               }
+               CloseHandle( hFile );
+               *s = size;
+               return true;
+       }
+       return false;
+}
+
+class DirEntWrap{
+public:
+       DIRENT ent;
+       DirEntWrap(){
+               memset(&ent, 0, sizeof(ent));
+       }
+       string filename;
+       vector<DirEntWrap> subdir;
+};
+
+void PutDir(DWORD *const fat, DWORD *const entptr, std::vector<DirEntWrap> &dirent
+       , const FAT32_BOOTSECTOR &bootsect, DWORD FirstDataSector, fstream &of){
+       DWORD direntclus = *entptr;
+
+       //\83f\83B\83\8c\83N\83g\83\8a\83G\83\93\83g\83\8a\82ð\8ai\94[\82·\82é\82Ì\82É\95K\97v\82È\83N\83\89\83X\83^\90\94\82ð\8cv\8eZ
+       DWORD dirclus = (dirent.size() * sizeof(DIRENT) + clussize - 1) / clussize;
+       for(DWORD i = 0; i < dirclus - 1; i++){
+               fat[*entptr + i] = *entptr + i + 1;
+       }
+       fat[*entptr + dirclus - 1] = EOC;
+       *entptr += dirclus;
+
+
+       for(size_t i = 0; i < dirent.size(); i++){
+               DWORD clus;
+               if(dirent[i].ent.DIR_Attr & ATTR_DIRECTORY){
+                       dirent[i].ent.setfirstclus(*entptr);
+                       PutDir(fat, entptr, dirent[i].subdir, bootsect, FirstDataSector, of);
+               }else{
+                       clus = (dirent[i].ent.DIR_FileSize + clussize - 1) / clussize;
+               
+                       for(DWORD j = 0; j < clus - 1; j++){
+                               fat[j + *entptr] = j + *entptr + 1;
+                       }
+                       fat[clus + *entptr - 1] = EOC;
+                       *entptr += clus;
+
+                       dirent[i].ent.setfirstclus(*entptr - clus);
+
+                       string filename = dirent[i].filename;
+
+                       fstream entfile(filename.c_str(), ios::binary | ios::in);
+                       if(entfile.is_open()){
+                               boost::scoped_array<char> b(new char [dirent[i].ent.DIR_FileSize]);
+                               entfile.read(b.get(), dirent[i].ent.DIR_FileSize);
+                               entfile.close();
+
+                               of.seekg(bootsect.BPB_BytsPerSec * (FirstDataSector + (*entptr - clus - 2) * bootsect.BPB_SecPerClus));
+                               of.write(b.get(), dirent[i].ent.DIR_FileSize);
+                       }else{
+                               printf("could not open %s\n", filename.c_str());
+                               throw std::exception("file not found");
+                       }
+               }
+       }
+       //fat\82Ì\83\8b\81[\83g\83f\83B\83\8c\83N\83g\83\8a\82Ö\88Ú\93®
+       of.seekg(bootsect.BPB_BytsPerSec * (FirstDataSector + (direntclus - 2) * bootsect.BPB_SecPerClus), ios::beg);
+       //of.write((char *)&dirent[0], dirent.size() * sizeof(DIRENT));
+       for(size_t i = 0; i < dirent.size(); i++){
+               of.write((char *)&dirent[i].ent, sizeof(DIRENT));
+       }
+}
+
+string getdir(string &dir){
+       size_t p = dir.find('/', 0);
+       string ret = dir.substr(0, p);
+       dir.erase(0, p + 1);
+       return ret;
+}
+
+int main(int argc, char *argv[]){
+       const char *def = DEFAULT_DEF_FILE;
+       if(argc < 2){
+               printf("use default file : %s\n", def);
+       }else{
+               def = argv[1];
+       }
+
+       ifstream f(def);
+
+       string bootsector, outfile, bootmgr, mbr;
+       DWORD dataclus = 0;
+       std::vector<std::pair<string, string> > files;
+       DWORD mintotalclus = 0;
+       std::vector<DirEntWrap> dirent;
+       std::vector<std::vector<DirEntWrap> *> dirent_list;
+       dirent_list.push_back(&dirent);
+
+       string buf, line = "";
+       int c = 0;
+       while(getline(f, buf)){
+               c++;
+               line = buf;
+               int pos = 0;
+               string cmd = getelem(line, &pos);
+               if(cmd == "b" || cmd == "bootsector"){
+                       bootsector = getelem(line, &pos);
+                       printf("bootsector: %s\n", bootsector.c_str());
+               }else if(cmd == "r" || cmd == "mbr"){
+                       mbr = getelem(line, &pos);
+                       printf("mbr: %s\n", mbr.c_str());
+               }else if(cmd == "o" || cmd == "outfile"){
+                       outfile = getelem(line, &pos);
+                       printf("outfile: %s\n", outfile.c_str());
+               }else if(cmd == "s" || cmd == "size"){
+                       string size = getelem(line, &pos);
+                       DWORD size_i = atoi(size.c_str());
+                       printf("size: %d mb\n", size_i);
+                       dataclus = size_i * 1024 * 1024 / clussize;
+               }else if(cmd == "m" || cmd == "bootmgr"){
+                       bootmgr = getelem(line, &pos);
+                       printf("bootmgr: %s\n", bootmgr.c_str());
+                       DWORD size;
+                       if(!getfilesize(bootmgr, &size)){
+                               printf("could not open %s\n", bootmgr.c_str());
+                               return -1;
+                       }
+                       mintotalclus += (size + clussize - 1) / clussize;
+               }else if(cmd == "f" || cmd == "file"){
+                       string file, dir;
+                       file = getelem(line, &pos);
+                       dir = getelem(line, &pos);
+                       
+                       printf("file: %s\n", file.c_str());
+                       files.push_back(make_pair(file, dir));
+               }else{
+                       printf("error unkown command %s line %d\n", cmd.c_str(), c);
+                       return -1;
+               }
+       }
+       f.close();
+
+       if(bootmgr != ""){
+               files.insert(files.begin(), make_pair(bootmgr, ""));
+       }
+       for(size_t i = 0; i < files.size(); i++){
+               std::vector<DirEntWrap> *curdirent = &dirent;
+               if(files[i].second == ""){
+               }else{
+                       string dir = files[i].second;
+                       size_t p = 0;
+                       while(1){
+                               p = dir.find('\\', p);
+                               if(p == -1){
+                                       break;
+                               }
+                               dir.replace(p, 1, 1, '/');
+                       }
+                       char last = dir[dir.size() - 1];
+                       if(last != '/'){
+                               dir.push_back('/');
+                       }
+
+                       while(dir != ""){
+                               string name = getdir(dir);
+                               DirEntWrap w;
+                               w.ent.DIR_Attr = ATTR_DIRECTORY;
+                               w.filename = name;
+                               toshort(w.ent.DIR_Name, name);
+                               bool found = false;
+                               for(size_t j = 0; j < curdirent->size(); j++){
+                                       if(memcmp(curdirent->operator[](j).ent.DIR_Name
+                                               , w.ent.DIR_Name, sizeof(w.ent.DIR_Name)) == 0){
+                                               found = true;
+                                               curdirent = &((*curdirent)[j].subdir);
+                                               break;
+                                       }
+                               }
+                               if(found){
+                               }else{
+                                       curdirent->push_back(w);
+                                       curdirent = &((*curdirent)[curdirent->size() - 1].subdir);
+                                       dirent_list.push_back(curdirent);
+                               }
+                       }
+               }
+               DirEntWrap w;
+               w.ent.DIR_Attr = 0;
+               if(!toshort(w.ent.DIR_Name, files[i].first)){
+                       printf("toshort failed %s\n", files[i].first.c_str());
+                       return -1;
+               }
+
+               DWORD size;
+               if(!getfilesize(files[i].first, &size)){
+                       printf("could not open %s\n", files[i].first.c_str());
+                       return -1;
+               }
+               mintotalclus += (size + clussize - 1) / clussize;
+               w.ent.DIR_FileSize = size;
+               w.filename = files[i].first;
+               curdirent->push_back(w);
+       }
+
+       //\83f\83B\83\8c\83N\83g\83\8a\83G\83\93\83g\83\8a\82É\95K\97v\82È\83N\83\89\83X\83^\90\94
+       for(size_t i = 0; i < dirent_list.size(); i++){
+               mintotalclus += (dirent_list[i]->size() * sizeof(DIRENT) + clussize - 1) / clussize;
+       }
+       dataclus = max(dataclus, mintotalclus);
+
+
+       printf("mintotalclus = 0x%X\n", mintotalclus);
+       printf("dataclus = 0x%X\n", dataclus);
+
+       //fat \83N\83\89\83X\83^\83e\81[\83u\83\8b\82É\95K\97v\82È\83Z\83N\83^\90\94
+       DWORD fatsectors = (dataclus * 4 + sectorsize - 1) / sectorsize;
+
+       fstream of;
+
+       if(mbr != ""){
+               if(!CopyFile(mbr.c_str(), outfile.c_str(), FALSE)){
+                       printf("could not copy '%s' to '%s'\n", mbr.c_str(), outfile.c_str());
+                       return -1;
+               }
+       }
+       of.open(outfile.c_str(), ios::out | ios::binary | ios::in);
+       if(!of.is_open()){
+               printf("could not open %s\n", outfile.c_str());
+               return -1;
+       }
+
+       //-------------------\83p\81[\83e\83B\83V\83\87\83\93\83e\81[\83u\83\8b\82Ì\8f\91\82«\8d\9e\82Ý----------------
+       PAT_TABLE pat0;
+       pat0.flag = 0x80;
+       pat0.begin_chs[0] = 1;
+       pat0.begin_chs[1] = 1;
+       pat0.begin_chs[2] = 0;
+       pat0.type = 0x0B;
+       pat0.end_chs[0] = 0xfe;
+       pat0.end_chs[1] = 0xff;
+       pat0.end_chs[2] = 0xff;
+       pat0.begin_lba = 0x80;
+       pat0.size_lba = dataclus * sectorperclus + fatreserved + fatnum * fatsectors;
+
+       of.seekg(0x200 - 2 - sizeof(PAT_TABLE) * 4, ios::beg);
+       of.write((char *)&pat0, sizeof(PAT_TABLE));
+
+
+       //--------------------\83u\81[\83g\83Z\83N\83^\82Ì\8f\91\82«\8d\9e\82Ý----------------------------
+       ifstream fbootsect(bootsector.c_str(), ios::in | ios::binary);
+       if(!fbootsect.is_open()){
+               printf("could not open %s\n", bootsector.c_str());
+               return -1;
+       }
+       fbootsect.seekg(0, ios::end);
+       DWORD bootsectorsize = fbootsect.tellg();
+       fbootsect.seekg(0, ios::beg);
+
+       boost::scoped_array<char> bootsectbuf(new char [bootsectorsize]);
+       fbootsect.read(bootsectbuf.get(), bootsectorsize);
+       fbootsect.close();
+
+       of.seekg(pat0.begin_lba * sectorsize, ios::beg);
+       of.write(bootsectbuf.get(), bootsectorsize);
+
+       bootsectbuf.reset();
+
+
+       FAT32_BOOTSECTOR bootsect = {0};
+       memcpy(bootsect.BS_OEMName, "MSWIN4.1", 8);
+       bootsect.BPB_BytsPerSec = sectorsize;
+       bootsect.BPB_SecPerClus = sectorperclus;
+       bootsect.BPB_RsvdSecCnt = fatreserved;
+       bootsect.BPB_NumFATs = fatnum;
+       bootsect.BPB_RootEntCnt = 0;
+       bootsect.BPB_TotSec16 = 0;
+       bootsect.BPB_Media = 0xf8;
+       bootsect.BPB_FATSz16 = 0;
+       bootsect.BPB_SecPerTrk = 0x003f;
+       bootsect.BPB_NumHeads = 0x00ff;
+       bootsect.BPB_HiddSec = pat0.begin_lba;
+       bootsect.BPB_TotSec32 = pat0.size_lba;
+       bootsect.BPB_FATSz32 = fatsectors;
+       bootsect.BPB_ExtFlags = 0;
+       bootsect.BPB_FSVer = 0;
+       bootsect.BPB_RootClus = 0x02;
+       bootsect.BPB_FSInfo = 0x01;
+       bootsect.BPB_BkBootSec = 0x06;
+       //bootsect.BPB_Reserved;
+       bootsect.BS_DrvNum = 0x80;
+       bootsect.BS_Reserved1 = 0;
+       bootsect.BS_BootSig = 0x29;
+       bootsect.BS_VolID = 0xdeadbeef;
+       memcpy(bootsect.BS_VolLab, "NO NAME    ", 11);
+       memcpy(bootsect.BS_FilSysType, "FAT32   ", 8);
+
+       of.seekg(bootsect.BPB_HiddSec * bootsect.BPB_BytsPerSec + BOOTSECTOR_JUMPINST, ios::beg);
+       of.write((char *)&bootsect, sizeof(FAT32_BOOTSECTOR));
+
+       //------------------------------FSInfo\8f\91\82«\8d\9e\82Ý------------------------------
+       FSINFO fsi = {0};
+       fsi.LeadSig = 0x41615252;
+       fsi.StrucSig = 0x61417272;
+       fsi.Free_Count = 0xffffffff;
+       fsi.Nxt_Free = 0xffffffff;
+       fsi.TrailSig = 0xAA550000;
+
+       of.seekg((bootsect.BPB_HiddSec + bootsect.BPB_FSInfo) * bootsect.BPB_BytsPerSec, ios::beg);
+       of.write((char *)&fsi, sizeof(FSINFO));
+
+       //DWORD DataSectors = 
+       DWORD FirstDataSector = bootsect.BPB_HiddSec + bootsect.BPB_RsvdSecCnt + bootsect.BPB_NumFATs * bootsect.BPB_FATSz32;
+       printf("FirstDataSector = 0x%X\n", FirstDataSector);
+       printf("FirstDataSector * 512 = %p\n", FirstDataSector * bootsect.BPB_BytsPerSec);
+
+       //bootmgr\82Ì\90Ý\92è
+       //DWORD bootmgrsize = 0;
+       //if(bootmgr != ""){
+       //      ifstream bootmgrfile(bootmgr.c_str(), ios::out | ios::binary | ios::in);
+       //      if(bootmgrfile.is_open()){
+       //              bootmgrfile.seekg(0, ios::end);
+       //              bootmgrsize = static_cast<DWORD>(bootmgrfile.tellg());
+       //              bootmgrfile.seekg(0, ios::beg);
+
+       //              boost::scoped_array<char> b(new char [bootmgrsize]);
+       //              bootmgrfile.read(b.get(), bootmgrsize);
+       //              bootmgrfile.close();
+       //              //FirstSectorofCluster = ((N - 2) * BPB_SecPerClus) + FirstDataSector;
+       //              //FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
+
+       //              //fat\82Ì\83\8b\81[\83g\83f\83B\83\8c\83N\83g\83\8a\82Ö\88Ú\93®
+       //              //of.seekg(bootsect.BPB_BytsPerSec * FirstDataSector);
+       //              //of.write(b.get(), bootmgrsize);
+       //      }else{
+       //              printf("could not open %s\n", bootmgr.c_str());
+       //              return -1;
+       //      }
+       //}
+
+       //fat\83G\83\93\83g\83\8a\82Ì\90Ý\92è
+       boost::scoped_array<DWORD> fat(new DWORD [bootsect.BPB_FATSz32 * bootsect.BPB_BytsPerSec / 4]);
+       memset(fat.get(), 0, bootsect.BPB_FATSz32 * bootsect.BPB_BytsPerSec);
+       fat[0] = bootsect.BPB_Media | 0x0fffff00;
+       fat[1] = 0x03ffffff;
+       
+
+
+
+       //if(bootmgr != ""){
+       //      DWORD bootmgrsize;
+       //      if(!getfilesize(bootmgr, &bootmgrsize)){
+       //              printf("could not get file size: %s\n", bootmgr.c_str());
+       //              return -1;
+       //      }
+
+       //      DIRENT mgrent = {0};
+       //      mgrent.DIR_Attr = ATTR_READ_ONLY | ATTR_SYSTEM;
+       //      mgrent.DIR_FileSize = bootmgrsize;
+       //      memcpy(mgrent.DIR_Name, "BOOTMGR    ", 11);
+
+       //      dirent.insert(dirent.begin(), mgrent);
+       //}
+
+       DWORD entptr = 2;
+
+       PutDir(fat.get(), &entptr, dirent, bootsect, FirstDataSector, of);
+
+
+       for(int i = 0; i < bootsect.BPB_NumFATs; i++){
+               of.seekg(bootsect.BPB_BytsPerSec * 
+                       (bootsect.BPB_HiddSec + bootsect.BPB_RsvdSecCnt + i * bootsect.BPB_FATSz32));
+               of.write((char *)fat.get(), bootsect.BPB_FATSz32 * bootsect.BPB_BytsPerSec);
+       }
+
+
+       of.seekg(0, ios::end);
+       DWORD lastsize = of.tellg();
+       DWORD lastsector = (lastsize + sectorsize - 1) / sectorsize;
+       //\8dÅ\8cã\82É\82 \82é\83t\83@\83C\83\8b\82ª\8aï\90\94\83Z\83N\83^\8eg\82Á\82Ä\82¢\82é\8fê\8d\871\82¸\82ê\82é\82Ì\82Å\83`\83F\83b\83N\82Í\82µ\82È\82¢
+       //assert(lastsector == (mintotalclus * sectorperclus + bootsect.BPB_HiddSec + bootsect.BPB_RsvdSecCnt + bootsect.BPB_NumFATs * bootsect.BPB_FATSz32));
+       DWORD allsector = dataclus * sectorperclus + bootsect.BPB_HiddSec + bootsect.BPB_RsvdSecCnt + bootsect.BPB_NumFATs * bootsect.BPB_FATSz32;
+
+
+       //\83t\83@\83C\83\8b\83T\83C\83Y\82ð\83Z\83N\83^\83T\83C\83Y\8b«\8aE\82É\82 \82í\82¹\82é
+       of.seekg(0, ios::end);
+       if(static_cast<DWORD>(of.tellg()) == allsector * sectorsize){
+               //\8aù\82É\91µ\82Á\82Ä\82¢\82é
+       }else{
+               of.seekg(allsector * sectorsize - 1, ios::beg);
+               char dummy = 0;
+               of.write(&dummy, 1);
+       }
+
+       of.close();
+}
+
+
diff --git a/fatmgr/fatmgr.vcxproj b/fatmgr/fatmgr.vcxproj
new file mode 100644 (file)
index 0000000..b5924a3
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{84F34813-8B38-4C65-9B9D-CA81FCD18521}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>fatmgr</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>NotSet</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>NotSet</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <PostBuildEvent>
+      <Command>copy "$(TargetPath)" "G:\c\os\harib27f"</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+    <PostBuildEvent>
+      <Command>copy "$(TargetPath)" "G:\c\os\harib27f"</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <None Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="fatmgr.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/fatmgr/stdafx.cpp b/fatmgr/stdafx.cpp
new file mode 100644 (file)
index 0000000..e0d24ce
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h fatmgr.pch \82Ì\82Ý\82ð
+// \8aÜ\82Þ\83\\81[\83\83t\83@\83C\83\8b\82Í\81A\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\83w\83b\83_\81[\82É\82È\82è\82Ü\82·\81B
+// stdafx.obj \82É\82Í\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\8c^\8fî\95ñ\82ª\8aÜ\82Ü\82ê\82Ü\82·\81B
+
+#include "stdafx.h"
+
+// TODO: \82±\82Ì\83t\83@\83C\83\8b\82Å\82Í\82È\82­\81ASTDAFX.H \82Å\95K\97v\82È
+// \92Ç\89Á\83w\83b\83_\81[\82ð\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/fatmgr/stdafx.h b/fatmgr/stdafx.h
new file mode 100644 (file)
index 0000000..93c07ff
--- /dev/null
@@ -0,0 +1,15 @@
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\81A\82Ü\82½\82Í
+// \8eQ\8fÆ\89ñ\90\94\82ª\91½\82­\81A\82©\82Â\82 \82Ü\82è\95Ï\8dX\82³\82ê\82È\82¢\81A\83v\83\8d\83W\83F\83N\83g\90ê\97p\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b
+// \82ð\8bL\8fq\82µ\82Ü\82·\81B
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#include <stdio.h>
+#include <tchar.h>
+
+
+
+// TODO: \83v\83\8d\83O\83\89\83\80\82É\95K\97v\82È\92Ç\89Á\83w\83b\83_\81[\82ð\82±\82±\82Å\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/fatmgr/targetver.h b/fatmgr/targetver.h
new file mode 100644 (file)
index 0000000..10b7ccd
--- /dev/null
@@ -0,0 +1,8 @@
+#pragma once
+
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\82Æ\81A\97\98\97p\82Å\82«\82é\8dÅ\82à\8fã\88Ê\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\82ª\92è\8b`\82³\82ê\82Ü\82·\81B
+
+// \88È\91O\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\97p\82É\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\83r\83\8b\83h\82·\82é\8fê\8d\87\82Í\81AWinSDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82µ\81A
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\91O\82É\81A\83T\83|\81[\83g\91Î\8fÛ\82Æ\82·\82é\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\8e¦\82·\82æ\82¤\82É _WIN32_WINNT \83}\83N\83\8d\82ð\90Ý\92è\82µ\82Ü\82·\81B
+
+#include <SDKDDKVer.h>
diff --git a/golibc/Makefile b/golibc/Makefile
new file mode 100644 (file)
index 0000000..b77882b
--- /dev/null
@@ -0,0 +1,77 @@
+TARGET     = golibc
+STACKSIZE  =
+MALLOCSIZE =
+MMAREA     =
+OBJS       = abs.obj atof.obj atoi.obj errno.obj frexp.obj ldexp.obj \
+       memchr.obj memcmp.obj memmove.obj memset.obj memcpy.obj qsort.obj rand.obj \
+       sprintf.obj strcat.obj strcmp.obj strcpy.obj strcspn.obj strdup.obj \
+       strlen.obj strncat.obj strncmp.obj strncpy.obj strpbrk.obj strrchr.obj \
+       strspn.obj strstr.obj strtol.obj strtoul.obj strtoul0.obj vsprintf.obj charset.obj
+# \88È\8fã5\82Â\82Í\83\\81[\83X\82²\82Æ\82É\8f\91\82«\8a·\82¦\82é
+# OBJS\82ð\8f\91\82«\8a·\82¦\82é\82Æ\95ª\8a\84\83R\83\93\83p\83C\83\8b\91Î\89\9e
+TOOLPATH =
+INCPATH  = .
+RULEFILE =
+MAKE     = $(TOOLPATH)make -r
+SJISCONV = $(TOOLPATH)sjisconv -s
+CC1      = $(TOOLPATH)cc1 -I$(INCPATH) -Os -quiet -W -Wall -Werror
+GAS2NASK = $(TOOLPATH)gas2nask -a
+NASK     = $(TOOLPATH)nask
+OBJ2BIM  = $(TOOLPATH)obj2bim3
+BIM2BIN  = $(TOOLPATH)bim2bin3
+CPP0     = $(TOOLPATH)cpp0 -P -I$(INCPATH)
+ASKA     = $(TOOLPATH)aska
+NASKCNV  = $(TOOLPATH)naskcnv0 -l -s -w
+GOLIB    = $(TOOLPATH)golib00w
+DELE     = rm
+LIB = ar rv
+CC = g++ -c -I../include 
+
+# \88È\8fã\82Ì\8d\80\96Ú\82Í\82 \82È\82½\82Ì\83f\83B\83\8c\83N\83g\83\8a\8d\\90¬\82É\82 \82í\82¹\82Ä\8f\91\82«\8a·\82¦\82é
+
+ALL :
+       $(MAKE) $(TARGET).lib
+
+%.ca : %.c Makefile
+       $(SJISCONV) $*.c $*.ca
+
+%.gas : %.ca Makefile
+       $(CC1) -o $*.gas $*.ca
+
+%.nas : %.gas Makefile
+       $(GAS2NASK) $*.gas $*.nas
+
+%.obj : %.c Makefile
+       $(CC) $*.c -o $*.obj
+
+%.obj : %.cpp Makefile
+       $(CC) $*.cpp -o $*.obj
+
+%.ias : %.ask Makefile
+       $(CPP0) -o $*.ias $*.ask
+
+%.3as : %.ias Makefile
+       $(ASKA) $*.ias $*.3as
+
+%.nas : %.3as Makefile
+       $(NASKCNV) $*.3as $*.nas
+
+%.lst : %.nas Makefile
+       $(NASK) $*.nas $*.obj $*.lst
+
+$(TARGET).lib : $(OBJS) Makefile
+       $(LIB) $(TARGET).lib $(OBJS)
+
+%.bin : %.bim Makefile
+       $(BIM2BIN) in:$*.bim out:$*.org malloc:$(MALLOCSIZE) mmarea:$(MMAREA)
+       $(BIM2BIN) in:$*.org out:$*.bin -osacmp -tek0
+
+
+clean :
+       -$(DELE) *.obj
+       -$(DELE) $(TARGET).bim
+       -$(DELE) $(TARGET).map
+       -$(DELE) $(TARGET).org
+       -$(DELE) $(TARGET).lib
diff --git a/golibc/abs.c b/golibc/abs.c
new file mode 100644 (file)
index 0000000..7b68f53
--- /dev/null
@@ -0,0 +1,8 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+extern "C" int abs(int n)
+{
+       if (n < 0)
+               n = - n;
+       return n;
+}
diff --git a/golibc/atof.c b/golibc/atof.c
new file mode 100644 (file)
index 0000000..9a76b37
--- /dev/null
@@ -0,0 +1,9 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#include <stdlib.h>    /* strtod */
+#include <stdio.h>     /* NULL */
+
+extern "C" double atof(const char *s)
+{
+       return strtod(s, (const char **) NULL);
+}
diff --git a/golibc/atoi.c b/golibc/atoi.c
new file mode 100644 (file)
index 0000000..792dfc4
--- /dev/null
@@ -0,0 +1,9 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#include <stdlib.h>    /* strtol */
+#include <stdio.h>     /* NULL */
+
+extern "C" int atoi(const char *s)
+{
+       return (int) strtol(s, (const char **) NULL, 10);
+}
diff --git a/golibc/charset.cpp b/golibc/charset.cpp
new file mode 100644 (file)
index 0000000..53e110a
--- /dev/null
@@ -0,0 +1,114 @@
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "CP932.h2"
+
+//--------------------stdlib.h------------------
+
+int cp932towcs(const char *p1, int n, wchar_t *unicode){
+       int left = 0;
+       int right = sizeof(cp932_unicode) / sizeof(cp932_unicode[0]);
+       int cp932 = 0;
+       int ret = 0;
+       unsigned char *p = (unsigned char *)p1;
+       unsigned char c = *p;
+       //fprintf(stderr, "c:%02X\n", *p);
+       if(c < 0x7f){
+               *unicode = c;
+               return 1;
+       }else if (c >= 0xa1 && c <= 0xdf){
+               cp932 = c;
+               ret = 1;
+       }else{
+               if(n < 2){
+                       return 0;
+               }
+               cp932 = p[1] | (p[0] << 8);
+               //fprintf(stderr, "p:%p\n", cp932);
+               ret = 2;
+       }
+       *unicode = 0;
+       while(1){
+               if(right <= left){
+                       break;
+               }
+               int mid = (right + left) / 2;
+               //printf("r:%04X(%04X) l:%04X(%04X) m:%04X(%04X)\n", right, cp932_unicode[right].cp932, left, cp932_unicode[left].cp932, mid, cp932_unicode[mid].cp932);
+               if(cp932_unicode[mid].cp932 < cp932){
+                       left = mid + 1;
+               }else if(cp932_unicode[mid].cp932 > cp932){
+                       right = mid;
+               }else{
+                       *unicode = cp932_unicode[mid].unicode;
+                       break;
+               }
+       }
+       if(*unicode == 0){
+               return 0;
+       }
+       return ret;
+}
+
+size_t mbstowcs(wchar_t *dest, const char *src, size_t n){
+       if(dest != NULL){
+               size_t p = 0;
+               for(;;){
+                       int r = cp932towcs(src, 10, dest + p);
+                       if(r == 0){
+                               return (size_t)-1;
+                       }
+                       if(dest[p] == 0){
+                               return p;
+                       }
+                       if(p >= n - 1){
+                               return n;
+                       }
+                       p++;
+
+                       src += r;
+               }
+       }else{
+               size_t p = 0;
+               for(;;){
+                       wchar_t u;
+                       int r = cp932towcs(src, 10, &u);
+                       if(r == 0){
+                               return (size_t)-1;
+                       }
+                       if(u == 0){
+                               return p;
+                       }
+                       p++;
+
+                       src += r;
+               }
+       }
+}
+
+//----------------------string.h--------------------------
+
+
+int wcslen(const wchar_t *p){
+       int len = 0;
+       while(p[len++]);
+       return len - 1;
+}
+
+wchar_t *wcsncpy(wchar_t *dest, const wchar_t *src, int n){
+       for(int i = 0; i < n; i++){
+               if(!(dest[i] = src[i])){
+                       break;
+               }
+       }
+       return dest;
+}
+
+int wcsicmp(const wchar_t *s1, const wchar_t *s2){
+       int i;
+       for(i = 0; towlower(s1[i]) == towlower(s2[i]); i++){
+               if(s1[i] == L'\0' || s2[i] == L'\0'){
+                       return (int)s1[i] - (int)s2[i];
+               }
+       }
+       return (int)towlower(s1[i]) - (int)towlower(s2[i]);
+}
diff --git a/golibc/errno.c b/golibc/errno.c
new file mode 100644 (file)
index 0000000..c5f709d
--- /dev/null
@@ -0,0 +1 @@
+extern "C" int errno = 0;
diff --git a/golibc/errno.h b/golibc/errno.h
new file mode 100644 (file)
index 0000000..3b2b64e
--- /dev/null
@@ -0,0 +1,20 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(ERRNO_H))
+
+#define ERRNO_H        1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+extern int errno;
+
+#define        ENOENT          2       /* No such file or directory */
+#define        ERANGE          34      /* Result too large (or too small) */
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/float.h b/golibc/float.h
new file mode 100644 (file)
index 0000000..f541ac1
--- /dev/null
@@ -0,0 +1,26 @@
+/* copyright(C) 2002 H.Kawai (under KL-01). */
+
+#if (!defined(FLOAT_H))
+
+#define FLOAT_H                        1
+
+#define FLT_RADIX              2
+#define FLT_ROUNDS             1 /* nearest */
+#define FLT_DIG                        6
+#define FLT_EPSILON            1.19209290e-07F
+#define FLT_MANT_DIG   24
+#define FLT_MAX                        3.40282347e+38F
+#define FLT_MAX_EXP            (+128)
+#define FLT_MIN                        1.17549435e-38F
+#define FLT_MIN_EXP            (-125)
+
+#define DBL_DIG                        15
+#define DBL_EPSILON            2.2204460492503131e-16
+#define DBL_MANT_DIG   53
+#define DBL_MAX                        1.7976931348623157e+308
+#define DBL_MAX_EXP            1024
+#define DBL_MIN                        2.2250738585072014e-308
+#define DBL_MIN_EXP            (-1021)
+
+#endif
+
diff --git a/golibc/frexp.c b/golibc/frexp.c
new file mode 100644 (file)
index 0000000..f2e6265
--- /dev/null
@@ -0,0 +1,27 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+extern "C" double frexp(double x, int *exp)
+{
+       int n = 0;
+       double s = 1.0;
+       if (x < 0.0) {
+               x = - x;
+               s = -1.0;
+       }
+       if (x != 0.0) {
+               if (x >= 1.0) {
+                       do {
+                               n++;
+                               x *= 0.5;
+                       } while (x >= 1.0);
+               }
+               if (x < 0.5) {
+                       do {
+                               n--;
+                               x *= 2.0;
+                       } while (x < 0.5);
+               }
+       }
+       *exp = n;
+       return x * s;
+}
diff --git a/golibc/golibc.lib b/golibc/golibc.lib
new file mode 100644 (file)
index 0000000..1c8b000
Binary files /dev/null and b/golibc/golibc.lib differ
diff --git a/golibc/ldexp.c b/golibc/ldexp.c
new file mode 100644 (file)
index 0000000..f474b12
--- /dev/null
@@ -0,0 +1,16 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+extern "C" double ldexp(double x, int n)
+{
+       if (n > 0) {
+               do {
+                       x *= 2.0;
+               } while (--n);
+       }
+       if (n < 0) {
+               do {
+                       x *= 0.5;
+               } while (++n);
+       }
+       return x;
+}
diff --git a/golibc/limits.h b/golibc/limits.h
new file mode 100644 (file)
index 0000000..9eb6c47
--- /dev/null
@@ -0,0 +1,23 @@
+/* copyright(C) 2002 H.Kawai (under KL-01). */
+
+#if (!defined(LIMITS_H))
+
+#define LIMITS_H       1
+
+#define CHAR_BIT       8
+#define        CHAR_MAX        (+127)
+#define CHAR_MIN       0
+#define INT_MAX                (+0x7fffffff)
+#define INT_MIN                (-0x7fffffff)
+#define LONG_MAX    INT_MAX
+#define        LONG_MIN        INT_MIN
+#define SCHAR_MAX      (+127)
+#define        SCHAR_MIN       (-127)
+#define        SHRT_MAX        (+0x7fff)
+#define SHRT_MIN       (-0x7fff)
+#define UCHAR_MAX      (+0xff)
+#define UINT_MAX       (+0xffffffff)
+#define ULONG_MAX      UINT_MAX
+#define USHRT_MAX      (+0xffff)
+
+#endif
diff --git a/golibc/math.h b/golibc/math.h
new file mode 100644 (file)
index 0000000..da7ac84
--- /dev/null
@@ -0,0 +1,42 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(MATH_H))
+
+#define MATH_H 1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+double sin(double);
+double cos(double);
+double sqrt(double);
+double ldexp(double x, int n);
+double frexp(double x, int *exp);
+
+extern __inline__ double sin(double x)
+{
+       double res;
+       __asm__ ("fsin" : "=t" (res) : "0" (x));
+       return res;
+}
+
+extern __inline__ double cos(double x)
+{
+       double res;
+       __asm__ ("fcos" : "=t" (res) : "0" (x));
+       return res;
+}
+
+extern __inline__ double sqrt(double x)
+{
+       double res;
+       __asm__ ("fsqrt" : "=t" (res) : "0" (x));
+       return res;
+}
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/memchr.c b/golibc/memchr.c
new file mode 100644 (file)
index 0000000..8f09e2e
--- /dev/null
@@ -0,0 +1,23 @@
+//*****************************************************************************
+// memchr.c : memory function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stdio.h>
+#include <stddef.h>
+
+//=============================================================================
+// search SZ bytes of D for C
+//=============================================================================
+extern "C" void* memchr (void *d, int c, size_t sz)
+{
+       char *dp = (char*)d;
+
+       while (sz--) {
+               if (c == *dp)
+                       return dp;
+               dp++;
+       }
+
+       return NULL;
+}
diff --git a/golibc/memcmp.c b/golibc/memcmp.c
new file mode 100644 (file)
index 0000000..76f5d3b
--- /dev/null
@@ -0,0 +1,24 @@
+//*****************************************************************************
+// memcmp.c : memory function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// compare SZ bytes of D and S
+//=============================================================================
+extern "C" int memcmp (const void *d, const void *s, size_t sz)
+{
+       const char *dp = (const char*) d;
+       const char *sp = (const char*) s;
+
+       while (sz--) {
+               if (*dp != *sp)
+                       return *dp - *sp;
+               dp++;
+               sp++;
+       }
+
+       return 0;
+}
diff --git a/golibc/memcpy.c b/golibc/memcpy.c
new file mode 100644 (file)
index 0000000..35bf794
--- /dev/null
@@ -0,0 +1,21 @@
+//*****************************************************************************
+// memcpy.c : memory function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// copy SZ bytes of S to D
+//=============================================================================
+extern "C" void* memcpy (void *d, void *s, size_t sz)
+{
+       void *tmp = d;
+       char *dp = (char*)d;
+       char *sp = (char*)s;
+
+       while (sz--)
+               *dp++ = *sp++;
+
+       return tmp;
+}
diff --git a/golibc/memmove.c b/golibc/memmove.c
new file mode 100644 (file)
index 0000000..1ac3649
--- /dev/null
@@ -0,0 +1,29 @@
+//*****************************************************************************
+// memmove.c : memory function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// copy SZ bytes of S to D
+//   * guarantee - acceptable result for overlaped strings
+//=============================================================================
+extern "C" void* memmove (void *d, void *s, size_t sz)
+{
+       void *tmp = d;
+       char *dp = (char*)d;
+       char *sp = (char*)s;
+
+       if (dp > sp) {
+               dp += sz;
+               sp += sz;
+               while (sz--)
+                       *--dp = *--sp;
+       } else {
+               while (sz--)
+                       *dp++ = *sp++;
+       }
+
+       return tmp;
+}
diff --git a/golibc/memset.c b/golibc/memset.c
new file mode 100644 (file)
index 0000000..98cb3a1
--- /dev/null
@@ -0,0 +1,20 @@
+//*****************************************************************************
+// memset.c : memory function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// set SZ bytes of S to C
+//=============================================================================
+extern "C" void * memset (void *d, int c, size_t sz)
+{
+       void *tmp = d;
+       char *dp = (char*)d;
+
+       while (sz--)
+               *dp++ = c;
+
+       return tmp;
+}
diff --git a/golibc/qsort.c b/golibc/qsort.c
new file mode 100644 (file)
index 0000000..b4e14d1
--- /dev/null
@@ -0,0 +1,36 @@
+/* K&R\82©\82ç\82Ù\82Ú\82»\82Ì\82Ü\82Ü\88ø\97p */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#define pV(i) (((char *) base) + (i) * size)
+
+static void swap(size_t size, char *p, char *q)
+{
+       char t;
+       do {
+               t = *p;
+               *p++ = *q;
+               *q++ = t;
+       } while (--size);
+       return;
+}
+
+extern "C" void qsort(void *base, size_t n, size_t size,
+       int (*cmp)(const void *, const void *))
+{
+       size_t i, last;
+       if (size == 0)
+               return;
+       if (n <= 1)
+               return;
+       swap(size, pV(0), pV(n / 2));
+       last = 0;
+       for (i = 1; i < n; i++)
+               if ((*cmp)(pV(i), pV(0)) < 0)
+                       swap(size, pV(++last), pV(i));
+       swap(size, pV(0), pV(last));
+       qsort(pV(0), last, size, cmp);
+       qsort(pV(last + 1), n - last - 1, size, cmp);
+       return;
+}
diff --git a/golibc/rand.c b/golibc/rand.c
new file mode 100644 (file)
index 0000000..df0aa00
--- /dev/null
@@ -0,0 +1,9 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+unsigned int rand_seed = 1;
+
+extern "C" int rand(void)
+{
+       rand_seed = rand_seed * 1103515245 + 12345;
+       return (unsigned int) (rand_seed >> 16) & 32767;
+}
diff --git a/golibc/setjmp.h b/golibc/setjmp.h
new file mode 100644 (file)
index 0000000..3aa5996
--- /dev/null
@@ -0,0 +1,20 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(SETJMP_H))
+
+#define SETJMP_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+typedef int jmp_buf[3]; /* EBP, EIP, ESP */
+
+#define setjmp(env)                    __builtin_setjmp(env)
+#define longjmp(env, val)      __builtin_longjmp(env, val)
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/sprintf.c b/golibc/sprintf.c
new file mode 100644 (file)
index 0000000..ff35549
--- /dev/null
@@ -0,0 +1,16 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+extern "C" int sprintf(char *s, const char *format, ...)
+{
+       int i;
+       va_list ap;
+
+       va_start(ap, format);
+       i = vsprintf(s, format, ap);
+       va_end(ap);
+       return i;
+}
+
diff --git a/golibc/stdarg.h b/golibc/stdarg.h
new file mode 100644 (file)
index 0000000..da514ba
--- /dev/null
@@ -0,0 +1,21 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDARG_H))
+
+#define STDARG_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+#define va_start(v,l)  __builtin_stdarg_start((v),l)
+#define va_end                 __builtin_va_end
+#define va_arg                 __builtin_va_arg
+#define va_copy(d,s)   __builtin_va_copy((d),(s))
+#define        va_list                 __builtin_va_list
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/stddef.h b/golibc/stddef.h
new file mode 100644 (file)
index 0000000..bf572da
--- /dev/null
@@ -0,0 +1,17 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDDEF_H))
+
+#define STDDEF_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+typedef unsigned int size_t;
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/stdio.h b/golibc/stdio.h
new file mode 100644 (file)
index 0000000..a4765ed
--- /dev/null
@@ -0,0 +1,25 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDIO_H))
+
+#define STDIO_H        1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+#if (!defined(NULL))
+       #define NULL    ((void *) 0)
+#endif
+
+#include <stdarg.h>
+
+/* golibc */
+int sprintf(char *s, const char *format, ...);
+int vsprintf(char *s, const char *format, va_list arg);
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/stdlib.h b/golibc/stdlib.h
new file mode 100644 (file)
index 0000000..63cdcba
--- /dev/null
@@ -0,0 +1,38 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDLIB_H))
+
+#define STDLIB_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+#include <stddef.h>            /* size_t */
+
+#define        RAND_MAX        0x7fff
+#define srand(seed)                    (void) (rand_seed = (seed))
+
+#define EXIT_SUCCESS           0
+#define EXIT_FAILURE           1
+
+int abs(int n);
+double atof(const char *s);
+int atoi(const char *s);
+void qsort(void *base, size_t n, size_t size,
+       int (*cmp)(const void *, const void *));
+int rand(void);
+extern unsigned int rand_seed;
+double strtod(const char *s, const char **endp);
+long strtol(const char *s, const char **endp, int base);
+unsigned long strtoul(const char *s, const char **endp, int base);
+
+/* for strdup() */
+void *malloc(unsigned int nbytes);
+void free(void *ap);
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/strcat.c b/golibc/strcat.c
new file mode 100644 (file)
index 0000000..29a354b
--- /dev/null
@@ -0,0 +1,24 @@
+//*****************************************************************************
+// strcat.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// append S to D
+//=============================================================================
+extern "C" char* strcat (char *d, const char *s)
+{
+       char *tmp = d;
+
+       while ('\0' != *d)
+               d++;
+
+       while ('\0' != *s)
+               *d++ = *s++;
+
+       *d = '\0';
+
+       return tmp;
+}
diff --git a/golibc/strchr.c b/golibc/strchr.c
new file mode 100644 (file)
index 0000000..4fd9bfc
--- /dev/null
@@ -0,0 +1,19 @@
+//*****************************************************************************
+// strchr.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// search D for C
+//=============================================================================
+extern "C" char* strchr (char *d, int c)
+{
+       while (c != *d) {
+               if ('\0' == *d++)
+                       return NULL;
+       }
+
+       return d;
+}
diff --git a/golibc/strcmp.c b/golibc/strcmp.c
new file mode 100644 (file)
index 0000000..194b77d
--- /dev/null
@@ -0,0 +1,21 @@
+//*****************************************************************************
+// strcmp.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// compare D and S
+//=============================================================================
+extern "C" int strcmp (const char *d, const char *s)
+{
+       while ('\0' != *d) {
+               if (*d != *s)
+                       return *d - *s;
+               d++;
+               s++;
+       }
+
+       return *d - *s;
+}
diff --git a/golibc/strcpy.c b/golibc/strcpy.c
new file mode 100644 (file)
index 0000000..a88b6f0
--- /dev/null
@@ -0,0 +1,24 @@
+//*****************************************************************************
+// strcpy.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// copy S to D
+//=============================================================================
+extern "C" char* strcpy (char *d, const char *s)
+{
+       char *tmp = d;
+
+#if 0
+       while ('\0' != *s)
+               *d++ = *s++;
+
+       *d = '\0';
+#endif
+       while ((*d++ = *s++) != '\0');
+
+       return tmp;
+}
diff --git a/golibc/strcspn.c b/golibc/strcspn.c
new file mode 100644 (file)
index 0000000..d6edbba
--- /dev/null
@@ -0,0 +1,25 @@
+//*****************************************************************************
+// strcspn.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// return length of D which any characters in S
+//=============================================================================
+extern "C" size_t strcspn (char *d, const char *s)
+{
+       char *tmp = d;
+       const char *bgn = s;
+
+       while ('\0' != *d) {
+               while ('\0' != *s)
+                       if (*d == *s++)
+                               return d - tmp;
+               d++;
+               s = bgn;
+       }
+
+       return d - tmp;
+}
diff --git a/golibc/strdup.c b/golibc/strdup.c
new file mode 100644 (file)
index 0000000..32a0340
--- /dev/null
@@ -0,0 +1,12 @@
+/* copyright(C) 2002 H.Kawai (under KL-01). */
+
+#include <stdlib.h>
+#include <string.h>
+
+extern "C" char *strdup(const char *cs)
+{
+       char *t = (char *)malloc(strlen(cs) + 1);
+       if (t)
+               strcpy(t, cs);
+       return t;
+}
diff --git a/golibc/string.h b/golibc/string.h
new file mode 100644 (file)
index 0000000..f0958ac
--- /dev/null
@@ -0,0 +1,38 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STRING_H))
+
+#define STRING_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+#include <stddef.h>            /* size_t */
+
+char *strcpy(char *s, const char *ct);
+char *strncpy(char *s, const char *ct, size_t n);
+char *strcat(char *s, const char *ct);
+char *strncat(char *s, const char *ct, size_t n);
+int strcmp(const char *cs, const char *ct);
+int strncmp(const char *cs, const char *ct, size_t n);
+char *strchr(const char *cs, int c);
+char *strrchr(const char *cs, int c);
+size_t strspn(const char *s, const char *accept);
+size_t strcspn(const char *s, const char *reject);
+char *strpbrk(const char *s, const char *accept);
+char *strstr(const char *cs, const char *ct);
+size_t strlen(const char *cs);
+
+void *memcpy(void *s, const void *ct, size_t n);
+void *memmove(void *s, const void *ct, size_t n);
+int memcmp(const void *cs, const void *ct, size_t n);
+void *memchr(const void *cs, int c, size_t n);
+void *memset(void *s, int c, size_t n);
+char *strdup(const char *s);
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/golibc/strlen.c b/golibc/strlen.c
new file mode 100644 (file)
index 0000000..4c38237
--- /dev/null
@@ -0,0 +1,19 @@
+//*****************************************************************************
+// strlen.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// return the length of D
+//=============================================================================
+extern "C" size_t strlen (char *d)
+{
+       char *tmp = d;
+
+       while ('\0' != *d)
+               d++;
+
+       return d - tmp;
+}
diff --git a/golibc/strncat.c b/golibc/strncat.c
new file mode 100644 (file)
index 0000000..22735c0
--- /dev/null
@@ -0,0 +1,29 @@
+//*****************************************************************************
+// strncat.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// append no more SZ bytes from S to D
+//=============================================================================
+extern "C" char* strncat (char *d, const char *s, size_t sz)
+{
+       char *tmp = d;
+
+       while ('\0' != *d)
+               d++;
+
+       while ('\0' != *s) {
+               if (0 == sz)
+                       break;
+               sz--;
+               *d++ = *s++;
+       }
+
+       if (sz)
+               *d = '\0';
+
+       return tmp;
+}
diff --git a/golibc/strncmp.c b/golibc/strncmp.c
new file mode 100644 (file)
index 0000000..78801fd
--- /dev/null
@@ -0,0 +1,42 @@
+//*****************************************************************************
+// strncmp.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// compare no more SZ bytes D and S
+//=============================================================================
+extern "C" int strncmp (char *d, const char *s, size_t sz)
+{
+#if 0
+       /* Gaku's code */
+
+       while ( sz-- && '\0' != *d ) {
+               if (*d != *s)
+                       return *d - *s;
+               d++;
+               s++;
+       }
+       return *d - *s; /* bug? (if sz == 0) */
+
+#endif
+
+#if 1
+       /* Kawai's code */
+
+       while (sz--) {
+               if (*d == '\0')
+                       goto ret;
+               if (*d != *s) {
+ret:
+                       return *d - *s;
+               }
+               d++;
+               s++;
+       }
+       return 0;
+#endif
+
+}
diff --git a/golibc/strncpy.c b/golibc/strncpy.c
new file mode 100644 (file)
index 0000000..6a3edba
--- /dev/null
@@ -0,0 +1,26 @@
+//*****************************************************************************
+// strncpy.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// copy no more SZ bytes S to D
+//=============================================================================
+extern "C" char* strncpy (char *d, const char *s, size_t sz)
+{
+       char *tmp = d;
+
+       while ('\0' != *s) {
+               if (0 == sz)
+                       break;
+               sz--;
+               *d++ = *s++;
+       }
+
+       while (sz--)
+               *d++ = '\0';
+
+       return tmp;
+}
diff --git a/golibc/strpbrk.c b/golibc/strpbrk.c
new file mode 100644 (file)
index 0000000..6b7c5aa
--- /dev/null
@@ -0,0 +1,25 @@
+//*****************************************************************************
+// strpbrk.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stdio.h>
+#include <stddef.h>
+
+//=============================================================================
+// search D of any character in S
+//=============================================================================
+extern "C" char* strpbrk (char *d, const char *s)
+{
+       const char *bgn = s;
+
+       while ('\0' != *d) {
+               while ('\0' != *s)
+                       if (*d == *s++)
+                               return d;
+               d++;
+               s = bgn;
+       }
+
+       return NULL;
+}
diff --git a/golibc/strrchr.c b/golibc/strrchr.c
new file mode 100644 (file)
index 0000000..95ccde7
--- /dev/null
@@ -0,0 +1,26 @@
+//*****************************************************************************
+// strrchr.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stdio.h>
+#include <stddef.h>
+
+//=============================================================================
+// search the last occur of C in D
+//=============================================================================
+extern "C" char* strrchr (char *d, int c)
+{
+       char *tmp = d;
+
+       while ('\0' != *d)
+               d++;
+
+       while (tmp <= d) {
+               if (c == *d)
+                       return d;
+               d--;
+       }
+
+       return NULL;
+}
diff --git a/golibc/strspn.c b/golibc/strspn.c
new file mode 100644 (file)
index 0000000..6608b38
--- /dev/null
@@ -0,0 +1,29 @@
+//*****************************************************************************
+// strspn.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stddef.h>
+
+//=============================================================================
+// return the length of D of any character in S
+//=============================================================================
+extern "C" size_t strspn (char *d, const char *s)
+{
+       char *tmp = d;
+       const char *bgn = s;
+
+       while ('\0' != *d) {
+               while ('\0' != *s) {
+                       if (*d == *s)
+                               break;
+                       s++;
+               }
+               if ('\0' == *s)
+                       return d - tmp;
+               d++;
+               s = bgn;
+       }
+
+       return d - tmp;
+}
diff --git a/golibc/strstr.c b/golibc/strstr.c
new file mode 100644 (file)
index 0000000..430adf4
--- /dev/null
@@ -0,0 +1,28 @@
+//*****************************************************************************
+// strstr.c : string function
+// 2002/02/04 by Gaku : this is rough sketch
+//*****************************************************************************
+
+#include <stdio.h>
+#include <stddef.h>
+
+//=============================================================================
+// search S in D
+//   * simple search
+//=============================================================================
+extern "C" char* strstr (char *d, const char *s)
+{
+       char *tmp;
+       const char *bgn = s;
+
+       while ('\0' != *d) {
+               tmp = d;
+               while (*d++ == *s++)
+                       if ('\0' == *d || '\0' == *s)
+                               return tmp;
+               d = tmp+1;
+               s = bgn;
+       }
+
+       return NULL;
+}
diff --git a/golibc/strtol.c b/golibc/strtol.c
new file mode 100644 (file)
index 0000000..50845d9
--- /dev/null
@@ -0,0 +1,38 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#include <errno.h>
+#include <limits.h>
+
+unsigned long strtoul0(const char **ps, int base, char *errflag);
+
+extern "C" long strtol(const char *s, const char **endp, int base)
+{
+       const char *s0 = s, *s1;
+       char sign = 0, errflag;
+       unsigned long val;
+       while (*s != '\0' && *s <= ' ')
+               s++;
+       if (*s == '-') {
+               sign = 1;
+               s++;
+       }
+       while (*s != '\0' && *s <= ' ')
+               s++;
+       s1 = s;
+       val = strtoul0(&s, base, &errflag);
+       if (s == s1)
+               s = s0;
+       if (endp)
+               *endp = s;
+       if (val > LONG_MAX) {
+               errflag = 1;
+               val = LONG_MAX;
+               if (sign)
+                       val = LONG_MIN;
+       }
+       if (errflag == 0 && sign != 0)
+               val = - val;
+       if (errflag)
+               errno = ERANGE;
+       return val;
+}
diff --git a/golibc/strtoul.c b/golibc/strtoul.c
new file mode 100644 (file)
index 0000000..c7f3f57
--- /dev/null
@@ -0,0 +1,31 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#include <errno.h>
+
+extern "C" unsigned long strtoul0(const char **ps, int base, char *errflag);
+
+extern "C" unsigned long strtoul(const char *s, const char **endp, int base)
+{
+       const char *s0 = s, *s1;
+       char sign = 0, errflag;
+       unsigned long val;
+       while (*s != '\0' && *s <= ' ')
+               s++;
+       if (*s == '-') {
+               sign = 1;
+               s++;
+       }
+       while (*s != '\0' && *s <= ' ')
+               s++;
+       s1 = s;
+       val = strtoul0(&s, base, &errflag);
+       if (s == s1)
+               s = s0;
+       if (endp)
+               *endp = s;
+       if (errflag == 0 && sign != 0)
+               val = - val;
+       if (errflag)
+               errno = ERANGE;
+       return val;
+}
diff --git a/golibc/strtoul0.c b/golibc/strtoul0.c
new file mode 100644 (file)
index 0000000..61dcecc
--- /dev/null
@@ -0,0 +1,65 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#include <limits.h>
+
+extern "C" unsigned long strtoul0(const unsigned char **ps, int base, unsigned char *errflag);
+
+static int prefix(int c)
+{
+       signed char base = 0;
+       if ('a' <= c && c <= 'z')
+               c += 'A' - 'a';
+       if (c == 'B')
+               base =  2;
+       if (c == 'D')
+               base = 10;
+       if (c == 'O')
+               base =  8;
+       if (c == 'X')
+               base = 16;
+       return base;
+}
+
+extern "C" unsigned long strtoul0(const unsigned char **ps, int base, unsigned char *errflag)
+{
+       const unsigned char *s = *ps;
+       unsigned long val = 0, max;
+       int digit;
+       if (base == 0) {
+               base += 10;
+               if (*s == '0') {
+                       base = prefix(*(s + 1));
+                       if (base == 0)
+                               base += 8; /* base = 8; */
+               }
+       }
+       if (*s == '0') {
+               if (base == prefix(*(s + 1)))
+                       s += 2;
+       }
+       max = ULONG_MAX / base;
+       *errflag = 0;
+       for (;;) {
+               digit = 99;
+               if ('0' <= *s && *s <= '9')
+                       digit = *s - '0';
+               if ('A' <= *s && *s <= 'Z')
+                       digit = *s - ('A' - 10);
+               if ('a' <= *s && *s <= 'z')
+                       digit = *s - ('a' - 10);
+               if (digit >= base)
+                       break;
+               if (val > max)
+                       goto err;
+               val *= base;
+               if (ULONG_MAX - val < (unsigned long) digit) {
+err:
+                       *errflag = 1;
+                       val = ULONG_MAX;
+               } else
+                       val += digit;
+               s++;
+       }
+       *ps = s;
+       return val;
+}
diff --git a/golibc/vsprintf.c b/golibc/vsprintf.c
new file mode 100644 (file)
index 0000000..c4dc178
--- /dev/null
@@ -0,0 +1,183 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <limits.h>
+#include <string.h>
+
+extern "C" unsigned long strtoul0(const char **ps, int base, char *errflag);
+
+typedef unsigned char UCHAR;
+typedef unsigned int UINT;
+
+static UCHAR *setdec(UCHAR *s, UINT ui)
+{
+       do {
+               *--s = (ui % 10) + '0';
+       } while (ui /= 10);
+       return s;
+}
+
+extern "C" int vsprintf(char *s, const char *format, va_list arg)
+{
+       UCHAR c, *t = (UCHAR *)s, *p, flag_left, flag_zero /* , flag_sign, flag_space */;
+       UCHAR temp[32] /* \90\94\8e\9a\97p */, *q;
+       temp[31] = '\0';
+       int field_min, field_max, i;
+       long l;
+       static char hextable_X[] = "0123456789ABCDEF";
+       static char hextable_x[] = "0123456789abcdef";
+       //for(;*s++=*format++;){}return 0;
+       for (;;) {
+               c = *format++;
+               if (c != '%') {
+put1char:
+                       *t++ = c;
+                       if (c)
+                               continue;
+                       return t - (UCHAR *) s - 1;
+               }
+               flag_left = flag_zero = /* flag_sign = flag_space = flag_another = */ 0;
+               c = *format++;
+               for (;;) {
+                       if (c == '-')
+                               flag_left = 1;
+                       else if (c == '0')
+                               flag_zero = 1;
+                       else
+                               break;
+                       c = *format++;
+               }
+               field_min = 0;
+               if ('1' <= c && c <= '9') {
+                       format--;
+                       field_min = (int) strtoul0(&format, 10, (char *)&c);
+                       c = *format++;
+               } else if (c == '*') {
+                       field_min = va_arg(arg, int);
+                       c = *format++;
+               }
+               field_max = INT_MAX;
+               if (c == '.') {
+                       c = *format++;
+                       if ('1' <= c && c <= '9') {
+                               format--;
+                               field_min = (int) strtoul0(&format, 10, (char *)&c);
+                               c = *format++;
+                       } else if (c == '*') {
+                               field_max = va_arg(arg, int);
+                               c = *format++;
+                       }
+               }
+               if (c == 's') {
+                       if (field_max != INT_MAX)
+                               goto mikan;
+                       p = (UCHAR *)va_arg(arg, char *);
+                       l = strlen((char *)p);
+                       if (*p) {
+                               c = ' ';
+copy_p2t:
+                               if (flag_left == 0) {
+                                       while (l < field_min) {
+                                               *t++ = c;
+                                               field_min--;
+                                       }
+                               }
+                               do {
+                                       *t++ = *p++;
+                               } while (*p);
+                       }
+                       while (l < field_min) {
+                               *t++ = ' ';
+                               field_min--;
+                       }
+                       continue;
+               }
+               if (c == 'l') {
+                       c = *format++;
+                       if (c != 'd' && c != 'x' && c != 'u' && c != 'X' && c != 'o') {
+                               format--;
+                               goto mikan;
+                       }
+               }
+               if (c == 'u') {
+                       l = va_arg(arg, UINT);
+                       goto printf_u;
+               }
+               if (c == 'd') {
+printf_d:
+                       l = va_arg(arg, long);
+                       if (l < 0) {
+                               *t++ = '-';
+                               l = - l;
+                               field_min--;
+                       }
+printf_u:
+                       if (field_max != INT_MAX)
+                               goto mikan;
+                       if (field_min <= 0)
+                               field_min = 1;
+                       p = setdec(&temp[31], l);
+printf_x2:
+                       c = ' ';
+                       l = &temp[31] - p;
+                       if (flag_zero)
+                               c = '0';
+                       goto copy_p2t;
+               }
+               if (c == 'i')
+                       goto printf_d;
+               if (c == '%')
+                       goto put1char;
+               if (c == 'x') {
+                       q = (UCHAR *)hextable_x;
+printf_x:
+                       l = va_arg(arg, UINT);
+                       p = &temp[31];
+                       do {
+                               *--p = q[l & 0x0f];
+                       } while ((*(UINT *) &l) >>= 4);
+                       goto printf_x2;
+               }
+               if (c == 'X') {
+                       q = (UCHAR *)hextable_X;
+                       goto printf_x;
+               }
+               if (c == 'p') {
+                       i = (int) va_arg(arg, void *);
+                       p = &temp[31];
+                       for (l = 0; l < 8; l++) {
+                               *--p = hextable_X[i & 0x0f];
+                               i >>= 4;
+                       }
+                       goto copy_p2t;
+               }
+               if (c == 'c') {
+                       i = (int) va_arg(arg, void *);
+                       p = &temp[31];
+                       *--p = i;
+                       goto copy_p2t;
+               }
+               if (c == 'o') {
+                       l = va_arg(arg, UINT);
+                       p = &temp[31];
+                       do {
+                               *--p = hextable_x[l & 0x07];
+                       } while ((*(UINT *) &l) >>= 3);
+                       goto printf_x2;
+               }
+               if (c == 'f') {
+                       if (field_max == INT_MAX)
+                               field_max = 6;
+                       /* for ese */
+                       if (field_min < field_max + 2)
+                               field_min = field_max + 2;
+                       do {
+                               *t++ = '#';
+                       } while (--field_min);
+                       continue;
+               }
+mikan:
+               for(;;);
+       }
+}
diff --git a/haribote.img b/haribote.img
new file mode 100644 (file)
index 0000000..b2754ac
Binary files /dev/null and b/haribote.img differ
diff --git a/haribote.vhd b/haribote.vhd
new file mode 100644 (file)
index 0000000..56d0153
Binary files /dev/null and b/haribote.vhd differ
diff --git a/haribote/Debug/fatmgr.exe b/haribote/Debug/fatmgr.exe
new file mode 100644 (file)
index 0000000..c0154c6
Binary files /dev/null and b/haribote/Debug/fatmgr.exe differ
diff --git a/haribote/Debug/fatmgr.ilk b/haribote/Debug/fatmgr.ilk
new file mode 100644 (file)
index 0000000..449f930
Binary files /dev/null and b/haribote/Debug/fatmgr.ilk differ
diff --git a/haribote/Debug/ntdll.dll b/haribote/Debug/ntdll.dll
new file mode 100644 (file)
index 0000000..5772e37
Binary files /dev/null and b/haribote/Debug/ntdll.dll differ
diff --git a/haribote/Debug/ntdll.exp b/haribote/Debug/ntdll.exp
new file mode 100644 (file)
index 0000000..7517405
Binary files /dev/null and b/haribote/Debug/ntdll.exp differ
diff --git a/haribote/Debug/ntdll.ilk b/haribote/Debug/ntdll.ilk
new file mode 100644 (file)
index 0000000..4efd420
Binary files /dev/null and b/haribote/Debug/ntdll.ilk differ
diff --git a/haribote/Debug/ntdll.lib b/haribote/Debug/ntdll.lib
new file mode 100644 (file)
index 0000000..9629909
Binary files /dev/null and b/haribote/Debug/ntdll.lib differ
diff --git a/haribote/Makefile b/haribote/Makefile
new file mode 100644 (file)
index 0000000..7cc60d5
--- /dev/null
@@ -0,0 +1,107 @@
+TOOLPATH = ../../z_tools/
+INCPATH  = ../../z_tools/haribote/
+
+MAKE     = make.exe -r
+ASM     = nasm
+GAS2NASK = $(TOOLPATH)gas2nask.exe -a
+OBJ2BIM  = $(TOOLPATH)obj2bim.exe
+MAKEFONT = $(TOOLPATH)makefont.exe
+BIN2OBJ  = $(TOOLPATH)bin2obj.exe
+BIM2HRB  = $(TOOLPATH)bim2hrb.exe
+RULEFILE = ../haribote.rul
+EDIMG    = $(TOOLPATH)edimg.exe
+IMGTOL   = $(TOOLPATH)imgtol.com
+GOLIB    = $(TOOLPATH)golib00.exe 
+COPY     = cp
+DEL      = rm
+OBJCOPY  = objcopy
+OBJS = filesystem.obj screen.obj timer.obj desctable.obj naskfunc.obj pic.obj startup.obj debug.obj MemMan.obj ProcessMan.obj ThreadMan.obj
+CFILES = filesystem.cpp screen.cpp timer.cpp desctable.cpp naskfunc.cpp pic.cpp startup.cpp debug.cpp MemMan.cpp ProcessMan.cpp ThreadMan.cpp
+LIBS = ./ata/ataio.lib ../golibc/golibc.lib
+CC = g++
+BOOTPACKTARGET = bootpack.exe
+CFLAGS = -g -c -nostdinc -fno-rtti -fno-builtin-alloca -I../include -Ig:/lib/boost -DBOOST_NO_EXCEPTIONS -DBOOST_SP_DISABLE_THREADS -DBOOST_DISABLE_ASSERTS -DBOOST_NO_AUTO_PTR -DBOOST_NO_IOSTREAM -masm=intel -std=c++0x
+
+# \83f\83t\83H\83\8b\83g\93®\8dì
+
+default :
+       cd ata && $(MAKE)
+       $(MAKE) mbr.bin
+       $(MAKE) iplhd.bin
+       $(MAKE) haribote.sys
+
+
+# \83t\83@\83C\83\8b\90\90¬\8bK\91¥
+
+mbr.bin : mbr.asm Makefile
+       $(ASM) mbr.asm -o mbr.bin -l mbr.lst
+       perl mbr.pl >> mbr.bin
+
+iplhd.bin : iplhd.asm Makefile
+       $(ASM) iplhd.asm -o iplhd.bin -l iplhd.lst
+
+asmhead.bin : asmhead.asm Makefile
+       $(ASM) asmhead.asm -o asmhead.bin -l asmhead.lst
+
+bootpack.obj : bootpack.cpp Makefile
+       $(CC) $(CFLAGS) bootpack.cpp -o bootpack.obj
+
+$(BOOTPACKTARGET) : bootpack.obj $(OBJS) $(LIBS) Makefile
+       g++ -shared  -Wl,--image-base=0x00280000 -e _user_start -static -nostdlib -lgcc_s -lgcc bootpack.obj $(OBJS) $(LIBS) -o $(BOOTPACKTARGET)
+#      objcopy -j .text -I pe-i386 -O binary bootpack.dll bootpack.sys
+
+
+haribote.sys : asmhead.bin $(BOOTPACKTARGET) Makefile
+       cp asmhead.bin haribote.sys
+       cat $(BOOTPACKTARGET) >> haribote.sys
+
+naskfunc.obj : naskfunc.asm Makefile
+       $(ASM) -f win32 naskfunc.asm -o naskfunc.obj -l naskfunc.lst
+
+
+# \88ê\94Ê\8bK\91¥
+
+%.asm : %.gas Makefile
+       $(GAS2NASK) $*.gas $*.asm
+
+%.obj : %.cpp Makefile
+       $(CC) $(CFLAGS) $*.cpp -o $*.obj
+
+
+# \83R\83}\83\93\83h
+
+clean :
+       -$(DEL) mbr.bin
+       -$(DEL) iplhd.bin
+       -$(DEL) $(OBJS) bootpack.obj
+
+
+src_only :
+       $(MAKE) clean
+       -$(DEL) haribote.sys
+
+depend :
+       makedepend --  -- $(CFILES) bootpack.cpp
+       
+# DO NOT DELETE
+
+filesystem.obj: filesystem.h bootpack.h typedefs.h ata/ataio.h ata\dos.h
+filesystem.obj: fat32.h screen.h debug.h
+screen.obj: screen.h ata/ataio.h ata\dos.h bootpack.h typedefs.h hankaku.h
+timer.obj: bootpack.h typedefs.h timer.h naskfunc.h pic.h
+desctable.obj: bootpack.h typedefs.h desctable.h naskfunc.h screen.h
+desctable.obj: ata/ataio.h ata\dos.h debug.h processman.h Vector.h MemMan.h
+desctable.obj: FileSystem.h fat32.h ThreadMan.h
+pic.obj: bootpack.h typedefs.h pic.h naskfunc.h
+debug.obj: debug.h screen.h ata/ataio.h ata\dos.h bootpack.h typedefs.h
+debug.obj: MemMan.h
+MemMan.obj: MemMan.h typedefs.h naskfunc.h debug.h vector.h
+ProcessMan.obj: ProcessMan.h typedefs.h Vector.h MemMan.h FileSystem.h
+ProcessMan.obj: bootpack.h ata/ataio.h ata\dos.h fat32.h desctable.h
+ProcessMan.obj: ThreadMan.h filesystem.h debug.h naskfunc.h
+ThreadMan.obj: ThreadMan.h desctable.h typedefs.h MemMan.h Vector.h debug.h
+ThreadMan.obj: ProcessMan.h FileSystem.h bootpack.h ata/ataio.h ata\dos.h
+ThreadMan.obj: fat32.h
+bootpack.obj: bootpack.h typedefs.h filesystem.h ata/ataio.h ata\dos.h
+bootpack.obj: fat32.h screen.h timer.h desctable.h pic.h naskfunc.h MemMan.h
+bootpack.obj: debug.h ProcessMan.h Vector.h FileSystem.h ThreadMan.h
diff --git a/haribote/Makefile.bak b/haribote/Makefile.bak
new file mode 100644 (file)
index 0000000..5cb3b27
--- /dev/null
@@ -0,0 +1,98 @@
+TOOLPATH = ../../z_tools/
+INCPATH  = ../../z_tools/haribote/
+
+MAKE     = make.exe -r
+ASM     = nasm
+GAS2NASK = $(TOOLPATH)gas2nask.exe -a
+OBJ2BIM  = $(TOOLPATH)obj2bim.exe
+MAKEFONT = $(TOOLPATH)makefont.exe
+BIN2OBJ  = $(TOOLPATH)bin2obj.exe
+BIM2HRB  = $(TOOLPATH)bim2hrb.exe
+RULEFILE = ../haribote.rul
+EDIMG    = $(TOOLPATH)edimg.exe
+IMGTOL   = $(TOOLPATH)imgtol.com
+GOLIB    = $(TOOLPATH)golib00.exe 
+COPY     = cp
+DEL      = rm
+OBJCOPY  = objcopy
+OBJS = filesystem.obj screen.obj timer.obj desctable.obj naskfunc.obj pic.obj startup.obj debug.obj MemMan.obj ProcessMan.obj ThreadMan.obj
+CFILES = filesystem.cpp screen.cpp timer.cpp desctable.cpp naskfunc.cpp pic.cpp startup.cpp debug.cpp MemMan.cpp ProcessMan.cpp ThreadMan.cpp
+LIBS = ./ata/ataio.lib ../golibc/golibc.lib
+CC = g++
+BOOTPACKTARGET = bootpack.exe
+CFLAGS = -g -c -nostdinc -fno-rtti -fno-builtin-alloca -I../include -Ig:/lib/boost -DBOOST_NO_EXCEPTIONS -DBOOST_SP_DISABLE_THREADS -DBOOST_DISABLE_ASSERTS -DBOOST_NO_AUTO_PTR -DBOOST_NO_IOSTREAM -masm=intel -std=c++0x
+
+# \83f\83t\83H\83\8b\83g\93®\8dì
+
+default :
+       cd ata && $(MAKE)
+       $(MAKE) mbr.bin
+       $(MAKE) iplhd.bin
+       $(MAKE) haribote.sys
+
+
+# \83t\83@\83C\83\8b\90\90¬\8bK\91¥
+
+mbr.bin : mbr.asm Makefile
+       $(ASM) mbr.asm -o mbr.bin -l mbr.lst
+       perl mbr.pl >> mbr.bin
+
+iplhd.bin : iplhd.asm Makefile
+       $(ASM) iplhd.asm -o iplhd.bin -l iplhd.lst
+
+asmhead.bin : asmhead.asm Makefile
+       $(ASM) asmhead.asm -o asmhead.bin -l asmhead.lst
+
+bootpack.obj : bootpack.cpp Makefile
+       $(CC) $(CFLAGS) bootpack.cpp -o bootpack.obj
+
+$(BOOTPACKTARGET) : bootpack.obj $(OBJS) $(LIBS) Makefile
+       g++ -shared  -Wl,--image-base=0x00280000 -e _user_start -static -nostdlib -lgcc_s -lgcc bootpack.obj $(OBJS) $(LIBS) -o $(BOOTPACKTARGET)
+#      objcopy -j .text -I pe-i386 -O binary bootpack.dll bootpack.sys
+
+
+haribote.sys : asmhead.bin $(BOOTPACKTARGET) Makefile
+       cp asmhead.bin haribote.sys
+       cat $(BOOTPACKTARGET) >> haribote.sys
+
+naskfunc.obj : naskfunc.asm Makefile
+       $(ASM) -f win32 naskfunc.asm -o naskfunc.obj -l naskfunc.lst
+
+
+# \88ê\94Ê\8bK\91¥
+
+%.asm : %.gas Makefile
+       $(GAS2NASK) $*.gas $*.asm
+
+%.obj : %.cpp Makefile
+       $(CC) $(CFLAGS) $*.cpp -o $*.obj
+
+
+# \83R\83}\83\93\83h
+
+clean :
+       -$(DEL) mbr.bin
+       -$(DEL) iplhd.bin
+       -$(DEL) $(OBJS) bootpack.obj
+
+
+src_only :
+       $(MAKE) clean
+       -$(DEL) haribote.sys
+
+depend :
+       makedepend --  -- $(CFILES) bootpack.cpp
+       
+# DO NOT DELETE
+
+filesystem.obj: filesystem.h bootpack.h typedefs.h ata/ataio.h ata\dos.h
+filesystem.obj: fat32.h screen.h debug.h
+screen.obj: screen.h ata/ataio.h ata\dos.h bootpack.h typedefs.h hankaku.h
+timer.obj: bootpack.h typedefs.h timer.h naskfunc.h pic.h
+desctable.obj: bootpack.h typedefs.h desctable.h naskfunc.h screen.h
+desctable.obj: ata/ataio.h ata\dos.h debug.h processman.h Vector.h MemMan.h
+desctable.obj: FileSystem.h fat32.h
+pic.obj: bootpack.h typedefs.h pic.h naskfunc.h
+debug.obj: debug.h screen.h ata/ataio.h ata\dos.h bootpack.h typedefs.h
+debug.obj: MemMan.h
+MemMan.obj: MemMan.h typedefs.h naskfunc.h debug.h vector.h
diff --git a/haribote/MemMan.cpp b/haribote/MemMan.cpp
new file mode 100644 (file)
index 0000000..917c377
--- /dev/null
@@ -0,0 +1,205 @@
+#include "MemMan.h"
+#include "naskfunc.h"
+#include "debug.h"
+#include "vector.h"
+
+#define EFLAGS_AC_BIT          0x00040000
+#define CR0_CACHE_DISABLE      0x60000000
+
+BYTE MemMan::buf[sizeof(MemMan)];
+
+void MemMan::Init(){
+       new ((void *)buf) MemMan();
+}
+
+MemMan::MemMan(void)
+{
+       debugprint("memory checking...\n");
+       memsize = memtest(SECOND_BEGIN, 0xbfffffff);
+       if(memsize >= 0x80000000){
+               memsize = 0x80000000;
+       }
+       debugprint("memory:%d (max mem is 2G byte)\n", memsize);
+
+       //0~memsize-1\82Ü\82Å\8eg\82¦\82é
+       pagecount = (FIRST_END - FIRST_BEGIN) / PAGE_SIZE + memsize / PAGE_SIZE;
+       pages_for_pageinfo = (pagecount * sizeof(PAGEINFO) + PAGE_SIZE - 1) / PAGE_SIZE;
+       //0x00001000 - 0x0009efff\82É\93ü\82éBLOCKINFO\82Ì\90\94\82ð\8cv\8eZ
+       maxfirst = (FIRST_END - FIRST_BEGIN) / sizeof(PAGEINFO);
+
+       for(int i = 0; i < pagecount; i++){
+               PAGEINFO &pi = *getpageinfo(i);
+               if(i < pages_for_pageinfo){
+                       //PAGEINFO\8ai\94[\82É\97\98\97p\82³\82ê\82é\83y\81[\83W
+                       pi.commited = 1;
+                       pi.unpageoutable = 1;
+                       pi.system = 1;
+                       pi.pid = 0;
+               }else{
+                       pi.commited = 0;
+                       pi.unpageoutable = 0;
+                       pi.system = 0;
+                       pi.pid = 0;
+               }
+       }
+
+       minfo = new Vector<MEMINFO>(0);
+}
+
+
+MemMan::~MemMan(void)
+{
+       delete minfo;
+}
+
+MemMan::PAGEINFO *MemMan::getpageinfo(DWORD i){
+       if(pagecount <= i){
+               return NULL;
+       }
+       if(i < maxfirst){
+               //\88ê\82Â\96Ú\82Ì\8bó\82«\97Ì\88æ
+               return (PAGEINFO *)(FIRST_BEGIN + i * sizeof(PAGEINFO));
+       }else{
+               return (PAGEINFO *)(SECOND_BEGIN + (i - maxfirst) * sizeof(PAGEINFO));
+       }
+}
+
+DWORD MemMan::getpageaddr(DWORD i){
+       if(pagecount <= i){
+               return -1;
+       }
+       if(FIRST_BEGIN + i * PAGE_SIZE < FIRST_END){
+               return FIRST_BEGIN + i * PAGE_SIZE;
+       }else{
+               return SECOND_BEGIN + (i - (FIRST_END - FIRST_BEGIN) / PAGE_SIZE) * PAGE_SIZE;
+       }
+}
+
+DWORD MemMan::getpageindex(DWORD addr){
+       DWORD pageindex = 0;
+       if(addr < FIRST_END){
+               pageindex = (addr - FIRST_BEGIN) / PAGE_SIZE;
+       }else{
+               pageindex = (FIRST_END - FIRST_BEGIN) / PAGE_SIZE + (addr - SECOND_BEGIN) / PAGE_SIZE;
+       }
+       return pageindex;
+}
+
+DWORD MemMan::malloc(bool unpageoutable, bool system, DWORD pid, DWORD count){
+       for(int i = 0; i < pagecount - count + 1; i++){
+               bool allocable = true;
+               for(DWORD j = 0; j < count; j++){
+                       if(getpageinfo(i + j)->commited){
+                               allocable = false;
+                               break;
+                       }
+               }
+               if(allocable){
+                       for(DWORD j = 0; j < count; j++){
+                               //debugprint("malloc phy:%p\n", getpageaddr(i + j));
+                               PAGEINFO &pi = *getpageinfo(i + j);
+                               pi.commited = 1;
+                               pi.unpageoutable = unpageoutable;
+                               pi.pid = pid;
+                               pi.system = system;
+                       }
+
+                       return getpageaddr(i);
+               }
+       }
+}
+
+void MemMan::free(DWORD addr, DWORD count){
+       DWORD pageindex = getpageindex(addr);
+       for(DWORD i = 0; i < count; i++){
+               //debugprint("free phy:%p\n", getpageaddr(pageindex + i));
+               getpageinfo(pageindex + i)->commited = 0;
+       }
+}
+
+
+DWORD MemMan::memtest(DWORD start, DWORD end)
+{
+       bool flg486 = false;
+       DWORD eflg, cr0, i;
+
+       /* 386\82©\81A486\88È\8d~\82È\82Ì\82©\82Ì\8am\94F */
+       eflg = io_load_eflags();
+       eflg |= EFLAGS_AC_BIT; /* AC-bit = 1 */
+       io_store_eflags(eflg);
+       eflg = io_load_eflags();
+       if ((eflg & EFLAGS_AC_BIT) != 0) { /* 386\82Å\82ÍAC=1\82É\82µ\82Ä\82à\8e©\93®\82Å0\82É\96ß\82Á\82Ä\82µ\82Ü\82¤ */
+               flg486 = true;
+       }
+       eflg &= ~EFLAGS_AC_BIT; /* AC-bit = 0 */
+       io_store_eflags(eflg);
+
+       if (flg486) {
+               cr0 = load_cr0();
+               cr0 |= CR0_CACHE_DISABLE; /* \83L\83\83\83b\83V\83\85\8bÖ\8e~ */
+               store_cr0(cr0);
+       }
+
+       i = memtest_sub(start, end);
+
+       if (flg486) {
+               cr0 = load_cr0();
+               cr0 &= ~CR0_CACHE_DISABLE; /* \83L\83\83\83b\83V\83\85\8b\96\89 */
+               store_cr0(cr0);
+       }
+
+       return i;
+}
+
+DWORD MemMan::memtest_sub(DWORD start, DWORD end)
+{
+       volatile DWORD i, *p, old, pat0 = 0xaa55aa55, pat1 = 0x55aa55aa;
+       for (i = start; i <= end; i += 0x1000) {
+               p = (DWORD *) (i + 0xffc);
+               old = *p;                       /* \82¢\82\82é\91O\82Ì\92l\82ð\8ao\82¦\82Ä\82¨\82­ */
+               *p = pat0;                      /* \82½\82ß\82µ\82É\8f\91\82¢\82Ä\82Ý\82é */
+               *p ^= 0xffffffff;       /* \82»\82µ\82Ä\82»\82ê\82ð\94½\93]\82µ\82Ä\82Ý\82é */
+               if (*p != pat1) {       /* \94½\93]\8c\8b\89Ê\82É\82È\82Á\82½\82©\81H */
+not_memory:
+                       *p = old;
+                       break;
+               }
+               *p ^= 0xffffffff;       /* \82à\82¤\88ê\93x\94½\93]\82µ\82Ä\82Ý\82é */
+               if (*p != pat0) {       /* \8c³\82É\96ß\82Á\82½\82©\81H */
+                       goto not_memory;
+               }
+               *p = old;                       /* \82¢\82\82Á\82½\92l\82ð\8c³\82É\96ß\82· */
+       }
+       return i;
+}
+
+
+
+void *MemMan::sys_malloc(size_t size){
+       MEMINFO m;
+       m.addr = malloc(true, true, 0, (size + PAGE_SIZE - 1) / PAGE_SIZE);
+       m.size = size;
+       minfo->Add(m);
+       debugprint("malloced:%p %p %p\n", m.addr, m.size, (size + PAGE_SIZE - 1) / PAGE_SIZE);
+
+       return (void *)m.addr;
+}
+
+void MemMan::sys_free(void *p){
+       DWORD i = 0;
+       for(i = 0; i < minfo->GetCount(); i++){
+               if((*minfo)[i]->addr == (DWORD)p){
+                       break;
+               }
+       }
+       if(i == minfo->GetCount()){
+               debugprint("sys_free error");
+               hung();
+               return;
+       }
+       MEMINFO m = *((*minfo)[i]);
+       free(m.addr, (m.size + PAGE_SIZE - 1) / PAGE_SIZE);
+       debugprint("freed:%p %p\n", m.addr, m.size);
+
+       minfo->Remove(i);
+}
diff --git a/haribote/MemMan.h b/haribote/MemMan.h
new file mode 100644 (file)
index 0000000..92d42f7
--- /dev/null
@@ -0,0 +1,74 @@
+#pragma once
+#include <new>
+#include "typedefs.h"
+//#include "ProcessMan.h"
+
+template <class> class Vector;
+
+
+class MemMan
+{
+public:
+       static void Init();
+       static MemMan &Inst(){return *(MemMan *)buf;}
+
+private:
+       MemMan(void);
+       ~MemMan(void);
+       static BYTE buf[];
+       static void* operator new(size_t size, void* pbuf){ return pbuf; }
+
+#pragma pack(push, 1)
+       struct PAGEINFO{
+               BYTE commited:1;
+               BYTE unpageoutable:1;
+               BYTE system:1;
+               DWORD pid;
+       };
+#pragma pack(pop)
+       int pages_for_pageinfo, maxfirst, pagecount;
+       static const DWORD FIRST_BEGIN = 0x00001000;
+       static const DWORD FIRST_END = 0x0009f000;
+       static const DWORD SECOND_BEGIN = 0x00400000;
+
+       
+       PAGEINFO *getpageinfo(DWORD i);
+       DWORD getpageaddr(DWORD i);
+       DWORD getpageindex(DWORD addr);
+
+public:
+       DWORD malloc(bool unpageoutable, bool system, DWORD pid, DWORD count = 1);
+       void free(DWORD addr, DWORD count = 1);
+
+       static DWORD neccesarypagecount(DWORD size){
+               return (size + PAGE_SIZE - 1) / PAGE_SIZE;
+       }
+private:
+       DWORD memsize;
+
+       DWORD memtest(DWORD start, DWORD end);
+       DWORD memtest_sub(DWORD start, DWORD end);
+
+public:
+       void *sys_malloc(size_t size);
+       void sys_free(void *p);
+private:
+
+       struct MEMINFO{
+               DWORD addr, size;
+       };
+       Vector<MEMINFO> *minfo;
+
+};
+
+
+class phymemdeleter {
+       DWORD count;
+public:
+       phymemdeleter(DWORD count = 1):count(count){
+       }
+       template <class T>
+       void operator ()(T *p){
+               MemMan::Inst().free((DWORD)p, count);
+       }
+};
diff --git a/haribote/ProcessMan.cpp b/haribote/ProcessMan.cpp
new file mode 100644 (file)
index 0000000..650617e
--- /dev/null
@@ -0,0 +1,208 @@
+#include "ProcessMan.h"
+#include "filesystem.h"
+#include "desctable.h"
+#include "debug.h"
+#include "naskfunc.h"
+#include <string.h>
+
+BYTE ProcessMan::buf[sizeof(ProcessMan)];
+
+void ProcessMan::Init(){
+       new ((void *)buf) ProcessMan();
+}
+
+ProcessMan::ProcessMan(void)
+       :curpid(1), plist(0), sysdll(0)
+{
+       //Process sys(0, SYSTEM_PAGE_DIRECTORY_PHY);
+       //plist.Add(sys);
+
+       //sysdll.Add(DLL(L"c:\\windows\\system32\\ntdll.dll"));
+       sysdll.Add(DLL(L"c:\\windows\\system32\\ntdll.dll"));
+}
+
+
+ProcessMan::~ProcessMan(void)
+{
+}
+
+
+void ProcessMan::CreateProcess(const wchar_t *filename){
+       //FileSystem::File *file = FileSystem::Inst().CreateFile(filename, 0, 0, 0, 0, 0, 0);
+       DWORD newpid = curpid++;
+       DWORD pagedir = MemMan::Inst().malloc(true, true, newpid);
+
+       Process p(newpid, pagedir, sysdll);
+
+       plist.Add(p);
+}
+
+
+Process::Process(DWORD pid, DWORD cr3, Vector<DLL> &sysdll):pid(pid),cr3(cr3),MainThread(NULL){
+       DWORD *ppagedir = getppagedir();
+       for(int i = 0; i < 0x400; i++){
+               ppagedir[i] = 0;
+       }
+
+       //dt->set_gatedesc();
+       for(DWORD i = 0; i < sysdll.GetCount(); i++){
+               sysdll[i]->setpagedir(this);
+       }
+
+
+       DWORD eip = 0;
+       if(!sysdll[0]->getprocaddr("entry", &eip)){
+               debugprint("ntdll does not have func 'entry'");
+               hung();
+       }
+       MainThread = ThreadMan::Inst().CreateThread(this, eip);
+
+}
+
+Process::~Process(){
+}
+
+DWORD Process::VirtualAlloc(DWORD addr, bool phy, DWORD phyaddr, bool isreadonly
+       , DWORD pagecount, bool reserve, bool onlycommit)
+{
+       if(onlycommit){
+               for(DWORD i = 0; i < pagecount; i++){
+                       DWORD *pagetableent = getpagetableent(addr + i * PAGE_SIZE);
+                       *pagetableent |= ePAGE_TABLE_ENT::COMMIT;
+                       
+               }
+       }else{
+               DWORD i = addr;
+               for(i = addr; i < END_OF_VMEM; i += PAGE_SIZE){
+                       bool empty = true;
+                       DWORD j = 0;
+                       for(j = 0; j < pagecount; j++){
+                               DWORD *pagetableent = getpagetableent(i + j * PAGE_SIZE);
+                               if(*pagetableent & ePAGE_TABLE_ENT::RESERVE){
+                                       //\97\\96ñ\8dÏ\82Ý
+                                       empty = false;
+                                       break;
+                               }else{
+                                       //\90V\82½\82É\83R\83~\83b\83g\82Å\82«\82é
+                               }
+                       }
+                       if(empty){
+                               break;
+                       }
+                       i += j * PAGE_SIZE;
+               }
+               if(i >= END_OF_VMEM){
+                       return 0;
+               }
+               //DWORD *pagetableent = getpagetableent(addr);
+               for(DWORD j = 0; j < pagecount; j++){
+                       DWORD *pagetableent = getpagetableent(i + j * PAGE_SIZE);
+                       //\90V\82½\82É\83R\83~\83b\83g\82·\82é
+                       *pagetableent |= 0;
+                       if(!reserve){
+                               //\96{\93\96\82É\97\\96ñ\82Ì\82Æ\82«\82ÍRESERVE\82ÆCOMMIT\82ð\97¼\95û\97§\82Ä\82é
+                               *pagetableent |= ePAGE_TABLE_ENT::COMMIT;
+                       }
+                       *pagetableent |= ePAGE_TABLE_ENT::RESERVE;
+                       *pagetableent |= (isreadonly ? 0 : ePAGE_TABLE_ENT::READ_WRITE);
+                       if(phy){
+                               //\95¨\97\9d\83A\83h\83\8c\83X\82ª\8ew\92è\82³\82ê\82Ä\82¢\82é\82Æ\82«\82Í\82»\82ê\82ð\8ew\82·\82æ\82¤\82É\82·\82é
+                               *pagetableent |= phyaddr;
+                       }else{
+                               //\8dÅ\8f\89\82Ì#PF\8e\9e\82É\95¨\97\9d\83\81\83\82\83\8a\82ð\8a\84\82è\93\96\82Ä\82é
+                               *pagetableent |= ePAGE_TABLE_ENT::NEW_PAGE;
+                       }
+               }
+       }else{
+       }
+}
+
+DWORD *Process::getpagetableent(DWORD addr){
+       DWORD *ppagedir = getppagedir();
+       DWORD *pagedir = &ppagedir[addr >> 22];
+       if(*pagedir & ePAGE_DIR_ENT::PRESENT){
+               //\83f\83B\83\8c\83N\83g\83\8a\83G\83\93\83g\83\8a(\83y\81[\83W\83e\81[\83u\83\8b)\82ª\8aù\82É\91\8dÝ\82µ\82Ä\82¢\82½\82ç\82à\82¤\8dì\82ç\82È\82¢
+       }else{
+               //\83y\81[\83W\83e\81[\83u\83\8b\82ª\82È\82¢\82Ì\82Å\8dì\90¬
+               *pagedir = 0;
+               *pagedir |= ePAGE_DIR_ENT::PRESENT;
+               *pagedir |= ePAGE_DIR_ENT::READ_WRITE;
+               //*pagedir |= ePAGE_DIR_ENT::;
+               DWORD *pagetable = (DWORD *)MemMan::Inst().malloc(true, true, pid);
+               for(int i = 0; i < 0x400; i++){
+                       pagetable[i] = 0;
+               }
+               *pagedir |= ((DWORD)pagetable) & ~0xfff;
+       }
+       DWORD *pagetable = (DWORD *)((*pagedir) & ~0xfff);
+       DWORD *pagetableent = &pagetable[(addr >> 12) & 0x3ff];
+       return pagetableent;
+}
+
+
+DLL::DLL(const wchar_t *filename){
+       DWORD e_lfanew = 0;
+       DWORD image_base = 0;
+       file.reset(FileSystem::Inst().CreateFile(filename, 0, 0, 0, 0, 0, 0));
+       if(file.get() == NULL){
+               debugprint("could not open file in DLL::DLL");
+               hung();
+       }
+
+       header.reset((BYTE *)MemMan::Inst().malloc(true, true, 0)
+               , phymemdeleter(1));
+       file->Read(header.get(), PAGE_SIZE < file->Size() ? PAGE_SIZE : file->Size());
+
+       DWORD count = MemMan::neccesarypagecount(nt()->OptionalHeader.SizeOfImage);
+       BYTE *newheader = (BYTE *)MemMan::Inst().malloc(true, true, 0
+               , count);
+       debugprint("size:%p %p\n", nt()->OptionalHeader.SizeOfImage, count);
+
+       memset(newheader, 0, count * PAGE_SIZE);
+       file->Seek(0, FileSystem::File::SEEK_ORG::SET);
+       file->Read(newheader
+               , nt()->OptionalHeader.SizeOfHeaders < file->Size() 
+               ? nt()->OptionalHeader.SizeOfHeaders : file->Size());
+       debugprint("size2:%p\n", nt()->OptionalHeader.SizeOfHeaders);
+
+       header.reset(newheader, phymemdeleter(count));
+
+       //debugprint("test:%c%c %p\n", header.get(), header.get() + 1, nt()->FileHeader.NumberOfSections);
+
+       for(int i = 0; i < nt()->FileHeader.NumberOfSections; i++){
+               debugprint("s:%d %d %d\n", i, sec(i)->VirtualAddress, sec(i)->SizeOfRawData);
+               file->Seek(sec(i)->PointerToRawData, FileSystem::File::SEEK_ORG::SET);
+               file->Read(header.get() + sec(i)->VirtualAddress, sec(i)->SizeOfRawData);
+       }
+}
+
+DLL::~DLL(){
+}
+
+bool DLL::getprocaddr(const char *name, DWORD *addr){
+       IMAGE_EXPORT_DIRECTORY *e = (IMAGE_EXPORT_DIRECTORY *)(header.get()
+               + nt()->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
+       bool found = false;
+       debugprint("get:%p %p %p\n", e->AddressOfFunctions, e->AddressOfNameOrdinals, e->Base);
+       debugprint("dllname:%s\n", e->Name + header.get());
+
+       DWORD *names = (DWORD *)(header.get() + e->AddressOfNames);
+       for(DWORD i = 0; i < e->NumberOfNames; i++){
+               char *s = (char *)(header.get() + names[i]);
+               //debugprint("%s\n", s);
+               if(strcmp(s, name) == 0){
+                       WORD *nameords = (WORD *)(header.get() + e->AddressOfNameOrdinals);
+                       *addr = ((DWORD *)(header.get() + e->AddressOfFunctions))[nameords[i]];
+                       *addr += nt()->OptionalHeader.ImageBase;
+                       found = true;
+                       break;
+               }
+       }
+       return found;
+}
+
+
+void DLL::setpagedir(Process *p){
+       DWORD base = nt()->OptionalHeader.ImageBase;
+       p->VirtualAlloc(base, true, (DWORD)header.get(), true);
+}
diff --git a/haribote/ProcessMan.h b/haribote/ProcessMan.h
new file mode 100644 (file)
index 0000000..2ca8c34
--- /dev/null
@@ -0,0 +1,119 @@
+#pragma once
+#include "typedefs.h"
+#include "Vector.h"
+#include "FileSystem.h"
+#include "desctable.h"
+#include "ThreadMan.h"
+#include "MemMan.h"
+#include <boost\shared_ptr.hpp>
+
+namespace ePAGE_DIR_ENT{
+enum ePAGE_DIR_ENT{
+       PRESENT = 1 << 0,
+       READ_WRITE = 1 << 1,
+       USER_SUPER_VISOR = 1 << 2,
+       ACCESS = 1 << 5,
+       DIRTY = 1 << 6,
+       PAGE_SIZE_4M = 1 << 7,
+       GLOBAL = 1 << 8
+};
+}
+
+namespace ePAGE_TABLE_ENT{
+enum ePAGE_TABLE_ENT{
+       PRESENT = 1 << 0,
+       READ_WRITE = 1 << 1,
+       USER_SUPER_VISOR = 1 << 2,
+       USABLE1 = 1 << 9,
+       COMMIT = USABLE1,
+       USABLE2 = 1 << 10,
+       RESERVE = USABLE2,
+       USABLE3 = 1 << 11,
+       NEW_PAGE = USABLE3
+};
+}
+
+const DWORD END_OF_VMEM = 0x80000000;
+
+
+class Process;
+
+class DLL{
+public:
+       DLL(const wchar_t *filename);
+       ~DLL();
+
+       void setpagedir(Process *p);
+       bool getprocaddr(const char *name, DWORD *addr);
+private:
+       //struct SECTION{
+       //      BYTE *phyaddr;
+       //      DWORD size;
+       //};
+       //Vector<SECTION> sections;
+       boost::shared_ptr<FileSystem::File> file;
+       boost::shared_ptr<BYTE> header;
+       IMAGE_DOS_HEADER *dos(){return (IMAGE_DOS_HEADER *)header.get();}
+       IMAGE_NT_HEADERS *nt(){return (IMAGE_NT_HEADERS *)(header.get() + dos()->e_lfanew);}
+       IMAGE_SECTION_HEADER *sec(DWORD i = 0){
+               return (IMAGE_SECTION_HEADER *)(header.get() + dos()->e_lfanew
+                        + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * i);
+       }
+
+
+};
+
+class Process{
+public:
+       Process(DWORD pid, DWORD cr3, Vector<DLL> &sysdll);
+       ~Process();
+
+       DWORD VirtualAlloc(DWORD addr, bool phy = false
+               , DWORD phyaddr = 0, bool isreadonly = false
+               , DWORD pagecount = 1, bool reserve = false, bool onlycommit = false);
+
+       DWORD *getppagedir(){
+               return (DWORD *)(cr3 & ~0x3fff);
+       }
+
+       DWORD getpid(){
+               return pid;
+       }
+
+       DWORD getcr3(){
+               return cr3;
+       }
+private:
+       DWORD pid;
+       DWORD cr3;
+
+       Thread *MainThread;
+
+       DWORD *getpagetableent(DWORD addr);
+};
+
+class ProcessMan
+{
+public:
+       static void Init();
+       static ProcessMan &Inst(){
+               return *(ProcessMan *)buf;
+       }
+
+       void CreateProcess(const wchar_t *filename);
+
+       Process *SysProcess(){
+               return plist.Get(0);
+       }
+private:
+       static BYTE buf[];
+       static void* operator new(size_t size, void* pbuf){ return pbuf; }
+       ProcessMan(void);
+       ~ProcessMan(void);
+
+       DWORD curpid;
+       Vector<Process> plist;
+
+       Vector<DLL> sysdll;
+};
+
diff --git a/haribote/ProcessMem.cpp b/haribote/ProcessMem.cpp
new file mode 100644 (file)
index 0000000..e9cbc33
--- /dev/null
@@ -0,0 +1,37 @@
+#include "ProcessMem.h"
+
+
+ProcessMem::ProcessMem(void):minfo(0)
+{
+}
+
+
+ProcessMem::~ProcessMem(void)
+{
+}
+
+
+void *ProcessMem::sys_malloc(size_t size){
+       count++;
+       minfo[count - 1].size = (size + 0x1000 - 1) / 0x1000 * 0x1000;
+       //return (void *)(minfo[count - 1].addr = alloc(minfo[count - 1].size));
+       return 0;
+}
+
+void ProcessMem::sys_free(void *p){
+       int i = 0;
+       for(i = 0; i < count; i++){
+               if(minfo[i].addr == (DWORD)p){
+                       break;
+               }
+       }
+       if(i == count){
+               debugprint("sys_free error");
+               hung();
+               return;
+       }
+       for(; i < count; i++){
+               minfo[i] = minfo[i + 1];
+       }
+       count--;
+}
diff --git a/haribote/ProcessMem.h b/haribote/ProcessMem.h
new file mode 100644 (file)
index 0000000..1fcbcee
--- /dev/null
@@ -0,0 +1,21 @@
+#pragma once
+#include "Vector.h"
+
+
+class ProcessMem
+{
+public:
+       ProcessMem(void);
+       ~ProcessMem(void);
+
+       void *sys_malloc(size_t size);
+       void sys_free(void *p);
+private:
+
+       struct MEMINFO{
+               DWORD addr, size;
+       };
+       Vector<MEMINFO> minfo;
+       int count;
+
+};
diff --git a/haribote/ThreadMan.cpp b/haribote/ThreadMan.cpp
new file mode 100644 (file)
index 0000000..1171c2f
--- /dev/null
@@ -0,0 +1,103 @@
+#include "ThreadMan.h"
+#include "debug.h"
+#include "typedefs.h"
+#include "ProcessMan.h"
+#include "naskfunc.h"
+#include <stdlib.h>
+#include <string.h>
+
+BYTE ThreadMan::buf[sizeof(ThreadMan)];
+
+
+Thread::Thread(Process *p, DWORD tid, DWORD eip)
+:p(p),tid(tid)
+{
+       DWORD gdtsize = 0x400, idtsize = 0x800;
+       dtbuf.reset((BYTE *)MemMan::Inst().malloc(true, false, p->getpid()));
+
+       DWORD dtva = p->VirtualAlloc(0xc0000000, true, (DWORD)dtbuf.get());
+
+       dt.init((DWORD)dtbuf.get(), ((DWORD)dtbuf.get()) + gdtsize
+               , gdtsize - 1, idtsize - 1);
+
+       TSS32 *tsslist = (TSS32 *)(((DWORD)dtbuf.get()) + gdtsize + idtsize);
+       tss.reset(&tsslist[0], placementdeleter());
+       systss.reset(&tsslist[1], placementdeleter());
+       memset(tss.get(), 0, sizeof(TSS32));
+       memset(systss.get(), 0, sizeof(TSS32));
+
+       debugprint("systss:%p\n", systss.get());
+
+       dt.init_app_gdtidt(tss.get(), systss.get());
+
+
+       //\83X\83^\83b\83N\97Ì\88æ\82Æ\82µ\82Ä1MB\83\8a\83U\81[\83u
+       DWORD esp = p->VirtualAlloc(0xf00000, false, 0, false, 0x100);
+       p->VirtualAlloc(esp, false, 0, false, 2, false, true);
+       
+       tss->ldtr = 0;
+       tss->iomap = 0x40000000;
+       tss->fs = tss->ds = tss->es = tss->gs = tss->ss = 1 << 3;
+       tss->cs = 2 << 3;
+       tss->esp = esp;
+       //tss->cr3 = p->getcr3();
+       tss->cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
+       tss->eflags = 0x00000202;
+       tss->eax = tss->ecx = tss->edx = tss->edi = tss->esi = tss->ebp = tss->ebx = 0;
+       tss->eip = eip;
+       tss->eax = dtva;
+       tss->ecx = p->getcr3();
+
+       systss->ldtr = 0;
+       systss->iomap = 0x40000000;
+       systss->cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
+}
+
+Thread::~Thread(){
+}
+
+
+void Thread::seteip(DWORD eip){
+       tss->eip = eip;
+}
+
+void Thread::SwitchThread(){
+       store_cr3(p->getcr3());
+       dt.load();
+       dt.load_systr();
+       dt.jump_to_task();
+}
+
+void ThreadMan::Init(void)
+{
+       new ((void *)buf) ThreadMan();
+}
+
+ThreadMan::ThreadMan(void)
+:thlist(0)
+{
+       curtid = 1;
+       curthread = 0;
+}
+
+
+ThreadMan::~ThreadMan(void)
+{
+}
+
+Thread *ThreadMan::CreateThread(Process *p, DWORD eip){
+       Thread t(p, curtid++, eip);
+       thlist.Add(t);
+       return thlist[thlist.GetCount() - 1];
+}
+
+void ThreadMan::SwitchThread(){
+       if(curthread == 0){
+               if(thlist.GetCount() < 1){
+                       return;
+               }
+               Thread *t = thlist[0];
+               t->SwitchThread();
+       }
+
+}
diff --git a/haribote/ThreadMan.h b/haribote/ThreadMan.h
new file mode 100644 (file)
index 0000000..566bd8c
--- /dev/null
@@ -0,0 +1,57 @@
+#pragma once
+#include <boost\shared_ptr.hpp>
+#include "desctable.h"
+#include "MemMan.h"
+#include "Vector.h"
+
+class Process;
+
+class Thread{
+public:
+       Thread(Process *p, DWORD tid, DWORD eip);
+       ~Thread();
+
+       void seteip(DWORD eip);
+       const BYTE *gettss(){
+               return (BYTE *)tss.get();
+       }
+       Process *GetProcess(){
+               return p;
+       }
+
+       //\82±\82Ì\83X\83\8c\83b\83h\82Ö\83X\83C\83b\83`\82·\82é
+       void SwitchThread();
+       
+private:
+       boost::shared_ptr<BYTE> dtbuf;
+       boost::shared_ptr<TSS32> tss;
+       boost::shared_ptr<TSS32> systss;
+       GDT_IDT dt;
+       Process *p;
+       DWORD tid;
+};
+
+class ThreadMan
+{
+public:
+       static void Init();
+       static ThreadMan &Inst(){
+               return *(ThreadMan *)buf;
+       }
+
+
+       Thread *CreateThread(Process *p, DWORD eip);
+
+       void SwitchThread();
+private:
+       static BYTE buf[];
+       static void* operator new(size_t size, void* pbuf){ return pbuf; }
+       ThreadMan(void);
+       ~ThreadMan(void);
+
+       Vector<Thread> thlist;
+       DWORD curtid;
+
+       DWORD curthread;
+};
+
diff --git a/haribote/Vector.cpp b/haribote/Vector.cpp
new file mode 100644 (file)
index 0000000..617a140
--- /dev/null
@@ -0,0 +1,11 @@
+#include "Vector.h"
+
+
+Vector::Vector(void)
+{
+}
+
+
+Vector::~Vector(void)
+{
+}
diff --git a/haribote/Vector.h b/haribote/Vector.h
new file mode 100644 (file)
index 0000000..9ca85d6
--- /dev/null
@@ -0,0 +1,72 @@
+#pragma once
+#include "MemMan.h"
+#include <stdio.h>
+
+template<class T>
+class Vector
+{
+public:
+       Vector(DWORD pid):pid(pid), head(NULL){
+               head = (ELEM *)MemMan::Inst().malloc(true, true, pid);
+               head->next = NULL;
+               count = 0;
+       }
+       ~Vector(void){
+       }
+
+       void Add(T e){
+               DWORD elemnum = count / ELEM::numperelem;
+               ELEM **p = GetElem(elemnum);
+               if(count % ELEM::numperelem == 0){
+                       *p = (ELEM *)MemMan::Inst().malloc(true, true, pid);
+               }
+               (*p)->a[count % ELEM::numperelem] = e;
+               count++;
+       }
+
+       T *Get(DWORD index){
+               DWORD elemnum = index / ELEM::numperelem;
+               ELEM **p = GetElem(elemnum);
+               return &(*p)->a[index % ELEM::numperelem];
+       }
+
+       T* operator [](size_t i){
+               return Get(i);
+       }
+
+       DWORD GetCount(){
+               return count;
+       }
+
+       void Remove(DWORD index){
+               for(DWORD i = index; i < count - 1; i++){
+                       *Get(i) = *Get(i + 1);
+               }
+               Get(count - 1)->~T();
+               count--;
+               if(count % ELEM::numperelem == 0){
+                       DWORD elemnum = index / ELEM::numperelem;
+                       ELEM **p = GetElem(elemnum);
+                       MemMan::Inst().free((DWORD)*p);
+                       *p = NULL;
+               }
+       }
+private:
+       DWORD pid;
+       struct ELEM{
+               ELEM *next;
+               static const DWORD numperelem = (PAGE_SIZE - sizeof(ELEM *)) / sizeof(T);
+               T a[numperelem];
+       };
+       ELEM *head;
+       DWORD count;
+
+       ELEM **GetElem(DWORD elemnum){
+               ELEM **p = &head;
+               for(DWORD i = 0; i < elemnum; i++){
+                       p = &((*p)->next);
+               }
+               return p;
+       }
+};
+
diff --git a/haribote/asmhead.asm b/haribote/asmhead.asm
new file mode 100644 (file)
index 0000000..6206972
--- /dev/null
@@ -0,0 +1,274 @@
+; haribote-os boot asm
+; TAB=4
+
+
+VBEMODE EQU 0x118                      ; 1024 x 768 x 24bitカラー
+BITPERPIXEL EQU 24
+MEMORYMODEL EQU 6 ; 4ならインデックスカラー 6ならダイレクトカラー
+; (画面モード一覧)
+;      0x100 :  640 x  400 x 8bitカラー
+;      0x101 :  640 x  480 x 8bitカラー
+;      0x103 :  800 x  600 x 8bitカラー
+;      0x105 : 1024 x  768 x 8bitカラー
+;      0x107 : 1280 x 1024 x 8bitカラー
+;      0x118 : 1024 x 768 x 24bitカラー
+
+
+BOOTPACK_CODE EQU 0x00280000           ; bootpackのロード先
+
+;DSKCAC        EQU             0x00100000              ; ディスクキャッシュの場所
+;DSKCAC0       EQU             0x00008000              ; ディスクキャッシュの場所(リアルモード)
+
+SYSPAGEDIR EQU 0x00100000
+
+; BOOT_INFO関係
+BOOTDRIVE      EQU             0x0ff0                  ; ブートセクタが設定する
+LEDS   EQU             0x0ff1
+VMODE  EQU             0x0ff2                  ; 色数に関する情報。何ビットカラーか?
+SCRNX  EQU             0x0ff4                  ; 解像度のX
+SCRNY  EQU             0x0ff6                  ; 解像度のY
+VRAM   EQU             0x0ff8                  ; グラフィックバッファの開始番地
+
+               ORG             0xc200                  ; このプログラムがどこに読み込まれるのか
+
+;ブートデバイスを保存
+               mov [BOOTDRIVE], dl
+; VBE存在確認
+
+               MOV             AX,0x9000
+               MOV             ES,AX
+               MOV             DI,0
+               MOV             AX,0x4f00
+               INT             0x10
+               CMP             AX,0x004f
+               JNE             scrn320
+
+; VBEのバージョンチェック
+
+               MOV             AX,[ES:DI+4]
+               CMP             AX,0x0200
+               JB              scrn320                 ; if (AX < 0x0200) goto scrn320
+
+; 画面モード情報を得る
+
+               MOV             CX,VBEMODE
+               MOV             AX,0x4f01
+               INT             0x10
+               CMP             AX,0x004f
+               JNE             scrn320
+
+; 画面モード情報の確認
+
+               CMP             BYTE [ES:DI+0x19],BITPERPIXEL
+               JNE             scrn320
+               CMP             BYTE [ES:DI+0x1b],MEMORYMODEL
+               JNE             scrn320
+               MOV             AX,[ES:DI+0x00]
+               AND             AX,0x0080
+               JZ              scrn320                 ; モード属性のbit7が0だったのであきらめる
+
+; 画面モードの切り替え
+
+               MOV             BX,VBEMODE | 0x4000
+               MOV             AX,0x4f02
+               INT             0x10
+               MOV             BYTE [VMODE],BITPERPIXEL        ; 画面モードをメモする(C言語が参照する)
+               MOV             AX,[ES:DI+0x12]
+               MOV             [SCRNX],AX
+               MOV             AX,[ES:DI+0x14]
+               MOV             [SCRNY],AX
+               MOV             EAX,[ES:DI+0x28]
+               MOV             [VRAM],EAX
+               JMP             keystatus
+
+scrn320:
+               MOV             AL,0x13                 ; VGAグラフィックス、320x200x8bitカラー
+               MOV             AH,0x00
+               INT             0x10
+               MOV             BYTE [VMODE],8  ; 画面モードをメモする(C言語が参照する)
+               MOV             WORD [SCRNX],320
+               MOV             WORD [SCRNY],200
+               MOV             DWORD [VRAM],0x000a0000
+
+; キーボードのLED状態をBIOSに教えてもらう
+
+keystatus:
+               MOV             AH,0x02
+               INT             0x16                    ; keyboard BIOS
+               MOV             [LEDS],AL
+
+; PICが一切の割り込みを受け付けないようにする
+;      AT互換機の仕様では、PICの初期化をするなら、
+;      こいつをCLI前にやっておかないと、たまにハングアップする
+;      PICの初期化はあとでやる
+
+               MOV             AL,0xff
+               OUT             0x21,AL
+               NOP                                             ; OUT命令を連続させるとうまくいかない機種があるらしいので
+               OUT             0xa1,AL
+
+               CLI                                             ; さらにCPUレベルでも割り込み禁止
+
+; CPUから1MB以上のメモリにアクセスできるように、A20GATEを設定
+
+               CALL    waitkbdout
+               MOV             AL,0xd1
+               OUT             0x64,AL
+               CALL    waitkbdout
+               MOV             AL,0xdf                 ; enable A20
+               OUT             0x60,AL
+               CALL    waitkbdout
+               
+;[INSTRSET "i486p"]                            ; 486の命令まで使いたいという記述
+
+; プロテクトモード移行
+; page size = 4mb or 4kb (混在)  pys addr size = 32 bit
+
+               LGDT    [GDTR0]                 ; 暫定GDTを設定
+               MOV             EAX,CR0
+               ;or eax, 1 << 0x1f ; paging flag
+               ;AND            EAX,0x7fffffff  ; bit31を0にする(ページング禁止のため)
+               OR              EAX,0x00000001  ; bit0を1にする(プロテクトモード移行のため)
+               MOV             CR0,EAX
+               JMP     pipelineflush
+pipelineflush:
+;ページディレクトリ等の設定
+
+               xor eax, eax
+               mov ecx, 0
+               
+               align 16
+pagedirloop:
+               mov eax, ecx
+               shl eax, 22
+               or eax, ((1 << 8)|(1 << 7)|(1 << 1)|1)
+               mov [SYSPAGEDIR + 4 * ecx], eax
+               
+               inc ecx
+               cmp ecx, 0x400
+               jb pagedirloop
+
+
+;ページングの設定
+               mov eax, cr3
+               or eax, SYSPAGEDIR
+               mov cr3, eax
+               
+               mov eax, cr4
+               and eax, ~(1 << 5) ;  physical addr ext(pae) を無効に
+               or eax, 1 << 4; enable paging size ext(pse)
+               mov cr4, eax
+               
+               ;TLB無効化?
+               mov eax, cr3
+               mov cr3, eax
+               
+               MOV             EAX,CR0
+               or eax, 1 << 0x1f ; paging flag
+               MOV             CR0,EAX
+               JMP     pipelineflush2
+pipelineflush2:
+               
+               MOV             AX,1*8                  ;  読み書き可能セグメント32bit
+               MOV             DS,AX
+               MOV             ES,AX
+               MOV             FS,AX
+               MOV             GS,AX
+               MOV             SS,AX
+
+
+; ついでにディスクデータも本来の位置へ転送
+
+; まずはブートセクタから
+
+               ;MOV            ESI,0x7c00              ; 転送元
+               ;MOV            EDI,DSKCAC              ; 転送先
+               ;MOV            ECX,512/4
+               ;CALL   memcpy
+
+; asmheadでしなければいけないことは全部し終わったので、
+;      あとはbootpackに任せる
+
+; bootpackの起動
+
+               MOV     EBX, bootpack
+               MOV     ECX, [EBX+0x3C]   ; lfanew
+               add ebx, ecx          ; nt header 32
+               mov  ax, [ebx + 6]    ; number of section
+               mov ebp, [ebx + 0x28] ; entry point
+               add ebp, BOOTPACK_CODE
+               add ebx, 0xf8          ; section header
+readsection:
+               mov edi, [ebx + 0x0C] ; virtual addr
+               mov ecx, [ebx + 0x10] ; size of raw data
+               mov esi, [ebx + 0x14] ; pointer to raw data
+               add edi, BOOTPACK_CODE ; このセクションのコピー先
+               add esi, bootpack      ; コピー元
+               cld
+               
+               a32 rep movsb
+               ;db 0xf3
+               ;db 0x67
+               ;db 0xa4
+               ;rep dword movsb ; f3 a4
+               
+               
+               add ebx, 0x28 ; section header size
+               dec ax
+               jnz readsection
+               
+
+               MOV     ESP, 0x00380000 ; スタック初期値
+
+               push dword 2*8
+               push ebp
+               
+               ;sti
+               
+               
+               o32 retf 
+               ; call eipload
+; eipload:
+               ; pop ax
+               ; movzx eax, ax
+               ; mov [eax+0x15], ebp
+               ; mov dword [eax+0x19], 2*8
+
+               ; jmp dword 0:0
+               ; db 0,0
+
+waitkbdout:
+               IN               AL,0x64
+               AND              AL,0x02
+               IN               AL,0x60                ; から読み(受信バッファが悪さをしないように)
+               JNZ             waitkbdout              ; ANDの結果が0でなければwaitkbdoutへ
+               RET
+
+memcpy:
+               push eax
+memcpy_loop:
+               MOV             EAX,[ESI]
+               ADD             ESI,4
+               MOV             [EDI],EAX
+               ADD             EDI,4
+               SUB             ECX,1
+               JNZ             memcpy_loop                     ; 引き算した結果が0でなければmemcpyへ
+               pop eax
+               RET
+; memcpyはアドレスサイズプリフィクスを入れ忘れなければ、ストリング命令でも書ける
+
+
+               ALIGNB  16
+GDT0:
+               RESB    8                               ; ヌルセレクタ
+               db 0xff,0xff,0x00,0x00,0x00,0x92,0xcf,0x00      ; 読み書き可能セグメント32bit
+               ;db 0xff,0xff,0x00,0x00,0x28,0x9a,0x4f,0x00     ; 実行可能セグメント32bit(bootpack用)
+               db 0xff,0xff,0x00,0x00,0x00,0x9a,0xcf,0x00      ; 実行可能セグメント32bit(bootpack用)
+
+               DW              0
+GDTR0:
+               DW              8*3-1
+               DD              GDT0
+
+               ALIGNB  16
+bootpack:
diff --git a/haribote/asmhead.bin b/haribote/asmhead.bin
new file mode 100644 (file)
index 0000000..0352bf8
Binary files /dev/null and b/haribote/asmhead.bin differ
diff --git a/haribote/asmhead.lst b/haribote/asmhead.lst
new file mode 100644 (file)
index 0000000..a298150
--- /dev/null
@@ -0,0 +1,276 @@
+     1                                  ; haribote-os boot asm
+     2                                  ; TAB=4
+     3                                  
+     4                                  
+     5                                  VBEMODE EQU 0x118                      ; 1024 x 768 x 24bitカラー
+     6                                  BITPERPIXEL EQU 24
+     7                                  MEMORYMODEL EQU 6 ; 4ならインデックスカラー 6ならダイレクトカラー
+     8                                  ; (画面モード一覧)
+     9                                  ;      0x100 :  640 x  400 x 8bitカラー
+    10                                  ;      0x101 :  640 x  480 x 8bitカラー
+    11                                  ;      0x103 :  800 x  600 x 8bitカラー
+    12                                  ;      0x105 : 1024 x  768 x 8bitカラー
+    13                                  ;      0x107 : 1280 x 1024 x 8bitカラー
+    14                                  ;      0x118 : 1024 x 768 x 24bitカラー
+    15                                  
+    16                                  
+    17                                  BOOTPACK_CODE EQU 0x00280000           ; bootpackのロード先
+    18                                  
+    19                                  ;DSKCAC        EQU             0x00100000              ; ディスクキャッシュの場所
+    20                                  ;DSKCAC0       EQU             0x00008000              ; ディスクキャッシュの場所(リアルモード)
+    21                                  
+    22                                  SYSPAGEDIR EQU 0x00100000
+    23                                  
+    24                                  ; BOOT_INFO関係
+    25                                  BOOTDRIVE      EQU             0x0ff0                  ; ブートセクタが設定する
+    26                                  LEDS   EQU             0x0ff1
+    27                                  VMODE  EQU             0x0ff2                  ; 色数に関する情報。何ビットカラーか?
+    28                                  SCRNX  EQU             0x0ff4                  ; 解像度のX
+    29                                  SCRNY  EQU             0x0ff6                  ; 解像度のY
+    30                                  VRAM   EQU             0x0ff8                  ; グラフィックバッファの開始番地
+    31                                  
+    32                                                 ORG             0xc200                  ; このプログラムがどこに読み込まれるのか
+    33                                  
+    34                                  ;ブートデバイスを保存
+    35 00000000 8816F00F                               mov [BOOTDRIVE], dl
+    36                                  ; VBE存在確認
+    37                                  
+    38 00000004 B80090                                 MOV             AX,0x9000
+    39 00000007 8EC0                                   MOV             ES,AX
+    40 00000009 BF0000                                 MOV             DI,0
+    41 0000000C B8004F                                 MOV             AX,0x4f00
+    42 0000000F CD10                                   INT             0x10
+    43 00000011 3D4F00                                 CMP             AX,0x004f
+    44 00000014 7553                                   JNE             scrn320
+    45                                  
+    46                                  ; VBEのバージョンチェック
+    47                                  
+    48 00000016 268B4504                               MOV             AX,[ES:DI+4]
+    49 0000001A 3D0002                                 CMP             AX,0x0200
+    50 0000001D 724A                                   JB              scrn320                 ; if (AX < 0x0200) goto scrn320
+    51                                  
+    52                                  ; 画面モード情報を得る
+    53                                  
+    54 0000001F B91801                                 MOV             CX,VBEMODE
+    55 00000022 B8014F                                 MOV             AX,0x4f01
+    56 00000025 CD10                                   INT             0x10
+    57 00000027 3D4F00                                 CMP             AX,0x004f
+    58 0000002A 753D                                   JNE             scrn320
+    59                                  
+    60                                  ; 画面モード情報の確認
+    61                                  
+    62 0000002C 26807D1918                             CMP             BYTE [ES:DI+0x19],BITPERPIXEL
+    63 00000031 7536                                   JNE             scrn320
+    64 00000033 26807D1B06                             CMP             BYTE [ES:DI+0x1b],MEMORYMODEL
+    65 00000038 752F                                   JNE             scrn320
+    66 0000003A 268B05                                 MOV             AX,[ES:DI+0x00]
+    67 0000003D 258000                                 AND             AX,0x0080
+    68 00000040 7427                                   JZ              scrn320                 ; モード属性のbit7が0だったのであきらめる
+    69                                  
+    70                                  ; 画面モードの切り替え
+    71                                  
+    72 00000042 BB1841                                 MOV             BX,VBEMODE | 0x4000
+    73 00000045 B8024F                                 MOV             AX,0x4f02
+    74 00000048 CD10                                   INT             0x10
+    75 0000004A C606F20F18                             MOV             BYTE [VMODE],BITPERPIXEL        ; 画面モードをメモする(C言語が参照する)
+    76 0000004F 268B4512                               MOV             AX,[ES:DI+0x12]
+    77 00000053 A3F40F                                 MOV             [SCRNX],AX
+    78 00000056 268B4514                               MOV             AX,[ES:DI+0x14]
+    79 0000005A A3F60F                                 MOV             [SCRNY],AX
+    80 0000005D 26668B4528                             MOV             EAX,[ES:DI+0x28]
+    81 00000062 66A3F80F                               MOV             [VRAM],EAX
+    82 00000066 E92000                                 JMP             keystatus
+    83                                  
+    84                                  scrn320:
+    85 00000069 B013                                   MOV             AL,0x13                 ; VGAグラフィックス、320x200x8bitカラー
+    86 0000006B B400                                   MOV             AH,0x00
+    87 0000006D CD10                                   INT             0x10
+    88 0000006F C606F20F08                             MOV             BYTE [VMODE],8  ; 画面モードをメモする(C言語が参照する)
+    89 00000074 C706F40F4001                           MOV             WORD [SCRNX],320
+    90 0000007A C706F60FC800                           MOV             WORD [SCRNY],200
+    91 00000080 66C706F80F00000A00                     MOV             DWORD [VRAM],0x000a0000
+    92                                  
+    93                                  ; キーボードのLED状態をBIOSに教えてもらう
+    94                                  
+    95                                  keystatus:
+    96 00000089 B402                                   MOV             AH,0x02
+    97 0000008B CD16                                   INT             0x16                    ; keyboard BIOS
+    98 0000008D A2F10F                                 MOV             [LEDS],AL
+    99                                  
+   100                                  ; PICが一切の割り込みを受け付けないようにする
+   101                                  ;      AT互換機の仕様では、PICの初期化をするなら、
+   102                                  ;      こいつをCLI前にやっておかないと、たまにハングアップする
+   103                                  ;      PICの初期化はあとでやる
+   104                                  
+   105 00000090 B0FF                                   MOV             AL,0xff
+   106 00000092 E621                                   OUT             0x21,AL
+   107 00000094 90                                     NOP                                             ; OUT命令を連続させるとうまくいかない機種があるらしいので
+   108 00000095 E6A1                                   OUT             0xa1,AL
+   109                                  
+   110 00000097 FA                                     CLI                                             ; さらにCPUレベルでも割り込み禁止
+   111                                  
+   112                                  ; CPUから1MB以上のメモリにアクセスできるように、A20GATEを設定
+   113                                  
+   114 00000098 E8F600                                 CALL    waitkbdout
+   115 0000009B B0D1                                   MOV             AL,0xd1
+   116 0000009D E664                                   OUT             0x64,AL
+   117 0000009F E8EF00                                 CALL    waitkbdout
+   118 000000A2 B0DF                                   MOV             AL,0xdf                 ; enable A20
+   119 000000A4 E660                                   OUT             0x60,AL
+   120 000000A6 E8E800                                 CALL    waitkbdout
+   121                                                 
+   122                                  ;[INSTRSET "i486p"]                            ; 486の命令まで使いたいという記述
+   123                                  
+   124                                  ; プロテクトモード移行
+   125                                  ; page size = 4mb or 4kb (混在)  pys addr size = 32 bit
+   126                                  
+   127 000000A9 0F0116[DA01]                           LGDT    [GDTR0]                 ; 暫定GDTを設定
+   128 000000AE 0F20C0                                 MOV             EAX,CR0
+   129                                                 ;or eax, 1 << 0x1f ; paging flag
+   130                                                 ;AND            EAX,0x7fffffff  ; bit31を0にする(ページング禁止のため)
+   131 000000B1 660D01000000                           OR              EAX,0x00000001  ; bit0を1にする(プロテクトモード移行のため)
+   132 000000B7 0F22C0                                 MOV             CR0,EAX
+   133 000000BA E90000                                 JMP     pipelineflush
+   134                                  pipelineflush:
+   135                                  ;ページディレクトリ等の設定
+   136                                  
+   137 000000BD 6631C0                                 xor eax, eax
+   138 000000C0 66B900000000                           mov ecx, 0
+   139                                                 
+   140 000000C6 90<rept>                               align 16
+   141                                  pagedirloop:
+   142 000000D0 6689C8                                 mov eax, ecx
+   143 000000D3 66C1E016                               shl eax, 22
+   144 000000D7 660D83010000                           or eax, ((1 << 8)|(1 << 7)|(1 << 1)|1)
+   145 000000DD 676689048D00001000                     mov [SYSPAGEDIR + 4 * ecx], eax
+   146                                                 
+   147 000000E6 6641                                   inc ecx
+   148 000000E8 6681F900040000                         cmp ecx, 0x400
+   149 000000EF 72DF                                   jb pagedirloop
+   150                                  
+   151                                  
+   152                                  ;ページングの設定
+   153 000000F1 0F20D8                                 mov eax, cr3
+   154 000000F4 660D00001000                           or eax, SYSPAGEDIR
+   155 000000FA 0F22D8                                 mov cr3, eax
+   156                                                 
+   157 000000FD 0F20E0                                 mov eax, cr4
+   158 00000100 6625DFFFFFFF                           and eax, ~(1 << 5) ;  physical addr ext(pae) を無効に
+   159 00000106 660D10000000                           or eax, 1 << 4; enable paging size ext(pse)
+   160 0000010C 0F22E0                                 mov cr4, eax
+   161                                                 
+   162                                                 ;TLB無効化?
+   163 0000010F 0F20D8                                 mov eax, cr3
+   164 00000112 0F22D8                                 mov cr3, eax
+   165                                                 
+   166 00000115 0F20C0                                 MOV             EAX,CR0
+   167 00000118 660D00000080                           or eax, 1 << 0x1f ; paging flag
+   168 0000011E 0F22C0                                 MOV             CR0,EAX
+   169 00000121 E90000                                 JMP     pipelineflush2
+   170                                  pipelineflush2:
+   171                                                 
+   172 00000124 B80800                                 MOV             AX,1*8                  ;  読み書き可能セグメント32bit
+   173 00000127 8ED8                                   MOV             DS,AX
+   174 00000129 8EC0                                   MOV             ES,AX
+   175 0000012B 8EE0                                   MOV             FS,AX
+   176 0000012D 8EE8                                   MOV             GS,AX
+   177 0000012F 8ED0                                   MOV             SS,AX
+   178                                  
+   179                                  
+   180                                  ; ついでにディスクデータも本来の位置へ転送
+   181                                  
+   182                                  ; まずはブートセクタから
+   183                                  
+   184                                                 ;MOV            ESI,0x7c00              ; 転送元
+   185                                                 ;MOV            EDI,DSKCAC              ; 転送先
+   186                                                 ;MOV            ECX,512/4
+   187                                                 ;CALL   memcpy
+   188                                  
+   189                                  ; asmheadでしなければいけないことは全部し終わったので、
+   190                                  ;      あとはbootpackに任せる
+   191                                  
+   192                                  ; bootpackの起動
+   193                                  
+   194 00000131 66BB[E0010000]                         MOV     EBX, bootpack
+   195 00000137 67668B4B3C                             MOV     ECX, [EBX+0x3C]   ; lfanew
+   196 0000013C 6601CB                                 add ebx, ecx          ; nt header 32
+   197 0000013F 678B4306                               mov  ax, [ebx + 6]    ; number of section
+   198 00000143 67668B6B28                             mov ebp, [ebx + 0x28] ; entry point
+   199 00000148 6681C500002800                         add ebp, BOOTPACK_CODE
+   200 0000014F 6681C3F8000000                         add ebx, 0xf8          ; section header
+   201                                  readsection:
+   202 00000156 67668B7B0C                             mov edi, [ebx + 0x0C] ; virtual addr
+   203 0000015B 67668B4B10                             mov ecx, [ebx + 0x10] ; size of raw data
+   204 00000160 67668B7314                             mov esi, [ebx + 0x14] ; pointer to raw data
+   205 00000165 6681C700002800                         add edi, BOOTPACK_CODE ; このセクションのコピー先
+   206 0000016C 6681C6[E0010000]                       add esi, bootpack      ; コピー元
+   207 00000173 FC                                     cld
+   208                                                 
+   209 00000174 F367A4                                 a32 rep movsb
+   210                                                 ;db 0xf3
+   211                                                 ;db 0x67
+   212                                                 ;db 0xa4
+   213                                                 ;rep dword movsb ; f3 a4
+   214                                                 
+   215                                                 
+   216 00000177 6681C328000000                         add ebx, 0x28 ; section header size
+   217 0000017E 48                                     dec ax
+   218 0000017F 75D5                                   jnz readsection
+   219                                                 
+   220                                  
+   221 00000181 66BC00003800                           MOV     ESP, 0x00380000 ; スタック初期値
+   222                                  
+   223 00000187 666810000000                           push dword 2*8
+   224 0000018D 6655                                   push ebp
+   225                                                 
+   226                                                 ;sti
+   227                                                 
+   228                                                 
+   229 0000018F 66CB                                   o32 retf 
+   230                                                 ; call eipload
+   231                                  ; eipload:
+   232                                                 ; pop ax
+   233                                                 ; movzx eax, ax
+   234                                                 ; mov [eax+0x15], ebp
+   235                                                 ; mov dword [eax+0x19], 2*8
+   236                                  
+   237                                                 ; jmp dword 0:0
+   238                                                 ; db 0,0
+   239                                  
+   240                                  waitkbdout:
+   241 00000191 E464                                   IN               AL,0x64
+   242 00000193 2402                                   AND              AL,0x02
+   243 00000195 E460                                   IN               AL,0x60                ; から読み(受信バッファが悪さをしないように)
+   244 00000197 75F8                                   JNZ             waitkbdout              ; ANDの結果が0でなければwaitkbdoutへ
+   245 00000199 C3                                     RET
+   246                                  
+   247                                  memcpy:
+   248 0000019A 6650                                   push eax
+   249                                  memcpy_loop:
+   250 0000019C 67668B06                               MOV             EAX,[ESI]
+   251 000001A0 6681C604000000                         ADD             ESI,4
+   252 000001A7 67668907                               MOV             [EDI],EAX
+   253 000001AB 6681C704000000                         ADD             EDI,4
+   254 000001B2 6681E901000000                         SUB             ECX,1
+   255 000001B9 75E1                                   JNZ             memcpy_loop                     ; 引き算した結果が0でなければmemcpyへ
+   256 000001BB 6658                                   pop eax
+   257 000001BD C3                                     RET
+   258                                  ; memcpyはアドレスサイズプリフィクスを入れ忘れなければ、ストリング命令でも書ける
+   259                                  
+   260                                  
+   261 000001BE <res 00000002>                         ALIGNB  16
+   262          ******************       warning: uninitialized space declared in .text section: zeroing
+   263                                  GDT0:
+   264 000001C0 <res 00000008>                         RESB    8                               ; ヌルセレクタ
+   265          ******************       warning: uninitialized space declared in .text section: zeroing
+   266 000001C8 FFFF00000092CF00                       db 0xff,0xff,0x00,0x00,0x00,0x92,0xcf,0x00      ; 読み書き可能セグメント32bit
+   267                                                 ;db 0xff,0xff,0x00,0x00,0x28,0x9a,0x4f,0x00     ; 実行可能セグメント32bit(bootpack用)
+   268 000001D0 FFFF0000009ACF00                       db 0xff,0xff,0x00,0x00,0x00,0x9a,0xcf,0x00      ; 実行可能セグメント32bit(bootpack用)
+   269                                  
+   270 000001D8 0000                                   DW              0
+   271                                  GDTR0:
+   272 000001DA 1700                                   DW              8*3-1
+   273 000001DC [C0010000]                             DD              GDT0
+   274                                  
+   275                                                 ALIGNB  16
+   276                                  bootpack:
diff --git a/haribote/ata/ATAIO.H b/haribote/ata/ATAIO.H
new file mode 100644 (file)
index 0000000..57997cd
--- /dev/null
@@ -0,0 +1,849 @@
+#pragma once
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIO.H (driver's public data)
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+// See the make files EXAMPLE1.MAK and EXAMPLE2.MAK.
+//
+// This C source file is the header file for the for this driver
+// and is used in the ATAIOxxx.C files and must also be used
+// by any program using this driver code.
+//********************************************************************
+
+#define ATA_DRIVER_VERSION "16N"
+
+//**************************************************************
+//
+// Global defines -- ATA register and register bits.
+// command block & control block regs
+//
+//**************************************************************
+#include "dos.h"
+
+// These are the offsets into pio_reg_addrs[]
+
+#define CB_DATA  0   // data reg         in/out pio_base_addr1+0
+#define CB_ERR   1   // error            in     pio_base_addr1+1
+#define CB_FR    1   // feature reg         out pio_base_addr1+1
+#define CB_SC    2   // sector count     in/out pio_base_addr1+2
+#define CB_SN    3   // sector number    in/out pio_base_addr1+3
+#define CB_CL    4   // cylinder low     in/out pio_base_addr1+4
+#define CB_CH    5   // cylinder high    in/out pio_base_addr1+5
+#define CB_DH    6   // device head      in/out pio_base_addr1+6
+#define CB_STAT  7   // primary status   in     pio_base_addr1+7
+#define CB_CMD   7   // command             out pio_base_addr1+7
+#define CB_ASTAT 8   // alternate status in     pio_base_addr2+6
+#define CB_DC    8   // device control      out pio_base_addr2+6
+#define CB_DA    9   // device address   in     pio_base_addr2+7
+
+// error reg (CB_ERR) bits
+
+#define CB_ER_ICRC 0x80    // ATA Ultra DMA bad CRC
+#define CB_ER_BBK  0x80    // ATA bad block
+#define CB_ER_UNC  0x40    // ATA uncorrected error
+#define CB_ER_MC   0x20    // ATA media change
+#define CB_ER_IDNF 0x10    // ATA id not found
+#define CB_ER_MCR  0x08    // ATA media change request
+#define CB_ER_ABRT 0x04    // ATA command aborted
+#define CB_ER_NTK0 0x02    // ATA track 0 not found
+#define CB_ER_NDAM 0x01    // ATA address mark not found
+
+#define CB_ER_P_SNSKEY 0xf0   // ATAPI sense key (mask)
+#define CB_ER_P_MCR    0x08   // ATAPI Media Change Request
+#define CB_ER_P_ABRT   0x04   // ATAPI command abort
+#define CB_ER_P_EOM    0x02   // ATAPI End of Media
+#define CB_ER_P_ILI    0x01   // ATAPI Illegal Length Indication
+
+// ATAPI Interrupt Reason bits in the Sector Count reg (CB_SC)
+
+#define CB_SC_P_TAG    0xf8   // ATAPI tag (mask)
+#define CB_SC_P_REL    0x04   // ATAPI release
+#define CB_SC_P_IO     0x02   // ATAPI I/O
+#define CB_SC_P_CD     0x01   // ATAPI C/D
+
+// bits 7-4 of the device/head (CB_DH) reg
+
+#define CB_DH_LBA        0x40    // LBA bit
+#define CB_DH_DEV0       0x00    // select device 0
+#define CB_DH_DEV1       0x10    // select device 1
+#define CB_DH_OBSOLETE   0xa0    // bits 7 and 5 both 1 (obsolete)
+
+// status reg (CB_STAT and CB_ASTAT) bits
+
+#define CB_STAT_BSY  0x80  // busy
+#define CB_STAT_RDY  0x40  // ready
+#define CB_STAT_DF   0x20  // device fault
+#define CB_STAT_WFT  0x20  // write fault (old name)
+#define CB_STAT_SKC  0x10  // seek complete (only SEEK command)
+#define CB_STAT_SERV 0x10  // service (overlap/queued commands)
+#define CB_STAT_DRQ  0x08  // data request
+#define CB_STAT_CORR 0x04  // corrected (obsolete)
+#define CB_STAT_IDX  0x02  // index (obsolete)
+#define CB_STAT_ERR  0x01  // error (ATA)
+#define CB_STAT_CHK  0x01  // check (ATAPI)
+
+// device control reg (CB_DC) bits
+
+#define CB_DC_HOB    0x80  // High Order Byte (48-bit LBA)
+#define CB_DC_HD15   0x00  // bit 3 is reserved
+// #define CB_DC_HD15   0x08  // (old definition of bit 3)
+#define CB_DC_SRST   0x04  // soft reset
+#define CB_DC_NIEN   0x02  // disable interrupts
+
+// BMIDE registers and bits
+
+#define BM_COMMAND_REG    0            // offset to BM command reg
+#define BM_CR_MASK_READ    0x00           // read from memory
+#define BM_CR_MASK_WRITE   0x08           // write to memory
+#define BM_CR_MASK_START   0x01           // start transfer
+#define BM_CR_MASK_STOP    0x00           // stop transfer
+
+#define BM_STATUS_REG     2            // offset to BM status reg
+#define BM_SR_MASK_SIMPLEX 0x80           // simplex only
+#define BM_SR_MASK_DRV1    0x40           // drive 1 can do dma
+#define BM_SR_MASK_DRV0    0x20           // drive 0 can do dma
+#define BM_SR_MASK_INT     0x04           // INTRQ signal asserted
+#define BM_SR_MASK_ERR     0x02           // error
+#define BM_SR_MASK_ACT     0x01           // active
+
+#define BM_PRD_ADDR_LOW   4            // offset to prd addr reg low 16 bits
+#define BM_PRD_ADDR_HIGH  6            // offset to prd addr reg high 16 bits
+
+//**************************************************************
+//
+// Most mandtory and optional ATA commands
+//
+//**************************************************************
+
+#define CMD_CFA_ERASE_SECTORS            0xC0
+#define CMD_CFA_REQUEST_EXT_ERR_CODE     0x03
+#define CMD_CFA_TRANSLATE_SECTOR         0x87
+#define CMD_CFA_WRITE_MULTIPLE_WO_ERASE  0xCD
+#define CMD_CFA_WRITE_SECTORS_WO_ERASE   0x38
+#define CMD_CHECK_POWER_MODE1            0xE5
+#define CMD_CHECK_POWER_MODE2            0x98
+#define CMD_DEVICE_RESET                 0x08
+#define CMD_EXECUTE_DEVICE_DIAGNOSTIC    0x90
+#define CMD_FLUSH_CACHE                  0xE7
+#define CMD_FLUSH_CACHE_EXT              0xEA
+#define CMD_FORMAT_TRACK                 0x50
+#define CMD_IDENTIFY_DEVICE              0xEC
+#define CMD_IDENTIFY_DEVICE_PACKET       0xA1
+#define CMD_IDENTIFY_PACKET_DEVICE       0xA1
+#define CMD_IDLE1                        0xE3
+#define CMD_IDLE2                        0x97
+#define CMD_IDLE_IMMEDIATE1              0xE1
+#define CMD_IDLE_IMMEDIATE2              0x95
+#define CMD_INITIALIZE_DRIVE_PARAMETERS  0x91
+#define CMD_INITIALIZE_DEVICE_PARAMETERS 0x91
+#define CMD_NOP                          0x00
+#define CMD_PACKET                       0xA0
+#define CMD_READ_BUFFER                  0xE4
+#define CMD_READ_DMA                     0xC8
+#define CMD_READ_DMA_EXT                 0x25
+#define CMD_READ_MULTIPLE                0xC4
+#define CMD_READ_MULTIPLE_EXT            0x29
+#define CMD_READ_SECTORS                 0x20
+#define CMD_READ_SECTORS_EXT             0x24
+#define CMD_READ_VERIFY_SECTORS          0x40
+#define CMD_READ_VERIFY_SECTORS_EXT      0x42
+#define CMD_RECALIBRATE                  0x10
+#define CMD_SEEK                         0x70
+#define CMD_SET_FEATURES                 0xEF
+#define CMD_SET_MULTIPLE_MODE            0xC6
+#define CMD_SLEEP1                       0xE6
+#define CMD_SLEEP2                       0x99
+#define CMD_SMART                        0xB0
+#define CMD_STANDBY1                     0xE2
+#define CMD_STANDBY2                     0x96
+#define CMD_STANDBY_IMMEDIATE1           0xE0
+#define CMD_STANDBY_IMMEDIATE2           0x94
+#define CMD_WRITE_BUFFER                 0xE8
+#define CMD_WRITE_DMA                    0xCA
+#define CMD_WRITE_DMA_EXT                0x35
+#define CMD_WRITE_DMA_FUA_EXT            0x3D
+#define CMD_WRITE_MULTIPLE               0xC5
+#define CMD_WRITE_MULTIPLE_EXT           0x39
+#define CMD_WRITE_MULTIPLE_FUA_EXT       0xCE
+#define CMD_WRITE_SECTORS                0x30
+#define CMD_WRITE_SECTORS_EXT            0x34
+#define CMD_WRITE_VERIFY                 0x3C
+
+#define CMD_SRST                          256   // fake command code for Soft Reset
+
+//**************************************************************
+//
+// Public functions in ATAIOISA.C
+//
+//**************************************************************
+
+extern int dma_isa_config( int chan );
+
+extern int dma_isa_chs( int dev, int cmd,
+                        unsigned int fr, unsigned int sc,
+                        unsigned int cyl, unsigned int head, unsigned int sect,
+                        unsigned int seg, unsigned int off,
+                        long numSect );
+
+extern int dma_isa_lba28( int dev, int cmd,
+                          unsigned int fr, unsigned int sc,
+                          unsigned long lba,
+                          unsigned int seg, unsigned int off,
+                          long numSect );
+
+extern int dma_isa_lba48( int dev, int cmd,
+                          unsigned int fr, unsigned int sc,
+                          unsigned long lbahi, unsigned long lbalo,
+                          unsigned int seg, unsigned int off,
+                          long numSect );
+
+extern int dma_isa_packet( int dev,
+                           unsigned int cpbc,
+                           unsigned int cpseg, unsigned int cpoff,
+                           int dir,
+                           long dpbc,
+                           unsigned int dpseg, unsigned int dpoff,
+                           unsigned long lba );
+
+//**************************************************************
+//
+// Public data in ATAIOINT.C
+//
+//**************************************************************
+
+// Interrupt mode flag (interrupts in use if != 0 )
+// This value is READ ONLY - do not change.
+
+extern int int_use_intr_flag;
+
+//**************************************************************
+//
+// Public functions in ATAIOINT.C
+//
+//**************************************************************
+
+extern int int_enable_irq( int shared, int irqNum,
+                           unsigned int bmAddr, unsigned int ataAddr );
+
+extern void int_disable_irq( void );
+
+//**************************************************************
+//
+// Public data in ATAIOPCI.C
+//
+//**************************************************************
+
+extern int dma_pci_prd_type;     // type of PRD list to use
+#define PRD_TYPE_SIMPLE  0       // use PRD buffer, simple list
+#define PRD_TYPE_COMPLEX 1       // use PRD buffer, complex list
+#define PRD_TYPE_LARGE   2       // use I/O buffer, overlay I/O buffer
+
+extern long dma_pci_largeMaxB;   // max LARGE dma transfer size in bytes
+extern long dma_pci_largeMaxS;   // max LARGE dma transfer size in sectors
+extern unsigned long far * dma_pci_largePrdBufPtr;  // LARGE PRD buffer ptr
+extern unsigned char far * dma_pci_largeIoBufPtr;   // LARGE PRD I/O address
+
+extern unsigned long far * dma_pci_prd_ptr;  // current PRD buffer address
+extern int dma_pci_num_prd;                  // current number of PRD entries
+
+//**************************************************************
+//
+// Public functions in ATAIOPCI.C
+//
+//**************************************************************
+
+extern int dma_pci_config( unsigned int regAddr );
+
+extern void dma_pci_set_max_xfer( unsigned int seg, unsigned int off,
+                                  long bufSize );
+
+extern int dma_pci_chs( int dev, int cmd,
+                        unsigned int fr, unsigned int sc,
+                        unsigned int cyl, unsigned int head, unsigned int sect,
+                        unsigned int seg, unsigned int off,
+                        long numSect );
+
+extern int dma_pci_lba28( int dev, int cmd,
+                          unsigned int fr, unsigned int sc,
+                          unsigned long lba,
+                          unsigned int seg, unsigned int off,
+                          long numSect );
+
+extern int dma_pci_lba48( int dev, int cmd,
+                          unsigned int fr, unsigned int sc,
+                          unsigned long lbahi, unsigned long lbalo,
+                          unsigned int seg, unsigned int off,
+                          long numSect );
+
+extern int dma_pci_packet( int dev,
+                           unsigned int cpbc,
+                           unsigned int cpseg, unsigned int cpoff,
+                           int dir,
+                           long dpbc,
+                           unsigned int dpseg, unsigned int dpoff,
+                           unsigned long lba );
+
+//**************************************************************
+//
+// Public data in ATAIOPIO.C
+//
+//**************************************************************
+
+extern unsigned int pio_base_addr1;
+extern unsigned int pio_base_addr2;
+
+extern unsigned int pio_memory_seg;
+extern int pio_memory_dt_opt;
+#define PIO_MEMORY_DT_OPT0 0  // use Data reg at offset 0H
+#define PIO_MEMORY_DT_OPT8 1  // use Data reg at offset 8H
+#define PIO_MEMORY_DT_OPTB 2  // use Data reg at offsets 400-7ffH
+#define PIO_MEMORY_DT_OPTR 3  // randomly select these options
+
+extern unsigned int pio_bmide_base_addr;
+
+extern unsigned int pio_reg_addrs[10];
+
+extern unsigned char pio_last_write[10];
+extern unsigned char pio_last_read[10];
+
+extern int pio_xfer_width;
+
+//**************************************************************
+//
+// Public functions in ATAIOPIO.C
+//
+//**************************************************************
+
+// configuration functions
+
+extern void pio_set_iobase_addr( unsigned int base1,
+                                 unsigned int base2,
+                                 unsigned int base3 );
+
+extern void pio_set_memory_addr( unsigned int seg );
+
+// normal register read/write functions
+
+extern unsigned char pio_inbyte( unsigned int addr );
+
+extern void pio_outbyte( unsigned int addr, unsigned char data );
+
+extern unsigned int pio_inword( unsigned int addr );
+
+extern void pio_outword( unsigned int addr, unsigned int data );
+
+// Normal PIO DRQ block transfer functions. These functions
+// handle both PCMCIA memory mode and all I/O mode transfers.
+
+extern void pio_drq_block_in( unsigned int addrDataReg,
+                              unsigned int bufSeg, unsigned int bufOff,
+                              long wordCnt );
+
+extern void pio_drq_block_out( unsigned int addrDataReg,
+                               unsigned int bufSeg, unsigned int bufOff,
+                               long wordCnt );
+
+// These functions can be called directly but are normally
+// called by the pio_drq_block_in() and pio_drq_block_out()
+// functions. These functions handle only I/O mode transfers.
+
+extern void pio_rep_inbyte( unsigned int addrDataReg,
+                            unsigned int bufSeg, unsigned int bufOff,
+                            long byteCnt );
+
+extern void pio_rep_outbyte( unsigned int addrDataReg,
+                             unsigned int bufSeg, unsigned int bufOff,
+                             long byteCnt );
+
+extern void pio_rep_inword( unsigned int addrDataReg,
+                            unsigned int bufSeg, unsigned int bufOff,
+                            long wordCnt );
+
+extern void pio_rep_outword( unsigned int addrDataReg,
+                             unsigned int bufSeg, unsigned int bufOff,
+                             long wordCnt );
+
+extern void pio_rep_indword( unsigned int addrDataReg,
+                             unsigned int bufSeg, unsigned int bufOff,
+                             long dwordCnt );
+
+extern void pio_rep_outdword( unsigned int addrDataReg,
+                              unsigned int bufSeg, unsigned int bufOff,
+                              long dwordCnt );
+
+//**************************************************************
+//
+// Public data in ATAIOREG.C
+//
+//**************************************************************
+
+// last ATAPI command packet size and data
+
+extern int reg_atapi_cp_size;
+extern unsigned char reg_atapi_cp_data[16];
+
+// flag to control the ~110ms delay for ATAPI devices,
+// no delay if the flag is zero.
+
+extern int reg_atapi_delay_flag;
+
+// the values in these variables are placed into the Feature,
+// Sector Count, Sector Number and Device/Head register by
+// reg_packet() before the A0H command is issued.  reg_packet()
+// sets these variables to zero before returning.  These variables
+// are initialized to zero.  Only bits 3,2,1,0 of reg_atapi_reg_dh
+// are used.
+
+extern unsigned char reg_atapi_reg_fr;
+extern unsigned char reg_atapi_reg_sc;
+extern unsigned char reg_atapi_reg_sn;
+extern unsigned char reg_atapi_reg_dh;
+
+extern long reg_buffer_size;
+
+// Extended error information returned by
+// reg_reset(), reg_non_data_*(), reg_pio_data_in_*(),
+// reg_pio_data_out_*(), reg_packet(), dma_isa_*()
+// and dma_pci_*() functions.
+
+struct REG_CMD_INFO
+{
+   // entry type, flag and command code
+   unsigned char flg;         // see TRC_FLAG_xxx in ataio.h
+   unsigned char ct;          // see TRC_TYPE_xxx in ataio.h
+   unsigned char cmd;         // command code
+   // before regs
+   unsigned int  fr1;         // feature (8 or 16 bits)
+   unsigned int  sc1;         // sec cnt (8 or 16 bits)
+   unsigned char sn1;         // sec num
+   unsigned char cl1;         // cyl low
+   unsigned char ch1;         // cyl high
+   unsigned char dh1;         // device head
+   unsigned char dc1;         // device control
+   // after regs
+   unsigned char st2;         // status reg
+   unsigned char as2;         // alt status reg
+   unsigned char er2;         // error reg
+   unsigned int  sc2;         // sec cnt (8 or 16 bits)
+   unsigned char sn2;         // sec num
+   unsigned char cl2;         // cyl low
+   unsigned char ch2;         // cyl high
+   unsigned char dh2;         // device head
+   // driver error codes
+   unsigned char ec;          // detailed error code
+   unsigned char to;          // not zero if time out error
+   // additional result info
+   long totalBytesXfer;       // total bytes transfered
+   long drqPackets;           // number of PIO DRQ packets
+   long drqPacketSize;        // number of bytes in current DRQ block
+   unsigned int failbits;     // failure bits (protocol errors)
+      #define FAILBIT15 0x8000   // extra interrupts detected
+      #define FAILBIT14 0x4000
+      #define FAILBIT13 0x2000
+      #define FAILBIT12 0x1000
+      #define FAILBIT11 0x0800
+      #define FAILBIT10 0x0400
+      #define FAILBIT9  0x0200
+      #define FAILBIT8  0x0100   // SC( CD/IO bits) wrong at end of cmd
+      #define FAILBIT7  0x0080   // byte count odd at data packet xfer time
+      #define FAILBIT6  0x0040   // byte count wrong at data packet xfer time
+      #define FAILBIT5  0x0020   // SC (IO bit) wrong at data packet xfer time
+      #define FAILBIT4  0x0010   // SC (CD bit) wrong at data packet xfer time
+      #define FAILBIT3  0x0008   // byte count wrong at cmd packet xfer time
+      #define FAILBIT2  0x0004   // SC wrong at cmd packet xfer time
+      #define FAILBIT1  0x0002   // got interrupt before cmd packet xfer
+      #define FAILBIT0  0x0001   // slow setting BSY=1 or DRQ=1 after AO cmd
+   // sector count, multiple count, and CHS/LBA info
+   long ns;                   // number of sectors (sector count)
+   int mc;                    // multiple count
+   unsigned char lbaSize;     // size of LBA used
+      #define LBACHS 0           // last command used CHS
+      #define LBA28  28          // last command used 28-bit LBA
+      #define LBA32  32          // last command used 32-bit LBA (Packet)
+      #define LBA48  48          // last command used 48-bit LBA
+      #define LBA64  64          // future use?
+   unsigned long lbaLow1;     // lower 32-bits of LBA before
+   unsigned long lbaHigh1;    // upper 32-bits of LBA before
+   unsigned long lbaLow2;     // lower 32-bits of LBA after
+   unsigned long lbaHigh2;    // upper 32-bits of LBA after
+} ;
+
+extern struct REG_CMD_INFO reg_cmd_info;
+
+// Configuration data for device 0 and 1
+// returned by the reg_config() function.
+
+extern int reg_config_info[2];
+
+#define REG_CONFIG_TYPE_NONE  0
+#define REG_CONFIG_TYPE_UNKN  1
+#define REG_CONFIG_TYPE_ATA   2
+#define REG_CONFIG_TYPE_ATAPI 3
+
+// flag to control the slow data transfer option:
+// 0 = no slow data transfer
+// !0= slow data transfer before this DRQ packet
+
+extern long reg_slow_xfer_flag;
+
+// flag bits for 'incompatible' controllers and devices
+
+extern int reg_incompat_flags;   // see #defines...
+
+#define REG_INCOMPAT_DMA_DELAY   0x0001   // set to 1 for delay before
+                                          // and after stopping the
+                                          // DMA engine
+#define REG_INCOMPAT_DMA_POLL    0x0002   // set to 1 for no polling
+                                          // of Alt Status during
+                                          // DMA transfers
+
+#define REG_INCOMPAT_DEVREG      0x0004   // set bits 7 and 5 to
+                                          // to 1 in the Device
+                                          // (Drive/Head) register
+
+//**************************************************************
+//
+// Public functions in ATAIOREG.C
+//
+//**************************************************************
+
+// config and reset funcitons
+
+extern int reg_config( void );
+
+extern int reg_reset( int skipFlag, int devRtrn );
+
+// ATA Non-Data command funnctions (for CHS, LBA28 and LBA48)
+
+extern int reg_non_data_chs( int dev, int cmd,
+                             unsigned int fr, unsigned int sc,
+                             unsigned int cyl, unsigned int head, unsigned int sect );
+
+extern int reg_non_data_lba28( int dev, int cmd,
+                               unsigned int fr, unsigned int sc,
+                               unsigned long lba );
+
+extern int reg_non_data_lba48( int dev, int cmd,
+                               unsigned int fr, unsigned int sc,
+                               unsigned long lbahi, unsigned long lbalo );
+
+// PIO Data In/Out data transfer call back function
+
+extern void ( * reg_drq_block_call_back ) ( struct REG_CMD_INFO * );
+
+// ATA PIO Data In command functions (for CHS, LBA28 and LBA48)
+
+extern int reg_pio_data_in_chs( int dev, int cmd,
+                                unsigned int fr, unsigned int sc,
+                                unsigned int cyl, unsigned int head, unsigned int sect,
+                                unsigned int seg, unsigned int off,
+                                long numSect, int multiCnt );
+
+extern int reg_pio_data_in_lba28( int dev, int cmd,
+                                  unsigned int fr, unsigned int sc,
+                                  unsigned long lba,
+                                  unsigned int seg, unsigned int off,
+                                  long numSect, int multiCnt );
+
+extern int reg_pio_data_in_lba48( int dev, int cmd,
+                                  unsigned int fr, unsigned int sc,
+                                  unsigned long lbahi, unsigned long lbalo,
+                                  unsigned int seg, unsigned int off,
+                                  long numSect, int multiCnt );
+
+// ATA PIO Data Out command functions (for CHS, LBA28 and LBA48)
+
+extern int reg_pio_data_out_chs( int dev, int cmd,
+                                 unsigned int fr, unsigned int sc,
+                                 unsigned int cyl, unsigned int head, unsigned int sect,
+                                 unsigned int seg, unsigned int off,
+                                 long numSect, int multiCnt );
+
+extern int reg_pio_data_out_lba28( int dev, int cmd,
+                                   unsigned int fr, unsigned int sc,
+                                   unsigned long lba,
+                                   unsigned int seg, unsigned int off,
+                                   long numSect, int multiCnt );
+
+extern int reg_pio_data_out_lba48( int dev, int cmd,
+                                   unsigned int fr, unsigned int sc,
+                                   unsigned long lbahi, unsigned long lbalo,
+                                   unsigned int seg, unsigned int off,
+                                   long numSect, int multiCnt );
+
+// ATAPI Packet PIO function
+
+extern int reg_packet( int dev,
+                       unsigned int cpbc,
+                       unsigned int cpseg, unsigned int cpoff,
+                       int dir,
+                       long dpbc,
+                       unsigned int dpseg, unsigned int dpoff,
+                       unsigned long lba );
+
+//**************************************************************
+//
+// Public data in ATAIOTMR.C
+//
+//**************************************************************
+
+extern long tmr_time_out;           // command time out in seconds
+
+extern long tmr_cmd_start_time;     // command start time
+
+extern long tmr_1s_count;           // number of I/O port reads required
+                                    //    for a 1s delay
+extern long tmr_1ms_count;          // number of I/O port reads required
+                                    //    for a 1ms delay
+extern long tmr_1us_count;          // number of I/O port reads required
+                                    //    for a 1us delay
+extern long tmr_500ns_count;        // number of I/O port reads required
+                                    //    for a 500ns delay
+
+//**************************************************************
+//
+// Public functions in ATAIOTMR.C
+//
+//**************************************************************
+
+extern long tmr_read_bios_timer( void );
+
+extern void tmr_set_timeout( void );
+
+extern int tmr_chk_timeout( void );
+
+extern void tmr_get_delay_counts( void );
+
+extern void tmr_delay_1ms( long count );
+
+extern void tmr_delay_1us( long count );
+
+extern void tmr_delay_ata( void );
+
+extern void tmr_delay_atapi( int dev );
+
+extern void tmr_delay_xfer( void );
+
+//**************************************************************
+//
+// Public functions in ATAIOTRC.C
+//
+//**************************************************************
+
+// number of commands in lookup table
+#define TRC_NUM_CMDS 52
+
+// macro to convert a command code to a command index
+#define TRC_CC2NDX(cc) (trc_CmdCodeNdx[cc])
+
+// command code to command index table
+extern char trc_CmdCodeNdx[256];
+
+// command history trace entry types used by reg_cmd_info.flg,
+// trc_get_cmd_name(), etc.
+#define TRC_FLAG_EMPTY 0
+#define TRC_FLAG_SRST  1
+#define TRC_FLAG_ATA   2
+#define TRC_FLAG_ATAPI 3
+
+// command types (protocol types) used by reg_cmd_info.ct,
+// trc_cht_types(), etc.  this is a bit shift value.
+// NOTE: also see trc_get_type_name() in ATAIOTRC.C !
+#define TRC_TYPE_ALL    16    // trace all cmd types
+#define TRC_TYPE_NONE    0    // don't trace any cmd types
+#define TRC_TYPE_ADMAI   1    // ATA DMA In
+#define TRC_TYPE_ADMAO   2    // ATA DMA Out
+#define TRC_TYPE_AND     3    // ATA PIO Non-Data
+#define TRC_TYPE_APDI    4    // ATA PIO Data In
+#define TRC_TYPE_APDO    5    // ATA PIO Data Out
+#define TRC_TYPE_ASR     6    // ATA Soft Reset
+#define TRC_TYPE_PDMAI   7    // ATAPI DMA In
+#define TRC_TYPE_PDMAO   8    // ATAPI DMA Out
+#define TRC_TYPE_PND     9    // ATAPI PIO Non-Data
+#define TRC_TYPE_PPDI   10    // ATAPI PIO Data In
+#define TRC_TYPE_PPDO   11    // ATAPI PIO Data Out
+
+extern char * trc_get_type_name( char ct );
+
+extern char * trc_get_cmd_name( unsigned int cc );
+
+extern char * trc_get_st_bit_name( unsigned char st );
+
+extern char * trc_get_er_bit_name( unsigned char er );
+
+extern char * trc_get_err_name( int ec );
+
+extern void trc_err_dump1( void );
+extern char * trc_err_dump2( void );
+
+extern void trc_cht_types( int type );
+extern void trc_cht_dump0( void );
+extern void trc_cht_dump1( void );
+extern char * trc_cht_dump2( void );
+
+extern void trc_llt_dump0( void );
+extern void trc_llt_dump1( void );
+extern char * trc_llt_dump2( void );
+
+//********************************************************************
+//
+// The remainder of this file is ATADRVR's private data -
+// this data and these functions should not be used outside
+// of the ATADRVR source files.
+//
+//********************************************************************
+
+// macro used to read Alt Status, delay and read Alt Status again,
+// this delay (~400ns) is required by the older ATA command protocols.
+
+#define ATA_DELAY() {pio_inbyte(CB_ASTAT);tmr_delay_ata();pio_inbyte(CB_ASTAT);}
+
+// marco used to read Alt Status, delay and read Alt Status again,
+// this delay (~80ms) is required for some poorly designed ATAPI
+// device to get the status updated correctly.
+
+#define ATAPI_DELAY(dev) {pio_inbyte(CB_ASTAT);tmr_delay_atapi(dev);pio_inbyte(CB_ASTAT);}
+
+//**************************************************************
+//
+// Private data in ATAIOINT.C
+//
+//**************************************************************
+
+// Interrupt counter (incremented each time there is an interrupt)
+
+extern volatile int int_intr_cntr;
+
+// Interrupt flag (!= 0 if there was an interrupt)
+
+extern volatile int int_intr_flag;
+
+// BMIDE Status register I/O address
+
+extern unsigned int int_bmide_addr;
+
+// BMIDE Status register at time of last interrupt
+
+extern volatile unsigned char int_bm_status;
+
+// ATA Status register I/O address
+
+extern unsigned int int_ata_addr;
+
+// ATA Status register at time of last interrupt
+
+extern volatile unsigned char int_ata_status;
+
+//**************************************************************
+//
+// Private functions in ATAIOINT.C
+//
+//**************************************************************
+
+extern void int_save_int_vect( void );
+
+extern void int_restore_int_vect( void );
+
+//**************************************************************
+//
+// Private data in ATAIOSUB.C
+//
+//**************************************************************
+
+// Private functions in ATAIOSUB.C
+
+extern void sub_zero_return_data( void );
+extern void sub_setup_command( void );
+extern void sub_trace_command( void );
+extern int sub_select( int dev );
+extern unsigned char sub_readBusMstrCmd( void );
+extern unsigned char sub_readBusMstrStatus( void );
+extern void sub_writeBusMstrCmd( unsigned char x );
+extern void sub_writeBusMstrStatus( unsigned char x );
+
+//**************************************************************
+//
+// Private data in ATAIOTRC.C
+//
+//**************************************************************
+
+// low level trace entry type values
+
+#define TRC_LLT_NONE     0  // unused entry
+
+#define TRC_LLT_INB      1  // in byte
+#define TRC_LLT_OUTB     2  // out byte
+#define TRC_LLT_INW      3  // in word
+#define TRC_LLT_OUTW     4  // out word
+#define TRC_LLT_INSB     5  // rep in byte
+#define TRC_LLT_OUTSB    6  // rep out byte
+#define TRC_LLT_INSW     7  // rep in word
+#define TRC_LLT_OUTSW    8  // rep out word
+#define TRC_LLT_INSD     9  // rep in dword
+#define TRC_LLT_OUTSD   10  // rep out dword
+
+#define TRC_LLT_S_CFG   11  // start config
+#define TRC_LLT_S_RST   12  // start reset
+#define TRC_LLT_S_ND    13  // start ND cmd
+#define TRC_LLT_S_PDI   14  // start PDI cmd
+#define TRC_LLT_S_PDO   15  // start PDO cmd
+#define TRC_LLT_S_PI    16  // start packet cmd
+#define TRC_LLT_S_RWD   17  // start ata R/W DMA cmd
+#define TRC_LLT_S_PID   18  // start packet DMA cmd
+#define TRC_LLT_WINT    21  // wait for int
+#define TRC_LLT_INTRQ   22  // int received
+#define TRC_LLT_PNBSY   23  // poll for not busy
+#define TRC_LLT_PRDY    24  // poll for ready
+#define TRC_LLT_TOUT    25  // timeout
+#define TRC_LLT_ERROR   26  // error detected
+#define TRC_LLT_DELAY1  27  // delay ~110ms
+#define TRC_LLT_DELAY2  28  // delay 0-55ms
+#define TRC_LLT_E_CFG   31  // end   config
+#define TRC_LLT_E_RST   32  // end   reset
+#define TRC_LLT_E_ND    33  // end   ND cmd
+#define TRC_LLT_E_PDI   34  // end   PDI cmd
+#define TRC_LLT_E_PDO   35  // end   PDO cmd
+#define TRC_LLT_E_PI    36  // end   packet CMD
+#define TRC_LLT_E_RWD   37  // end   ata R/W DMA cmd
+#define TRC_LLT_E_PID   38  // end   packet DMA cmd
+
+#define TRC_LLT_DMA1    41  // enable/start ISA DMA channel
+#define TRC_LLT_DMA2    42  // poll the ISA DMA TC bit
+#define TRC_LLT_DMA3    43  // disable/stop ISA DMA channel
+
+#define TRC_LLT_DEBUG   51  // debug data
+#define TRC_LLT_P_CMD   52  // packet cmd code
+#define TRC_LLT_R_BM_CR 53  // read bus master cmd reg
+#define TRC_LLT_R_BM_SR 54  // read bus master status reg
+#define TRC_LLT_W_BM_CR 55  // write bus master cmd reg
+#define TRC_LLT_W_BM_SR 56  // write bus master status reg
+
+//**************************************************************
+//
+// Private functions in ATAIOTRC.C
+//
+//**************************************************************
+
+extern void trc_cht( void );
+
+extern void trc_llt( unsigned char addr,
+                     unsigned char data,
+                     unsigned char type );
+
+// end ataio.h
diff --git a/haribote/ata/ATAIOINT.C b/haribote/ata/ATAIOINT.C
new file mode 100644 (file)
index 0000000..088e32d
--- /dev/null
@@ -0,0 +1,378 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOINT.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-x, and ATA/ATAPI-x standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+//
+// This C source contains the low level interrupt set up and
+// interrupt handler functions.
+//********************************************************************
+
+#include <dos.h>
+
+#include "ataio.h"
+
+//*************************************************************
+//
+// Global interrupt mode data
+//
+//*************************************************************
+
+int int_use_intr_flag = 0;    // use INT mode if != 0
+
+volatile int int_intr_cntr;   // interrupt counter, incremented
+                              // each time there is an interrupt
+
+volatile int int_intr_flag;   // interrupt flag, incremented
+                              // for each device interrupt
+
+unsigned int int_bmide_addr;  // BMIDE status reg i/o address
+
+volatile unsigned char int_bm_status;     // BMIDE status
+
+unsigned int int_ata_addr;    // ATA status reg I/O address
+
+volatile unsigned char int_ata_status;    // ATA status
+
+//*************************************************************
+//
+// Local data
+//
+//*************************************************************
+
+// interrupt handler function info...
+
+static void interrupt ( far * int_org_int_vect ) ();  // save area for the
+                                                      // system's INT vector
+
+static void far interrupt int_handler( void );        // our INT handler
+
+// our interrupt handler's data...
+
+static int int_got_it_now = 0;      // != 0, our interrupt handler
+                                    //is installed now
+
+static int int_irq_number = 0;      // IRQ number in use, 1 to 15
+static int int_int_vector = 0;      // INT vector in use,
+                                    // INT 8h-15h and INT 70H-77H.
+static int int_shared = 0;          // shared flag
+
+// system interrupt controller data...
+
+#define PIC0_CTRL 0x20           // PIC0 i/o address
+#define PIC0_MASK 0x21           // PIC0 i/o address
+#define PIC1_CTRL 0xA0           // PIC1 i/o address
+#define PIC1_MASK 0xA1           // PIC1 i/o address
+
+#define PIC0_ENABLE_PIC1 0xFB    // mask to enable PIC1 in PIC0
+
+static int pic_enable_irq[8] =       // mask to enable
+   { 0xFE, 0xFD, 0xFB, 0xF7,     //   IRQ 0-7 in PIC 0 or
+     0xEF, 0xDF, 0xBF, 0x7F  };  //   IRQ 8-15 in PIC 1
+
+#define PIC_EOI      0x20        // end of interrupt
+
+//*************************************************************
+//
+// Enable interrupt mode -- get the IRQ number we are using.
+//
+// The function MUST be called before interrupt mode can
+// be used!
+//
+// If this function is called then the int_disable_irq()
+// function MUST be called before exiting to DOS.
+//
+//*************************************************************
+
+int int_enable_irq( int shared, int irqNum,
+                    unsigned int bmAddr, unsigned int ataAddr )
+
+//  shared: 0 is not shared, != 0 is shared
+//  irqNum: 1 to 15
+//  bmAddr: i/o address for BMIDE Status register
+//  ataAddr: i/o address for the ATA Status register
+
+{
+
+   // error if interrupts enabled now
+   // error if invalid irq number
+   // error if bmAddr is < 100H
+   // error if shared and bmAddr is 0
+   // error if ataAddr is < 100H
+
+   if ( int_use_intr_flag )
+      return 1;
+   if ( ( irqNum < 1 ) || ( irqNum > 15 ) )
+      return 2;
+   if ( irqNum == 2 )
+      return 2;
+   if ( bmAddr && ( bmAddr < 0x0100 ) )
+      return 3;
+   if ( shared && ( ! bmAddr ) )
+      return 4;
+   if ( ataAddr < 0x0100 )
+      return 5;
+
+   // save the input parameters
+
+   int_shared     = shared;
+   int_irq_number = irqNum;
+   int_bmide_addr  = bmAddr;
+   int_ata_addr   = ataAddr;
+
+   // convert IRQ number to INT number
+   // and
+   // enable the interrupt in the PIC
+
+   if ( irqNum < 8 )
+   {
+      int_int_vector = irqNum + 8;
+      // In PIC0 change the IRQ 0-7 enable bit to 0
+      outportb( PIC0_MASK, ( inportb( PIC0_MASK )
+                         & pic_enable_irq[ irqNum ] ) );
+   }
+   else
+   {
+      int_int_vector = 0x70 + ( irqNum - 8 );
+      // In PIC0 change the PIC1 enable bit to 0 (enable IRQ 2)
+      // In PIC1 change the IRQ enable bit to 0
+      outportb( PIC0_MASK, ( inportb( PIC0_MASK ) & PIC0_ENABLE_PIC1 ) );
+      outportb( PIC1_MASK, ( inportb( PIC1_MASK )
+                         & pic_enable_irq[ irqNum - 8 ] ) );
+   }
+
+   // interrupts use is now enabled
+
+   int_use_intr_flag = 1;
+   int_got_it_now = 0;
+
+   // Done.
+
+   return 0;
+}
+
+//*************************************************************
+//
+// Disable interrupt mode.
+//
+// If the int_enable_irq() function has been called,
+// this function MUST be called before exiting to DOS.
+//
+//*************************************************************
+
+void int_disable_irq( void )
+
+{
+
+   // if our interrupt handler is installed now,
+   // restore the system's (the original) interrupt handler.
+
+   if ( int_got_it_now )
+   {
+
+      // Disable interrupts.
+      // Restore the system's interrupt vector.
+      // Enable interrupts.
+
+      disable();
+      setvect( int_int_vector, int_org_int_vect );
+      enable();
+   }
+
+   // Reset all the interrupt data.
+
+   int_use_intr_flag = 0;
+   int_got_it_now = 0;
+}
+
+//*************************************************************
+//
+// Install our interrupt handler.
+//
+// Interrupt mode MUST be setup by calling int_enable_irq()
+// before calling this function.
+//
+//*************************************************************
+
+void int_save_int_vect( void )
+
+{
+
+   // Do nothing if interrupt use not enabled now.
+   // Do nothing if our interrupt handler is installed now.
+
+   if ( ! int_use_intr_flag )
+      return;
+   if ( int_got_it_now )
+      return;
+
+   // Disable interrupts.
+   // Save the interrupt vector.
+
+   disable();
+   int_org_int_vect = getvect( int_int_vector );
+
+   // install our interrupt handler
+
+   setvect( int_int_vector, int_handler );
+
+   // Our interrupt handler is installed now.
+
+   int_got_it_now = 1;
+
+   // Reset the interrupt flag.
+
+   int_intr_cntr = 0;
+   int_intr_flag = 0;
+
+   // Enable interrupts.
+
+   enable();
+}
+
+//*************************************************************
+//
+// Restore the interrupt vector.
+//
+// Interrupt mode MUST be setup by calling int_enable_irq()
+// before calling this function.
+//
+//*************************************************************
+
+void int_restore_int_vect( void )
+
+{
+
+   // Do nothing if interrupt useis disabled now.
+   // Do nothing if our interrupt handler is not installed.
+
+   if ( ! int_use_intr_flag )
+      return;
+   if ( ! int_got_it_now )
+      return;
+
+   // Disable interrupts.
+   // Restore the interrupt vector.
+   // Enable interrupts.
+
+   disable();
+   setvect( int_int_vector, int_org_int_vect );
+   enable();
+
+   // Our interrupt handler is not installed now.
+
+   int_got_it_now = 0;
+}
+
+//*************************************************************
+//
+// ATADRVR's Interrupt Handler.
+//
+//*************************************************************
+
+static void far interrupt int_handler( void )
+
+{
+
+   // increment the interrupt counter
+
+   int_intr_cntr ++ ;
+
+   // if BMIDE present read the BMIDE status
+   // else just read the device status.
+
+   if ( int_bmide_addr )
+   {
+      // PCI ATA controller...
+      // ... read BMIDE status
+      int_bm_status = inportb( int_bmide_addr );
+      //... check if Interrupt bit = 1
+      if ( int_bm_status & BM_SR_MASK_INT )
+      {
+         // ... Interrupt=1...
+         // ... increment interrupt flag,
+         // ... read ATA status,
+         // ... reset Interrupt bit.
+         int_intr_flag ++ ;
+         int_ata_status = inportb( int_ata_addr );
+         outportb( int_bmide_addr, BM_SR_MASK_INT );
+      }
+   }
+   else
+   {
+      // legacy ATA controller...
+      // ... increment interrupt flag,
+      // ... read ATA status.
+      int_intr_flag ++ ;
+      int_ata_status = inportb( int_ata_addr );
+   }
+
+   // if interrupt is shared, jump to the original handler...
+
+   if ( int_shared )
+   {
+
+      // pop all regs
+#if 0
+      asm pop   bp
+      asm pop   edi
+      asm pop   esi
+      asm pop   ds
+      asm pop   es
+      asm pop   edx
+      asm pop   ecx
+      asm pop   ebx
+      asm pop   eax
+
+      // put cs:ip of next interrupt handler on stack
+
+      asm push  ax            // will be bp+8
+      asm push  ax            // will be bp+6
+      asm push  ax
+      asm push  bp
+      asm push  ds
+      asm mov   bp,DGROUP
+      asm mov   ds,bp
+      asm mov   bp, sp
+      asm mov   ax, word ptr DGROUP:int_org_int_vect
+      asm mov   [bp+6], ax
+      asm mov   ax, word ptr DGROUP:int_org_int_vect+2
+      asm mov   [bp+8], ax
+      asm pop   ds
+      asm pop   bp
+      asm pop   ax
+
+      // jump to the original interrupt handler
+
+      asm retf
+#endif
+      // never get here
+
+   }
+
+   // interrupt is not shared...
+   // send End-of-Interrupt (EOI) to the interrupt controller(s).
+
+   outportb( PIC0_CTRL, PIC_EOI );
+   if ( int_irq_number >= 8 )
+      outportb( PIC1_CTRL, PIC_EOI );
+
+   // IRET here (return from interrupt)
+}
+
+// end ataioint.c
diff --git a/haribote/ata/ATAIOISA.C b/haribote/ata/ATAIOISA.C
new file mode 100644 (file)
index 0000000..03a0d67
--- /dev/null
@@ -0,0 +1,1101 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOISA.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+//
+// This C source contains the ISA bus READ/WRITE DMA command
+// processing for ATA and ATAPI.
+//********************************************************************
+
+#include <dos.h>
+
+#include "ataio.h"
+
+#define DEBUG_ISA 0x00  // not zero for debug
+                        // 0x01 trace the DMA channel mode
+
+//***********************************************************
+//
+// Some notes about ISA bus DMA...
+//
+// ISA bus DMA uses an DMA controller built into an ISA bus
+// motherboard.  This DMA controller has six DMA channels:  1, 2, 3,
+// 5, 6 and 7. Channels 0 and 4 are reserved for other uses.
+// Channels 1, 2 and 3 are 8-bit and channels 5, 6 and 7 are 16-bit.
+// Since ATA DMA is always 16-bit only channels 5, 6 or 7 can be
+// used here.
+//
+// An ISA bus DMA controller is unable to transfer data across a
+// 128K boundary in physical memory.  This code is able to cross one
+// 128K DMA boundary.  It could be enhanced to cross any number of
+// boundaries but since a tradional ATA read/write command can not
+// transfer more than 256 sectors or 128K bytes, there is little
+// need for this code to handle more than one boundary crossing.
+//
+// Note that the ISA 16-bit DMA channels are restricted to
+// transfering data on word boundaries and transfers of an even
+// number of bytes.  This is because the host memory address and the
+// transfer length byte count are both divided by 2. These word
+// addresses and word counts are used by the DMA controller.
+//
+//***********************************************************
+
+//***********************************************************
+//
+// isa bus dma channel configuration stuff,
+// see dma_isa_config().
+//
+//***********************************************************
+
+static int dmaChan = 0;          // dma channel number (5, 6 or 7)
+
+static int dmaPageReg;           // page reg addr
+static int dmaAddrReg;           // addr reg addr
+static int dmaCntrReg;           // cntr reg addr
+
+static int dmaChanSel;           // channel selection bits...
+                                 // also see modeByte below
+
+#define DMA_SEL5 0x01            // values used in dmaChanSel
+#define DMA_SEL6 0x02
+#define DMA_SEL7 0x03
+
+static int dmaTCbit;             // terminal count bit status
+
+#define DMA_TC5 0x02             // values used in dmaTCbit
+#define DMA_TC6 0x04
+#define DMA_TC7 0x08
+
+//***********************************************************
+//
+// isa bus dma channel configuration and control macros
+//
+//***********************************************************
+
+#define DMA_MASK_ENABLE  0x00    // bits for enable/disable
+#define DMA_MASK_DISABLE 0x04
+
+#define enableChan()  outportb( 0xd4, DMA_MASK_ENABLE  | dmaChanSel )
+#define disableChan() outportb( 0xd4, DMA_MASK_DISABLE | dmaChanSel )
+
+#define clearFF() outportb( 0xd8, 0 )  // macro to reset flip-flop
+                                       // so we access the low byte
+                                       // of the address and word
+                                       // count registers
+
+//***********************************************************
+//
+// dma channel programming stuff
+//
+//***********************************************************
+
+static int doTwo;             // transfer crosses a physical boundary if != 0
+
+static unsigned int page1;    // upper part of physical memory address
+                              // for 1st (or only) transfer
+static unsigned int page2;    // upper part of physical memory address
+                              // for 2nd transfer
+
+static unsigned long addr1;   // physical address for 1st (or only) transfer
+static unsigned long addr2;   // physical address for 2nd transfer
+
+static unsigned long count1;  // byte/word count for 1st (or only) transfer
+static unsigned long count2;  // byte/word count for 2nd transfer
+
+static int modeByte;          // mode byte for the dma channel...
+                              // also see dmaChanSel above
+
+#define DMA_MODE_DEMAND 0x00  // modeByte bits for various dma modes
+#define DMA_MODE_BLOCK  0x80
+#define DMA_MODE_SINGLE 0x40
+
+#define DMA_MODE_MEMR 0x08    // modeByte memory read or write
+#define DMA_MODE_MEMW 0x04
+
+//***********************************************************
+//
+// set_up_xfer() -- set up for 1 or 2 dma transfers -- either
+//                  1 or 2 transfers are required per ata
+//                  or atapi command.
+//
+//***********************************************************
+
+static void set_up_xfer( int dir, long bc, unsigned int seg, unsigned int off );
+
+static void set_up_xfer( int dir, long bc, unsigned int seg, unsigned int off )
+
+{
+   unsigned long count;    // total byte/word count
+   unsigned long addr;     // absolute memory address
+
+   // determine number of bytes to be transferred
+
+   count = bc;
+
+   // convert transfer address from seg:off to a 20-bit absolute memory address
+
+   addr = (unsigned long) seg;
+   addr = addr << 4;
+   addr = addr + (unsigned long) off;
+
+   // determine first transfer address,
+   // determine first and second transfer counts.
+   // The absolute address bits a19 - a0 are used as follows:
+   // bits 7-4 of the page register are set to 0.
+   // a19 - a17 are placed into the page register bits 3-1.
+   // bit 0 of the page register is set to 0.
+   // a16-a1 are placed into the address register bits 15-0.
+   // a0 is discarded.
+   // assume that only one transfer is needed and determine the
+   // page, addr1, count1 and count2 values.
+   // the transfer count is converted from byte to word counts.
+
+   page1 = (int) ( ( addr & 0x000e0000L ) >> 16 );
+   page2 = page1 + 2;
+   addr1 = ( addr & 0x0001fffeL ) >> 1;
+   addr2 = 0;
+   count1 = count >> 1;
+   count2 = 0;
+
+   // if a dma boundary will be crossed, determine the
+   // first and second transfer counts.  again the
+   // transfer counts must be converted from byte to word counts.
+
+   doTwo = 0;
+   if ( ( ( addr + count - 1L ) & 0x000e0000L ) != ( addr & 0x000e0000L ) )
+   {
+      doTwo = 1;
+
+      // determine first and second transfer counts
+
+      count1 = ( ( addr & 0x000e0000L ) + 0x00020000L ) - addr;
+      count2 = count - count1;
+
+      // convert counts to word values
+
+      count1 = count1 >> 1;
+      count2 = count2 >> 1;
+   }
+
+   // get dma channel mode
+
+   modeByte = DMA_MODE_DEMAND;      // change this line for single word dma
+   modeByte = modeByte | ( dir ? DMA_MODE_MEMR : DMA_MODE_MEMW );
+   modeByte = modeByte | dmaChanSel;
+}
+
+//***********************************************************
+//
+// prog_dma_chan() -- config the dma channel we will use --
+//                    we call this function to set each
+//                    part of a dma transfer.
+//
+//***********************************************************
+
+static void prog_dma_chan( unsigned int page, unsigned long addr,
+                           unsigned long count, int mode );
+
+static void prog_dma_chan( unsigned int page, unsigned long addr,
+                           unsigned long count, int mode )
+
+{
+
+   // disable interrupts
+
+   disable();
+
+   // disable the dma channel
+
+   trc_llt( 0, 0, TRC_LLT_DMA3 );
+   disableChan();
+
+   // reset channel status (required by some systems)
+
+   inportb( 0xd0 );
+
+   // set dma channel transfer address
+
+   clearFF();
+   outportb( dmaAddrReg, (int) ( addr & 0x000000ffL ) );
+   addr = addr >> 8;
+   outportb( dmaAddrReg, (int) ( addr & 0x000000ffL ) );
+
+   // set dma channel page
+
+   outportb( dmaPageReg, page );
+
+   // set dma channel word count
+
+   count -- ;
+   clearFF();
+   outportb( dmaCntrReg, (int) ( count & 0x000000ffL ) );
+   count = count >> 8;
+   outportb( dmaCntrReg, (int) ( count & 0x000000ffL ) );
+
+   // set dma channel mode
+
+   outportb( 0xd6, mode );
+
+   #if DEBUG_ISA & 0x01
+      trc_llt( 0, mode, TRC_LLT_DEBUG );  // for debugging
+   #endif
+
+   // enable the dma channel
+
+   trc_llt( 0, 0, TRC_LLT_DMA1 );
+   enableChan();
+
+   // enable interrupts
+
+   enable();
+}
+
+//***********************************************************
+//
+// chk_cmd_done() -- check for command completion
+//
+//***********************************************************
+
+static int chk_cmd_done( void );
+
+static int chk_cmd_done( void )
+
+{
+   int status;
+
+   // check for interrupt or poll status
+
+   if ( int_use_intr_flag )
+   {
+      if ( int_intr_flag )                // interrupt?
+      {
+         trc_llt( 0, 0, TRC_LLT_INTRQ );
+         status = int_ata_status;         // get status
+         trc_llt( CB_STAT, status, TRC_LLT_INB );
+         return 1;                        // cmd done
+      }
+   }
+   else
+   {
+      status = pio_inbyte( CB_ASTAT );    // poll for not busy & DRQ/errors
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DRQ ) ) == 0 )
+         return 1;                        // cmd done
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DF ) ) == CB_STAT_DF )
+         return 1;                        // cmd done
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_ERR ) ) == CB_STAT_ERR )
+         return 1;                        // cmd done
+   }
+   return 0;                              // not done yet
+}
+
+//***********************************************************
+//
+// dma_isa_config() - configure/setup for Read/Write DMA
+//
+// The caller must call this function before attempting
+// to use any ATA or ATAPI commands in ISA DMA mode.
+//
+//***********************************************************
+
+int dma_isa_config( int chan )
+
+{
+
+   // channel must be 0 (disable) or 5, 6 or 7.
+
+   switch ( chan )
+   {
+      case 0:
+         dmaChan = 0;            // disable ISA DMA
+         return 0;
+      case 5:                    // set up channel 5
+         dmaChan = 5;
+         dmaPageReg = 0x8b;
+         dmaAddrReg = 0xc4;
+         dmaCntrReg = 0xc6;
+         dmaChanSel = DMA_SEL5;
+         dmaTCbit   = DMA_TC5;
+         break;
+      case 6:                    // set up channel 6
+         dmaChan = 6;
+         dmaPageReg = 0x89;
+         dmaAddrReg = 0xc8;
+         dmaCntrReg = 0xca;
+         dmaChanSel = DMA_SEL6;
+         dmaTCbit   = DMA_TC6;
+         break;
+      case 7:                    // set up channel 7
+         dmaChan = 7;
+         dmaPageReg = 0x8a;
+         dmaAddrReg = 0xcc;
+         dmaCntrReg = 0xce;
+         dmaChanSel = DMA_SEL7;
+         dmaTCbit   = DMA_TC7;
+         break;
+      default:                   // not channel 5, 6 or 7
+         dmaChan = 0;               // disable ISA DMA
+         return 1;                  // return error
+   }
+
+   return 0;
+}
+
+//***********************************************************
+//
+// exec_isa_ata_cmd() - DMA in ISA Multiword for ATA R/W DMA
+//
+//***********************************************************
+
+static int exec_isa_ata_cmd( int dev,
+                             unsigned int seg, unsigned int off,
+                             long numSect );
+
+static int exec_isa_ata_cmd( int dev,
+                             unsigned int seg, unsigned int off,
+                             long numSect )
+
+{
+   unsigned char status;
+   unsigned long lw1, lw2;
+
+   // mark start of a R/W DMA command in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_RWD );
+
+   // Quit now if no dma channel set up.
+
+   if ( ! dmaChan )
+   {
+      reg_cmd_info.ec = 70;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_RWD );
+      return 1;
+   }
+
+   // Quit now if 1) I/O buffer overrun possible
+   // or 2) DMA can't handle the transfer size.
+
+   if ( ( numSect > 256L ) || ( ( numSect * 512L ) > reg_buffer_size ) )
+   {
+      reg_cmd_info.ec = 61;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // set up the dma transfer
+
+   set_up_xfer( ( reg_cmd_info.cmd == CMD_WRITE_DMA )
+                ||
+                ( reg_cmd_info.cmd == CMD_WRITE_DMA_EXT ),
+                numSect * 512L, seg, off );
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // Select the drive - call the sub_select function.
+   // Quit now if this fails.
+
+   if ( sub_select( dev ) )
+   {
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_RWD );
+      return 1;
+   }
+
+   // Set up all the registers except the command register.
+
+   sub_setup_command();
+
+   // For interrupt mode, install interrupt handler.
+
+   int_save_int_vect();
+
+   // program the dma channel for the first or only transfer.
+
+   prog_dma_chan( page1, addr1, count1, modeByte );
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, reg_cmd_info.cmd );
+
+   // Waste some time by reading the alternate status a few times.
+   // This gives the drive time to set BUSY in the status register on
+   // really fast systems.  If we don't do this, a slow drive on a fast
+   // system may not set BUSY fast enough and we would think it had
+   // completed the command when it really had not even started the
+   // command yet.
+
+   ATA_DELAY();
+
+   // Data transfer...
+   // If this transfer requires two dma transfers,
+   // wait for the first transfer to complete and
+   // then program the dma channel for the second transfer.
+
+   if ( ( reg_cmd_info.ec == 0 ) && doTwo )
+   {
+      // Data transfer...
+      // wait for dma chan to transfer first part by monitoring
+      // the dma channel's terminal count status bit
+      // -or-
+      // watch for command completion due to an error
+      // -or-
+      // time out if this takes too long.
+
+      trc_llt( 0, 0, TRC_LLT_DMA2 );
+      while ( 1 )
+      {
+         if ( inportb( 0xd0 ) & dmaTCbit )   // terminal count yet ?
+            break;                           // yes - ok!
+         if ( chk_cmd_done() )               // cmd done ?
+         {
+            reg_cmd_info.ec = 71;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+         if ( tmr_chk_timeout() )            // time out yet ?
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 72;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+
+      // if no error, set up 2nd transfer
+
+      if ( reg_cmd_info.ec == 0 )
+      {
+         // update bytes transferred count
+         reg_cmd_info.totalBytesXfer += count1 << 1;
+
+         // program dma channel to transfer the second part
+         prog_dma_chan( page2, addr2, count2, modeByte );
+         count1 = count2;
+      }
+   }
+
+   // End of command...
+   // if no error,
+   // wait for drive to signal command completion
+   // -or-
+   // time out if this takes to long.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( int_use_intr_flag )
+         trc_llt( 0, 0, TRC_LLT_WINT );
+      else
+         trc_llt( 0, 0, TRC_LLT_PNBSY );
+      while ( 1 )
+      {
+         if ( chk_cmd_done() )               // cmd done ?
+            break;                           // yes
+         if ( tmr_chk_timeout() )            // time out yet ?
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );   // yes
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 73;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+   }
+
+   // End of command...
+   // disable the dma channel
+
+   trc_llt( 0, 0, TRC_LLT_DMA3 );
+   disableChan();
+
+   // End of command...
+   // If polling or error read the Status register,
+   // otherwise use the Status register value that was read
+   // by the interrupt handler.
+
+   if ( ( ! int_use_intr_flag ) || ( reg_cmd_info.ec ) )
+      status = pio_inbyte( CB_STAT );
+   else
+      status = int_ata_status;
+
+   // Final status check...
+   // if no error, check final status...
+   // Error if BUSY, DEVICE FAULT, DRQ or ERROR status now.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & ( CB_STAT_BSY | CB_STAT_DF | CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 74;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   // Final status check...
+   // if no error, check dma channel terminal count flag
+
+   if ( ( reg_cmd_info.ec == 0 )
+        &&
+        ( ( inportb( 0xd0 ) & dmaTCbit ) == 0 )
+      )
+   {
+      reg_cmd_info.ec = 71;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+   }
+
+   // Final status check...
+   // update total bytes transferred
+
+   if ( reg_cmd_info.ec == 0 )
+      reg_cmd_info.totalBytesXfer += count1 << 1;
+   else
+   {
+      clearFF();
+      lw1 = inportb( dmaCntrReg );
+      lw2 = inportb( dmaCntrReg );
+      lw1 = ( ( lw2 << 8 ) | lw1 ) + 1;
+      lw1 = lw1 & 0x0000ffffL;
+      reg_cmd_info.totalBytesXfer += ( count1 - lw1 ) << 1;
+   }
+
+   // Done...
+   // Read the output registers and trace the command.
+
+   sub_trace_command();
+
+   // Done...
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // Done...
+   // mark end of a R/W DMA command in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_RWD );
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+//***********************************************************
+//
+// dma_isa_chs() - DMA in ISA Multiword for ATA R/W DMA
+//
+//***********************************************************
+
+int dma_isa_chs( int dev, int cmd,
+                     unsigned int fr, unsigned int sc,
+                     unsigned int cyl, unsigned int head, unsigned int sect,
+                     unsigned int seg, unsigned int off,
+                     long numSect )
+
+{
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_ADMAI;
+   if ( ( cmd == CMD_WRITE_DMA ) || ( cmd == CMD_WRITE_DMA_EXT ) )
+      reg_cmd_info.ct  = TRC_TYPE_ADMAO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.sn1 = sect;
+   reg_cmd_info.cl1 = cyl & 0x00ff;
+   reg_cmd_info.ch1 = ( cyl & 0xff00 ) >> 8;
+   reg_cmd_info.dh1 = ( dev ? CB_DH_DEV1 : CB_DH_DEV0 ) | ( head & 0x0f );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.lbaSize = LBACHS;
+
+   // Execute the command.
+
+   return exec_isa_ata_cmd( dev, seg, off, numSect );
+}
+
+//***********************************************************
+//
+// dma_isa_lba28() - DMA in ISA Multiword for ATA R/W DMA
+//
+//***********************************************************
+
+int dma_isa_lba28( int dev, int cmd,
+                       unsigned int fr, unsigned int sc,
+                       unsigned long lba,
+                       unsigned int seg, unsigned int off,
+                       long numSect )
+
+{
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_ADMAI;
+   reg_cmd_info.cmd = cmd;
+   if ( ( cmd == CMD_WRITE_DMA ) || ( cmd == CMD_WRITE_DMA_EXT ) )
+      reg_cmd_info.ct  = TRC_TYPE_ADMAO;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.lbaSize = LBA28;
+   reg_cmd_info.lbaHigh1 = 0L;
+   reg_cmd_info.lbaLow1 = lba;
+
+   // Execute the command.
+
+   return exec_isa_ata_cmd( dev, seg, off, numSect );
+}
+
+//***********************************************************
+//
+// dma_isa_lba48() - DMA in ISA Multiword for ATA R/W DMA
+//
+//***********************************************************
+
+int dma_isa_lba48( int dev, int cmd,
+                       unsigned int fr, unsigned int sc,
+                       unsigned long lbahi, unsigned long lbalo,
+                       unsigned int seg, unsigned int off,
+                       long numSect )
+
+{
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_ADMAI;
+   if ( ( cmd == CMD_WRITE_DMA ) || ( cmd == CMD_WRITE_DMA_EXT ) )
+      reg_cmd_info.ct  = TRC_TYPE_ADMAO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.lbaSize = LBA48;
+   reg_cmd_info.lbaHigh1 = lbahi;
+   reg_cmd_info.lbaLow1 = lbalo;
+
+   // Execute the command.
+
+   return exec_isa_ata_cmd( dev, seg, off, numSect );
+}
+
+//***********************************************************
+//
+// dma_isa_packet() - DMA in ISA Multiword for ATAPI Packet
+//
+//***********************************************************
+
+int dma_isa_packet( int dev,
+                    unsigned int cpbc,
+                    unsigned int cpseg, unsigned int cpoff,
+                    int dir,
+                    long dpbc,
+                    unsigned int dpseg, unsigned int dpoff,
+                    unsigned long lba )
+
+{
+   unsigned char status;
+   unsigned char reason;
+   unsigned char lowCyl;
+   unsigned char highCyl;
+   int ndx;
+   unsigned char far * cfp;
+   unsigned long lw1, lw2;
+
+   // mark start of isa dma PI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_PID );
+
+   // Make sure the command packet size is either 12 or 16
+   // and save the command packet size and data.
+
+   cpbc = cpbc < 12 ? 12 : cpbc;
+   cpbc = cpbc > 12 ? 16 : cpbc;
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATAPI;
+   reg_cmd_info.ct  = dir ? TRC_TYPE_PDMAO : TRC_TYPE_PDMAI;
+   reg_cmd_info.cmd = CMD_PACKET;
+   reg_cmd_info.fr1 = reg_atapi_reg_fr | 0x01;  // packet DMA mode !
+   reg_cmd_info.sc1 = reg_atapi_reg_sc;
+   reg_cmd_info.sn1 = reg_atapi_reg_sn;
+   reg_cmd_info.cl1 = 0;         // no Byte Count Limit in DMA !
+   reg_cmd_info.ch1 = 0;         // no Byte Count Limit in DMA !
+   reg_cmd_info.dh1 = dev ? CB_DH_DEV1 : CB_DH_DEV0;
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBA32;
+   reg_cmd_info.lbaLow1 = lba;
+   reg_cmd_info.lbaHigh1 = 0L;
+   reg_atapi_cp_size = cpbc;
+   cfp = MK_FP( cpseg, cpoff );
+   for ( ndx = 0; ndx < cpbc; ndx ++ )
+   {
+      reg_atapi_cp_data[ndx] = * cfp;
+      cfp ++ ;
+   }
+
+   // Zero the alternate ATAPI register data.
+
+   reg_atapi_reg_fr = 0;
+   reg_atapi_reg_sc = 0;
+   reg_atapi_reg_sn = 0;
+   reg_atapi_reg_dh = 0;
+
+   // Quit now if no dma channel set up
+
+   if ( ! dmaChan )
+   {
+      reg_cmd_info.ec = 70;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // the data packet byte count must be even
+   // and must not be zero
+
+   if ( dpbc & 1L )
+      dpbc ++ ;
+   if ( dpbc < 2L )
+      dpbc = 2L;
+
+   // Quit now if 1) I/O buffer overrun possible
+   // or 2) DMA can't handle the transfer size.
+
+   if ( ( dpbc > 131072L ) || ( dpbc > reg_buffer_size ) )
+   {
+      reg_cmd_info.ec = 61;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // set up the dma transfer(s)
+
+   set_up_xfer( dir, dpbc, dpseg, dpoff );
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // Select the drive - call the reg_select function.
+   // Quit now if this fails.
+
+   if ( sub_select( dev ) )
+   {
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // Set up all the registers except the command register.
+
+   sub_setup_command();
+
+   // For interrupt mode, install interrupt handler.
+
+   int_save_int_vect();
+
+   // program the dma channel for the first or only transfer.
+
+   prog_dma_chan( page1, addr1, count1, modeByte );
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, CMD_PACKET );
+
+   // Waste some time by reading the alternate status a few times.
+   // This gives the drive time to set BUSY in the status register on
+   // really fast systems.  If we don't do this, a slow drive on a fast
+   // system may not set BUSY fast enough and we would think it had
+   // completed the command when it really had not even started the
+   // command yet.
+
+   ATA_DELAY();
+
+   // Command packet transfer...
+   // Check for protocol failures,
+   // the device should have BSY=1 or
+   // if BSY=0 then either DRQ=1 or CHK=1.
+
+   ATAPI_DELAY( dev );
+   status = pio_inbyte( CB_ASTAT );
+   if ( status & CB_STAT_BSY )
+   {
+      // BSY=1 is OK
+   }
+   else
+   {
+      if ( status & ( CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         // BSY=0 and DRQ=1 is OK
+         // BSY=0 and ERR=1 is OK
+      }
+      else
+      {
+         reg_cmd_info.failbits |= FAILBIT0;  // not OK
+      }
+   }
+
+   // Command packet transfer...
+   // Poll Alternate Status for BSY=0.
+
+   trc_llt( 0, 0, TRC_LLT_PNBSY );
+   while ( 1 )
+   {
+      status = pio_inbyte( CB_ASTAT );       // poll for not busy
+      if ( ( status & CB_STAT_BSY ) == 0 )
+         break;
+      if ( tmr_chk_timeout() )               // time out yet ?
+      {
+         trc_llt( 0, 0, TRC_LLT_TOUT );      // yes
+         reg_cmd_info.to = 1;
+         reg_cmd_info.ec = 75;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         break;
+      }
+   }
+
+   // Command packet transfer...
+   // Check for protocol failures... no interrupt here please!
+   // Clear any interrupt the command packet transfer may have caused.
+
+   if ( int_intr_flag )    // extra interrupt(s) ?
+      reg_cmd_info.failbits |= FAILBIT1;
+   int_intr_flag = 0;
+
+   // Command packet transfer...
+   // If no error, transfer the command packet.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+
+      // Command packet transfer...
+      // Read the primary status register and the other ATAPI registers.
+
+      status = pio_inbyte( CB_STAT );
+      reason = pio_inbyte( CB_SC );
+      lowCyl = pio_inbyte( CB_CL );
+      highCyl = pio_inbyte( CB_CH );
+
+      // Command packet transfer...
+      // check status: must have BSY=0, DRQ=1 now
+
+      if (    ( status & ( CB_STAT_BSY | CB_STAT_DRQ | CB_STAT_ERR ) )
+           != CB_STAT_DRQ
+         )
+      {
+         reg_cmd_info.ec = 76;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+      else
+      {
+         // Command packet transfer...
+         // Check for protocol failures...
+         // check: C/nD=1, IO=0.
+
+         if ( ( reason &  ( CB_SC_P_TAG | CB_SC_P_REL | CB_SC_P_IO ) )
+              || ( ! ( reason &  CB_SC_P_CD ) )
+            )
+            reg_cmd_info.failbits |= FAILBIT2;
+         if (    ( lowCyl != reg_cmd_info.cl1 )
+              || ( highCyl != reg_cmd_info.ch1 ) )
+            reg_cmd_info.failbits |= FAILBIT3;
+
+         // Command packet transfer...
+         // trace cdb byte 0,
+         // xfer the command packet (the cdb)
+
+         trc_llt( 0, * (unsigned char far *) MK_FP( cpseg, cpoff ), TRC_LLT_P_CMD );
+         pio_drq_block_out( CB_DATA, cpseg, cpoff, cpbc >> 1 );
+      }
+   }
+
+   // Data transfer...
+   // If this transfer requires two dma transfers,
+   // wait for the first transfer to complete and
+   // then program the dma channel for the second transfer.
+
+   if ( ( reg_cmd_info.ec == 0 ) && doTwo )
+   {
+      // Data transfer...
+      // wait for dma chan to transfer first part by monitoring
+      // the dma channel's terminal count status bit
+      // -or-
+      // watch for command completion due to an error
+      // -or-
+      // time out if this takes too long.
+
+      trc_llt( 0, 0, TRC_LLT_DMA2 );
+      while ( 1 )
+      {
+         if ( inportb( 0xd0 ) & dmaTCbit )   // terminal count yet ?
+            break;                           // yes - ok!
+         if ( chk_cmd_done() )               // cmd done ?
+         {
+            reg_cmd_info.ec = 71;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+         if ( tmr_chk_timeout() )            // time out yet ?
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 72;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+
+      // if no error, set up 2nd transfer
+
+      if ( reg_cmd_info.ec == 0 )
+      {
+         // update bytes transferred count
+         reg_cmd_info.totalBytesXfer += count1 << 1;
+
+         // program dma channel to transfer the second part
+         prog_dma_chan( page2, addr2, count2, modeByte );
+         count1 = count2;
+      }
+   }
+
+   // End of command...
+   // if no error,
+   // wait for drive to signal command completion
+   // -or-
+   // time out if this takes to long.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( int_use_intr_flag )
+         trc_llt( 0, 0, TRC_LLT_WINT );
+      else
+         trc_llt( 0, 0, TRC_LLT_PNBSY );
+      while ( 1 )
+      {
+         if ( chk_cmd_done() )               // cmd done ?
+            break;                           // yes
+         if ( tmr_chk_timeout() )            // time out yet ?
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );   // yes
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 73;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+   }
+
+   // End of command...
+   // disable/stop the dma channel
+
+   trc_llt( 0, 0, TRC_LLT_DMA3 );
+   disableChan();
+
+   // End of command...
+   // If polling or error read the Status register,
+   // otherwise use the Status register value that was read
+   // by the interrupt handler.
+
+   if ( ( ! int_use_intr_flag ) || ( reg_cmd_info.ec ) )
+      status = pio_inbyte( CB_STAT );
+   else
+      status = int_ata_status;
+
+   // Final status check...
+   // if no error, check final status...
+   // Error if BUSY, DEVICE FAULT, DRQ or ERROR status now.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & ( CB_STAT_BSY | CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 74;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   // Final status check...
+   // Check for protocol failures...
+   // check: C/nD=1, IO=1.
+
+   reason = pio_inbyte( CB_SC );
+   if ( ( reason & ( CB_SC_P_TAG | CB_SC_P_REL ) )
+        || ( ! ( reason & CB_SC_P_IO ) )
+        || ( ! ( reason & CB_SC_P_CD ) )
+      )
+      reg_cmd_info.failbits |= FAILBIT8;
+
+   // Final status check...
+   // update total bytes transferred
+
+   clearFF();
+   lw1 = inportb( dmaCntrReg );
+   lw2 = inportb( dmaCntrReg );
+   lw1 = ( ( lw2 << 8 ) | lw1 ) + 1;
+   lw1 = lw1 & 0x0000ffffL;
+   reg_cmd_info.totalBytesXfer += ( count1 - lw1 ) << 1;
+
+   // Done...
+   // Read the output registers and trace the command.
+
+   sub_trace_command();
+
+   // Done...
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // Done...
+   // mark end of isa dma PI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_PID );
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+// end ataioisa.c
diff --git a/haribote/ata/ATAIOPCI.C b/haribote/ata/ATAIOPCI.C
new file mode 100644 (file)
index 0000000..9908994
--- /dev/null
@@ -0,0 +1,1218 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOPCI.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+//
+// This C source contains the functions for executing ATA PCI bus
+// mastering READ/WRITE DMA commands for ATA and ATAPI.
+//********************************************************************
+
+#include <dos.h>
+
+#include "ataio.h"
+
+#define DEBUG_PCI 0x00  // not zero for debug
+                        // 0x01 trace the interrupt counter and flag
+                        // 0x02 debug LARGE PRD
+
+#if DEBUG_PCI & 0x02
+   #include <stdio.h>
+   extern unsigned char far LFB[128];
+   extern void prt( void );
+   extern void pstr( unsigned char * s );
+#endif
+
+//***********************************************************
+//
+// Some notes about PCI bus mastering DMA...
+//
+// ATA PCI Bus Master DMA was first described by the SFF-8038
+// document.  That document is now very obsolete and generally
+// difficult to obtain.  The ANSI INCITS T13 document "ATA Host
+// Adapter Standards" (T13 document 1510D) has replaced
+// SFF-8038.  This code supports the type of DMA described by
+// sections 1 to 5 of the T13 1510D document.
+//
+// Note that the T13 1510D document also describes (in section 6) a
+// complex DMA engine called ADMA.  While ADMA is a good idea it
+// will probably never be popular or widely implemented.  This code
+// does not support ADMA.
+//
+// The base address of the Bus Master Control Registers (BMIDE) is
+// found in the PCI Configuration space for the ATA controller (at
+// offset 0x30 in the config space data).  This is normally an I/O
+// address.
+//
+// The BMIDE data is 16 bytes of data starting at the BMIDE base
+// address.  The first 8 bytes is for the primary ATA channel and
+// the second 8 bytes is for the secondary ATA channel.  The 8 bytes
+// contain a "command" byte and a "status" byte and a 4 byte
+// (32-bit) physical memory address pointing to the Physical Region
+// Descriptor (PRD) list.  Each PRD entry describes an area of
+// memory or data buffer for the DMA transfer.  A region described
+// by a PRD may not cross a 64K byte boundary in physical memory.
+// Also, the PRD list must not cross a 64K byte boundary.
+//
+// SIMPLE/COMPLEX PRD lists...
+// This code can build a PRD list for data transfers up to 256K
+// bytes. These types of PRD lists are built in a data area
+// that is statically allocated below. These PRD lists use
+// transfer the data to/from the caller's I/O buffer.
+//
+// LARGE PRD lists...
+// This code also supports READ/WRITE DMA EXT command transfers
+// up to 65536 sectors. This is done by creating a large
+// PRD list in the caller's I/O buffer. This PRD list
+// reuses a 64K part of the caller's I/O buffer for the data transfer.
+// In this manner transfers up toe 65536 sectors (or about 33Mbytes).
+// See the function dma_pci_set_max_xfer().
+//
+//***********************************************************
+
+//***********************************************************
+//
+// pci bus master registers and PRD list buffer,
+// see dma_pci_config().
+//
+//***********************************************************
+
+// public data...
+
+int dma_pci_prd_type;                  // type of PRD list to use
+
+long dma_pci_largeMaxB;                // max LARGE dma xfer size in bytes
+long dma_pci_largeMaxS;                // max LARGE dma xfer size in sectors
+unsigned long far * dma_pci_largePrdBufPtr;  // LARGE PRD buffer ptr
+unsigned char far * dma_pci_largeIoBufPtr;   // LARGE PRD I/O address
+
+unsigned long far * dma_pci_prd_ptr;   // current PRD buffer address
+int dma_pci_num_prd;                   // current number of PRD entries
+
+// private data...
+
+// data used by SIMPLE/COMPLEX PRD lists
+
+#define MAX_TRANSFER_SIZE  262144L     // max transfer size (in bytes,
+                                       // should be multiple of 65536)
+
+#define MAX_SEG ((MAX_TRANSFER_SIZE/65536L)+2L) // number physical segments
+#define MAX_PRD (MAX_SEG*4L)                    // number of PRDs required
+
+#define PRD_BUF_SIZE (48+(2*MAX_PRD*8))         // size of PRD list buffer
+
+static unsigned char far prdBuf[PRD_BUF_SIZE];  // PRD buffer address
+static unsigned long far * prdBufPtr;           // PRD addr (seg:off) off is 0
+
+// BMIDE data
+
+static unsigned char statReg;          // save BM status reg bits
+static unsigned char rwControl;        // read/write control bit setting
+
+//***********************************************************
+//
+// set_up_xfer() -- set up the PRD entry list
+//
+// NOTE:
+// dma_pci_prd_type == PCI_TYPE_LARGE uses part of the caller's
+// I/O buffer to hold a large PRD list and another part of the
+// caller's I/O buffer to send/receive the actual data. Each
+// PRD entry uses the same memory address.
+//
+//***********************************************************
+
+static int set_up_xfer( int dir, long bc, unsigned int seg, unsigned int off );
+
+static int set_up_xfer( int dir, long bc, unsigned int seg, unsigned int off )
+
+{
+   int numPrd;                      // number of PRD required
+   int maxPrd;                      // max number of PRD allowed
+   unsigned long temp;
+   unsigned long phyAddr;           // physical memory address
+   unsigned long savePhyAddr;       // physical memory address
+   unsigned long bigCnt;            // complex big count
+   unsigned long smallCnt;          // complex small count
+   unsigned long far * prdPtr;      // pointer to PRD entry list
+
+   // disable/stop the dma channel, clear interrupt and error bits
+   sub_writeBusMstrCmd( BM_CR_MASK_STOP );
+   sub_writeBusMstrStatus( statReg | BM_SR_MASK_INT | BM_SR_MASK_ERR );
+
+   // setup to build the PRD list...
+   if ( dma_pci_prd_type == PRD_TYPE_LARGE )
+   {
+      // ...set up for LARGE PRD list
+      // ...max PRDs allowed
+      maxPrd = 512;
+      // ...set big and small counts to max
+      bigCnt = smallCnt = 65536L;
+      // ...set the LARGE PRD buffer address
+      dma_pci_prd_ptr = prdPtr = dma_pci_largePrdBufPtr;
+      // ...convert I/O buffer address to physical memory address
+      phyAddr = (unsigned long) FP_SEG( dma_pci_largeIoBufPtr );
+      phyAddr = phyAddr << 4;
+      phyAddr = phyAddr + (unsigned long) FP_OFF( dma_pci_largeIoBufPtr );
+      phyAddr = phyAddr & 0xfffffffeL;
+   }
+   else
+   {
+      // ...set up for SIMPLE/COMPLEX PRD list
+      // ...max PRDs allowed
+      maxPrd = (int) MAX_PRD;
+      // ...set big and small counts to max
+      bigCnt = smallCnt = 65536L;
+      // ...adjust PRD buffer address and adjust big and small counts
+      prdPtr = prdBufPtr;
+      if ( dma_pci_prd_type == PRD_TYPE_COMPLEX )
+      {
+         temp = tmr_read_bios_timer();
+         prdPtr = MK_FP( FP_SEG( prdBufPtr ),
+                         (unsigned int) ( temp & 0x0000000cL ) );
+         smallCnt = ( temp & 0x000000feL ) + 2L;
+         bigCnt = bigCnt - smallCnt - ( temp & 0x0000000eL );
+      }
+      // ...set the SIMPLE/COMPLEX PRD buffer address
+      dma_pci_prd_ptr = prdPtr;
+      // ... convert I/O buffer address to an physical memory address
+      phyAddr = (unsigned long) seg;
+      phyAddr = phyAddr << 4;
+      phyAddr = phyAddr + (unsigned long) off;
+      phyAddr = phyAddr & 0xfffffffeL;
+   }
+   savePhyAddr = phyAddr;
+
+   #if DEBUG_PCI & 0x02
+      pstr( "z=>[prd] set_up_xfer()..." );
+      sprintf( LFB, "z=>[prd] dir %d bc %lx seg %04x off %04x",
+                             dir, bc, seg, off );
+      prt();
+      sprintf( LFB, "z=>[prd] maxPrd %d prdPtr %Fp bigCnt %lx smallCnt %lx",
+                             maxPrd, prdPtr, bigCnt, smallCnt );
+      prt();
+      sprintf( LFB, "z=>[prd] phyAddr %08lx", phyAddr );
+      prt();
+   #endif
+
+   // build the PRD list...
+   // ...PRD entry format:
+   // +0 to +3 = memory address
+   // +4 to +5 = 0x0000 (not EOT) or 0x8000 (EOT)
+   // +6 to +7 = byte count
+   // ...zero number of PRDs
+   numPrd = 0;
+   // ...loop to build each PRD
+   while ( bc > 0 )
+   {
+      if ( numPrd >= maxPrd )
+         return 1;
+      // set this PRD's address
+      if ( dma_pci_prd_type == PRD_TYPE_LARGE )
+         phyAddr = savePhyAddr;
+      prdPtr[0] = phyAddr;
+      // set count for this PRD
+      if ( ( numPrd & 0x0003 ) == 0x0002 )
+         temp = bigCnt;       // use big count (1 of 4 PRDs)
+      else                    // else
+         temp = smallCnt;     // use small count (3 of 4 PRDs)
+      if ( temp > bc )        // count to large?
+         temp = bc;           //    yes - use actual count
+      // check if count will fit
+      phyAddr = phyAddr + temp;
+      if ( ( phyAddr & 0xffff0000L ) != ( prdPtr[0] & 0xffff0000L ) )
+      {
+         phyAddr = phyAddr & 0xffff0000L;
+         temp = phyAddr - prdPtr[0];
+      }
+      // set this PRD's count
+      prdPtr[1] = temp & 0x0000ffffL;
+      // update byte count
+      bc = bc - temp;
+      // set the end bit in the prd list
+      if ( bc < 1 )
+         prdPtr[1] = prdPtr[1] | 0x80000000L;
+      prdPtr ++ ;
+      prdPtr ++ ;
+      numPrd ++ ;
+   }
+
+   // return the current PRD list size and
+   // set the prd list address in the BMIDE:
+   // convert PRD buffer seg:off to a physical address
+   // and write into BMIDE PRD address registers.
+
+   dma_pci_num_prd = numPrd;
+   temp = FP_SEG( dma_pci_prd_ptr );
+   temp = temp << 4;
+   temp = temp + FP_OFF( dma_pci_prd_ptr );
+   outport( pio_bmide_base_addr + BM_PRD_ADDR_LOW,
+            (unsigned int) ( temp & 0x0000ffffL ) );
+   outport( pio_bmide_base_addr + BM_PRD_ADDR_HIGH,
+            (unsigned int) ( ( temp & 0xffff0000L ) >> 16 ) );
+
+   #if DEBUG_PCI & 0x02
+      {
+         int ndx;
+         unsigned long far * lfp;
+
+         pstr( "z=>[prd] ----- Bus Master PRD List -----" );
+         sprintf( LFB, "z=>[prd] PRD PhyAddr %08lX",
+                       ( ( (unsigned long) FP_SEG( dma_pci_prd_ptr ) ) << 4 )
+                       + ( (unsigned long) FP_OFF( dma_pci_prd_ptr ) ) );
+         prt();
+         lfp = dma_pci_prd_ptr;
+         ndx = 0;
+         while ( ndx < dma_pci_num_prd )
+         {
+            sprintf( LFB, "z=>[prd] PRD %2d - PhyAddr %08lX Cnt %08lX",
+                           ndx, * lfp, * ( lfp + 1 ) );
+            prt();
+            lfp ++ ;
+            if (  ( * lfp ) & 0x80000000L )
+               break;
+            lfp ++ ;
+            ndx ++ ;
+         }
+      }
+   #endif
+
+   // set the read/write control:
+   // PCI reads for ATA Write DMA commands,
+   // PCI writes for ATA Read DMA commands.
+
+   if ( dir )
+      rwControl = BM_CR_MASK_READ;     // ATA Write DMA
+   else
+      rwControl = BM_CR_MASK_WRITE;    // ATA Read DMA
+   sub_writeBusMstrCmd( rwControl );
+   return 0;
+}
+
+//***********************************************************
+//
+// dma_pci_config() - configure/setup for Read/Write DMA
+//
+// The caller must call this function before attempting
+// to use any ATA or ATAPI commands in PCI DMA mode.
+//
+//***********************************************************
+
+int dma_pci_config( unsigned int regAddr )
+
+{
+   unsigned int off;
+   unsigned int seg;
+   unsigned long lw;
+
+   // check reg address
+
+   if ( regAddr & 0x0007 )       // error if regs addr
+      return 1;                  // are not xxx0h or xxx8h
+
+   // save the base i/o address of the bus master (BMIDE) regs
+
+   pio_bmide_base_addr = regAddr;
+
+   // disable if reg address is zero
+
+   if ( ! regAddr )              // if zero,
+      return 0;                  // PCI DMA is disabled.
+
+   // Set up the PRD entry list buffer address - the PRD entry list
+   // may not span a 64KB boundary in physical memory. Space is
+   // allocated (above) for this buffer such that it will be
+   // aligned on a seqment boundary (off of seg:off will be 0)
+   // and such that the PRD list will not span a 64KB boundary...
+   // ...convert seg:off to physical address.
+   seg = FP_SEG( (unsigned char far *) prdBuf );
+   off = FP_OFF( (unsigned char far *) prdBuf );
+   lw = (unsigned long) seg;
+   lw = lw << 4;
+   lw = lw + (unsigned long) off;
+   // ...move up to a segment boundary.
+   lw = lw + 15;
+   lw = lw & 0xfffffff0L;
+   // ...check for 64KB boundary in the first part of the PRD buffer,
+   // ...if so just move the buffer to that boundary.
+   if ( ( lw & 0xffff0000L )
+        !=
+        ( ( lw + ( MAX_PRD * 8L ) - 1L ) & 0xffff0000L )
+      )
+      lw = ( lw + ( MAX_PRD * 8L ) ) & 0xffff0000L;
+   // ...convert back to seg:off, note that off is now 0
+   seg = (unsigned int) ( lw >> 4 );
+   dma_pci_prd_ptr = prdBufPtr = MK_FP( seg, 0 );
+   // ... current size of the SIMPLE/COMPLEX PRD buffer
+   dma_pci_num_prd = 0;
+
+   // read the BM status reg and save the upper 3 bits.
+   statReg = sub_readBusMstrStatus() & 0x60;
+
+   // initialize the large PRD list info
+   dma_pci_largePrdBufPtr = (void *) 0;
+   dma_pci_largeIoBufPtr = (void *) 0;
+   dma_pci_largeMaxB = 0;
+   dma_pci_largeMaxS = 0;
+
+   return 0;
+}
+
+//***********************************************************
+//
+// determine max dma transfer for PRD type LARGE
+//
+// dma_pci_prd_type == PCI_TYPE_LARGE uses part of the caller's
+// I/O buffer to hold a large PRD list and another part of the
+// caller's I/O buffer to send/receive the actual data. Each
+// PRD entry uses the same memory address.
+//
+//***********************************************************
+
+void dma_pci_set_max_xfer( unsigned int seg, unsigned int off,
+                           long bufSize )
+
+{
+   long bufStart;       // buffer starting physical memory address
+   long bufEnd;         // buffer ending physical memory address (+1)
+   long pmaStart;       // start of 64K area within buffer
+   long pmaEnd;         // end of 64K area within buffer
+
+   // save buffer size
+   reg_buffer_size = bufSize;
+
+   // large DMA xfers not supported
+   dma_pci_largePrdBufPtr = (void *) 0;
+   dma_pci_largeIoBufPtr = (void *) 0;
+   dma_pci_largeMaxB = 0L;
+   dma_pci_largeMaxS = 0L;
+
+   // convert I/O buffer address from seg:off to an absolute memory address
+   // note: the physical address must be a word boundary (an even number).
+   bufStart = (unsigned long) seg;
+   bufStart = bufStart << 4;
+   bufStart = bufStart + (unsigned long) off;
+   bufStart = bufStart & 0xfffffffeL;
+   // move up to dword boundary
+   bufStart = ( bufStart + 15L ) & 0xfffffff0;
+   // compute end
+   bufEnd = bufStart + bufSize;
+   // compute start/end of 64K area (pma)
+   // that will be the I/O buffer
+   pmaStart = ( bufStart + 0x00010000L ) & 0xffff0000;
+   pmaEnd = pmaStart + 0x00010000L;
+
+   // if pma is in buffer then...
+   if ( ( pmaStart < bufEnd ) && ( pmaEnd <= bufEnd ) )
+   {
+      // ...find location for PRD list
+      if ( ( pmaStart - bufStart ) >= 4096L )
+      {
+         // PRD buffer first (I/O buffer second)
+         dma_pci_largePrdBufPtr = MK_FP( (unsigned int) ( bufStart >> 4 ), 0 );
+      }
+      else
+      if ( ( bufEnd - pmaEnd ) >= 4096L )
+      {
+         // PRD buffer second (I/O buffer first)
+         dma_pci_largePrdBufPtr = MK_FP( (unsigned int) ( pmaEnd >> 4 ), 0 );
+      }
+      if ( dma_pci_largePrdBufPtr )
+      {
+         dma_pci_largeIoBufPtr = MK_FP( (unsigned int) ( pmaStart >> 4 ), 0 );
+         dma_pci_largeMaxB = 65536L * 512L;
+         dma_pci_largeMaxS = 65536L;
+      }
+   }
+
+   #if DEBUG_PCI & 0x02
+      pstr( "z=>[dma] dma_pci_set_max_xfer()..." );
+      sprintf( LFB, "z=>[dma] seg %04x off %04x bufSize %lx", seg, off, bufSize );
+      prt();
+      sprintf( LFB, "z=>[dma] bufStart %lx bufEnd %lx", bufStart, bufEnd );
+      prt();
+      sprintf( LFB, "z=>[dma] pmaStart %lx pmaEnd %lx", pmaStart, pmaEnd );
+      prt();
+      sprintf( LFB, "z=>[dma] largePrdBufPtr %Fp largeIoBufPtr %Fp",
+                             dma_pci_largePrdBufPtr, dma_pci_largeIoBufPtr );
+      prt();
+      sprintf( LFB, "z=>[dma] dma_pci_largeMaxB %ld dma_pci_largeMaxS %ld",
+                             dma_pci_largeMaxB, dma_pci_largeMaxS );
+      prt();
+   #endif
+
+}
+
+//***********************************************************
+//
+// exec_pci_ata_cmd() - PCI Bus Master for ATA R/W DMA commands
+//
+//***********************************************************
+
+static int exec_pci_ata_cmd( int dev,
+                             unsigned int seg, unsigned int off,
+                             long numSect );
+
+static int exec_pci_ata_cmd( int dev,
+                             unsigned int seg, unsigned int off,
+                             long numSect )
+
+{
+   unsigned int cntr;
+   unsigned char status;
+   long lw;
+
+   // mark start of a R/W DMA command in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_RWD );
+
+   // Quit now if no dma channel set up
+   // or interrupts are not enabled.
+
+   if ( ( ! pio_bmide_base_addr ) || ( ! int_use_intr_flag ) )
+   {
+      reg_cmd_info.ec = 70;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_RWD );
+      return 1;
+   }
+
+   // Quit now if 1) I/O buffer overrun possible.
+   // or 2) DMA can't handle the transfer size.
+
+   lw = numSect * 512L;
+   if ( (    ( dma_pci_prd_type != PRD_TYPE_LARGE )
+          && ( ( lw > MAX_TRANSFER_SIZE ) || ( lw > reg_buffer_size ) ) )
+        ||
+        (    ( dma_pci_prd_type == PRD_TYPE_LARGE )
+          && ( lw > dma_pci_largeMaxB ) )
+      )
+   {
+      reg_cmd_info.ec = 61;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // Set up the dma transfer
+
+   if ( set_up_xfer(    ( reg_cmd_info.cmd == CMD_WRITE_DMA )
+                     || ( reg_cmd_info.cmd == CMD_WRITE_DMA_EXT )
+                     || ( reg_cmd_info.cmd == CMD_WRITE_DMA_FUA_EXT ),
+                     numSect * 512L, seg, off ) )
+   {
+      reg_cmd_info.ec = 61;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // Select the drive - call the sub_select function.
+   // Quit now if this fails.
+
+   if ( sub_select( dev ) )
+   {
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_RWD );
+      return 1;
+   }
+
+   // Set up all the registers except the command register.
+
+   sub_setup_command();
+
+   // For interrupt mode, install interrupt handler.
+
+   int_save_int_vect();
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, reg_cmd_info.cmd );
+
+   // The drive should start executing the command including any
+   // data transfer.
+
+   // Data transfer...
+   // read the BMIDE regs
+   // enable/start the dma channel.
+   // read the BMIDE regs again
+
+   sub_readBusMstrCmd();
+   sub_readBusMstrStatus();
+   sub_writeBusMstrCmd( rwControl | BM_CR_MASK_START );
+   sub_readBusMstrCmd();
+   sub_readBusMstrStatus();
+
+   // Data transfer...
+   // the device and dma channel transfer the data here while we start
+   // checking for command completion...
+   // wait for the PCI BM Interrupt=1 (see ATAIOINT.C)...
+
+   trc_llt( 0, 0, TRC_LLT_WINT );
+   cntr = 0;
+   while ( 1 )
+   {
+      cntr ++ ;
+      if ( ! ( cntr & 0x1fff ) )
+      {
+         sub_readBusMstrStatus();         // read BM status (for trace)
+         if ( ! ( reg_incompat_flags & REG_INCOMPAT_DMA_POLL ) )
+            pio_inbyte( CB_ASTAT );       // poll Alt Status
+      }
+      if ( int_intr_flag )                // interrupt ?
+      {
+         trc_llt( 0, 0, TRC_LLT_INTRQ );  // yes
+         trc_llt( 0, int_bm_status, TRC_LLT_R_BM_SR );
+         trc_llt( CB_STAT, int_ata_status, TRC_LLT_INB );
+         trc_llt( 0, 0x04, TRC_LLT_W_BM_SR );
+         break;
+      }
+      if ( tmr_chk_timeout() )            // time out ?
+      {
+         trc_llt( 0, 0, TRC_LLT_TOUT );   // yes
+         reg_cmd_info.to = 1;
+         reg_cmd_info.ec = 73;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         break;
+      }
+   }
+
+   if ( reg_incompat_flags & REG_INCOMPAT_DMA_DELAY )
+   {
+      tmr_delay_1ms( 1L );    // delay for buggy controllers
+   }
+
+   // End of command...
+   // disable/stop the dma channel
+
+   status = int_bm_status;                // read BM status
+   status &= ~ BM_SR_MASK_ACT;            // ignore Active bit
+   sub_writeBusMstrCmd( BM_CR_MASK_STOP );    // shutdown DMA
+   sub_readBusMstrCmd();                      // read BM cmd (just for trace)
+   status |= sub_readBusMstrStatus();         // read BM status again
+
+   if ( reg_incompat_flags & REG_INCOMPAT_DMA_DELAY )
+   {
+      tmr_delay_1ms( 1L );    // delay for buggy controlers
+   }
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & BM_SR_MASK_ERR )            // bus master error?
+      {
+         reg_cmd_info.ec = 78;                  // yes
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & BM_SR_MASK_ACT )            // end of PRD list?
+      {
+         reg_cmd_info.ec = 71;                  // no
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   #if DEBUG_PCI & 0x01
+      trc_llt( 0, int_intr_cntr, TRC_LLT_DEBUG );  // for debugging
+   #endif
+
+   // End of command...
+   // If no error use the Status register value that was read
+   // by the interrupt handler. If there was an error
+   // read the Status register because it may not have been
+   // read by the interrupt handler.
+
+   if ( reg_cmd_info.ec )
+      status = pio_inbyte( CB_STAT );
+   else
+      status = int_ata_status;
+
+   // Final status check...
+   // if no error, check final status...
+   // Error if BUSY, DEVICE FAULT, DRQ or ERROR status now.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & ( CB_STAT_BSY | CB_STAT_DF | CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 74;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   // Final status check...
+   // if any error, update total bytes transferred.
+
+   if ( reg_cmd_info.ec == 0 )
+      reg_cmd_info.totalBytesXfer = numSect * 512L;
+   else
+      reg_cmd_info.totalBytesXfer = 0L;
+
+   // Done...
+   // Read the output registers and trace the command.
+
+   sub_trace_command();
+
+   // Done...
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // Done...
+   // mark end of a R/W DMA command in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_RWD );
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+//***********************************************************
+//
+// dma_pci_chs() - PCI Bus Master for ATA R/W DMA commands
+//
+//***********************************************************
+
+int dma_pci_chs( int dev, int cmd,
+                 unsigned int fr, unsigned int sc,
+                 unsigned int cyl, unsigned int head, unsigned int sect,
+                 unsigned int seg, unsigned int off,
+                 long numSect )
+
+{
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_ADMAI;
+   if (    ( cmd == CMD_WRITE_DMA )
+        || ( cmd == CMD_WRITE_DMA_EXT )
+        || ( cmd == CMD_WRITE_DMA_FUA_EXT )
+      )
+      reg_cmd_info.ct  = TRC_TYPE_ADMAO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.sn1 = sect;
+   reg_cmd_info.cl1 = cyl & 0x00ff;
+   reg_cmd_info.ch1 = ( cyl & 0xff00 ) >> 8;
+   reg_cmd_info.dh1 = ( dev ? CB_DH_DEV1 : CB_DH_DEV0 ) | ( head & 0x0f );
+   reg_cmd_info.dc1 = 0x00;      // nIEN=0 required on PCI !
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.lbaSize = LBACHS;
+
+   // Execute the command.
+
+   return exec_pci_ata_cmd( dev, seg, off, numSect );
+}
+
+//***********************************************************
+//
+// dma_pci_lba28() - DMA in PCI Multiword for ATA R/W DMA
+//
+//***********************************************************
+
+int dma_pci_lba28( int dev, int cmd,
+                   unsigned int fr, unsigned int sc,
+                   unsigned long lba,
+                   unsigned int seg, unsigned int off,
+                   long numSect )
+
+{
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_ADMAI;
+   if (    ( cmd == CMD_WRITE_DMA )
+        || ( cmd == CMD_WRITE_DMA_EXT )
+        || ( cmd == CMD_WRITE_DMA_FUA_EXT )
+      )
+      reg_cmd_info.ct  = TRC_TYPE_ADMAO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = 0x00;      // nIEN=0 required on PCI !
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.lbaSize = LBA28;
+   reg_cmd_info.lbaHigh1 = 0L;
+   reg_cmd_info.lbaLow1 = lba;
+
+   // Execute the command.
+
+   return exec_pci_ata_cmd( dev, seg, off, numSect );
+}
+
+//***********************************************************
+//
+// dma_pci_lba48() - DMA in PCI Multiword for ATA R/W DMA
+//
+//***********************************************************
+
+int dma_pci_lba48( int dev, int cmd,
+                   unsigned int fr, unsigned int sc,
+                   unsigned long lbahi, unsigned long lbalo,
+                   unsigned int seg, unsigned int off,
+                   long numSect )
+
+{
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_ADMAI;
+   if (    ( cmd == CMD_WRITE_DMA )
+        || ( cmd == CMD_WRITE_DMA_EXT )
+        || ( cmd == CMD_WRITE_DMA_FUA_EXT )
+      )
+      reg_cmd_info.ct  = TRC_TYPE_ADMAO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = 0x00;      // nIEN=0 required on PCI !
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.lbaSize = LBA48;
+   reg_cmd_info.lbaHigh1 = lbahi;
+   reg_cmd_info.lbaLow1 = lbalo;
+
+   // Execute the command.
+
+   return exec_pci_ata_cmd( dev, seg, off, numSect );
+}
+
+//***********************************************************
+//
+// dma_pci_packet() - PCI Bus Master for ATAPI Packet command
+//
+//***********************************************************
+
+int dma_pci_packet( int dev,
+                    unsigned int cpbc,
+                    unsigned int cpseg, unsigned int cpoff,
+                    int dir,
+                    long dpbc,
+                    unsigned int dpseg, unsigned int dpoff,
+                    unsigned long lba )
+
+{
+   unsigned char status;
+   unsigned char reason;
+   unsigned char lowCyl;
+   unsigned char highCyl;
+   unsigned int cntr;
+   int ndx;
+   unsigned char far * cfp;
+
+   // mark start of isa dma PI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_PID );
+
+   // Make sure the command packet size is either 12 or 16
+   // and save the command packet size and data.
+
+   cpbc = cpbc < 12 ? 12 : cpbc;
+   cpbc = cpbc > 12 ? 16 : cpbc;
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATAPI;
+   reg_cmd_info.ct  = dir ? TRC_TYPE_PDMAO : TRC_TYPE_PDMAI;
+   reg_cmd_info.cmd = CMD_PACKET;
+   reg_cmd_info.fr1 = reg_atapi_reg_fr | 0x01;  // packet DMA mode !
+   reg_cmd_info.sc1 = reg_atapi_reg_sc;
+   reg_cmd_info.sn1 = reg_atapi_reg_sn;
+   reg_cmd_info.cl1 = 0;         // no Byte Count Limit in DMA !
+   reg_cmd_info.ch1 = 0;         // no Byte Count Limit in DMA !
+   reg_cmd_info.dh1 = dev ? CB_DH_DEV1 : CB_DH_DEV0;
+   reg_cmd_info.dc1 = 0x00;      // nIEN=0 required on PCI !
+   reg_cmd_info.lbaSize = LBA32;
+   reg_cmd_info.lbaLow1 = lba;
+   reg_cmd_info.lbaHigh1 = 0L;
+   reg_atapi_cp_size = cpbc;
+   cfp = MK_FP( cpseg, cpoff );
+   for ( ndx = 0; ndx < cpbc; ndx ++ )
+   {
+      reg_atapi_cp_data[ndx] = * cfp;
+      cfp ++ ;
+   }
+
+   // Zero the alternate ATAPI register data.
+
+   reg_atapi_reg_fr = 0;
+   reg_atapi_reg_sc = 0;
+   reg_atapi_reg_sn = 0;
+   reg_atapi_reg_dh = 0;
+
+   // Quit now if no dma channel set up
+
+   if ( ! pio_bmide_base_addr )
+   {
+      reg_cmd_info.ec = 70;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // the data packet byte count must be even
+   // and must not be zero
+
+   if ( dpbc & 1L )
+      dpbc ++ ;
+   if ( dpbc < 2L )
+      dpbc = 2L;
+
+   // Quit now if 1) I/O buffer overrun possible
+   // or 2) DMA can't handle the transfer size.
+
+   if ( (    ( dma_pci_prd_type != PRD_TYPE_LARGE )
+          && ( ( dpbc > MAX_TRANSFER_SIZE ) || ( dpbc > reg_buffer_size ) ) )
+        ||
+        (    ( dma_pci_prd_type == PRD_TYPE_LARGE )
+          && ( dpbc > dma_pci_largeMaxB ) )
+      )
+   {
+      reg_cmd_info.ec = 61;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // Set up the dma transfer
+
+   if ( set_up_xfer( dir, dpbc, dpseg, dpoff ) )
+   {
+      reg_cmd_info.ec = 61;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // Select the drive - call the reg_select function.
+   // Quit now if this fails.
+
+   if ( sub_select( dev ) )
+   {
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PID );
+      return 1;
+   }
+
+   // Set up all the registers except the command register.
+
+   sub_setup_command();
+
+   // For interrupt mode, install interrupt handler.
+
+   int_save_int_vect();
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, CMD_PACKET );
+
+   // Waste some time by reading the alternate status a few times.
+   // This gives the drive time to set BUSY in the status register on
+   // really fast systems.  If we don't do this, a slow drive on a fast
+   // system may not set BUSY fast enough and we would think it had
+   // completed the command when it really had not started the
+   // command yet.
+
+   ATA_DELAY();
+
+   // Command packet transfer...
+   // Check for protocol failures,
+   // the device should have BSY=1 or
+   // if BSY=0 then either DRQ=1 or CHK=1.
+
+   ATAPI_DELAY( dev );
+   status = pio_inbyte( CB_ASTAT );
+   if ( status & CB_STAT_BSY )
+   {
+      // BSY=1 is OK
+   }
+   else
+   {
+      if ( status & ( CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         // BSY=0 and DRQ=1 is OK
+         // BSY=0 and ERR=1 is OK
+      }
+      else
+      {
+         reg_cmd_info.failbits |= FAILBIT0;  // not OK
+      }
+   }
+
+   // Command packet transfer...
+   // Poll Alternate Status for BSY=0.
+
+   trc_llt( 0, 0, TRC_LLT_PNBSY );
+   while ( 1 )
+   {
+      status = pio_inbyte( CB_ASTAT );       // poll for not busy
+      if ( ( status & CB_STAT_BSY ) == 0 )
+         break;
+      if ( tmr_chk_timeout() )               // time out yet ?
+      {
+         trc_llt( 0, 0, TRC_LLT_TOUT );      // yes
+         reg_cmd_info.to = 1;
+         reg_cmd_info.ec = 75;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         break;
+      }
+   }
+
+   // Command packet transfer...
+   // Check for protocol failures... no interrupt here please!
+   // Clear any interrupt the command packet transfer may have caused.
+
+   if ( int_intr_flag )    // extra interrupt(s) ?
+      reg_cmd_info.failbits |= FAILBIT1;
+   int_intr_flag = 0;
+
+   // Command packet transfer...
+   // If no error, transfer the command packet.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+
+      // Command packet transfer...
+      // Read the primary status register and the other ATAPI registers.
+
+      status = pio_inbyte( CB_STAT );
+      reason = pio_inbyte( CB_SC );
+      lowCyl = pio_inbyte( CB_CL );
+      highCyl = pio_inbyte( CB_CH );
+
+      // Command packet transfer...
+      // check status: must have BSY=0, DRQ=1 now
+
+      if (    ( status & ( CB_STAT_BSY | CB_STAT_DRQ | CB_STAT_ERR ) )
+           != CB_STAT_DRQ
+         )
+      {
+         reg_cmd_info.ec = 76;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+      else
+      {
+         // Command packet transfer...
+         // Check for protocol failures...
+         // check: C/nD=1, IO=0.
+
+         if ( ( reason &  ( CB_SC_P_TAG | CB_SC_P_REL | CB_SC_P_IO ) )
+              || ( ! ( reason &  CB_SC_P_CD ) )
+            )
+            reg_cmd_info.failbits |= FAILBIT2;
+         if (    ( lowCyl != reg_cmd_info.cl1 )
+              || ( highCyl != reg_cmd_info.ch1 ) )
+            reg_cmd_info.failbits |= FAILBIT3;
+
+         // Command packet transfer...
+         // trace cdb byte 0,
+         // xfer the command packet (the cdb)
+
+         trc_llt( 0, * (unsigned char far *) MK_FP( cpseg, cpoff ), TRC_LLT_P_CMD );
+         pio_drq_block_out( CB_DATA, cpseg, cpoff, cpbc >> 1 );
+      }
+   }
+
+   // Data transfer...
+   // The drive should start executing the command
+   // including any data transfer.
+   // If no error, set up and start the DMA,
+   // and wait for the DMA to complete.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+
+      // Data transfer...
+      // read the BMIDE regs
+      // enable/start the dma channel.
+      // read the BMIDE regs again
+
+      sub_readBusMstrCmd();
+      sub_readBusMstrStatus();
+      sub_writeBusMstrCmd( rwControl | BM_CR_MASK_START );
+      sub_readBusMstrCmd();
+      sub_readBusMstrStatus();
+
+      // Data transfer...
+      // the device and dma channel transfer the data here while we start
+      // checking for command completion...
+      // wait for the PCI BM Active=0 and Interrupt=1 or PCI BM Error=1...
+
+      trc_llt( 0, 0, TRC_LLT_WINT );
+      cntr = 0;
+      while ( 1 )
+      {
+         cntr ++ ;
+         if ( ! ( cntr & 0x1fff) )
+         {
+            sub_readBusMstrStatus();         // read BM status (for trace)
+            if ( ! ( reg_incompat_flags & REG_INCOMPAT_DMA_POLL ) )
+               pio_inbyte( CB_ASTAT );       // poll Alt Status
+         }
+         if ( int_intr_flag )                // interrupt ?
+         {
+            trc_llt( 0, 0, TRC_LLT_INTRQ );  // yes
+            trc_llt( 0, int_bm_status, TRC_LLT_R_BM_SR );
+            trc_llt( CB_STAT, int_ata_status, TRC_LLT_INB );
+            trc_llt( 0, 0x04, TRC_LLT_W_BM_SR );
+            break;
+         }
+         if ( tmr_chk_timeout() )            // time out ?
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );   // yes
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 73;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+
+      if ( reg_incompat_flags & REG_INCOMPAT_DMA_DELAY )
+      {
+         tmr_delay_1ms( 1L);     // delay for buggy controllers
+      }
+
+      // End of command...
+      // disable/stop the dma channel
+
+      status = int_bm_status;                // read BM status
+      status &= ~ BM_SR_MASK_ACT;            // ignore Active bit
+      sub_writeBusMstrCmd( BM_CR_MASK_STOP );    // shutdown DMA
+      sub_readBusMstrCmd();                      // read BM cmd (just for trace)
+      status |= sub_readBusMstrStatus();         // read BM statu again
+
+      if ( reg_incompat_flags & REG_INCOMPAT_DMA_DELAY )
+      {
+         tmr_delay_1ms( 1L );    // delay for buggy controllers
+      }
+   }
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & ( BM_SR_MASK_ERR ) )        // bus master error?
+      {
+         reg_cmd_info.ec = 78;                  // yes
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+      if ( ( status & BM_SR_MASK_ACT ) )        // end of PRD list?
+      {
+         reg_cmd_info.ec = 71;                  // no
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   #if DEBUG_PCI & 0x01
+      trc_llt( 0, int_intr_cntr, TRC_LLT_DEBUG );  // for debugging
+   #endif
+
+   // End of command...
+   // If no error use the Status register value that was read
+   // by the interrupt handler. If there was an error
+   // read the Status register because it may not have been
+   // read by the interrupt handler.
+
+   if ( reg_cmd_info.ec )
+      status = pio_inbyte( CB_STAT );
+   else
+      status = int_ata_status;
+
+   // Final status check...
+   // if no error, check final status...
+   // Error if BUSY, DRQ or ERROR status now.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & ( CB_STAT_BSY | CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 74;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   // Final status check...
+   // Check for protocol failures...
+   // check: C/nD=1, IO=1.
+
+   reason = pio_inbyte( CB_SC );
+   if ( ( reason & ( CB_SC_P_TAG | CB_SC_P_REL ) )
+        || ( ! ( reason & CB_SC_P_IO ) )
+        || ( ! ( reason & CB_SC_P_CD ) )
+      )
+      reg_cmd_info.failbits |= FAILBIT8;
+
+   // Final status check...
+   // if any error, update total bytes transferred.
+
+   if ( reg_cmd_info.ec == 0 )
+      reg_cmd_info.totalBytesXfer = dpbc;
+   else
+      reg_cmd_info.totalBytesXfer = 0L;
+
+   // Done...
+   // Read the output registers and trace the command.
+
+   sub_trace_command();
+
+   // Done...
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // Done...
+   // mark end of isa dma PI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_PID );
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+// end ataiopci.c
diff --git a/haribote/ata/ATAIOPIO.C b/haribote/ata/ATAIOPIO.C
new file mode 100644 (file)
index 0000000..c3be2ca
--- /dev/null
@@ -0,0 +1,735 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOPIO.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+// This module contains inline assembler code so you'll
+// also need Borland's Assembler.
+//
+// This C source contains the low level I/O port IN/OUT functions.
+//********************************************************************
+
+#include <dos.h>
+
+#include "ataio.h"
+
+//*************************************************************
+//
+// Host adapter base addresses.
+//
+//*************************************************************
+
+unsigned int pio_base_addr1 = 0x1f0;
+unsigned int pio_base_addr2 = 0x3f0;
+
+unsigned int pio_memory_seg = 0;
+int pio_memory_dt_opt = PIO_MEMORY_DT_OPT0;
+
+unsigned int pio_bmide_base_addr = 0;
+
+unsigned int pio_reg_addrs[10];
+
+unsigned char pio_last_write[10];
+unsigned char pio_last_read[10];
+
+int pio_xfer_width = 16;
+
+//*************************************************************
+//
+// Set the host adapter i/o base addresses.
+//
+//*************************************************************
+
+void pio_set_iobase_addr( unsigned int base1,
+                          unsigned int base2,
+                          unsigned int base3 )
+
+{
+
+   pio_base_addr1 = base1;
+   pio_base_addr2 = base2;
+   pio_bmide_base_addr = base3;
+   pio_memory_seg = 0;
+   pio_reg_addrs[ CB_DATA ] = pio_base_addr1 + 0;  // 0
+   pio_reg_addrs[ CB_FR   ] = pio_base_addr1 + 1;  // 1
+   pio_reg_addrs[ CB_SC   ] = pio_base_addr1 + 2;  // 2
+   pio_reg_addrs[ CB_SN   ] = pio_base_addr1 + 3;  // 3
+   pio_reg_addrs[ CB_CL   ] = pio_base_addr1 + 4;  // 4
+   pio_reg_addrs[ CB_CH   ] = pio_base_addr1 + 5;  // 5
+   pio_reg_addrs[ CB_DH   ] = pio_base_addr1 + 6;  // 6
+   pio_reg_addrs[ CB_CMD  ] = pio_base_addr1 + 7;  // 7
+   pio_reg_addrs[ CB_DC   ] = pio_base_addr2 + 6;  // 8
+   pio_reg_addrs[ CB_DA   ] = pio_base_addr2 + 7;  // 9
+}
+
+//*************************************************************
+//
+// Set the host adapter memory base addresses.
+//
+//*************************************************************
+
+void pio_set_memory_addr( unsigned int seg )
+
+{
+
+   pio_base_addr1 = 0;
+   pio_base_addr2 = 8;
+   pio_bmide_base_addr = 0;
+   pio_memory_seg = seg;
+   pio_memory_dt_opt = PIO_MEMORY_DT_OPT0;
+   pio_reg_addrs[ CB_DATA ] = pio_base_addr1 + 0;  // 0
+   pio_reg_addrs[ CB_FR   ] = pio_base_addr1 + 1;  // 1
+   pio_reg_addrs[ CB_SC   ] = pio_base_addr1 + 2;  // 2
+   pio_reg_addrs[ CB_SN   ] = pio_base_addr1 + 3;  // 3
+   pio_reg_addrs[ CB_CL   ] = pio_base_addr1 + 4;  // 4
+   pio_reg_addrs[ CB_CH   ] = pio_base_addr1 + 5;  // 5
+   pio_reg_addrs[ CB_DH   ] = pio_base_addr1 + 6;  // 6
+   pio_reg_addrs[ CB_CMD  ] = pio_base_addr1 + 7;  // 7
+   pio_reg_addrs[ CB_DC   ] = pio_base_addr2 + 6;  // 8
+   pio_reg_addrs[ CB_DA   ] = pio_base_addr2 + 7;  // 9
+}
+
+//*************************************************************
+//
+// These functions do basic IN/OUT of byte and word values:
+//
+//    pio_inbyte()
+//    pio_outbyte()
+//    pio_inword()
+//    pio_outword()
+//
+//*************************************************************
+
+unsigned char pio_inbyte( unsigned int addr )
+
+{
+   unsigned int regAddr;
+   unsigned char uc;
+   unsigned char far * ucp;
+
+   regAddr = pio_reg_addrs[ addr ];
+   if ( pio_memory_seg )
+   {
+      ucp = (unsigned char far *) MK_FP( pio_memory_seg, regAddr );
+      uc = * ucp;
+   }
+   else
+   {
+       uc = (unsigned char) inportb( regAddr );
+
+      // READ THIS: If you get a compile error on the following
+      // statement you are trying to use BASM (the assembler
+      // built into Borland C). BASM can not assemble 386
+      // instructions. You must use Borland TASM as is shown
+      // in the EXAMPLE1.MAK or EXAMPLE2.MAK "make files".
+
+      // asm   .386
+
+      // asm   push  ax
+      // asm   push  dx
+
+      // asm   mov   dx,regAddr
+
+      // asm   in    al,dx
+      // asm   mov   uc,al
+
+      // asm   pop   dx
+      // asm   pop   ax
+
+   }
+   pio_last_read[ addr ] = uc;
+   trc_llt( addr, uc, TRC_LLT_INB );
+   return uc;
+}
+
+//*************************************************************
+
+void pio_outbyte( unsigned int addr, unsigned char data )
+
+{
+   unsigned int regAddr;
+   unsigned char far * ucp;
+
+   regAddr = pio_reg_addrs[ addr ];
+   if ( pio_memory_seg )
+   {
+      ucp = (unsigned char far *) MK_FP( pio_memory_seg, regAddr );
+      * ucp = data;
+   }
+   else
+   {
+       outportb( regAddr, data );
+
+      // asm   .386
+
+      // asm   push  ax
+      // asm   push  dx
+
+      // asm   mov   dx,regAddr
+      // asm   mov   al,data
+
+      // asm   out   dx,al
+
+      // asm   pop   dx
+      // asm   pop   ax
+
+   }
+   pio_last_write[ addr ] = data;
+   trc_llt( addr, data, TRC_LLT_OUTB );
+}
+
+//*************************************************************
+
+unsigned int pio_inword( unsigned int addr )
+
+{
+   unsigned int regAddr;
+   unsigned int ui;
+   unsigned int far * uip;
+
+   regAddr = pio_reg_addrs[ addr ];
+   if ( pio_memory_seg )
+   {
+      uip = (unsigned int far *) MK_FP( pio_memory_seg, regAddr );
+      ui = * uip;
+   }
+   else
+   {
+       ui = inportw( regAddr );
+
+      // asm   .386
+
+      // asm   push  ax
+      // asm   push  dx
+
+      // asm   mov   dx,regAddr
+
+      // asm   in    ax,dx
+      // asm   mov   ui,ax
+
+      // asm   pop   dx
+      // asm   pop   ax
+
+   }
+   trc_llt( addr, 0, TRC_LLT_INW );
+   return ui;
+}
+
+//*************************************************************
+
+void pio_outword( unsigned int addr, unsigned int data )
+
+{
+   unsigned int regAddr;
+   unsigned int far * uip;
+
+   regAddr = pio_reg_addrs[ addr ];
+   if ( pio_memory_seg )
+   {
+      uip = (unsigned int far *) MK_FP( pio_memory_seg, regAddr );
+      * uip = data;
+   }
+   else
+   {
+       outportw( regAddr, data );
+
+      // asm   .386
+
+      // asm   push  ax
+      // asm   push  dx
+
+      // asm   mov   dx,regAddr
+      // asm   mov   ax,data
+
+      // asm   out   dx,ax
+
+      // asm   pop   dx
+      // asm   pop   ax
+
+   }
+   trc_llt( addr, 0, TRC_LLT_OUTW );
+}
+
+//*************************************************************
+//
+// These functions are normally used to transfer DRQ blocks:
+//
+// pio_drq_block_in()
+// pio_drq_block_out()
+//
+//*************************************************************
+
+// Note: pio_drq_block_in() is the primary way perform PIO
+// Data In transfers. It will handle 8-bit, 16-bit and 32-bit
+// I/O based data transfers and 8-bit and 16-bit PCMCIA Memory
+// mode transfers.
+
+void pio_drq_block_in( unsigned int addrDataReg,
+                       unsigned int bufSeg, unsigned int bufOff,
+                       long wordCnt )
+
+{
+   long bCnt;
+   int memDtOpt;
+   unsigned int randVal;
+   unsigned int dataRegAddr;
+   unsigned int far * uip1;
+   unsigned int far * uip2;
+   unsigned char far * ucp1;
+   unsigned char far * ucp2;
+   unsigned long bufAddr;
+
+   // NOTE: wordCnt is the size of a DRQ block
+   // in words. The maximum value of wordCnt is normally:
+   // a) For ATA, 16384 words or 32768 bytes (64 sectors,
+   //    only with READ/WRITE MULTIPLE commands),
+   // b) For ATAPI, 32768 words or 65536 bytes
+   //    (actually 65535 bytes plus a pad byte).
+
+   // normalize bufSeg:bufOff
+
+   bufAddr = bufSeg;
+   bufAddr = bufAddr << 4;
+   bufAddr = bufAddr + bufOff;
+
+   if ( pio_memory_seg )
+   {
+
+      // PCMCIA Memory mode data transfer.
+
+      // set Data reg address per pio_memory_dt_opt
+      dataRegAddr = 0x0000;
+      memDtOpt = pio_memory_dt_opt;
+      if ( pio_memory_dt_opt == PIO_MEMORY_DT_OPTR )
+      {
+         randVal = * (unsigned int *) MK_FP( 0x40, 0x6c );
+         memDtOpt = randVal % 3;
+      }
+      if ( memDtOpt == PIO_MEMORY_DT_OPT8 )
+         dataRegAddr = 0x0008;
+      if ( memDtOpt == PIO_MEMORY_DT_OPTB )
+      {
+         dataRegAddr = 0x0400;
+         if ( pio_memory_dt_opt == PIO_MEMORY_DT_OPTR )
+            dataRegAddr = dataRegAddr | ( randVal & 0x03fe );
+      }
+
+      if ( pio_xfer_width == 8 )
+      {
+         // PCMCIA Memory mode 8-bit
+         bCnt = wordCnt * 2L;
+         ucp1 = (unsigned char far *) MK_FP( pio_memory_seg, dataRegAddr );
+         for ( ; bCnt > 0; bCnt -- )
+         {
+            bufSeg = (unsigned int) ( bufAddr >> 4 );
+            bufOff = (unsigned int) ( bufAddr & 0x0000000fL );
+            ucp2 = (unsigned char far *) MK_FP( bufSeg, bufOff );
+            * ucp2 = * ucp1;
+            bufAddr += 1;
+            if ( memDtOpt == PIO_MEMORY_DT_OPTB )
+            {
+               dataRegAddr += 1;
+               dataRegAddr = ( dataRegAddr & 0x03ff ) | 0x0400;
+               ucp1 = (unsigned char far *) MK_FP( pio_memory_seg, dataRegAddr );
+            }
+         }
+         trc_llt( addrDataReg, 0, TRC_LLT_INSB );
+      }
+      else
+      {
+         // PCMCIA Memory mode 16-bit
+         uip1 = (unsigned int far *) MK_FP( pio_memory_seg, dataRegAddr );
+         for ( ; wordCnt > 0; wordCnt -- )
+         {
+            bufSeg = (unsigned int) ( bufAddr >> 4 );
+            bufOff = (unsigned int) ( bufAddr & 0x0000000fL );
+            uip2 = (unsigned int far *) MK_FP( bufSeg, bufOff );
+            * uip2 = * uip1;
+            bufAddr += 2;
+            if ( memDtOpt == PIO_MEMORY_DT_OPTB )
+            {
+               dataRegAddr += 2;
+               dataRegAddr = ( dataRegAddr & 0x03fe ) | 0x0400;
+               uip1 = (unsigned int far *) MK_FP( pio_memory_seg, dataRegAddr );
+            }
+         }
+         trc_llt( addrDataReg, 0, TRC_LLT_INSW );
+      }
+   }
+   else
+   {
+      int pxw;
+      long wc;
+
+      // adjust pio_xfer_width - don't use DWORD if wordCnt is odd.
+
+      pxw = pio_xfer_width;
+      if ( ( pxw == 32 ) && ( wordCnt & 0x00000001L ) )
+         pxw = 16;
+
+      // Data transfer using INS instruction.
+      // Break the transfer into chunks of 32768 or fewer bytes.
+
+      while ( wordCnt > 0 )
+      {
+         //bufSeg = (unsigned int) ( bufAddr >> 4 );
+         //bufOff = (unsigned int) ( bufAddr & 0x0000000fL );
+                bufSeg = 0;
+                bufOff = bufAddr;
+         if ( wordCnt > 16384L )
+            wc = 16384;
+         else
+            wc = wordCnt;
+         if ( pxw == 8 )
+         {
+            // do REP INS
+            pio_rep_inbyte( addrDataReg, bufSeg, bufOff, wc * 2L );
+         }
+         else
+         if ( pxw == 32 )
+         {
+            // do REP INSD
+            pio_rep_indword( addrDataReg, bufSeg, bufOff, wc / 2L );
+         }
+         else
+         {
+            // do REP INSW
+            pio_rep_inword( addrDataReg, bufSeg, bufOff, wc );
+         }
+         bufAddr = bufAddr + ( wc * 2 );
+         wordCnt = wordCnt - wc;
+      }
+   }
+
+   return;
+}
+
+//*************************************************************
+
+// Note: pio_drq_block_out() is the primary way perform PIO
+// Data Out transfers. It will handle 8-bit, 16-bit and 32-bit
+// I/O based data transfers and 8-bit and 16-bit PCMCIA Memory
+// mode transfers.
+
+void pio_drq_block_out( unsigned int addrDataReg,
+                        unsigned int bufSeg, unsigned int bufOff,
+                        long wordCnt )
+
+{
+   long bCnt;
+   int memDtOpt;
+   unsigned int randVal;
+   unsigned int dataRegAddr;
+   unsigned int far * uip1;
+   unsigned int far * uip2;
+   unsigned char far * ucp1;
+   unsigned char far * ucp2;
+   unsigned long bufAddr;
+
+   // NOTE: wordCnt is the size of a DRQ block
+   // in words. The maximum value of wordCnt is normally:
+   // a) For ATA, 16384 words or 32768 bytes (64 sectors,
+   //    only with READ/WRITE MULTIPLE commands),
+   // b) For ATAPI, 32768 words or 65536 bytes
+   //    (actually 65535 bytes plus a pad byte).
+
+   // normalize bufSeg:bufOff
+
+   bufAddr = bufSeg;
+   bufAddr = bufAddr << 4;
+   bufAddr = bufAddr + bufOff;
+
+   if ( pio_memory_seg )
+   {
+
+      // PCMCIA Memory mode data transfer.
+
+      // set Data reg address per pio_memory_dt_opt
+      dataRegAddr = 0x0000;
+      memDtOpt = pio_memory_dt_opt;
+      if ( pio_memory_dt_opt == PIO_MEMORY_DT_OPTR )
+      {
+         randVal = * (unsigned int *) MK_FP( 0x40, 0x6c );
+         memDtOpt = randVal % 3;
+      }
+      if ( memDtOpt == PIO_MEMORY_DT_OPT8 )
+         dataRegAddr = 0x0008;
+      if ( memDtOpt == PIO_MEMORY_DT_OPTB )
+      {
+         dataRegAddr = 0x0400;
+         if ( pio_memory_dt_opt == PIO_MEMORY_DT_OPTR )
+            dataRegAddr = dataRegAddr | ( randVal & 0x03fe );
+      }
+
+      if ( pio_xfer_width == 8 )
+      {
+         // PCMCIA Memory mode 8-bit
+         bCnt = wordCnt * 2L;
+         ucp2 = (unsigned char far *) MK_FP( pio_memory_seg, dataRegAddr );
+         for ( ; bCnt > 0; bCnt -- )
+         {
+            bufSeg = (unsigned int) ( bufAddr >> 4 );
+            bufOff = (unsigned int) ( bufAddr & 0x0000000fL );
+            ucp1 = (unsigned char far *) MK_FP( bufSeg, bufOff );
+            * ucp2 = * ucp1;
+            bufAddr += 1;
+            if ( memDtOpt == PIO_MEMORY_DT_OPTB )
+            {
+               dataRegAddr += 1;
+               dataRegAddr = ( dataRegAddr & 0x03ff ) | 0x0400;
+               ucp2 = (unsigned char far *) MK_FP( pio_memory_seg, dataRegAddr );
+            }
+         }
+         trc_llt( addrDataReg, 0, TRC_LLT_OUTSB );
+      }
+      else
+      {
+         // PCMCIA Memory mode 16-bit
+         uip2 = (unsigned int far *) MK_FP( pio_memory_seg, dataRegAddr );
+         for ( ; wordCnt > 0; wordCnt -- )
+         {
+            bufSeg = (unsigned int) ( bufAddr >> 4 );
+            bufOff = (unsigned int) ( bufAddr & 0x0000000fL );
+            uip1 = (unsigned int far *) MK_FP( bufSeg, bufOff );
+            * uip2 = * uip1;
+            bufAddr += 2;
+            if ( memDtOpt == PIO_MEMORY_DT_OPTB )
+            {
+               dataRegAddr = dataRegAddr + 2;
+               dataRegAddr = ( dataRegAddr & 0x03fe ) | 0x0400;
+               uip2 = (unsigned int far *) MK_FP( pio_memory_seg, dataRegAddr );
+            }
+         }
+         trc_llt( addrDataReg, 0, TRC_LLT_OUTSW );
+      }
+   }
+   else
+   {
+      int pxw;
+      long wc;
+
+      // adjust pio_xfer_width - don't use DWORD if wordCnt is odd.
+
+      pxw = pio_xfer_width;
+      if ( ( pxw == 32 ) && ( wordCnt & 0x00000001L ) )
+         pxw = 16;
+
+      // Data transfer using OUTS instruction.
+      // Break the transfer into chunks of 32768 or fewer bytes.
+
+      while ( wordCnt > 0 )
+      {
+         bufOff = (unsigned int) ( bufAddr & 0x0000000fL );
+         bufSeg = (unsigned int) ( bufAddr >> 4 );
+         if ( wordCnt > 16384L )
+            wc = 16384;
+         else
+            wc = wordCnt;
+         if ( pxw == 8 )
+         {
+            // do REP OUTS
+            pio_rep_outbyte( addrDataReg, bufSeg, bufOff, wc * 2L );
+         }
+         else
+         if ( pxw == 32 )
+         {
+            // do REP OUTSD
+            pio_rep_outdword( addrDataReg, bufSeg, bufOff, wc / 2L );
+         }
+         else
+         {
+            // do REP OUTSW
+            pio_rep_outword( addrDataReg, bufSeg, bufOff, wc );
+         }
+         bufAddr = bufAddr + ( wc * 2 );
+         wordCnt = wordCnt - wc;
+      }
+   }
+
+   return;
+}
+
+//*************************************************************
+//
+// These functions do REP INS/OUTS data transfers
+// (PIO data transfers in I/O mode):
+//
+// pio_rep_inbyte()
+// pio_rep_outbyte()
+// pio_rep_inword()
+// pio_rep_outword()
+// pio_rep_indword()
+// pio_rep_outdword()
+//
+// These functions can be called directly but usually they
+// are called by the pio_drq_block_in() and pio_drq_block_out()
+// functions to perform I/O mode transfers. See the
+// pio_xfer_width variable!
+//
+//*************************************************************
+
+void pio_rep_inbyte( unsigned int addrDataReg,
+                     unsigned int bufSeg, unsigned int bufOff,
+                     long byteCnt )
+
+{
+   unsigned short dataRegAddr = pio_reg_addrs[ addrDataReg ];
+   unsigned int bCnt = (unsigned int) byteCnt;
+
+   // Warning: Avoid calling this function with
+   // byteCnt > 32768 (transfers 32768 bytes).
+   // bufSeg and bufOff should be normalized such
+   // that bufOff is a value between 0 and 15 (0xf).
+
+   //asm   .386
+
+   asm(
+   "cld\n\t"
+   "rep insb\n\t"
+   ::"D"(bufOff),"c"(byteCnt),"d"(dataRegAddr));
+
+   trc_llt( addrDataReg, 0, TRC_LLT_INSB );
+}
+
+//*************************************************************
+
+void pio_rep_outbyte( unsigned int addrDataReg,
+                      unsigned int bufSeg, unsigned int bufOff,
+                      long byteCnt )
+
+{
+   unsigned int dataRegAddr = pio_reg_addrs[ addrDataReg ];
+   unsigned int bCnt = (unsigned int) byteCnt;
+
+   // Warning: Avoid calling this function with
+   // byteCnt > 32768 (transfers 32768 bytes).
+   // bufSeg and bufOff should be normalized such
+   // that bufOff is a value between 0 and 15 (0xf).
+
+   //asm(".386");
+
+   asm(
+   "cld\n\t"
+   "rep outsb\n\t"
+   ::"S"(bufOff),"c"(bCnt),"d"(dataRegAddr));
+
+   trc_llt( addrDataReg, 0, TRC_LLT_OUTSB );
+}
+
+//*************************************************************
+
+void pio_rep_inword( unsigned int addrDataReg,
+                     unsigned int bufSeg, unsigned int bufOff,
+                     long wordCnt )
+
+{
+   unsigned int dataRegAddr = pio_reg_addrs[ addrDataReg ];
+   unsigned int wCnt = (unsigned int) wordCnt;
+
+   // Warning: Avoid calling this function with
+   // wordCnt > 16384 (transfers 32768 bytes).
+   // bufSeg and bufOff should be normalized such
+   // that bufOff is a value between 0 and 15 (0xf).
+
+   //asm(".386");
+
+
+   asm(
+   "cld\n\t"
+   "rep insw\n\t"
+   ::"D"(bufOff),"c"(wCnt),"d"(dataRegAddr));
+   trc_llt( addrDataReg, 0, TRC_LLT_INSW );
+}
+
+//*************************************************************
+
+void pio_rep_outword( unsigned int addrDataReg,
+                      unsigned int bufSeg, unsigned int bufOff,
+                      long wordCnt )
+
+{
+   unsigned int dataRegAddr = pio_reg_addrs[ addrDataReg ];
+   unsigned int wCnt = (unsigned int) wordCnt;
+
+   // Warning: Avoid calling this function with
+   // wordCnt > 16384 (transfers 32768 bytes).
+   // bufSeg and bufOff should be normalized such
+   // that bufOff is a value between 0 and 15 (0xf).
+
+   //asm(".386");
+
+   asm(
+   "cld\n\t"
+   "rep outsw\n\t"
+   ::"S"(bufOff),"c"(wCnt),"d"(dataRegAddr));
+
+   trc_llt( addrDataReg, 0, TRC_LLT_OUTSW );
+}
+
+//*************************************************************
+
+void pio_rep_indword( unsigned int addrDataReg,
+                      unsigned int bufSeg, unsigned int bufOff,
+                      long dwordCnt )
+
+{
+   unsigned int dataRegAddr = pio_reg_addrs[ addrDataReg ];
+   unsigned int dwCnt = (unsigned int) dwordCnt;
+
+   // Warning: Avoid calling this function with
+   // dwordCnt > 8192 (transfers 32768 bytes).
+   // bufSeg and bufOff should be normalized such
+   // that bufOff is a value between 0 and 15 (0xf).
+
+   //asm(".386");
+
+   asm(
+   "cld\n\t"
+   "rep insd\n\t" //"rep   insd;"
+   ::"D"(bufOff),"c"(dwCnt),"d"(dataRegAddr));
+
+   trc_llt( addrDataReg, 0, TRC_LLT_INSD );
+}
+
+//*************************************************************
+
+void pio_rep_outdword( unsigned int addrDataReg,
+                       unsigned int bufSeg, unsigned int bufOff,
+                       long dwordCnt )
+
+{
+   unsigned int dataRegAddr = pio_reg_addrs[ addrDataReg ];
+   unsigned int dwCnt = (unsigned int) dwordCnt;
+
+   // Warning: Avoid calling this function with
+   // dwordCnt > 8192 (transfers 32768 bytes).
+   // bufSeg and bufOff should be normalized such
+   // that bufOff is a value between 0 and 15 (0xf).
+
+   //asm(".386");
+
+
+   asm(
+   "cld;\n\t"
+   "rep outsd\n\t" // "rep   outsd;"
+   ::"S"(bufOff),"c"(dwCnt),"d"(dataRegAddr));
+
+   trc_llt( addrDataReg, 0, TRC_LLT_OUTSD );
+}
+
+// end ataiopio.c
diff --git a/haribote/ata/ATAIOREG.C b/haribote/ata/ATAIOREG.C
new file mode 100644 (file)
index 0000000..578aa91
--- /dev/null
@@ -0,0 +1,2165 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOREG.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+//
+// This C source contains the main body of the driver code:
+// Determine what devices are present, issue ATA Soft Reset,
+// execute Non-Data, PIO data in and PIO data out commands.
+//********************************************************************
+
+#include <dos.h>
+
+#include "ataio.h"
+
+#define DEBUG_REG 0x00  // not zero for debug
+                        // 0x01 trace the interrupt flag
+
+//*************************************************************
+//
+// ATAPI command packet,
+// atapi register data,
+// atapi delay flag,
+// config information,
+// slow transfer flag,
+// incompatible flags.
+//
+//*************************************************************
+
+unsigned char reg_atapi_cp_data[16];
+int reg_atapi_cp_size;
+
+int reg_atapi_delay_flag;
+
+unsigned char reg_atapi_reg_fr;  // see reg_packet()
+unsigned char reg_atapi_reg_sc;  // see reg_packet()
+unsigned char reg_atapi_reg_sn;  // see reg_packet()
+unsigned char reg_atapi_reg_dh;  // see reg_packet()
+
+long reg_buffer_size;
+
+struct REG_CMD_INFO reg_cmd_info;
+
+int reg_config_info[2];
+
+void ( * reg_drq_block_call_back ) ( struct REG_CMD_INFO * );
+
+long reg_slow_xfer_flag;
+
+int reg_incompat_flags;
+
+//*************************************************************
+//
+// reg_wait_poll() - wait for interrupt or poll for BSY=0
+//
+//*************************************************************
+
+static void reg_wait_poll( int we, int pe );
+
+static void reg_wait_poll( int we, int pe )
+
+{
+   unsigned char status;
+
+   // Wait for interrupt -or- wait for not BUSY -or- wait for time out.
+
+   if ( we && int_use_intr_flag )
+   {
+      trc_llt( 0, 0, TRC_LLT_WINT );
+      while ( 1 )
+      {
+         if ( int_intr_flag )                // interrupt ?
+         {
+            trc_llt( 0, 0, TRC_LLT_INTRQ );  // yes
+            if ( int_bmide_addr )
+               trc_llt( 0, int_bm_status, TRC_LLT_R_BM_SR );
+            status = int_ata_status;         // get status
+            trc_llt( CB_STAT, status, TRC_LLT_INB );
+            if ( int_bmide_addr )
+               trc_llt( 0, 0x04, TRC_LLT_W_BM_SR );
+            break;
+         }
+         if ( tmr_chk_timeout() )            // time out ?
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );   // yes
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = we;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+   }
+   else
+   {
+      trc_llt( 0, 0, TRC_LLT_PNBSY );
+      while ( 1 )
+      {
+         status = pio_inbyte( CB_ASTAT );       // poll for not busy
+         if ( ( status & CB_STAT_BSY ) == 0 )
+            break;
+         if ( tmr_chk_timeout() )               // time out yet ?
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = pe;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+   }
+
+   #if DEBUG_REG & 0x01
+      trc_llt( 0, int_intr_cntr, TRC_LLT_DEBUG );  // for debugging
+   #endif
+
+   // Reset the interrupt flag.
+
+   if ( int_intr_flag > 1 )      // extra interrupt(s) ?
+      reg_cmd_info.failbits |= FAILBIT15;
+   int_intr_flag = 0;
+}
+
+//*************************************************************
+//
+// reg_config() - Check the host adapter and determine the
+//                number and type of drives attached.
+//
+// This process is not documented by any of the ATA standards.
+//
+// Infomation is returned by this function is in
+// reg_config_info[] -- see ATAIO.H.
+//
+//*************************************************************
+
+int reg_config( void )
+
+{
+   int numDev = 0;
+   unsigned char dev75;
+   unsigned char sc;
+   unsigned char sn;
+   unsigned char cl;
+   unsigned char ch;
+   unsigned char st;
+   unsigned char devCtrl;
+
+   // compute the 1ms, 1us and 500ns delay counts - the number of I/O reads
+   // required to get an approximately 1ms, 1us and 500ns delay.
+
+   tmr_get_delay_counts();
+
+   // determine value of Device (Drive/Head) register bits 7 and 5
+
+   dev75 = 0;                    // normal value
+   if ( reg_incompat_flags & REG_INCOMPAT_DEVREG )
+      dev75 = CB_DH_OBSOLETE;    // obsolete value
+
+   // setup register values
+
+   devCtrl = CB_DC_HD15 | ( int_use_intr_flag ? 0 : CB_DC_NIEN );
+
+   // mark start of config in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_CFG );
+
+   // reset Bus Master Error bit
+
+   sub_writeBusMstrStatus( BM_SR_MASK_ERR );
+
+   // assume there are no devices
+
+   reg_config_info[0] = REG_CONFIG_TYPE_NONE;
+   reg_config_info[1] = REG_CONFIG_TYPE_NONE;
+
+   // set up Device Control register
+
+   pio_outbyte( CB_DC, devCtrl );
+
+   // lets see if there is a device 0
+
+   pio_outbyte( CB_DH, CB_DH_DEV0 | dev75 );
+   ATA_DELAY();
+   pio_outbyte( CB_SC, 0x55 );
+   pio_outbyte( CB_SN, 0xaa );
+   pio_outbyte( CB_SC, 0xaa );
+   pio_outbyte( CB_SN, 0x55 );
+   pio_outbyte( CB_SC, 0x55 );
+   pio_outbyte( CB_SN, 0xaa );
+   sc = pio_inbyte( CB_SC );
+   sn = pio_inbyte( CB_SN );
+   if ( ( sc == 0x55 ) && ( sn == 0xaa ) )
+      reg_config_info[0] = REG_CONFIG_TYPE_UNKN;
+
+   // lets see if there is a device 1
+
+   pio_outbyte( CB_DH, CB_DH_DEV1 | dev75 );
+   ATA_DELAY();
+   pio_outbyte( CB_SC, 0x55 );
+   pio_outbyte( CB_SN, 0xaa );
+   pio_outbyte( CB_SC, 0xaa );
+   pio_outbyte( CB_SN, 0x55 );
+   pio_outbyte( CB_SC, 0x55 );
+   pio_outbyte( CB_SN, 0xaa );
+   sc = pio_inbyte( CB_SC );
+   sn = pio_inbyte( CB_SN );
+   if ( ( sc == 0x55 ) && ( sn == 0xaa ) )
+      reg_config_info[1] = REG_CONFIG_TYPE_UNKN;
+
+   // quit if no devices found
+
+   if ( ( reg_config_info[0] == REG_CONFIG_TYPE_NONE )
+        &&
+        ( reg_config_info[1] == REG_CONFIG_TYPE_NONE )
+      )
+   {
+      trc_llt( 0, 0, TRC_LLT_E_CFG );
+      return numDev;    // no devices found
+   }
+
+   // now we think we know which devices, if any are there,
+   // so lets try a soft reset (ignoring any errors).
+
+   pio_outbyte( CB_DH, CB_DH_DEV0 | dev75 );
+   ATA_DELAY();
+   reg_reset( 0, 0 );
+
+   // lets check device 0 again, is device 0 really there?
+   // is it ATA or ATAPI?
+
+   pio_outbyte( CB_DH, CB_DH_DEV0 | dev75 );
+   ATA_DELAY();
+   sc = pio_inbyte( CB_SC );
+   sn = pio_inbyte( CB_SN );
+   st = pio_inbyte( CB_STAT );
+   if ( st == 0x7f )
+   {
+      reg_config_info[0] = REG_CONFIG_TYPE_NONE;
+   }
+   else
+   if ( ( sc == 0x01 ) && ( sn == 0x01 ) )
+   {
+      // yep, there is a device, what kind is it?
+      numDev ++ ;
+      cl = pio_inbyte( CB_CL );
+      ch = pio_inbyte( CB_CH );
+      if ( ( ( cl == 0x14 ) && ( ch == 0xeb ) )       // PATAPI
+           ||
+           ( ( cl == 0x69 ) && ( ch == 0x96 ) )       // SATAPI
+         )
+      {
+         reg_config_info[0] = REG_CONFIG_TYPE_ATAPI;
+      }
+      else
+      if ( ( ( cl == 0x00 ) && ( ch == 0x00 ) )     // PATA
+           ||
+           ( ( cl == 0x3c ) && ( ch == 0xc3 ) )     // SATA
+         )
+      {
+         reg_config_info[0] = REG_CONFIG_TYPE_ATA;
+      }
+   }
+
+   // lets check device 1 again, is device 1 really there?
+   // is it ATA or ATAPI?
+
+   pio_outbyte( CB_DH, CB_DH_DEV1 | dev75 );
+   ATA_DELAY();
+   sc = pio_inbyte( CB_SC );
+   sn = pio_inbyte( CB_SN );
+   st = pio_inbyte( CB_STAT );
+   if ( st == 0x7f )
+   {
+      reg_config_info[1] = REG_CONFIG_TYPE_NONE;
+   }
+   else
+   if ( ( sc == 0x01 ) && ( sn == 0x01 ) )
+   {
+      // yep, there is a device, what kind is it?
+      numDev ++ ;
+      cl = pio_inbyte( CB_CL );
+      ch = pio_inbyte( CB_CH );
+      if ( ( ( cl == 0x14 ) && ( ch == 0xeb ) )       // PATAPI
+           ||
+           ( ( cl == 0x69 ) && ( ch == 0x96 ) )       // SATAPI
+         )
+      {
+         reg_config_info[1] = REG_CONFIG_TYPE_ATAPI;
+      }
+      else
+      if ( ( ( cl == 0x00 ) && ( ch == 0x00 ) )     // PATA
+           ||
+           ( ( cl == 0x3c ) && ( ch == 0xc3 ) )     // SATA
+         )
+      {
+         reg_config_info[1] = REG_CONFIG_TYPE_ATA;
+      }
+   }
+
+   // If possible, select a device that exists
+
+   if ( reg_config_info[1] != REG_CONFIG_TYPE_NONE )
+   {
+      pio_outbyte( CB_DH, CB_DH_DEV1 | dev75 );
+      ATA_DELAY();
+   }
+   if ( reg_config_info[0] != REG_CONFIG_TYPE_NONE )
+   {
+      pio_outbyte( CB_DH, CB_DH_DEV0 | dev75 );
+      ATA_DELAY();
+   }
+
+   // BMIDE Error=1?
+
+   if ( sub_readBusMstrStatus() & BM_SR_MASK_ERR )
+   {
+      reg_cmd_info.ec = 78;                  // yes
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+   }
+
+   // mark end of config in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_CFG );
+
+   // return the number of devices found
+
+   return numDev;
+}
+
+//*************************************************************
+//
+// reg_reset() - Execute a Software Reset.
+//
+// See ATA-2 Section 9.2, ATA-3 Section 9.2, ATA-4 Section 8.3.
+//
+//*************************************************************
+
+int reg_reset( int skipFlag, int devRtrn )
+
+{
+   unsigned char dev75;
+   unsigned char sc;
+   unsigned char sn;
+   unsigned char status;
+   unsigned char devCtrl;
+
+   // determine value of Device (Drive/Head) register bits 7 and 5
+
+   dev75 = 0;                    // normal value
+   if ( reg_incompat_flags & REG_INCOMPAT_DEVREG )
+      dev75 = CB_DH_OBSOLETE;    // obsolete value
+
+   // setup register values
+
+   devCtrl = CB_DC_HD15 | ( int_use_intr_flag ? 0 : CB_DC_NIEN );
+
+   // mark start of reset in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_RST );
+
+   // reset Bus Master Error bit
+
+   sub_writeBusMstrStatus( BM_SR_MASK_ERR );
+
+   // Reset error return data.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_SRST;
+   reg_cmd_info.ct  = TRC_TYPE_ASR;
+
+   // initialize the command timeout counter
+
+   tmr_set_timeout();
+
+   // Set and then reset the soft reset bit in the Device Control
+   // register.  This causes device 0 be selected.
+
+   if ( ! skipFlag )
+   {
+      // set SRST=1
+      pio_outbyte( CB_DC, devCtrl | CB_DC_SRST );
+      ATA_DELAY();      // for trace of Alternate Status
+      // delay ~10us
+      tmr_delay_1us( 10L );
+      // set SRST=0
+      pio_outbyte( CB_DC, devCtrl );
+      ATA_DELAY();      // for trace of Alternate Status
+   }
+   ATAPI_DELAY( 0 );
+   ATAPI_DELAY( 1 );
+
+   // If there is a device 0, wait for device 0 to set BSY=0.
+
+   if ( reg_config_info[0] != REG_CONFIG_TYPE_NONE )
+   {
+      trc_llt( 0, 0, TRC_LLT_PNBSY );
+      while ( 1 )
+      {
+         status = pio_inbyte( CB_STAT );
+         if ( ( status & CB_STAT_BSY ) == 0 )
+            break;
+         if ( tmr_chk_timeout() )
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 1;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+   }
+
+   // Check that drive 0 has valid BSY=0 status
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      status = pio_inbyte( CB_STAT );
+      if ( ( status == 0x7f ) || ( status & CB_STAT_BSY ) )
+      {
+         reg_cmd_info.ec = 1;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   // If there is a device 1, wait until device 1 allows
+   // register access.
+
+   if ( reg_config_info[1] != REG_CONFIG_TYPE_NONE )
+   {
+      trc_llt( 0, 0, TRC_LLT_PNBSY );
+      while ( 1 )
+      {
+         pio_outbyte( CB_DH, CB_DH_DEV1 | dev75 );
+         ATA_DELAY();
+         sc = pio_inbyte( CB_SC );
+         sn = pio_inbyte( CB_SN );
+         if ( ( sc == 0x01 ) && ( sn == 0x01 ) )
+            break;
+         if ( tmr_chk_timeout() )
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 2;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+
+      // Check if drive 1 has valid BSY=0 status
+
+      if ( reg_cmd_info.ec == 0 )
+      {
+         status = pio_inbyte( CB_STAT );
+         if ( ( status == 0x7f ) || ( status & CB_STAT_BSY ) )
+         {
+            reg_cmd_info.ec = 3;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         }
+      }
+   }
+
+   // RESET_DONE:
+
+   // We are done but now we must select the device the caller
+   // requested before we trace the command.  This will cause
+   // the correct data to be returned in reg_cmd_info.
+
+   pio_outbyte( CB_DH, ( devRtrn ? CB_DH_DEV1 : CB_DH_DEV0 ) | dev75 );
+   ATA_DELAY();
+   sub_trace_command();
+
+   // If possible, select a device that exists
+
+   if ( reg_config_info[1] != REG_CONFIG_TYPE_NONE )
+   {
+      pio_outbyte( CB_DH, CB_DH_DEV1 | dev75 );
+      ATA_DELAY();
+   }
+   if ( reg_config_info[0] != REG_CONFIG_TYPE_NONE )
+   {
+      pio_outbyte( CB_DH, CB_DH_DEV0 | dev75 );
+      ATA_DELAY();
+   }
+
+   // BMIDE Error=1?
+
+   if ( sub_readBusMstrStatus() & BM_SR_MASK_ERR )
+   {
+      reg_cmd_info.ec = 78;                  // yes
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+   }
+
+   // mark end of reset in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_RST );
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+//*************************************************************
+//
+// exec_non_data_cmd() - Execute a non-data command.
+//
+// Note special handling for Execute Device Diagnostics
+// command when there is no device 0.
+//
+// See ATA-2 Section 9.5, ATA-3 Section 9.5,
+// ATA-4 Section 8.8 Figure 12.  Also see Section 8.5.
+//
+//*************************************************************
+
+static int exec_non_data_cmd( int dev );
+
+static int exec_non_data_cmd( int dev )
+
+{
+   unsigned char dev75;
+   unsigned char secCnt;
+   unsigned char secNum;
+   unsigned char status;
+   int polled = 0;
+
+   // determine value of Device (Drive/Head) register bits 7 and 5
+
+   dev75 = 0;                    // normal value
+   if ( reg_incompat_flags & REG_INCOMPAT_DEVREG )
+      dev75 = CB_DH_OBSOLETE;    // obsolete value
+
+   // mark start of ND cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_ND );
+
+   // reset Bus Master Error bit
+
+   sub_writeBusMstrStatus( BM_SR_MASK_ERR );
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // PAY ATTENTION HERE
+   // If the caller is attempting a Device Reset command, then
+   // don't do most of the normal stuff.  Device Reset has no
+   // parameters, should not generate an interrupt and it is the
+   // only command that can be written to the Command register
+   // when a device has BSY=1 (a very strange command!).  Not
+   // all devices support this command (even some ATAPI devices
+   // don't support the command.
+
+   if ( reg_cmd_info.cmd != CMD_DEVICE_RESET )
+   {
+      // Select the drive - call the sub_select function.
+      // Quit now if this fails.
+
+      if ( sub_select( dev ) )
+      {
+         sub_trace_command();
+         trc_llt( 0, 0, TRC_LLT_E_ND );
+         return 1;
+      }
+
+      // Set up all the registers except the command register.
+
+      sub_setup_command();
+
+      // For interrupt mode, install interrupt handler.
+
+      int_save_int_vect();
+   }
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, reg_cmd_info.cmd );
+
+   // Waste some time by reading the alternate status a few times.
+   // This gives the drive time to set BUSY in the status register on
+   // really fast systems.  If we don't do this, a slow drive on a fast
+   // system may not set BUSY fast enough and we would think it had
+   // completed the command when it really had not even started the
+   // command yet.
+
+   ATA_DELAY();
+   ATAPI_DELAY( 0 );
+   ATAPI_DELAY( 1 );
+
+   // IF
+   //    This is an Exec Dev Diag command (cmd=0x90)
+   //    and there is no device 0 then
+   //    there will be no interrupt. So we must
+   //    poll device 1 until it allows register
+   //    access and then do normal polling of the Status
+   //    register for BSY=0.
+   // ELSE
+   // IF
+   //    This is a Dev Reset command (cmd=0x08) then
+   //    there should be no interrupt.  So we must
+   //    poll for BSY=0.
+   // ELSE
+   //    Do the normal wait for interrupt or polling for
+   //    completion.
+
+   if ( ( reg_cmd_info.cmd == CMD_EXECUTE_DEVICE_DIAGNOSTIC )
+        &&
+        ( reg_config_info[0] == REG_CONFIG_TYPE_NONE )
+      )
+   {
+      polled = 1;
+      trc_llt( 0, 0, TRC_LLT_PNBSY );
+      while ( 1 )
+      {
+         pio_outbyte( CB_DH, CB_DH_DEV1 | dev75 );
+         ATA_DELAY();
+         secCnt = pio_inbyte( CB_SC );
+         secNum = pio_inbyte( CB_SN );
+         if ( ( secCnt == 0x01 ) && ( secNum == 0x01 ) )
+            break;
+         if ( tmr_chk_timeout() )
+         {
+            trc_llt( 0, 0, TRC_LLT_TOUT );
+            reg_cmd_info.to = 1;
+            reg_cmd_info.ec = 24;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;
+         }
+      }
+   }
+   else
+   {
+      if ( reg_cmd_info.cmd == CMD_DEVICE_RESET )
+      {
+         // Wait for not BUSY -or- wait for time out.
+
+         polled = 1;
+         reg_wait_poll( 0, 23 );
+      }
+      else
+      {
+         // Wait for interrupt -or- wait for not BUSY -or- wait for time out.
+
+         if ( ! int_use_intr_flag )
+            polled = 1;
+         reg_wait_poll( 22, 23 );
+      }
+   }
+
+   // If status was polled or if any error read the status register,
+   // otherwise get the status that was read by the interrupt handler.
+
+   if ( ( polled ) || ( reg_cmd_info.ec ) )
+      status = pio_inbyte( CB_STAT );
+   else
+      status = int_ata_status;
+
+   // Error if BUSY, DEVICE FAULT, DRQ or ERROR status now.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      if ( status & ( CB_STAT_BSY | CB_STAT_DF | CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 21;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   // read the output registers and trace the command.
+
+   sub_trace_command();
+
+   // BMIDE Error=1?
+
+   if ( sub_readBusMstrStatus() & BM_SR_MASK_ERR )
+   {
+      reg_cmd_info.ec = 78;                  // yes
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+   }
+
+   // NON_DATA_DONE:
+
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // mark end of ND cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_ND );
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+//*************************************************************
+//
+// reg_non_data_chs() - Execute a non-data command.
+//
+// Note special handling for Execute Device Diagnostics
+// command when there is no device 0.
+//
+// See ATA-2 Section 9.5, ATA-3 Section 9.5,
+// ATA-4 Section 8.8 Figure 12.  Also see Section 8.5.
+//
+//*************************************************************
+
+int reg_non_data_chs( int dev, int cmd,
+                      unsigned int fr, unsigned int sc,
+                      unsigned int cyl, unsigned int head, unsigned int sect )
+
+{
+
+   // Setup command parameters.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_AND;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.sn1 = sect;
+   reg_cmd_info.cl1 = cyl & 0x00ff;
+   reg_cmd_info.ch1 = ( cyl & 0xff00 ) >> 8;
+   reg_cmd_info.dh1 = ( dev ? CB_DH_DEV1 : CB_DH_DEV0 ) | ( head & 0x0f );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.ns  = sc;
+   reg_cmd_info.lbaSize = LBACHS;
+
+   // Execute the command.
+
+   return exec_non_data_cmd( dev );
+}
+
+//*************************************************************
+//
+// reg_non_data_lba28() - Easy way to execute a non-data command
+//                        using an LBA sector address.
+//
+//*************************************************************
+
+int reg_non_data_lba28( int dev, int cmd,
+                        unsigned int fr, unsigned int sc,
+                        unsigned long lba )
+
+{
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_AND;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.ns  = sc;
+   reg_cmd_info.lbaSize = LBA28;
+   reg_cmd_info.lbaHigh1 = 0L;
+   reg_cmd_info.lbaLow1 = lba;
+
+   // Execute the command.
+
+   return exec_non_data_cmd( dev );
+}
+
+//*************************************************************
+//
+// reg_non_data_lba48() - Easy way to execute a non-data command
+//                        using an LBA sector address.
+//
+//*************************************************************
+
+int reg_non_data_lba48( int dev, int cmd,
+                        unsigned int fr, unsigned int sc,
+                        unsigned long lbahi, unsigned long lbalo )
+
+{
+
+   // Setup current command infomation.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_AND;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.ns  = sc;
+   reg_cmd_info.lbaSize = LBA48;
+   reg_cmd_info.lbaHigh1 = lbahi;
+   reg_cmd_info.lbaLow1 = lbalo;
+
+   // Execute the command.
+
+   return exec_non_data_cmd( dev );
+}
+
+//*************************************************************
+//
+// exec_pio_data_in_cmd() - Execute a PIO Data In command.
+//
+// See ATA-2 Section 9.3, ATA-3 Section 9.3,
+// ATA-4 Section 8.6 Figure 10.
+//
+//*************************************************************
+
+static int exec_pio_data_in_cmd( int dev,
+                            unsigned int seg, unsigned int off,
+                            long numSect, int multiCnt );
+
+
+static int exec_pio_data_in_cmd( int dev,
+                            unsigned int seg, unsigned int off,
+                            long numSect, int multiCnt )
+
+{
+   unsigned char status;
+   long wordCnt;
+   unsigned int saveSeg = seg;
+   unsigned int saveOff = off;
+
+   // mark start of PDI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_PDI );
+
+   // reset Bus Master Error bit
+
+   sub_writeBusMstrStatus( BM_SR_MASK_ERR );
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // Select the drive - call the sub_select function.
+   // Quit now if this fails.
+
+   if ( sub_select( dev ) )
+   {
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PDI );
+      reg_drq_block_call_back = 0;
+      return 1;
+   }
+
+   // Set up all the registers except the command register.
+
+   sub_setup_command();
+
+   // For interrupt mode, install interrupt handler.
+
+   int_save_int_vect();
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, reg_cmd_info.cmd );
+
+   // Waste some time by reading the alternate status a few times.
+   // This gives the drive time to set BUSY in the status register on
+   // really fast systems.  If we don't do this, a slow drive on a fast
+   // system may not set BUSY fast enough and we would think it had
+   // completed the command when it really had not even started the
+   // command yet.
+
+   ATA_DELAY();
+
+   // Loop to read each sector.
+
+   while ( 1 )
+   {
+      // READ_LOOP:
+      //
+      // NOTE NOTE NOTE ...  The primary status register (1f7) MUST NOT be
+      // read more than ONCE for each sector transferred!  When the
+      // primary status register is read, the drive resets IRQ 14.  The
+      // alternate status register (3f6) can be read any number of times.
+      // After interrupt read the the primary status register ONCE
+      // and transfer the 256 words (REP INSW).  AS SOON as BOTH the
+      // primary status register has been read AND the last of the 256
+      // words has been read, the drive is allowed to generate the next
+      // IRQ 14 (newer and faster drives could generate the next IRQ 14 in
+      // 50 microseconds or less).  If the primary status register is read
+      // more than once, there is the possibility of a race between the
+      // drive and the software and the next IRQ 14 could be reset before
+      // the system interrupt controller sees it.
+
+      // Wait for interrupt -or- wait for not BUSY -or- wait for time out.
+
+      ATAPI_DELAY( dev );
+      reg_wait_poll( 34, 35 );
+
+      // If polling or error read the status, otherwise
+      // get the status that was read by the interrupt handler.
+
+      if ( ( ! int_use_intr_flag ) || ( reg_cmd_info.ec ) )
+         status = pio_inbyte( CB_STAT );
+      else
+         status = int_ata_status;
+
+      // If there was a time out error, go to READ_DONE.
+
+      if ( reg_cmd_info.ec )
+         break;   // go to READ_DONE
+
+      // If BSY=0 and DRQ=1, transfer the data,
+      // even if we find out there is an error later.
+
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DRQ ) ) == CB_STAT_DRQ )
+      {
+         // do the slow data transfer thing
+
+         if ( reg_slow_xfer_flag )
+         {
+            if ( numSect <= reg_slow_xfer_flag )
+            {
+               tmr_delay_xfer();
+               reg_slow_xfer_flag = 0;
+            }
+         }
+
+         // increment number of DRQ packets
+
+         reg_cmd_info.drqPackets ++ ;
+
+         // determine the number of sectors to transfer
+
+         wordCnt = multiCnt ? multiCnt : 1;
+         if ( wordCnt > numSect )
+            wordCnt = numSect;
+         wordCnt = wordCnt * 256;
+
+         // Quit if buffer overrun.
+         // Adjust buffer address when DRQ block call back in use.
+
+         if ( reg_drq_block_call_back )
+         {
+            if ( ( wordCnt << 1 ) > reg_buffer_size )
+            {
+               reg_cmd_info.ec = 61;
+               trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+               break;   // go to READ_DONE
+            }
+            seg = saveSeg;
+            off = saveOff;
+         }
+         else
+         {
+            if ( ( reg_cmd_info.totalBytesXfer + ( wordCnt << 1 ) )
+                 > reg_buffer_size )
+            {
+               reg_cmd_info.ec = 61;
+               trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+               break;   // go to READ_DONE
+            }
+         }
+
+         // Do the REP INSW to read the data for one DRQ block.
+
+         reg_cmd_info.totalBytesXfer += ( wordCnt << 1 );
+         pio_drq_block_in( CB_DATA, seg, off, wordCnt );
+
+         ATA_DELAY();   // delay so device can get the status updated
+
+         // Note: The drive should have dropped DATA REQUEST by now.  If there
+         // are more sectors to transfer, BUSY should be active now (unless
+         // there is an error).
+
+         // Call DRQ block call back function.
+         if ( reg_drq_block_call_back )
+         {
+            reg_cmd_info.drqPacketSize = ( wordCnt << 1 );
+            (* reg_drq_block_call_back) ( & reg_cmd_info );
+         }
+
+         // Decrement the count of sectors to be transferred
+         // and increment buffer address.
+
+         numSect = numSect - ( multiCnt ? multiCnt : 1 );
+         seg = seg + ( 32 * ( multiCnt ? multiCnt : 1 ) );
+      }
+
+      // So was there any error condition?
+
+      if ( status & ( CB_STAT_BSY | CB_STAT_DF | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 31;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         break;   // go to READ_DONE
+      }
+
+      // DRQ should have been set -- was it?
+
+      if ( ( status & CB_STAT_DRQ ) == 0 )
+      {
+         reg_cmd_info.ec = 32;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         break;   // go to READ_DONE
+      }
+
+      // If all of the requested sectors have been transferred, make a
+      // few more checks before we exit.
+
+      if ( numSect < 1 )
+      {
+         // Since the drive has transferred all of the requested sectors
+         // without error, the drive should not have BUSY, DEVICE FAULT,
+         // DATA REQUEST or ERROR active now.
+
+         ATAPI_DELAY( dev );
+         status = pio_inbyte( CB_STAT );
+         if ( status & ( CB_STAT_BSY | CB_STAT_DF | CB_STAT_DRQ | CB_STAT_ERR ) )
+         {
+            reg_cmd_info.ec = 33;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;   // go to READ_DONE
+         }
+
+         // All sectors have been read without error, go to READ_DONE.
+
+         break;   // go to READ_DONE
+
+      }
+
+      // This is the end of the read loop.  If we get here, the loop is
+      // repeated to read the next sector.  Go back to READ_LOOP.
+
+   }
+
+   // read the output registers and trace the command.
+
+   sub_trace_command();
+
+   // BMIDE Error=1?
+
+   if ( sub_readBusMstrStatus() & BM_SR_MASK_ERR )
+   {
+      reg_cmd_info.ec = 78;                  // yes
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+   }
+
+   // READ_DONE:
+
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // mark end of PDI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_PDI );
+
+   // reset reg_drq_block_call_back to NULL (0)
+
+   reg_drq_block_call_back = 0;
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+//*************************************************************
+//
+// reg_pio_data_in_chs() - Execute a PIO Data In command.
+//
+// See ATA-2 Section 9.3, ATA-3 Section 9.3,
+// ATA-4 Section 8.6 Figure 10.
+//
+//*************************************************************
+
+int reg_pio_data_in_chs( int dev, int cmd,
+                         unsigned int fr, unsigned int sc,
+                         unsigned int cyl, unsigned int head, unsigned int sect,
+                         unsigned int seg, unsigned int off,
+                         long numSect, int multiCnt )
+
+{
+
+   // Reset error return data.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_APDI;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.sn1 = sect;
+   reg_cmd_info.cl1 = cyl & 0x00ff;
+   reg_cmd_info.ch1 = ( cyl & 0xff00 ) >> 8;
+   reg_cmd_info.dh1 = ( dev ? CB_DH_DEV1 : CB_DH_DEV0 ) | ( head & 0x0f );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBACHS;
+
+   // these commands transfer only 1 sector
+   if (    ( cmd == CMD_IDENTIFY_DEVICE )
+        || ( cmd == CMD_IDENTIFY_DEVICE_PACKET )
+      )
+      numSect = 1;
+
+   // adjust multiple count
+   if ( multiCnt & 0x0800 )
+   {
+      // assume caller knows what they are doing
+      multiCnt &= 0x00ff;
+   }
+   else
+   {
+      // only multiple commands use multiCnt
+      if (    ( cmd != CMD_READ_MULTIPLE )
+           && ( cmd != CMD_READ_MULTIPLE_EXT )
+         )
+         multiCnt = 1;
+   }
+
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.mc  = multiCnt;
+
+   return exec_pio_data_in_cmd( dev, seg, off, numSect, multiCnt );
+}
+
+//*************************************************************
+//
+// reg_pio_data_in_lba28() - Easy way to execute a PIO Data In command
+//                           using an LBA sector address.
+//
+//*************************************************************
+
+int reg_pio_data_in_lba28( int dev, int cmd,
+                           unsigned int fr, unsigned int sc,
+                           unsigned long lba,
+                           unsigned int seg, unsigned int off,
+                           long numSect, int multiCnt )
+
+{
+
+   // Reset error return data.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_APDI;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBA28;
+   reg_cmd_info.lbaHigh1 = 0L;
+   reg_cmd_info.lbaLow1 = lba;
+
+   // these commands transfer only 1 sector
+   if (    ( cmd == CMD_IDENTIFY_DEVICE )
+        || ( cmd == CMD_IDENTIFY_DEVICE_PACKET )
+      )
+      numSect = 1;
+
+   // adjust multiple count
+   if ( multiCnt & 0x0800 )
+   {
+      // assume caller knows what they are doing
+      multiCnt &= 0x00ff;
+   }
+   else
+   {
+      // only multiple commands use multiCnt
+      if (    ( cmd != CMD_READ_MULTIPLE )
+           && ( cmd != CMD_READ_MULTIPLE_EXT )
+         )
+         multiCnt = 1;
+   }
+
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.mc  = multiCnt;
+
+   return exec_pio_data_in_cmd( dev, seg, off, numSect, multiCnt );
+}
+
+//*************************************************************
+//
+// reg_pio_data_in_lba48() - Easy way to execute a PIO Data In command
+//                           using an LBA sector address.
+//
+//*************************************************************
+
+int reg_pio_data_in_lba48( int dev, int cmd,
+                           unsigned int fr, unsigned int sc,
+                           unsigned long lbahi, unsigned long lbalo,
+                           unsigned int seg, unsigned int off,
+                           long numSect, int multiCnt )
+
+{
+
+   // Reset error return data.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_APDI;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBA48;
+   reg_cmd_info.lbaHigh1 = lbahi;
+   reg_cmd_info.lbaLow1 = lbalo;
+
+   // adjust multiple count
+   if ( multiCnt & 0x0800 )
+   {
+      // assume caller knows what they are doing
+      multiCnt &= 0x00ff;
+   }
+   else
+   {
+      // only multiple commands use multiCnt
+      if (    ( cmd != CMD_READ_MULTIPLE )
+           && ( cmd != CMD_READ_MULTIPLE_EXT )
+         )
+         multiCnt = 1;
+   }
+
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.mc  = multiCnt;
+
+   return exec_pio_data_in_cmd( dev, seg, off, numSect, multiCnt );
+}
+
+//*************************************************************
+//
+// exec_pio_data_out_cmd() - Execute a PIO Data Out command.
+//
+// See ATA-2 Section 9.4, ATA-3 Section 9.4,
+// ATA-4 Section 8.7 Figure 11.
+//
+//*************************************************************
+
+static int exec_pio_data_out_cmd( int dev,
+                             unsigned int seg, unsigned int off,
+                             long numSect, int multiCnt );
+
+static int exec_pio_data_out_cmd( int dev,
+                             unsigned int seg, unsigned int off,
+                             long numSect, int multiCnt )
+
+{
+   unsigned char status;
+   int loopFlag = 1;
+   long wordCnt;
+   unsigned int saveSeg = seg;
+   unsigned int saveOff = off;
+
+   // mark start of PDO cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_PDO );
+
+   // reset Bus Master Error bit
+
+   sub_writeBusMstrStatus( BM_SR_MASK_ERR );
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // Select the drive - call the sub_select function.
+   // Quit now if this fails.
+
+   if ( sub_select( dev ) )
+   {
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PDO );
+      reg_drq_block_call_back = 0;
+      return 1;
+   }
+
+   // Set up all the registers except the command register.
+
+   sub_setup_command();
+
+   // For interrupt mode, instal interrupt handler.
+
+   int_save_int_vect();
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, reg_cmd_info.cmd );
+
+   // Waste some time by reading the alternate status a few times.
+   // This gives the drive time to set BUSY in the status register on
+   // really fast systems.  If we don't do this, a slow drive on a fast
+   // system may not set BUSY fast enough and we would think it had
+   // completed the command when it really had not even started the
+   // command yet.
+
+   ATA_DELAY();
+   ATAPI_DELAY( dev );
+
+   // Wait for not BUSY or time out.
+   // Note: No interrupt is generated for the
+   // first sector of a write command.  Well...
+   // that's not really true we are working with
+   // a PCMCIA PC Card ATA device.
+
+   trc_llt( 0, 0, TRC_LLT_PNBSY );
+   while ( 1 )
+   {
+      status = pio_inbyte( CB_ASTAT );
+      if ( ( status & CB_STAT_BSY ) == 0 )
+         break;
+      if ( tmr_chk_timeout() )
+      {
+         trc_llt( 0, 0, TRC_LLT_TOUT );
+         reg_cmd_info.to = 1;
+         reg_cmd_info.ec = 47;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         loopFlag = 0;
+         break;
+      }
+   }
+
+   // If we are using interrupts and we just got an interrupt, this is
+   // wrong.  The drive must not generate an interrupt at this time.
+
+   if ( loopFlag && int_use_intr_flag && int_intr_flag )
+   {
+      reg_cmd_info.ec = 46;
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      loopFlag = 0;
+   }
+
+   // This loop writes each sector.
+
+   while ( loopFlag )
+   {
+      // WRITE_LOOP:
+      //
+      // NOTE NOTE NOTE ...  The primary status register (1f7) MUST NOT be
+      // read more than ONCE for each sector transferred!  When the
+      // primary status register is read, the drive resets IRQ 14.  The
+      // alternate status register (3f6) can be read any number of times.
+      // For correct results, transfer the 256 words (REP OUTSW), wait for
+      // interrupt and then read the primary status register.  AS
+      // SOON as BOTH the primary status register has been read AND the
+      // last of the 256 words has been written, the drive is allowed to
+      // generate the next IRQ 14 (newer and faster drives could generate
+      // the next IRQ 14 in 50 microseconds or less).  If the primary
+      // status register is read more than once, there is the possibility
+      // of a race between the drive and the software and the next IRQ 14
+      // could be reset before the system interrupt controller sees it.
+
+      // If BSY=0 and DRQ=1, transfer the data,
+      // even if we find out there is an error later.
+
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DRQ ) ) == CB_STAT_DRQ )
+      {
+         // do the slow data transfer thing
+
+         if ( reg_slow_xfer_flag )
+         {
+            if ( numSect <= reg_slow_xfer_flag )
+            {
+               tmr_delay_xfer();
+               reg_slow_xfer_flag = 0;
+            }
+         }
+
+         // increment number of DRQ packets
+
+         reg_cmd_info.drqPackets ++ ;
+
+         // determine the number of sectors to transfer
+
+         wordCnt = multiCnt ? multiCnt : 1;
+         if ( wordCnt > numSect )
+            wordCnt = numSect;
+         wordCnt = wordCnt * 256;
+
+         // Quit if buffer overrun.
+         // If DRQ call back in use:
+         // a) Call DRQ block call back function.
+         // b) Adjust buffer address.
+
+         if ( reg_drq_block_call_back )
+         {
+            if ( ( wordCnt << 1 ) > reg_buffer_size )
+            {
+               reg_cmd_info.ec = 61;
+               trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+               break;   // go to READ_DONE
+            }
+            reg_cmd_info.drqPacketSize = ( wordCnt << 1 );
+            (* reg_drq_block_call_back) ( & reg_cmd_info );
+            seg = saveSeg;
+            off = saveOff;
+         }
+         else
+         {
+            if ( ( reg_cmd_info.totalBytesXfer + ( wordCnt << 1 ) )
+                > reg_buffer_size )
+            {
+               reg_cmd_info.ec = 61;
+               trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+               break;   // go to READ_DONE
+            }
+         }
+
+         // Do the REP OUTSW to write the data for one DRQ block.
+
+         reg_cmd_info.totalBytesXfer += ( wordCnt << 1 );
+         pio_drq_block_out( CB_DATA, seg, off, wordCnt );
+
+         ATA_DELAY();   // delay so device can get the status updated
+
+         // Note: The drive should have dropped DATA REQUEST and
+         // raised BUSY by now.
+
+         // Decrement the count of sectors to be transferred
+         // and increment buffer address.
+
+         numSect = numSect - ( multiCnt ? multiCnt : 1 );
+         seg = seg + ( 32 * ( multiCnt ? multiCnt : 1 ) );
+      }
+
+      // So was there any error condition?
+
+      if ( status & ( CB_STAT_BSY | CB_STAT_DF | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 41;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         break;   // go to WRITE_DONE
+      }
+
+      // DRQ should have been set -- was it?
+
+      if ( ( status & CB_STAT_DRQ ) == 0 )
+      {
+         reg_cmd_info.ec = 42;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         break;   // go to WRITE_DONE
+      }
+
+      // Wait for interrupt -or- wait for not BUSY -or- wait for time out.
+
+      ATAPI_DELAY( dev );
+      reg_wait_poll( 44, 45 );
+
+      // If polling or error read the status, otherwise
+      // get the status that was read by the interrupt handler.
+
+      if ( ( ! int_use_intr_flag ) || ( reg_cmd_info.ec ) )
+         status = pio_inbyte( CB_STAT );
+      else
+         status = int_ata_status;
+
+      // If there was a time out error, go to WRITE_DONE.
+
+      if ( reg_cmd_info.ec )
+         break;   // go to WRITE_DONE
+
+      // If all of the requested sectors have been transferred, make a
+      // few more checks before we exit.
+
+      if ( numSect < 1 )
+      {
+         // Since the drive has transferred all of the sectors without
+         // error, the drive MUST not have BUSY, DEVICE FAULT, DATA REQUEST
+         // or ERROR status at this time.
+
+         if ( status & ( CB_STAT_BSY | CB_STAT_DF | CB_STAT_DRQ | CB_STAT_ERR ) )
+         {
+            reg_cmd_info.ec = 43;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            break;   // go to WRITE_DONE
+         }
+
+         // All sectors have been written without error, go to WRITE_DONE.
+
+         break;   // go to WRITE_DONE
+
+      }
+
+      //
+      // This is the end of the write loop.  If we get here, the loop
+      // is repeated to write the next sector.  Go back to WRITE_LOOP.
+
+   }
+
+   // read the output registers and trace the command.
+
+   sub_trace_command();
+
+   // BMIDE Error=1?
+
+   if ( sub_readBusMstrStatus() & BM_SR_MASK_ERR )
+   {
+      reg_cmd_info.ec = 78;                  // yes
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+   }
+
+   // WRITE_DONE:
+
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // mark end of PDO cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_PDO );
+
+   // reset reg_drq_block_call_back to NULL (0)
+
+   reg_drq_block_call_back = 0;
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+//*************************************************************
+//
+// reg_pio_data_out_chs() - Execute a PIO Data Out command.
+//
+// See ATA-2 Section 9.4, ATA-3 Section 9.4,
+// ATA-4 Section 8.7 Figure 11.
+//
+//*************************************************************
+
+int reg_pio_data_out_chs( int dev, int cmd,
+                          unsigned int fr, unsigned int sc,
+                          unsigned int cyl, unsigned int head, unsigned int sect,
+                          unsigned int seg, unsigned int off,
+                          long numSect, int multiCnt )
+
+{
+
+   // Reset error return data.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_APDO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.sn1 = sect;
+   reg_cmd_info.cl1 = cyl & 0x00ff;
+   reg_cmd_info.ch1 = ( cyl & 0xff00 ) >> 8;
+   reg_cmd_info.dh1 = ( dev ? CB_DH_DEV1 : CB_DH_DEV0 ) | ( head & 0x0f );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBACHS;
+
+   // adjust multiple count
+   if ( multiCnt & 0x0800 )
+   {
+      // assume caller knows what they are doing
+      multiCnt &= 0x00ff;
+   }
+   else
+   {
+      // only multiple commands use multiCnt
+      if (    ( cmd != CMD_CFA_WRITE_MULTIPLE_WO_ERASE )
+           && ( cmd != CMD_WRITE_MULTIPLE )
+           && ( cmd != CMD_WRITE_MULTIPLE_EXT )
+           && ( cmd != CMD_WRITE_MULTIPLE_FUA_EXT )
+         )
+         multiCnt = 1;
+   }
+
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.mc  = multiCnt;
+
+   return exec_pio_data_out_cmd( dev, seg, off, numSect, multiCnt );
+}
+
+//*************************************************************
+//
+// reg_pio_data_out_lba28() - Easy way to execute a PIO Data In command
+//                            using an LBA sector address.
+//
+//*************************************************************
+
+int reg_pio_data_out_lba28( int dev, int cmd,
+                            unsigned int fr, unsigned int sc,
+                            unsigned long lba,
+                            unsigned int seg, unsigned int off,
+                            long numSect, int multiCnt )
+
+{
+
+   // Reset error return data.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_APDO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBA28;
+   reg_cmd_info.lbaHigh1 = 0;
+   reg_cmd_info.lbaLow1 = lba;
+
+   // adjust multiple count
+   if ( multiCnt & 0x0800 )
+   {
+      // assume caller knows what they are doing
+      multiCnt &= 0x00ff;
+   }
+   else
+   {
+      // only multiple commands use multiCnt
+      if (    ( cmd != CMD_CFA_WRITE_MULTIPLE_WO_ERASE )
+           && ( cmd != CMD_WRITE_MULTIPLE )
+           && ( cmd != CMD_WRITE_MULTIPLE_EXT )
+           && ( cmd != CMD_WRITE_MULTIPLE_FUA_EXT )
+         )
+         multiCnt = 1;
+   }
+
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.mc  = multiCnt;
+
+   return exec_pio_data_out_cmd( dev, seg, off, numSect, multiCnt );
+}
+
+//*************************************************************
+//
+// reg_pio_data_out_lba48() - Easy way to execute a PIO Data In command
+//                            using an LBA sector address.
+//
+//*************************************************************
+
+int reg_pio_data_out_lba48( int dev, int cmd,
+                            unsigned int fr, unsigned int sc,
+                            unsigned long lbahi, unsigned long lbalo,
+                            unsigned int seg, unsigned int off,
+                            long numSect, int multiCnt )
+
+{
+
+   // Reset error return data.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATA;
+   reg_cmd_info.ct  = TRC_TYPE_APDO;
+   reg_cmd_info.cmd = cmd;
+   reg_cmd_info.fr1 = fr;
+   reg_cmd_info.sc1 = sc;
+   reg_cmd_info.dh1 = CB_DH_LBA | (dev ? CB_DH_DEV1 : CB_DH_DEV0 );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBA48;
+   reg_cmd_info.lbaHigh1 = lbahi;
+   reg_cmd_info.lbaLow1 = lbalo;
+
+   // adjust multiple count
+   if ( multiCnt & 0x0800 )
+   {
+      // assume caller knows what they are doing
+      multiCnt &= 0x00ff;
+   }
+   else
+   {
+      // only multiple commands use multiCnt
+      if (    ( cmd != CMD_CFA_WRITE_MULTIPLE_WO_ERASE )
+           && ( cmd != CMD_WRITE_MULTIPLE )
+           && ( cmd != CMD_WRITE_MULTIPLE_EXT )
+           && ( cmd != CMD_WRITE_MULTIPLE_FUA_EXT )
+         )
+         multiCnt = 1;
+   }
+
+   reg_cmd_info.ns  = numSect;
+   reg_cmd_info.mc  = multiCnt;
+
+   return exec_pio_data_out_cmd( dev, seg, off, numSect, multiCnt );
+}
+
+//*************************************************************
+//
+// reg_packet() - Execute an ATAPI Packet (A0H) command.
+//
+// See ATA-4 Section 9.10, Figure 14.
+//
+//*************************************************************
+
+int reg_packet( int dev,
+                unsigned int cpbc,
+                unsigned int cpseg, unsigned int cpoff,
+                int dir,
+                long dpbc,
+                unsigned int dpseg, unsigned int dpoff,
+                unsigned long lba )
+
+{
+   unsigned char status;
+   unsigned char reason;
+   unsigned char lowCyl;
+   unsigned char highCyl;
+   unsigned int byteCnt;
+   long wordCnt;
+   int ndx;
+   unsigned long dpaddr;
+   unsigned long savedpaddr;
+   unsigned char far * cfp;
+   int slowXferCntr = 0;
+   int prevFailBit7 = 0;
+
+   // mark start of PI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_S_PI );
+
+   // reset Bus Master Error bit
+
+   sub_writeBusMstrStatus( BM_SR_MASK_ERR );
+
+   // Make sure the command packet size is either 12 or 16
+   // and save the command packet size and data.
+
+   cpbc = cpbc < 12 ? 12 : cpbc;
+   cpbc = cpbc > 12 ? 16 : cpbc;
+
+   // Setup current command information.
+
+   sub_zero_return_data();
+   reg_cmd_info.flg = TRC_FLAG_ATAPI;
+   reg_cmd_info.ct  = dir ? TRC_TYPE_PPDO : TRC_TYPE_PPDI;
+   reg_cmd_info.cmd = CMD_PACKET;
+   reg_cmd_info.fr1 = reg_atapi_reg_fr;
+   reg_cmd_info.sc1 = reg_atapi_reg_sc;
+   reg_cmd_info.sn1 = reg_atapi_reg_sn;
+   reg_cmd_info.cl1 = (unsigned char) ( dpbc & 0x00ff );
+   reg_cmd_info.ch1 = ( unsigned char) ( ( dpbc & 0xff00 ) >> 8 );
+   reg_cmd_info.dh1 = ( dev ? CB_DH_DEV1 : CB_DH_DEV0 )
+                      | ( reg_atapi_reg_dh & 0x0f );
+   reg_cmd_info.dc1 = int_use_intr_flag ? 0 : CB_DC_NIEN;
+   reg_cmd_info.lbaSize = LBA32;
+   reg_cmd_info.lbaLow1 = lba;
+   reg_cmd_info.lbaHigh1 = 0L;
+   reg_atapi_cp_size = cpbc;
+   cfp = (unsigned char *)MK_FP( cpseg, cpoff );
+   for ( ndx = 0; ndx < cpbc; ndx ++ )
+   {
+      reg_atapi_cp_data[ndx] = * cfp;
+      cfp ++ ;
+   }
+
+   // Zero the alternate ATAPI register data.
+
+   reg_atapi_reg_fr = 0;
+   reg_atapi_reg_sc = 0;
+   reg_atapi_reg_sn = 0;
+   reg_atapi_reg_dh = 0;
+
+   // Set command time out.
+
+   tmr_set_timeout();
+
+   // Select the drive - call the sub_select function.
+   // Quit now if this fails.
+
+   if ( sub_select( dev ) )
+   {
+      sub_trace_command();
+      trc_llt( 0, 0, TRC_LLT_E_PI );
+      reg_drq_block_call_back = 0;
+      return 1;
+   }
+
+   // Set up all the registers except the command register.
+
+   sub_setup_command();
+
+   // For interrupt mode, install interrupt handler.
+
+   int_save_int_vect();
+
+   // Start the command by setting the Command register.  The drive
+   // should immediately set BUSY status.
+
+   pio_outbyte( CB_CMD, CMD_PACKET );
+
+   // Waste some time by reading the alternate status a few times.
+   // This gives the drive time to set BUSY in the status register on
+   // really fast systems.  If we don't do this, a slow drive on a fast
+   // system may not set BUSY fast enough and we would think it had
+   // completed the command when it really had not even started the
+   // command yet.
+
+   ATA_DELAY();
+   ATAPI_DELAY( dev );
+
+   // Command packet transfer...
+   // Check for protocol failures,
+   // the device should have BSY=1 or
+   // if BSY=0 then either DRQ=1 or CHK=1.
+
+   status = pio_inbyte( CB_ASTAT );
+   if ( status & CB_STAT_BSY )
+   {
+      // BSY=1 is OK
+   }
+   else
+   {
+      if ( status & ( CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         // BSY=0 and DRQ=1 is OK
+         // BSY=0 and ERR=1 is OK
+      }
+      else
+      {
+         reg_cmd_info.failbits |= FAILBIT0;  // not OK
+      }
+   }
+
+   // Command packet transfer...
+   // Poll Alternate Status for BSY=0.
+
+   trc_llt( 0, 0, TRC_LLT_PNBSY );
+   while ( 1 )
+   {
+      status = pio_inbyte( CB_ASTAT );       // poll for not busy
+      if ( ( status & CB_STAT_BSY ) == 0 )
+         break;
+      if ( tmr_chk_timeout() )               // time out yet ?
+      {
+         trc_llt( 0, 0, TRC_LLT_TOUT );      // yes
+         reg_cmd_info.to = 1;
+         reg_cmd_info.ec = 51;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         dir = -1;   // command done
+         break;
+      }
+   }
+
+   // Command packet transfer...
+   // Check for protocol failures... no interrupt here please!
+   // Clear any interrupt the command packet transfer may have caused.
+
+   if ( int_intr_flag )       // extra interrupt(s) ?
+      reg_cmd_info.failbits |= FAILBIT1;
+   int_intr_flag = 0;
+
+   // Command packet transfer...
+   // If no error, transfer the command packet.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+
+      // Command packet transfer...
+      // Read the primary status register and the other ATAPI registers.
+
+      status = pio_inbyte( CB_STAT );
+      reason = pio_inbyte( CB_SC );
+      lowCyl = pio_inbyte( CB_CL );
+      highCyl = pio_inbyte( CB_CH );
+
+      // Command packet transfer...
+      // check status: must have BSY=0, DRQ=1 now
+
+      if (    ( status & ( CB_STAT_BSY | CB_STAT_DRQ | CB_STAT_ERR ) )
+           != CB_STAT_DRQ
+         )
+      {
+         reg_cmd_info.ec = 52;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         dir = -1;   // command done
+      }
+      else
+      {
+         // Command packet transfer...
+         // Check for protocol failures...
+         // check: C/nD=1, IO=0.
+
+         if ( ( reason &  ( CB_SC_P_TAG | CB_SC_P_REL | CB_SC_P_IO ) )
+              || ( ! ( reason &  CB_SC_P_CD ) )
+            )
+            reg_cmd_info.failbits |= FAILBIT2;
+         if (    ( lowCyl != reg_cmd_info.cl1 )
+              || ( highCyl != reg_cmd_info.ch1 ) )
+            reg_cmd_info.failbits |= FAILBIT3;
+
+         // Command packet transfer...
+         // trace cdb byte 0,
+         // xfer the command packet (the cdb)
+
+         trc_llt( 0, * (unsigned char far *) MK_FP( cpseg, cpoff ), TRC_LLT_P_CMD );
+         pio_drq_block_out( CB_DATA, cpseg, cpoff, cpbc >> 1 );
+
+         ATA_DELAY();   // delay so device can get the status updated
+      }
+   }
+
+   // Data transfer loop...
+   // If there is no error, enter the data transfer loop.
+   // First adjust the I/O buffer address so we are able to
+   // transfer large amounts of data (more than 64K).
+
+   dpaddr = dpseg;
+   dpaddr = dpaddr << 4;
+   dpaddr = dpaddr + dpoff;
+   savedpaddr = dpaddr;
+
+   while ( reg_cmd_info.ec == 0 )
+   {
+      // Data transfer loop...
+      // Wait for interrupt -or- wait for not BUSY -or- wait for time out.
+
+      ATAPI_DELAY( dev );
+      reg_wait_poll( 53, 54 );
+
+      // Data transfer loop...
+      // If there was a time out error, exit the data transfer loop.
+
+      if ( reg_cmd_info.ec )
+      {
+         dir = -1;   // command done
+         break;
+      }
+
+      // Data transfer loop...
+      // If using interrupts get the status read by the interrupt
+      // handler, otherwise read the status register.
+
+      if ( int_use_intr_flag )
+         status = int_ata_status;
+      else
+         status = pio_inbyte( CB_STAT );
+      reason = pio_inbyte( CB_SC );
+      lowCyl = pio_inbyte( CB_CL );
+      highCyl = pio_inbyte( CB_CH );
+
+      // Data transfer loop...
+      // Exit the read data loop if the device indicates this
+      // is the end of the command.
+
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DRQ ) ) == 0 )
+      {
+         dir = -1;   // command done
+         break;
+      }
+
+      // Data transfer loop...
+      // The device must want to transfer data...
+      // check status: must have BSY=0, DRQ=1 now.
+
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DRQ ) ) != CB_STAT_DRQ )
+      {
+         reg_cmd_info.ec = 55;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         dir = -1;   // command done
+         break;
+      }
+      else
+      {
+         // Data transfer loop...
+         // Check for protocol failures...
+         // check: C/nD=0, IO=1 (read) or IO=0 (write).
+
+         if ( ( reason &  ( CB_SC_P_TAG | CB_SC_P_REL ) )
+              || ( reason &  CB_SC_P_CD )
+            )
+            reg_cmd_info.failbits |= FAILBIT4;
+         if ( ( reason & CB_SC_P_IO ) && dir )
+            reg_cmd_info.failbits |= FAILBIT5;
+      }
+
+      // do the slow data transfer thing
+
+      if ( reg_slow_xfer_flag )
+      {
+         slowXferCntr ++ ;
+         if ( slowXferCntr <= reg_slow_xfer_flag )
+         {
+            tmr_delay_xfer();
+            reg_slow_xfer_flag = 0;
+         }
+      }
+
+      // Data transfer loop...
+      // get the byte count, check for zero...
+
+      byteCnt = ( highCyl << 8 ) | lowCyl;
+      if ( byteCnt < 1 )
+      {
+         reg_cmd_info.ec = 59;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         dir = -1;   // command done
+         break;
+      }
+
+      // Data transfer loop...
+      // and check protocol failures...
+
+      if ( byteCnt > dpbc )
+         reg_cmd_info.failbits |= FAILBIT6;
+      reg_cmd_info.failbits |= prevFailBit7;
+      prevFailBit7 = 0;
+      if ( byteCnt & 0x0001 )
+         prevFailBit7 = FAILBIT7;
+
+      // Data transfer loop...
+      // Quit if buffer overrun.
+      // If DRQ call back in use adjust buffer address.
+
+      if ( reg_drq_block_call_back )
+      {
+         if ( byteCnt > reg_buffer_size )
+         {
+            reg_cmd_info.ec = 61;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            dir = -1;   // command done
+            break;
+         }
+         reg_cmd_info.drqPacketSize = byteCnt;
+         dpaddr = savedpaddr;
+      }
+      else
+      {
+         if ( ( reg_cmd_info.totalBytesXfer + byteCnt ) > reg_buffer_size )
+         {
+            reg_cmd_info.ec = 61;
+            trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+            dir = -1;   // command done
+            break;
+         }
+      }
+
+      // increment number of DRQ packets
+
+      reg_cmd_info.drqPackets ++ ;
+
+      // Data transfer loop...
+      // transfer the data and update the i/o buffer address
+      // and the number of bytes transfered.
+
+      wordCnt = ( byteCnt >> 1 ) + ( byteCnt & 0x0001 );
+      reg_cmd_info.totalBytesXfer += ( wordCnt << 1 );
+      dpseg = (unsigned int) ( dpaddr >> 4 );
+      dpoff = (unsigned int) ( dpaddr & 0x0000000fL );
+      if ( dir )
+      {
+         if ( reg_drq_block_call_back )
+            (* reg_drq_block_call_back) ( & reg_cmd_info );
+         pio_drq_block_out( CB_DATA, dpseg, dpoff, wordCnt );
+      }
+      else
+      {
+         pio_drq_block_in( CB_DATA, dpseg, dpoff, wordCnt );
+         if ( reg_drq_block_call_back )
+            (* reg_drq_block_call_back) ( & reg_cmd_info );
+      }
+      dpaddr = dpaddr + byteCnt;
+
+      ATA_DELAY();   // delay so device can get the status updated
+   }
+
+   // End of command...
+   // Wait for interrupt or poll for BSY=0,
+   // but don't do this if there was any error or if this
+   // was a commmand that did not transfer data.
+
+   if ( ( reg_cmd_info.ec == 0 ) && ( dir >= 0 ) )
+   {
+      ATAPI_DELAY( dev );
+      reg_wait_poll( 56, 57 );
+   }
+
+   // Final status check, only if no previous error.
+
+   if ( reg_cmd_info.ec == 0 )
+   {
+      // Final status check...
+      // If using interrupts get the status read by the interrupt
+      // handler, otherwise read the status register.
+
+      if ( int_use_intr_flag )
+         status = int_ata_status;
+      else
+         status = pio_inbyte( CB_STAT );
+      reason = pio_inbyte( CB_SC );
+      lowCyl = pio_inbyte( CB_CL );
+      highCyl = pio_inbyte( CB_CH );
+
+      // Final status check...
+      // check for any error.
+
+      if ( status & ( CB_STAT_BSY | CB_STAT_DRQ | CB_STAT_ERR ) )
+      {
+         reg_cmd_info.ec = 58;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+      }
+   }
+
+   // Final status check...
+   // Check for protocol failures...
+   // check: C/nD=1, IO=1.
+
+   if ( ( reason & ( CB_SC_P_TAG | CB_SC_P_REL ) )
+        || ( ! ( reason & CB_SC_P_IO ) )
+        || ( ! ( reason & CB_SC_P_CD ) )
+      )
+      reg_cmd_info.failbits |= FAILBIT8;
+
+   // Done...
+   // Read the output registers and trace the command.
+
+   if ( ! reg_cmd_info.totalBytesXfer )
+      reg_cmd_info.ct = TRC_TYPE_PND;
+   sub_trace_command();
+
+   // Final status check
+   // BMIDE Error=1?
+
+   if ( sub_readBusMstrStatus() & BM_SR_MASK_ERR )
+   {
+      reg_cmd_info.ec = 78;                  // yes
+      trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+   }
+
+   // For interrupt mode, remove interrupt handler.
+
+   int_restore_int_vect();
+
+   // mark end of PI cmd in low level trace
+
+   trc_llt( 0, 0, TRC_LLT_E_PI );
+
+   // reset reg_drq_block_call_back to NULL (0)
+
+   reg_drq_block_call_back = 0;
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+// end ataioreg.c
diff --git a/haribote/ata/ATAIOSUB.C b/haribote/ata/ATAIOSUB.C
new file mode 100644 (file)
index 0000000..3bbe73c
--- /dev/null
@@ -0,0 +1,354 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOSUB.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+//
+// This C source contains common subroutines to support
+// the PIO and DMA command execution and trace functions.
+//********************************************************************
+
+#include <dos.h>
+
+#include "ataio.h"
+
+
+//*************************************************************
+//
+// sub_zero_return_data() -- zero the return data areas.
+//
+//*************************************************************
+
+void sub_zero_return_data( void )
+
+{
+   int ndx;
+
+   for ( ndx = 0; ndx < sizeof( reg_cmd_info ); ndx ++ )
+      ( (unsigned char *) & reg_cmd_info )[ndx] = 0;
+}
+
+//*************************************************************
+//
+// sub_setup_command() -- setup the command parameters
+//                        in FR, SC, SN, CL, CH and DH.
+//
+//*************************************************************
+
+void sub_setup_command( void )
+
+{
+   unsigned char dev75;
+   unsigned char fr48[2];
+   unsigned char sc48[2];
+   unsigned char lba48[8];
+
+   // determine value of Device (Drive/Head) register bits 7 and 5
+
+   dev75 = 0;                    // normal value
+   if ( reg_incompat_flags & REG_INCOMPAT_DEVREG )
+      dev75 = CB_DH_OBSOLETE;    // obsolete value
+
+   // WARNING: THIS CODE IS DESIGNED FOR A STUPID PROCESSOR
+   // LIKE INTEL X86 THAT IS Little-Endian, THAT IS, A
+   // PROCESSOR THAT STORES DATA IN MEMORY IN THE WRONG
+   // BYTE ORDER !!!
+
+   * (unsigned int *) fr48 = reg_cmd_info.fr1;
+   * (unsigned int *) sc48 = reg_cmd_info.sc1;
+   * (unsigned long *) ( lba48 + 4 ) = reg_cmd_info.lbaHigh1;
+   * (unsigned long *) ( lba48 + 0 ) = reg_cmd_info.lbaLow1;
+
+   pio_outbyte( CB_DC, reg_cmd_info.dc1 );
+
+   if ( reg_cmd_info.lbaSize == LBA28 )
+   {
+      // in ATA LBA28 mode
+      reg_cmd_info.fr1 = fr48[0];
+      pio_outbyte( CB_FR, fr48[0] );
+      reg_cmd_info.sc1 = sc48[0];
+      pio_outbyte( CB_SC, sc48[0] );
+      reg_cmd_info.sn1 = lba48[0];
+      pio_outbyte( CB_SN, lba48[0] );
+      reg_cmd_info.cl1 = lba48[1];
+      pio_outbyte( CB_CL, lba48[1] );
+      reg_cmd_info.ch1 = lba48[2];
+      pio_outbyte( CB_CH, lba48[2] );
+      reg_cmd_info.dh1 = ( reg_cmd_info.dh1 & 0xf0 ) | ( lba48[3] & 0x0f );
+      pio_outbyte( CB_DH, reg_cmd_info.dh1 | dev75 );
+   }
+   else
+   if ( reg_cmd_info.lbaSize == LBA48 )
+   {
+      // in ATA LBA48 mode
+      pio_outbyte( CB_FR, fr48[1] );
+      pio_outbyte( CB_SC, sc48[1] );
+      pio_outbyte( CB_SN, lba48[3] );
+      pio_outbyte( CB_CL, lba48[4] );
+      pio_outbyte( CB_CH, lba48[5] );
+      reg_cmd_info.fr1 = fr48[0];
+      pio_outbyte( CB_FR, fr48[0] );
+      reg_cmd_info.sc1 = sc48[0];
+      pio_outbyte( CB_SC, sc48[0] );
+      reg_cmd_info.sn1 = lba48[0];
+      pio_outbyte( CB_SN, lba48[0] );
+      reg_cmd_info.cl1 = lba48[1];
+      pio_outbyte( CB_CL, lba48[1] );
+      reg_cmd_info.ch1 = lba48[2];
+      pio_outbyte( CB_CH, lba48[2] );
+      pio_outbyte( CB_DH, reg_cmd_info.dh1 | dev75 );
+   }
+   else
+   {
+      // in ATA CHS or ATAPI LBA32 mode
+      pio_outbyte( CB_FR, reg_cmd_info.fr1  );
+      pio_outbyte( CB_SC, reg_cmd_info.sc1  );
+      pio_outbyte( CB_SN, reg_cmd_info.sn1  );
+      pio_outbyte( CB_CL, reg_cmd_info.cl1  );
+      pio_outbyte( CB_CH, reg_cmd_info.ch1  );
+      pio_outbyte( CB_DH, reg_cmd_info.dh1 | dev75 );
+   }
+}
+
+//*************************************************************
+//
+// sub_trace_command() -- trace the end of a command.
+//
+//*************************************************************
+
+void sub_trace_command( void )
+
+{
+   unsigned long lba;
+   unsigned char sc48[2];
+   unsigned char lba48[8];
+
+   reg_cmd_info.st2 = pio_inbyte( CB_STAT );
+   reg_cmd_info.as2 = pio_inbyte( CB_ASTAT );
+   reg_cmd_info.er2 = pio_inbyte( CB_ERR );
+   if ( reg_cmd_info.lbaSize == LBA48 )
+   {
+      // read back ATA LBA48...
+      sc48[0]  = pio_inbyte( CB_SC );
+      lba48[0] = pio_inbyte( CB_SN );
+      lba48[1] = pio_inbyte( CB_CL );
+      lba48[2] = pio_inbyte( CB_CH );
+      pio_outbyte( CB_DC, CB_DC_HOB );
+      sc48[1]  = pio_inbyte( CB_SC );
+      lba48[3] = pio_inbyte( CB_SN );
+      reg_cmd_info.sn2 = lba48[3];
+      lba48[4] = pio_inbyte( CB_CL );
+      reg_cmd_info.cl2 = lba48[4];
+      lba48[5] = pio_inbyte( CB_CH );
+      reg_cmd_info.ch2 = lba48[5];
+      lba48[6] = 0;
+      lba48[7] = 0;
+      reg_cmd_info.sc2 = * (unsigned int *) sc48;
+      reg_cmd_info.lbaHigh2 = * (unsigned long *) ( lba48 + 4 );
+      reg_cmd_info.lbaLow2  = * (unsigned long *) ( lba48 + 0 );
+      reg_cmd_info.dh2 = pio_inbyte( CB_DH );
+   }
+   else
+   {
+      // read back ATA CHS, ATA LBA28 or ATAPI LBA32
+      reg_cmd_info.sc2 = pio_inbyte( CB_SC );
+      reg_cmd_info.sn2 = pio_inbyte( CB_SN );
+      reg_cmd_info.cl2 = pio_inbyte( CB_CL );
+      reg_cmd_info.ch2 = pio_inbyte( CB_CH );
+      reg_cmd_info.dh2 = pio_inbyte( CB_DH );
+      reg_cmd_info.lbaHigh2 = 0;
+      reg_cmd_info.lbaLow2 = 0;
+      if ( reg_cmd_info.lbaSize == LBA28 )
+      {
+         lba = reg_cmd_info.dh2 & 0x0f;
+         lba = lba << 8;
+         lba = lba | reg_cmd_info.ch2;
+         lba = lba << 8;
+         lba = lba | reg_cmd_info.cl2;
+         lba = lba << 8;
+         lba = lba | reg_cmd_info.sn2;
+         reg_cmd_info.lbaLow2 = lba;
+      }
+   }
+   trc_cht();
+}
+
+//*************************************************************
+//
+// sub_select() - function used to select a drive.
+//
+// Function to select a drive making sure that BSY=0 DRQ=0.
+//
+//**************************************************************
+
+int sub_select( int dev )
+
+{
+
+   unsigned char dev75;
+   unsigned char status;
+
+   // determine value of Device (Drive/Head) register bits 7 and 5
+
+   dev75 = 0;                    // normal value
+   if ( reg_incompat_flags & REG_INCOMPAT_DEVREG )
+      dev75 = CB_DH_OBSOLETE;    // obsolete value
+
+   // PAY ATTENTION HERE
+   // The caller may want to issue a command to a device that doesn't
+   // exist (for example, Exec Dev Diag), so if we see this,
+   // just select that device, skip all status checking and return.
+   // We assume the caller knows what they are doing!
+
+   if ( reg_config_info[ dev ] < REG_CONFIG_TYPE_ATA )
+   {
+      // select the device and return
+
+      pio_outbyte( CB_DH, ( dev ? CB_DH_DEV1 : CB_DH_DEV0 ) | dev75 );
+      ATA_DELAY();
+      return 0;
+   }
+
+   // The rest of this is the normal ATA stuff for device selection
+   // and we don't expect the caller to be selecting a device that
+   // does not exist.
+   // We don't know which drive is currently selected but we should
+   // wait BSY=0 and DRQ=0. Normally both BSY=0 and DRQ=0
+   // unless something is very wrong!
+
+   trc_llt( 0, 0, TRC_LLT_PNBSY );
+   while ( 1 )
+   {
+      status = pio_inbyte( CB_STAT );
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DRQ ) ) == 0 )
+         break;
+      if ( tmr_chk_timeout() )
+      {
+         trc_llt( 0, 0, TRC_LLT_TOUT );
+         reg_cmd_info.to = 1;
+         reg_cmd_info.ec = 11;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         reg_cmd_info.st2 = status;
+         reg_cmd_info.as2 = pio_inbyte( CB_ASTAT );
+         reg_cmd_info.er2 = pio_inbyte( CB_ERR );
+         reg_cmd_info.sc2 = pio_inbyte( CB_SC );
+         reg_cmd_info.sn2 = pio_inbyte( CB_SN );
+         reg_cmd_info.cl2 = pio_inbyte( CB_CL );
+         reg_cmd_info.ch2 = pio_inbyte( CB_CH );
+         reg_cmd_info.dh2 = pio_inbyte( CB_DH );
+         return 1;
+      }
+   }
+
+   // Here we select the drive we really want to work with by
+   // setting the DEV bit in the Drive/Head register.
+
+   pio_outbyte( CB_DH, ( dev ? CB_DH_DEV1 : CB_DH_DEV0 ) | dev75 );
+   ATA_DELAY();
+
+   // Wait for the selected device to have BSY=0 and DRQ=0.
+   // Normally the drive should be in this state unless
+   // something is very wrong (or initial power up is still in
+   // progress).
+
+   trc_llt( 0, 0, TRC_LLT_PNBSY );
+   while ( 1 )
+   {
+      status = pio_inbyte( CB_STAT );
+      if ( ( status & ( CB_STAT_BSY | CB_STAT_DRQ ) ) == 0 )
+         break;
+      if ( tmr_chk_timeout() )
+      {
+         trc_llt( 0, 0, TRC_LLT_TOUT );
+         reg_cmd_info.to = 1;
+         reg_cmd_info.ec = 12;
+         trc_llt( 0, reg_cmd_info.ec, TRC_LLT_ERROR );
+         reg_cmd_info.st2 = status;
+         reg_cmd_info.as2 = pio_inbyte( CB_ASTAT );
+         reg_cmd_info.er2 = pio_inbyte( CB_ERR );
+         reg_cmd_info.sc2 = pio_inbyte( CB_SC );
+         reg_cmd_info.sn2 = pio_inbyte( CB_SN );
+         reg_cmd_info.cl2 = pio_inbyte( CB_CL );
+         reg_cmd_info.ch2 = pio_inbyte( CB_CH );
+         reg_cmd_info.dh2 = pio_inbyte( CB_DH );
+         return 1;
+      }
+   }
+
+   // All done.  The return values of this function are described in
+   // ATAIO.H.
+
+   if ( reg_cmd_info.ec )
+      return 1;
+   return 0;
+}
+
+//***********************************************************
+//
+// functions used to read/write the BMIDE registers
+//
+//***********************************************************
+
+unsigned char sub_readBusMstrCmd( void )
+
+{
+   unsigned char x;
+
+   if ( pio_bmide_base_addr < 0x0100 )
+      return 0;
+   x = inportb(pio_bmide_base_addr + BM_COMMAND_REG );
+   trc_llt( 0, x, TRC_LLT_R_BM_CR );
+   return x;
+}
+
+
+unsigned char sub_readBusMstrStatus( void )
+
+{
+   unsigned char x;
+
+   if ( pio_bmide_base_addr < 0x0100 )
+      return 0;
+   x = inportb( pio_bmide_base_addr + BM_STATUS_REG );
+   trc_llt( 0, x, TRC_LLT_R_BM_SR );
+   return x;
+}
+
+
+void sub_writeBusMstrCmd( unsigned char x )
+
+{
+
+   if ( pio_bmide_base_addr < 0x0100 )
+      return;
+   trc_llt( 0, x, TRC_LLT_W_BM_CR );
+   outportb( pio_bmide_base_addr + BM_COMMAND_REG, x );
+}
+
+
+void sub_writeBusMstrStatus( unsigned char x )
+
+{
+
+   if ( pio_bmide_base_addr < 0x0100 )
+      return;
+   trc_llt( 0, x, TRC_LLT_W_BM_SR );
+   outportb( pio_bmide_base_addr + BM_STATUS_REG, x );
+}
+
+// end ataiosub.c
diff --git a/haribote/ata/ATAIOTMR.C b/haribote/ata/ATAIOTMR.C
new file mode 100644 (file)
index 0000000..5900b21
--- /dev/null
@@ -0,0 +1,306 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOTMR.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+//
+// This C source file contains functions to access the BIOS
+// Time of Day information and to set and check the command
+// time out period.
+//********************************************************************
+
+#include <dos.h>
+
+#include "ataio.h"
+
+//**************************************************************
+
+long tmr_time_out = 20L;      // max command execution time in seconds
+
+long tmr_cmd_start_time;      // command start time - see the
+                              // tmr_set_timeout() and
+                              // tmr_chk_timeout() functions.
+
+long tmr_1s_count;            // number of I/O port reads required
+                              //    for a 1s delay
+long tmr_1ms_count;           // number of I/O port reads required
+                              //    for a 1ms delay
+long tmr_1us_count;           // number of I/O port reads required
+                              //    for a 1us delay
+long tmr_500ns_count;         // number of I/O port reads required
+                              //    for a 500ns delay
+
+//**************************************************************
+//
+// tmr_read_bios_timer() - function to read the BIOS timer
+//
+//**************************************************************
+
+long tmr_read_bios_timer_old( void )
+
+{
+   long curTime;
+
+   // Pointer to the low order word
+   // of the BIOS time of day counter at
+   // location 40:6C in the BIOS data area.
+   static volatile long far * todPtr = (long *)MK_FP( 0x40, 0x6c );
+
+   // loop so we get a valid value without
+   // turning interrupts off and on again
+   do
+   {
+      curTime = * todPtr;
+   } while ( curTime != * todPtr );
+   return curTime;
+}
+
+unsigned long long timer_getbiostimer();
+long tmr_read_bios_timer( void )
+{
+       return timer_getbiostimer();
+}
+
+//**************************************************************
+//
+// tmr_set_timeout() - get the command start time
+//
+//**************************************************************
+
+void tmr_set_timeout( void )
+
+{
+
+   // get the command start time
+   tmr_cmd_start_time = tmr_read_bios_timer();
+}
+
+//**************************************************************
+//
+// tmr_chk_timeout() - check for command timeout.
+//
+// Gives non-zero return if command has timed out.
+//
+//**************************************************************
+
+int tmr_chk_timeout( void )
+
+{
+   long curTime;
+
+   // get current time
+   curTime = tmr_read_bios_timer();
+
+   // if we have passed midnight, restart
+   if ( curTime < tmr_cmd_start_time )
+   {
+      tmr_cmd_start_time = curTime;
+      return 0;
+   }
+
+   // timed out yet ?
+   if ( curTime >= ( tmr_cmd_start_time + ( tmr_time_out * 18L ) ) )
+      return 1;      // yes
+
+   // no timeout yet
+   return 0;
+}
+
+//**************************************************************
+//
+// tmr_get_delay_counts - compute the number calls to
+//    tmr_waste_time() required for 1s, 1ms, 1us and 500ns delays.
+//
+//**************************************************************
+
+// our 'waste time' function (do some 32-bit multiply/divide)
+
+static long tmr_waste_time( long p );
+
+static long tmr_waste_time( long p )
+
+{
+   volatile long lc = 100;
+   for(int i = 0; i < 100; i++){
+       volatile long k = ( lc * lc ) / ( ( p * p ) + 1 );
+   }
+
+   return ( lc * lc ) / ( ( p * p ) + 1 );
+}
+
+// get the delay counts
+
+void tmr_get_delay_counts( void )
+
+{
+   long count;
+   long curTime, startTime, endTime;
+   int loop;
+   int retry;
+
+   // do only once
+   if ( tmr_1s_count )
+      return;
+
+   // outside loop to handle crossing midnight
+   count = 0;
+   retry = 1;
+   while ( retry )
+   {
+      // wait until the timer ticks
+      startTime = tmr_read_bios_timer();
+      while ( 1 )
+      {
+         curTime = tmr_read_bios_timer();
+         if ( curTime != startTime )
+            break;
+      }
+      // waste time for 1 second
+      endTime = curTime + 18L;
+      while ( 1 )
+      {
+         for ( loop = 0; loop < 100; loop ++ )
+            tmr_waste_time( 7 );
+         count += 100 ;
+         // check timer
+         curTime = tmr_read_bios_timer();
+         // pass midnight?
+         if ( curTime < startTime )
+         {
+            count = 0;  // yes, zero count
+            break;      // do again
+         }
+         // one second yet?
+         if ( curTime >= endTime )
+         {
+            retry = 0;  // yes, we have a count
+            break;      // done
+         }
+      }
+   }
+
+   // save the 1s count
+   tmr_1s_count = count;
+   // divide by 1000 and save 1ms count
+   tmr_1ms_count = count = count / 1000L;
+   // divide by 1000 and save 1us count
+   tmr_1us_count = count = count / 1000L;
+   // divide by 2 and save 500ns count
+   tmr_500ns_count = count / 2;
+
+   // make sure 1us count is at least 2
+   if ( tmr_1us_count < 2L )
+      tmr_1us_count = 2L;
+   // make sure 500ns count is at least 1
+   if ( tmr_500ns_count < 1L )
+      tmr_500ns_count = 1L;
+}
+
+//**************************************************************
+//
+// tmr_delay_1ms - delay approximately 'count' milliseconds
+//
+//**************************************************************
+
+void tmr_delay_1ms( long count )
+
+{
+   long loopcnt = tmr_1ms_count * count;
+
+   while ( loopcnt > 0 )
+   {
+      tmr_waste_time( 7 );
+      loopcnt -- ;
+   }
+}
+
+//**************************************************************
+//
+// tmr_delay_1us - delay approximately 'count' microseconds
+//
+//**************************************************************
+
+void tmr_delay_1us( long count )
+
+{
+   long loopcnt = tmr_1us_count * count;
+
+   while ( loopcnt > 0 )
+   {
+      tmr_waste_time( 7 );
+      loopcnt -- ;
+   }
+}
+
+//**************************************************************
+//
+// tmr_ata_delay - delay approximately 500 nanoseconds
+//
+//**************************************************************
+
+void tmr_delay_ata( void )
+
+{
+   long loopcnt = tmr_500ns_count;
+
+   while ( loopcnt > 0 )
+   {
+      tmr_waste_time( 7 );
+      loopcnt -- ;
+   }
+}
+
+//**************************************************************
+//
+// tmr_atapi_delay() - delay for ~80ms so that poorly designed
+//                     atapi device have time to updated their
+//                     status.
+//
+//**************************************************************
+
+void tmr_delay_atapi( int dev )
+
+{
+
+   if ( reg_config_info[dev] == REG_CONFIG_TYPE_ATA )
+      return;
+   if ( ! reg_atapi_delay_flag )
+      return;
+   trc_llt( 0, 0, TRC_LLT_DELAY1 );
+   tmr_delay_1ms( 80L );
+}
+
+//**************************************************************
+//
+// tmr_xfer_delay() - random delay until the bios timer ticks
+//                    (from 0 to 55ms).
+//
+//**************************************************************
+
+void tmr_delay_xfer( void )
+
+{
+   long lw;
+
+   trc_llt( 0, 0, TRC_LLT_DELAY2 );
+   lw = tmr_read_bios_timer();
+   while ( lw == tmr_read_bios_timer() )
+      /* do nothing */ ;
+}
+
+// end ataiotmr.c
diff --git a/haribote/ata/ATAIOTRC.C b/haribote/ata/ATAIOTRC.C
new file mode 100644 (file)
index 0000000..442339c
--- /dev/null
@@ -0,0 +1,1271 @@
+//********************************************************************
+// ATA LOW LEVEL I/O DRIVER -- ATAIOTRC.C
+//
+// by Hale Landis (www.ata-atapi.com)
+//
+// There is no copyright and there are no restrictions on the use
+// of this ATA Low Level I/O Driver code.  It is distributed to
+// help other programmers understand how the ATA device interface
+// works and it is distributed without any warranty.  Use this
+// code at your own risk.
+//
+// This code is based on the ATA-2, ATA-3 and ATA-4 standards and
+// on interviews with various ATA controller and drive designers.
+//
+// This code has been run on many ATA (IDE) drives and
+// MFM/RLL controllers.  This code may be a little
+// more picky about the status it sees at various times.  A real
+// BIOS probably would not check the status as carefully.
+//
+// Compile with one of the Borland C or C++ compilers.
+//
+// This C source contains the low level I/O trace functions.
+//********************************************************************
+
+#include <stdio.h>
+#include <string.h>
+#include <dos.h>
+
+#include "ataio.h"
+
+//**************************************************************
+
+// trace dump buffer returned by trc_err_dump2()
+// trc_cht_dump2() and trc_llt_dump2()
+
+static char trcDmpBuf[200];
+
+// buffer used to assemble print lines
+
+static char prtBuf[64];
+
+//**************************************************************
+
+// function to return command type (protocol)
+
+static char * typeNames[] =
+   {
+     //123456789012 (max 12 chars)
+      "NONE",              // TRC_TYPE_NONE
+      "ATA DmaIn",         // TRC_TYPE_ADMAI
+      "ATA DmaOut",        // TRC_TYPE_ADMAO
+      "ATA ND",            // TRC_TYPE_AND
+      "ATA PDI",           // TRC_TYPE_APDI
+      "ATA PDO",           // TRC_TYPE_APDO
+      "ATA SR",            // TRC_TYPE_ASR
+      "ATAPI DmaIn",       // TRC_TYPE_PDMAI
+      "ATAPI DmaOut",      // TRC_TYPE_PDMAO
+      "ATAPI ND",          // TRC_TYPE_PND
+      "ATAPI PDI",         // TRC_TYPE_PPDI
+      "ATAPI PDO",         // TRC_TYPE_PPDO
+      "????"
+   } ;
+
+char * trc_get_type_name( char ct )
+
+{
+
+   return typeNames[ ct ];
+}
+
+//**************************************************************
+
+// table used to initialize cmd code ndx table
+// this is used for fast lookup of cmd names
+// and can be used to implement other arrays
+// of information per cmd code.
+
+// number of commands in lookup tables
+// #define TRC_NUM_CMDS 52    // see ATAIO.H
+
+static unsigned char cmdCodeLst[TRC_NUM_CMDS] =
+   {
+      0x00,    // 00 - entry for unknown cmd codes
+      0x03,    // 01
+      0x08,    // 02
+      0x10,    // 03
+      0x20,    // 04
+      0x24,    // 05
+      0x25,    // 06
+      0x29,    // 08
+      0x30,    // 09
+      0x34,    // 10
+      0x35,    // 11
+      0x38,    // 12
+      0x39,    // 13
+      0x3C,    // 14
+      0x3D,    // 15
+      0x40,    // 16
+      0x42,    // 17
+      0x50,    // 18
+      0x70,    // 19
+      0x87,    // 20
+      0x90,    // 21
+      0x91,    // 22
+      0x94,    // 23
+      0x95,    // 24
+      0x96,    // 25
+      0x97,    // 26
+      0x98,    // 27
+      0x99,    // 28
+      0xA0,    // 29
+      0xA1,    // 30
+      0xb0,    // 31
+      0xC0,    // 32
+      0xC4,    // 33
+      0xC5,    // 34
+      0xC6,    // 35
+      0xC8,    // 36
+      0xCA,    // 37
+      0xCD,    // 38
+      0xCE,    // 39
+      0xE0,    // 40
+      0xE1,    // 41
+      0xE2,    // 42
+      0xE3,    // 43
+      0xE4,    // 44
+      0xE5,    // 45
+      0xE6,    // 46
+      0xE7,    // 47
+      0xE8,    // 48
+      0xEA,    // 49
+      0xEC,    // 50
+      0xEF     // 51
+   } ;
+
+// command name lookup table
+
+static char * cmdNames[TRC_NUM_CMDS] =
+   {
+      "? Cmd Name ?",                     // 0x00  00 - unknown cmd codes
+      "CFA REQUEST EXT ERR CODE" ,        // 0x03  01
+      "DEVICE RESET" ,                    // 0x08  02
+      "RECALIBRATE" ,                     // 0x10  03
+      "READ SECTORS" ,                    // 0x20  04
+      "READ SECTORS EXT" ,                // 0x24  05
+      "READ DMA EXT" ,                    // 0x25  06
+      "READ MULTIPLE EXT" ,               // 0x29  08
+      "WRITE SECTORS" ,                   // 0x30  09
+      "WRITE SECTORS EXT" ,               // 0x34  10
+      "WRITE DMA EXT" ,                   // 0x35  11
+      "CFA WRITE SECTORS WO ERASE" ,      // 0x38  12
+      "WRITE MULTIPLE EXT" ,              // 0x39  13
+      "WRITE VERIFY" ,                    // 0x3C  14
+      "WRITE DMA FUA EXT" ,               // 0x3D  15
+      "READ VERIFY SECTORS" ,             // 0x40  16
+      "READ VERIFY SECTORS EXT" ,         // 0x42  17
+      "FORMAT TRACK" ,                    // 0x50  18
+      "SEEK" ,                            // 0x70  19
+      "CFA TRANSLATE SECTOR" ,            // 0x87  20
+      "EXECUTE DEVICE DIAGNOSTIC" ,       // 0x90  21
+      "INITIALIZE DEVICE PARAMETERS" ,    // 0x91  22
+      "STANDBY IMMEDIATE" ,               // 0x94  23
+      "IDLE IMMEDIATE" ,                  // 0x95  24
+      "STANDBY" ,                         // 0x96  25
+      "IDLE" ,                            // 0x97  26
+      "CHECK POWER MODE" ,                // 0x98  27
+      "SLEEP" ,                           // 0x99  28
+      "PACKET" ,                          // 0xA0  29
+      "IDENTIFY PACKET DEVICE" ,          // 0xA1  30
+      "SMART",                            // 0xb0  31
+      "CFA ERASE SECTORS" ,               // 0xC0  32
+      "READ MULTIPLE" ,                   // 0xC4  33
+      "WRITE MULTIPLE" ,                  // 0xC5  34
+      "SET MULTIPLE MODE" ,               // 0xC6  35
+      "READ DMA" ,                        // 0xC8  36
+      "WRITE DMA" ,                       // 0xCA  37
+      "CFA WRITE MULTIPLE WO ERASE" ,     // 0xCD  38
+      "WRITE MULTIPLE FUA EXT" ,          // 0xCE  39
+      "STANDBY IMMEDIATE" ,               // 0xE0  40
+      "IDLE IMMEDIATE" ,                  // 0xE1  41
+      "STANDBY" ,                         // 0xE2  42
+      "IDLE" ,                            // 0xE3  43
+      "READ BUFFER" ,                     // 0xE4  44
+      "CHECK POWER MODE" ,                // 0xE5  45
+      "SLEEP" ,                           // 0xE6  46
+      "FLUSH CACHE" ,                     // 0xE7  47
+      "WRITE BUFFER" ,                    // 0xE8  48
+      "FLUSH CACHE EXT" ,                 // 0xEA  49
+      "IDENTIFY DEVICE" ,                 // 0xEC  50
+      "SET FEATURES" ,                    // 0xEF  51
+   } ;
+
+// cmd code to cmd ndx table -
+// see function init_cmd_ndx_tbl() and macro TRC_CC2NDX()
+
+char trc_CmdCodeNdx[256];
+
+// function to initialize trc_CmdCodeNdx[]
+
+static void init_cmd_ndx_tbl( void );
+
+static void init_cmd_ndx_tbl( void )
+
+{
+   int ndx;
+
+   for ( ndx = 0; ndx < sizeof( cmdCodeLst ); ndx ++ )
+      trc_CmdCodeNdx[cmdCodeLst[ndx]] = ndx;
+   // note: unknown cmd codes will have an ndx of 0.
+}
+
+// function to return the cmd name for a cmd code.
+
+char * trc_get_cmd_name( unsigned int cc )
+
+{
+
+   if ( trc_CmdCodeNdx[CMD_READ_SECTORS] == 0 )    // 1st call initialization
+      init_cmd_ndx_tbl();
+   if ( cc == CMD_SRST )                           // soft reset
+      return "SOFT RESET";
+   return cmdNames[trc_CmdCodeNdx[cc]];            // code->ndx->name
+}
+
+//**************************************************************
+
+// ATA status names lookup table and lookup function
+
+static struct
+{
+   unsigned char bitPos;
+   char * bitName;
+} ataStatusNames[] =
+   {
+      0x80 , "BSY "  ,
+      0x40 , "DRDY " ,
+      0x20 , "DF "   ,
+      0x10 , "DSC "  ,
+      0x08 , "DRQ "  ,
+      0x04 , "CORR " ,
+      0x02 , "IDX "  ,
+      0x01 , "ERR "
+   } ;
+
+static char ataStatusNameBuf[48];
+
+char * trc_get_st_bit_name( unsigned char st )
+
+{
+   int ndx;
+
+   if ( st & 0x80 )
+      st = 0x80;
+   * ataStatusNameBuf = 0;
+   for ( ndx = 0; ndx < 8; ndx ++ )
+   {
+      if ( st & ataStatusNames[ndx].bitPos )
+         strcat( ataStatusNameBuf, ataStatusNames[ndx].bitName );
+   }
+   return ataStatusNameBuf;
+}
+
+//**************************************************************
+
+// ATA error names lookup table and lookup function
+
+static struct
+{
+   unsigned char bitPos;
+   char * bitName;
+} ataErrorNames[] =
+   {
+      0x80 , "BBK:ICRC " ,
+      0x40 , "UNC "      ,
+      0x20 , "MC "       ,
+      0x10 , "IDNF "     ,
+      0x08 , "MCR "      ,
+      0x04 , "ABRT "     ,
+      0x02 , "TK0NF "    ,
+      0x01 , "AMNF "
+   } ;
+
+static char ataErrorNameBuf[48];
+
+char * trc_get_er_bit_name( unsigned char er )
+
+{
+   int ndx;
+
+   * ataErrorNameBuf = 0;
+   for ( ndx = 0; ndx < 8; ndx ++ )
+   {
+      if ( er & ataErrorNames[ndx].bitPos )
+         strcat( ataErrorNameBuf, ataErrorNames[ndx].bitName );
+   }
+   return ataErrorNameBuf;
+}
+
+//**************************************************************
+
+// error name lookup table and lookup function
+
+static struct
+{
+   int errCode;
+   char * errName;
+} errNames[] =
+   {
+       1 ,  "Soft Reset timed out polling for device 0 to set BSY=0"  ,
+       2 ,  "Soft Reset timed out polling device 1"                   ,
+       3 ,  "Soft Reset timed out polling for device 1 to set BSY=0"  ,
+
+      11 ,  "Selected device is hung - reset required"                ,
+      12 ,  "Device selection timed out polling for BSY=0 DRQ=0"      ,
+
+      21 ,  "Non-Data command ended with bad status"                  ,
+      22 ,  "Non-Data command timed out waiting for an interrupt"     ,
+      23 ,  "Non-Data command timed out polling for BSY=0"            ,
+      24 ,  "Exec Dev Diag command timed out polling device 1"        ,
+
+      31 ,  "PIO Data In command terminated by error status"          ,
+      32 ,  "Device should be ready to transfer data but DRQ=0"       ,
+      33 ,  "PIO Data In command ended with bad status"               ,
+      34 ,  "PIO Data In command timed out waiting for an interrupt"  ,
+      35 ,  "PIO Data In command timed out polling for BSY=0"         ,
+
+      41 ,  "PIO Data Out command terminated by error status"         ,
+      42 ,  "Device should be ready to transfer data but DRQ=0"       ,
+      43 ,  "PIO Data Out command ended with bad status"              ,
+      44 ,  "PIO Data Out command timed out waiting for an interrupt" ,
+      45 ,  "PIO Data Out command timed out polling for BSY=0"        ,
+      46 ,  "Extra interrupt at start of a PIO Data Out command"      ,
+      47 ,  "PIO Data Out command timed out polling for BSY=0"        ,
+
+      51 ,  "Timeout waiting for BSY=0/DRQ=1 for cmd packet transfer" ,
+      52 ,  "Bad status at command packet transfer time"              ,
+      53 ,  "Timeout waiting for interrupt for data packet transfer"  ,
+      54 ,  "Timeout polling for BSY=0/DRQ=1 for a data packet"       ,
+      55 ,  "Bad status at data packet transfer time"                 ,
+      56 ,  "Timout waiting for final interrupt at end of command"    ,
+      57 ,  "Timeout polling for final BSY=0 at end of command"       ,
+      58 ,  "Bad status at end of command"                            ,
+      59 ,  "Byte count for data packet is zero"                      ,
+
+      61 ,  "Buffer overrun (host buffer too small)"                  ,
+
+      70 ,  "DMA channel and/or interrupt not setup"                  ,
+      71 ,  "End of command without complete data transfer"           ,
+      72 ,  "Timeout waiting for 1st transfer to complete"            ,
+      73 ,  "Timeout waiting for command to complete"                 ,
+      74 ,  "Bad status at end of command"                            ,
+      75 ,  "Timeout waiting for BSY=0/DRQ=1 for cmd packet transfer" ,
+      76 ,  "Bad status at command packet transfer time"              ,
+      78 ,  "End of command with BMIDE Error=1"                  ,
+
+      80 ,  "No tag available now"                                    ,
+      81 ,  "Timeout polling for SERV=1"                              ,
+
+      0  ,  "(no error)"            // end of table
+   } ;
+
+char * trc_get_err_name( int ec )
+
+{
+   int ndx = 0;
+
+   while ( 1 )
+   {
+      if ( ec == errNames[ndx].errCode )
+         return errNames[ndx].errName;
+      if ( ! errNames[ndx].errCode )
+         break;
+      ndx ++ ;
+   }
+   return "? unknown error code ?";
+}
+
+//**************************************************************
+
+static struct
+{
+   unsigned int pErrCode;
+   char * pErrName;
+} pErrNames[] =
+   {
+      FAILBIT0  , "slow setting BSY=1 or DRQ=1 after A0 cmd"   ,
+      FAILBIT1  , "got interrupt before cmd packet xfer"       ,
+      FAILBIT2  , "SC wrong at cmd packet xfer time"           ,
+      FAILBIT3  , "byte count wrong at cmd packet xfer time"   ,
+      FAILBIT4  , "SC (CD bit) wrong at data packet xfer time" ,
+      FAILBIT5  , "SC (IO bit) wrong at data packet xfer time" ,
+      FAILBIT6  , "byte count wrong at data packet xfer time"  ,
+      FAILBIT7  , "byte count odd at data packet xfer time"    ,
+      FAILBIT8  , "SC (CD and IO bits) wrong at end of cmd"    ,
+      FAILBIT9  , "fail bit 9"                                 ,
+      FAILBIT10 , "fail bit 10"                                ,
+      FAILBIT11 , "fail bit 11"                                ,
+      FAILBIT12 , "fail bit 12"                                ,
+      FAILBIT13 , "fail bit 13"                                ,
+      FAILBIT14 , "fail bit 14"                                ,
+      FAILBIT15 , "extra interrupts detected"
+   } ;
+
+//**************************************************************
+
+// command or reset error display data
+
+static int errDmpLine = 0;
+static int errDmpLine2 = 0;
+
+//**************************************************************
+
+// start the display of a command or reset error display
+
+void trc_err_dump1( void )
+
+{
+
+   errDmpLine = 1;
+   errDmpLine2 = 0;
+}
+
+//**************************************************************
+
+// return one line of a command or reset error display,
+// returns NULL at end
+
+char * trc_err_dump2( void )
+
+{
+
+   if ( reg_cmd_info.flg == TRC_FLAG_EMPTY )
+      return 0;
+   if ( errDmpLine == 1 )
+   {
+      errDmpLine = 2;
+      if ( reg_cmd_info.flg == TRC_FLAG_SRST )
+         sprintf( trcDmpBuf, "ATA Reset: SR = %s (%s)",
+                             trc_get_cmd_name( CMD_SRST ),
+                             trc_get_type_name( reg_cmd_info.ct ) );
+      else
+      if ( reg_cmd_info.flg == TRC_FLAG_ATAPI )
+         sprintf( trcDmpBuf, "PACKET Command: %02X = %s (%s)",
+                             reg_cmd_info.cmd,
+                             trc_get_cmd_name( reg_cmd_info.cmd ),
+                             trc_get_type_name( reg_cmd_info.ct ) );
+      else
+         sprintf( trcDmpBuf, "ATA Command: %02X = %s (%s)",
+                             reg_cmd_info.cmd,
+                             trc_get_cmd_name( reg_cmd_info.cmd ),
+                             trc_get_type_name( reg_cmd_info.ct ) );
+
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 2 )
+   {
+      errDmpLine = 3;
+      if ( reg_cmd_info.flg == TRC_FLAG_ATA )
+      {
+         if ( reg_cmd_info.lbaSize == LBA48 )
+         {
+            // LBA48 before and after
+            sprintf( trcDmpBuf, "LBA48 SC %ld %lXH, "
+                                "before %lu.%lu %lX.%lXH, "
+                                "after %lu.%lu %lX.%lXH",
+                                 reg_cmd_info.ns, reg_cmd_info.ns,
+                                 reg_cmd_info.lbaHigh1, reg_cmd_info.lbaLow1,
+                                 reg_cmd_info.lbaHigh1, reg_cmd_info.lbaLow1,
+                                 reg_cmd_info.lbaHigh2, reg_cmd_info.lbaLow2,
+                                 reg_cmd_info.lbaHigh2, reg_cmd_info.lbaLow2 );
+         }
+         else
+         if ( reg_cmd_info.lbaSize == LBA28 )
+         {
+            // LBA28 before and after
+            sprintf( trcDmpBuf, "LBA28 SC %ld %lXH, "
+                                "before %lu %lXH, "
+                                "after %lu %lXH",
+                                 reg_cmd_info.ns, reg_cmd_info.ns,
+                                 reg_cmd_info.lbaLow1, reg_cmd_info.lbaLow1,
+                                 reg_cmd_info.lbaLow2, reg_cmd_info.lbaLow2 );
+         }
+         else
+         {
+            // CHS before and after
+            unsigned int cyl1, head1, sect1;
+            unsigned int cyl2, head2, sect2;
+
+            cyl1  = (unsigned int) ( reg_cmd_info.ch1 << 8 ) | reg_cmd_info.cl1;
+            head1 = (unsigned int) reg_cmd_info.dh1 & 0x0f;
+            sect1 = (unsigned int) reg_cmd_info.sn1;
+            cyl2  = (unsigned int) ( reg_cmd_info.ch2 << 8 ) | reg_cmd_info.cl2;
+            head2 = (unsigned int) reg_cmd_info.dh2 & 0x0f;
+            sect2 = (unsigned int) reg_cmd_info.sn2;
+            sprintf( trcDmpBuf, "CHS SC %ld %lXH, "
+                                "before %u.%u.%u %X.%X.%XH, "
+                                "after %u.%u.%u %X.%X.%XH ",
+                                 reg_cmd_info.ns, reg_cmd_info.ns,
+                                 cyl1, head1, sect1, cyl1, head1, sect1,
+                                 cyl2, head2, sect2, cyl2, head2, sect2 );
+         }
+         return trcDmpBuf;
+      }
+      if ( reg_cmd_info.flg == TRC_FLAG_ATAPI )
+      {
+         if ( reg_atapi_cp_size == 12 )
+         {
+            sprintf( trcDmpBuf, "CDB %02X %02X %02X %02X  "
+                                    "%02X %02X %02X %02X  "
+                                    "%02X %02X %02X %02X ",
+                     reg_atapi_cp_data[0], reg_atapi_cp_data[1],
+                     reg_atapi_cp_data[2], reg_atapi_cp_data[3],
+                     reg_atapi_cp_data[4], reg_atapi_cp_data[5],
+                     reg_atapi_cp_data[6], reg_atapi_cp_data[7],
+                     reg_atapi_cp_data[8], reg_atapi_cp_data[9],
+                     reg_atapi_cp_data[10], reg_atapi_cp_data[11] );
+         }
+         else
+         {
+            sprintf( trcDmpBuf, "CDB %02X %02X %02X %02X  "
+                                    "%02X %02X %02X %02X  "
+                                    "%02X %02X %02X %02X  "
+                                    "%02X %02X %02X %02X ",
+                     reg_atapi_cp_data[0], reg_atapi_cp_data[1],
+                     reg_atapi_cp_data[2], reg_atapi_cp_data[3],
+                     reg_atapi_cp_data[4], reg_atapi_cp_data[5],
+                     reg_atapi_cp_data[6], reg_atapi_cp_data[7],
+                     reg_atapi_cp_data[8], reg_atapi_cp_data[9],
+                     reg_atapi_cp_data[10], reg_atapi_cp_data[11],
+                     reg_atapi_cp_data[12], reg_atapi_cp_data[13],
+                     reg_atapi_cp_data[14], reg_atapi_cp_data[15] );
+         }
+         return trcDmpBuf;
+      }
+   }
+   if ( errDmpLine == 3 )
+   {
+      errDmpLine = 4;
+      sprintf( trcDmpBuf, "Driver ErrCode: %d %s ",
+                          reg_cmd_info.ec, trc_get_err_name( reg_cmd_info.ec ) );
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 4 )
+   {
+      errDmpLine = 5;
+      if ( reg_cmd_info.to )
+      {
+         sprintf( trcDmpBuf, "                   "
+                             "Driver timed out (see low level trace for details) !" );
+         return trcDmpBuf;
+      }
+   }
+   if ( errDmpLine == 5 )
+   {
+      errDmpLine = 6;
+      sprintf( trcDmpBuf, "Bytes transferred: %ld (%lXH); DRQ blocks: %ld (%lXH) ",
+                        reg_cmd_info.totalBytesXfer, reg_cmd_info.totalBytesXfer,
+                        reg_cmd_info.drqPackets, reg_cmd_info.drqPackets );
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 6 )
+   {
+      errDmpLine = 7;
+      sprintf( trcDmpBuf, "Device Status: %02X = %s ", reg_cmd_info.st2,
+                        trc_get_st_bit_name( reg_cmd_info.st2 ) );
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 7 )
+   {
+      errDmpLine = 8;
+      sprintf( trcDmpBuf, "Device  Error: %02X = %s ", reg_cmd_info.er2,
+                         trc_get_er_bit_name( reg_cmd_info.er2 ) );
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 8 )
+   {
+      errDmpLine = 9;
+      sprintf( trcDmpBuf, "ATA Intf Regs: FR  ER  SC  SN  CL  CH  DH  CM  ST  AS  DC " );
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 9 )
+   {
+      errDmpLine = 10;
+      if ( reg_cmd_info.flg == TRC_FLAG_SRST )
+         sprintf( trcDmpBuf, "   Cmd Params: "
+                  // fr  er  sc  sn  cl  ch  dh  cm  st  as  dc
+                    "--  --  --  --  --  --  --  --  --  --  04 " );
+      else
+         sprintf( trcDmpBuf, "   Cmd Params: "
+                  //  fr   er   sc    sn    cl    ch    dh    cm   st  as   dc
+                    "%02X  --  %02X  %02X  %02X  %02X  %02X  %02X  --  --  %02X ",
+                     reg_cmd_info.fr1 & 0x00ff,
+                     reg_cmd_info.sc1 & 0x00ff,
+                     reg_cmd_info.sn1,
+                     reg_cmd_info.cl1, reg_cmd_info.ch1, reg_cmd_info.dh1,
+                     reg_cmd_info.cmd, reg_cmd_info.dc1 );
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 10 )
+   {
+      errDmpLine = 11;
+      sprintf( trcDmpBuf, "    After Cmd: "
+                  // fr   er    sc    sn    cl    ch    dh   cm   st    as   dc
+                    "--  %02X  %02X  %02X  %02X  %02X  %02X  --  %02X  %02X  -- ",
+                     reg_cmd_info.er2, reg_cmd_info.sc2 & 0x00ff,
+                     reg_cmd_info.sn2, reg_cmd_info.cl2, reg_cmd_info.ch2,
+                     reg_cmd_info.dh2, reg_cmd_info.st2, reg_cmd_info.as2 );
+      return trcDmpBuf;
+   }
+   if ( ( errDmpLine == 11 ) &&  reg_cmd_info.failbits )
+   {
+      errDmpLine = 12;
+      errDmpLine2 = 0;
+      sprintf( trcDmpBuf, "  ATA/ATAPI protocol errors bits (%04XH):",
+                          reg_cmd_info.failbits );
+      return trcDmpBuf;
+   }
+   if ( errDmpLine == 12 )
+   {
+      while ( ( errDmpLine2 < 16 )
+              &&
+              ( ! ( reg_cmd_info.failbits & pErrNames[errDmpLine2].pErrCode ) )
+            )
+         errDmpLine2 ++ ;
+      if ( errDmpLine2 < 16 )
+      {
+         sprintf( trcDmpBuf, "      - %s", pErrNames[errDmpLine2].pErrName );
+         errDmpLine2 ++ ;
+         return trcDmpBuf;
+      }
+   }
+   return 0;
+}
+
+//**********************************************************
+
+// command types to trace, see TRC_TYPE_xxx in ataio.h and
+// see trc_cht_types() below.
+
+static unsigned int chtTypes = 0xffff; // default is trace all cmd types
+
+// command history trace buffer
+
+#define MAX_CHT 100
+
+static struct
+{
+   // entry type, entry flag, command code, etc
+   unsigned char flg;         // see TRC_FLAG_xxx in ataio.h
+   unsigned char ct;          // see TRC_TYPE_xxx in ataio.h
+   unsigned char cmd;         // command code
+   long ns;                   // number of sectors (sector count)
+   int mc;                    // multiple count
+   unsigned int  fr1;         // feature (8 or 16 bits)
+   unsigned char dh1;         // device head
+   // starting CHS/LBA
+   unsigned char lbaSize;     // CHS/LBA addr mode
+   unsigned int  cyl;         // CHS cyl or ATAPI BCL
+   unsigned char head;        // CHS head
+   unsigned char sect;        // CHS sect
+   unsigned long lbaLow1;     // LBA lower 32-bits
+   // ending status and driver error codes
+   unsigned char st2;         // status reg
+   unsigned char er2;         // error reg
+   unsigned char ec;          // detailed error code
+   unsigned char to;          // not zero if time out error
+   // ATAPI CDB size and CDB data
+   unsigned char cdbSize;     // CDB size (12 or 16)
+   unsigned char cdbBuf[16];  // CDB data
+}  chtBuf[MAX_CHT];
+
+static int chtCur = 0;
+static int chtDmpLine = 0;
+static int chtDmpNdx = 0;
+
+static char * chtTypeName[] =
+   { "?????",
+     "DR   ", "DW   ",
+     "ND   ", "PDI  ", "PDO  ",
+     "RESET",
+     "DPR  ", "DPW  ",
+     "PN   ", "PR   ", "PW   " } ;
+
+//**************************************************************
+
+// set the commands types that are traced,
+// see TRC_TYPE_xxx in ataio.h and chtTypes above.
+
+void trc_cht_types( int type )
+
+{
+
+   if ( type < 1 )
+      chtTypes = 0x0000;   // trace nothing
+   else
+      if ( type > 15 )
+         chtTypes = 0xffff;   // trace all
+      else
+         chtTypes |= 0x0001 << type;  // selective
+}
+
+//**************************************************************
+
+// place an command or reset entry into
+// the command history trace buffer
+
+void trc_cht( void )
+
+{
+   int ndx;
+
+   if ( ! ( ( 0x0001 << reg_cmd_info.ct ) & chtTypes ) )
+      return;
+   // entry type, entry flag, command code, etc
+   chtBuf[chtCur].flg = reg_cmd_info.flg;
+   chtBuf[chtCur].ct  = reg_cmd_info.ct ;
+   chtBuf[chtCur].cmd = reg_cmd_info.cmd;
+   chtBuf[chtCur].ns = reg_cmd_info.ns;
+   chtBuf[chtCur].mc = reg_cmd_info.mc;
+   chtBuf[chtCur].fr1 = reg_cmd_info.fr1;
+   chtBuf[chtCur].dh1 = reg_cmd_info.dh1;
+   // starting CHS/LBA
+   chtBuf[chtCur].lbaSize = reg_cmd_info.lbaSize;
+   chtBuf[chtCur].cyl  = ( reg_cmd_info.ch1 << 8 ) | reg_cmd_info.cl1;
+   chtBuf[chtCur].head = reg_cmd_info.dh1 & 0x0f;
+   chtBuf[chtCur].sect = reg_cmd_info.sn1;
+   chtBuf[chtCur].lbaLow1 = reg_cmd_info.lbaLow1;
+   // ending status and driver error codes
+   chtBuf[chtCur].st2 = reg_cmd_info.st2;
+   chtBuf[chtCur].er2 = reg_cmd_info.er2;
+   chtBuf[chtCur].ec  = reg_cmd_info.ec ;
+   chtBuf[chtCur].to  = reg_cmd_info.to ;
+   // ATAPI CDB size and CDB data
+   chtBuf[chtCur].cdbSize = reg_atapi_cp_size;
+   for ( ndx = 0; ndx < reg_atapi_cp_size; ndx ++ )
+      chtBuf[chtCur].cdbBuf[ndx] = reg_atapi_cp_data[ndx];
+   // move to next entry
+   chtCur ++ ;
+   if ( chtCur >= MAX_CHT )
+      chtCur = 0;
+}
+
+//**************************************************************
+
+// clear the command history trace buffer
+
+void trc_cht_dump0( void )
+
+{
+
+   for ( chtCur = 0; chtCur < MAX_CHT; chtCur ++ )
+      chtBuf[chtCur].flg = TRC_FLAG_EMPTY;
+   chtCur = 0;
+}
+
+//**************************************************************
+
+// start a dump of the command history trace buffer
+
+void trc_cht_dump1( void )
+
+{
+
+   chtDmpLine = 1;
+   chtDmpNdx = chtCur + 1;
+   if ( chtDmpNdx >= MAX_CHT )
+      chtDmpNdx = 0;
+}
+
+//**************************************************************
+
+// return one line of the command history trace buffer,
+// returns NULL at end.
+//
+// lines are formated in the style of ATADEMO commands.
+// there are three ATADEMO commands per line (DEV, LBAx,
+// and the I/O command). The three values at the end of the
+// line (following the //) are the driver result error code,
+// driver timeout flag, status register and error register.
+
+static char esStr[24];
+static char atStr[24];
+static char saStr[24];
+static char mcStr[24];
+
+char * trc_cht_dump2( void )
+
+{
+
+   if ( chtDmpLine == 1 )     // 1st line is 1st heading line
+   {
+      strcpy( trcDmpBuf,
+        //0        1         2         3         4         5         6         7
+        //123456789012345678901234567890123456789012345678901234567890123456789012
+        //DEV n, LBAnn, ttttt xxH xxxxH nnnnn nnnnnnnnn    nnn ; nn nn xxH xxH
+         "Dev n, LBAnn, Type- Cmd FR--- SC--- LBA--------- MC- ; EC TO ST- ER-" );
+      chtDmpLine = 2;
+      return trcDmpBuf;
+   }
+   if ( chtDmpLine == 2 )     // 2nd line is 2nd heading line
+   {
+      strcpy( trcDmpBuf,
+        //0        1         2         3         4         5         6         7
+        //123456789012345678901234567890123456789012345678901234567890123456789012
+        //DEV n, CHS,   ttttt xxH xxxxH nnnnn ccccc hh sss nnn ; nn nn xxH xxH
+         "Dev n, CHS,   Type- Cmd FR--- SC--- Cyl-- Hd Sec MC- ; EC TO ST- ER-" );
+      chtDmpLine = 3;
+      return trcDmpBuf;
+   }
+   // search for oldest entry
+   while ( 1 )
+   {
+      if ( chtDmpNdx == chtCur )
+         return 0;
+      if ( chtBuf[chtDmpNdx].flg != TRC_FLAG_EMPTY )
+         break;
+      chtDmpNdx ++ ;
+      if ( chtDmpNdx >= MAX_CHT )
+         chtDmpNdx = 0;
+   }
+   // return one trace table entry...
+   // first format the result data
+   sprintf( esStr, " ; %2d %2d %02XH %02XH",
+                   chtBuf[chtDmpNdx].ec,
+                   chtBuf[chtDmpNdx].to,
+                   chtBuf[chtDmpNdx].st2,
+                   chtBuf[chtDmpNdx].er2 );
+   if ( chtBuf[chtDmpNdx].flg == TRC_FLAG_SRST )
+   {
+      // TRC_TYPE_ASR -> DEV n, LBAnn, RESET ; nn nn xxH xxH
+
+      //0        1         2         3         4         5         6         7
+      //123456789012345678901234567890123456789012345678901234567890123456789012
+      //DEV n, LBAnn, RESET                                  ; nn nn xxH xxH
+
+      sprintf( trcDmpBuf,
+         "DEV %d, LBA28, RESET                                 ",
+            ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0 );
+      strcat( trcDmpBuf, esStr );
+   }
+   else
+   if ( chtBuf[chtDmpNdx].flg == TRC_FLAG_ATA )
+   {
+      // TRC_TYPE_ADMAI -> DEV n, LBAnn, DR      xxH sc lba    ; nn nn xxH xxH
+      // TRC_TYPE_ADMAO -> DEV n, LBAnn, DW      xxH sc lba    ; nn nn xxH xxH
+      // TRC_TYPE_AND   -> DEV n, LBAnn, ND  xxH xxH sc lba    ; nn nn xxH xxH
+      // TRC_TYPE_APDI  -> DEV n, LBAnn, PDI xxH xxH sc lba mc ; nn nn xxH xxH
+      // TRC_TYPE_APDO  -> DEV n, LBAnn, PDO xxH xxH sc lba mc ; nn nn xxH xxH
+
+      // format the LBAxx/CHS and starting LBA/CHS
+      if ( chtBuf[chtDmpNdx].lbaSize == 48 )
+      {
+         strcpy( atStr, "LBA48," );
+         sprintf( saStr, " %12ld", chtBuf[chtDmpNdx].lbaLow1 );
+      }
+      else
+      if ( chtBuf[chtDmpNdx].lbaSize == 28 )
+      {
+         strcpy( atStr, "LBA28," );
+         sprintf( saStr, " %12ld", chtBuf[chtDmpNdx].lbaLow1 );
+      }
+      else
+      {
+         strcpy( atStr, "CHS,  " );
+         sprintf( saStr, " %5u %2u %3u",
+                  chtBuf[chtDmpNdx].cyl,
+                  chtBuf[chtDmpNdx].head,
+                  chtBuf[chtDmpNdx].sect );
+      }
+
+      // format the MC
+      if (    ( chtBuf[chtDmpNdx].cmd == CMD_READ_MULTIPLE )
+           || ( chtBuf[chtDmpNdx].cmd == CMD_READ_MULTIPLE_EXT )
+           || ( chtBuf[chtDmpNdx].cmd == CMD_WRITE_MULTIPLE )
+           || ( chtBuf[chtDmpNdx].cmd == CMD_WRITE_MULTIPLE_EXT )
+           || ( chtBuf[chtDmpNdx].cmd == CMD_WRITE_MULTIPLE_FUA_EXT )
+           || ( chtBuf[chtDmpNdx].cmd == CMD_CFA_WRITE_MULTIPLE_WO_ERASE )
+         )
+         sprintf( mcStr, " %3d", chtBuf[chtDmpNdx].mc );
+      else
+         strcpy( mcStr, "    " );
+
+        //0        1         2         3         4         5         6         7
+        //123456789012345678901234567890123456789012345678901234567890123456789012
+        //DEV n, LBAnn, ttttt xxH xxxxH nnnnn nnnnnnnnn    nnn ; nn nn xxH xxH
+        //DEV n, CHS,   ttttt xxH xxxxH nnnnn ccccc hh sss nnn ; nn nn xxH xxH
+
+      sprintf( trcDmpBuf,
+         "DEV %d, %s %s %02XH %4XH %5u",
+            ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0,
+            atStr,
+            chtTypeName[chtBuf[chtDmpNdx].ct],
+            chtBuf[chtDmpNdx].cmd,
+            chtBuf[chtDmpNdx].fr1,
+            chtBuf[chtDmpNdx].ns );
+      strcat( trcDmpBuf, saStr );
+      strcat( trcDmpBuf, mcStr );
+      strcat( trcDmpBuf, esStr );
+   }
+   else
+   if ( chtBuf[chtDmpNdx].flg == TRC_FLAG_ATAPI )
+   {
+      // TRC_TYPE_PDMAI -> not used by ATACT
+      // TRC_TYPE_PDMAO -> not used by ATACT
+      // TRC_TYPE_PND   -> DEV n, PN bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
+      // TRC_TYPE_PPDI  -> DEV n, PR bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
+      // TRC_TYPE_PPDO  -> DEV n, PW bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
+
+      if ( chtBuf[chtDmpNdx].cdbSize == 12 )
+      {
+         //DEV n, t n x x x x x x x x x x x x ; nn nn xxH xxH
+         sprintf( trcDmpBuf,
+            "DEV %d, %3.3s %u %02XH %d %d %d %d %d %d %d %d %d %d %d",
+               ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0,
+               chtTypeName[chtBuf[chtDmpNdx].ct],
+               chtBuf[chtDmpNdx].cyl,
+               chtBuf[chtDmpNdx].cdbBuf[0], chtBuf[chtDmpNdx].cdbBuf[1],
+               chtBuf[chtDmpNdx].cdbBuf[2], chtBuf[chtDmpNdx].cdbBuf[3],
+               chtBuf[chtDmpNdx].cdbBuf[4], chtBuf[chtDmpNdx].cdbBuf[5],
+               chtBuf[chtDmpNdx].cdbBuf[6], chtBuf[chtDmpNdx].cdbBuf[7],
+               chtBuf[chtDmpNdx].cdbBuf[8], chtBuf[chtDmpNdx].cdbBuf[9],
+               chtBuf[chtDmpNdx].cdbBuf[10], chtBuf[chtDmpNdx].cdbBuf[11] );
+         strcat( trcDmpBuf, esStr );
+      }
+      else
+      {
+         //DEV n, tt n x x x x x x x x x x x x x x x x ; nn nn xxH xxH
+         sprintf( trcDmpBuf,
+            "DEV %d, %3.3s %u %02XH %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
+               ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0,
+               chtTypeName[chtBuf[chtDmpNdx].ct],
+               chtBuf[chtDmpNdx].cyl,
+               chtBuf[chtDmpNdx].cdbBuf[0], chtBuf[chtDmpNdx].cdbBuf[1],
+               chtBuf[chtDmpNdx].cdbBuf[2], chtBuf[chtDmpNdx].cdbBuf[3],
+               chtBuf[chtDmpNdx].cdbBuf[4], chtBuf[chtDmpNdx].cdbBuf[5],
+               chtBuf[chtDmpNdx].cdbBuf[6], chtBuf[chtDmpNdx].cdbBuf[7],
+               chtBuf[chtDmpNdx].cdbBuf[8], chtBuf[chtDmpNdx].cdbBuf[9],
+               chtBuf[chtDmpNdx].cdbBuf[10], chtBuf[chtDmpNdx].cdbBuf[11],
+               chtBuf[chtDmpNdx].cdbBuf[12], chtBuf[chtDmpNdx].cdbBuf[13],
+               chtBuf[chtDmpNdx].cdbBuf[14], chtBuf[chtDmpNdx].cdbBuf[15] );
+         strcat( trcDmpBuf, esStr );
+      }
+   }
+   chtDmpNdx ++ ;
+   if ( chtDmpNdx >= MAX_CHT )
+      chtDmpNdx = 0;
+   return trcDmpBuf;
+}
+
+//**********************************************************
+
+// Low-level trace buffer
+
+#define MAX_LLT 500
+
+static struct
+{
+   unsigned char addr;
+   unsigned char data;
+   unsigned char type;
+   unsigned char rep;
+} lltBuf[MAX_LLT];
+
+static int lltCur = 0;
+static int lltDmpLine = 0;
+static int lltDmpNdx = 0;
+
+static struct
+{
+   unsigned char typeId;      // trace entry type
+   char * typeNm;    // trace entry name
+} type_nm[]
+   =
+   {
+                 //0        1         2         3         4
+                 //12345678901234567890123456789012345678901
+                 //<rep> <opr> <--register---> <data - note>
+      TRC_LLT_INB     , "INB   " ,
+      TRC_LLT_OUTB    , "OUTB  " ,
+      TRC_LLT_INW     , "INW   " ,
+      TRC_LLT_OUTW    , "OUTW  " ,
+      TRC_LLT_INSB    , "INSB  " ,
+      TRC_LLT_OUTSB   , "OUTSB " ,
+      TRC_LLT_INSW    , "INSW  " ,
+      TRC_LLT_OUTSW   , "OUTSW " ,
+      TRC_LLT_INSD    , "INSD  " ,
+      TRC_LLT_OUTSD   , "OUTSD " ,
+
+      TRC_LLT_S_CFG   , "===== Start Dev Cnfg  ",
+      TRC_LLT_S_RST   , "===== Start Reset     ",
+      TRC_LLT_S_ND    , "===== Start ND cmd    ",
+      TRC_LLT_S_PDI   , "===== Start PDI cmd   ",
+      TRC_LLT_S_PDO   , "===== Start PDO cmd   ",
+      TRC_LLT_S_PI    , "===== Start PI cmd    ",
+      TRC_LLT_S_RWD   , "===== Start R/W DMA   ",
+      TRC_LLT_S_PID   , "===== Start PI DMA    ",
+      TRC_LLT_WINT    , "..... Wait for INTRQ  ",
+      TRC_LLT_INTRQ   , "..... I N T R Q       ",
+      TRC_LLT_PNBSY   , "..... Poll for BSY=0  ",
+      TRC_LLT_PRDY    , "..... Poll for DRDY=1 ",
+      TRC_LLT_TOUT    , "..... T I M E O U T   ",
+      TRC_LLT_ERROR   , "..... E R R O R       ",
+      TRC_LLT_DELAY1  , "..... DELAY ~80ms     ",
+      TRC_LLT_DELAY2  , "..... DELAY ~0-55ms   ",
+      TRC_LLT_E_CFG   , "===== End Dev Cnfg    ",
+      TRC_LLT_E_RST   , "===== End Reset       ",
+      TRC_LLT_E_ND    , "===== End ND cmd      ",
+      TRC_LLT_E_PDI   , "===== End PDI cmd     ",
+      TRC_LLT_E_PDO   , "===== End PDO cmd     ",
+      TRC_LLT_E_PI    , "===== End PI cmd      ",
+      TRC_LLT_E_RWD   , "===== End R/W DMA     ",
+      TRC_LLT_E_PID   , "===== End PI DMA      ",
+
+      TRC_LLT_DMA1    , "..... Enable DMA Ch   ",
+      TRC_LLT_DMA2    , "..... Poll DMA TC bit ",
+      TRC_LLT_DMA3    , "..... Disable DMA Ch  ",
+
+      TRC_LLT_DEBUG   , "..... DEBUG           ",
+      TRC_LLT_P_CMD   , "..... ATAPI Cmd Code  ",
+      TRC_LLT_R_BM_CR , "..... Rd BM Cmd Reg   ",
+      TRC_LLT_R_BM_SR , "..... Rd BM Stat Reg  ",
+      TRC_LLT_W_BM_CR , "..... Wr BM Cmd Reg   ",
+      TRC_LLT_W_BM_SR , "..... Wr BM Stat Reg  ",
+      0               , "????? " ,
+   } ;
+
+static char * reg_nm[]  // register names for trace
+   =
+   {
+      //0        1         2         3         4
+      //12345678901234567890123456789012345678901
+      //<rep> <opr> <--register---> <data - note>
+                   "Data            " , // 0 data reg
+                   "Error/Feature   " , // 1 error & feature
+                   "SectorCount     " , // 2 sector count
+                   "SectorNumber    " , // 3 sector number
+                   "CylinderLow     " , // 4 cylinder low
+                   "CylinderHigh    " , // 5 cylinder high
+                   "DeviceHead      " , // 6 device head
+                   "Status/Cmd      " , // 7 primary status & command
+                   "AltStat/DevCtrl " , // 8 alternate status & device control
+                   "DevAddr         " , // 9 device address
+   } ;
+
+//*********************************************************
+
+// place an entry into the low level trace buffer
+
+void trc_llt( unsigned char addr,
+              unsigned char data,
+              unsigned char type )
+
+{
+
+   // if same as previous, incr rep count and return
+   if ( ( addr == lltBuf[lltCur].addr )
+        &&
+        ( data == lltBuf[lltCur].data )
+        &&
+        ( type == lltBuf[lltCur].type )
+      )
+   {
+      lltBuf[lltCur].rep = ( lltBuf[lltCur].rep >= 255L )
+                           ? 255 : lltBuf[lltCur].rep + 1;
+      return;
+   }
+   // incr buffer index
+   lltCur ++ ;
+   if ( lltCur >= MAX_LLT )
+      lltCur = 0;
+   // start new entry
+   lltBuf[lltCur].addr = addr;
+   lltBuf[lltCur].data = data;
+   lltBuf[lltCur].type = type;
+   lltBuf[lltCur].rep = 1;
+}
+
+//**************************************************************
+
+// clear the low level trace buffer
+
+void trc_llt_dump0( void )
+
+{
+
+   for ( lltCur = 0; lltCur < MAX_LLT; lltCur ++ )
+   {
+      lltBuf[lltCur].type = TRC_LLT_NONE;
+   }
+   lltCur = 0;
+}
+
+//**************************************************************
+
+// start a dump of the low level trace buffer
+
+void trc_llt_dump1( void )
+
+{
+
+   // complete most recent trace entry
+   trc_llt( 0, 0, TRC_LLT_NONE );
+   // setup to return trace data
+   lltDmpLine = 0;
+   lltDmpNdx = lltCur + 1;
+   if ( lltDmpNdx >= MAX_LLT )
+      lltDmpNdx = 0;
+}
+
+//**************************************************************
+
+// return one line of the low level trace,
+// returns NULL at end.
+
+char * trc_llt_dump2( void )
+
+{
+   int ndx;
+
+   // increment output line number
+   lltDmpLine ++ ;
+
+   // return 1st line - the heading
+   if ( lltDmpLine == 1 )     // 1st line is heading
+   {
+                        //0        1         2         3         4
+                        //12345678901234567890123456789012345678901
+      strcpy( trcDmpBuf, "<rep> <opr> <--register---> <data - note>" );
+      return trcDmpBuf;
+   }
+
+   // find next non-zero trace entry
+   while ( 1 )
+   {
+      if ( lltDmpNdx == lltCur )
+         return 0;
+      if ( lltBuf[lltDmpNdx].type != 0 )
+         break;
+      lltDmpNdx ++ ;
+      if ( lltDmpNdx >= MAX_LLT )
+         lltDmpNdx = 0;
+   }
+
+   // put repeat count into buffer
+   if ( lltBuf[lltDmpNdx].rep == 255 )
+      strcpy( prtBuf, ">=255 " );
+   else
+      sprintf( prtBuf, "%5u ", lltBuf[lltDmpNdx].rep );
+   strcpy( trcDmpBuf, prtBuf );
+
+   // lookup trace entry type, put into buffer
+   ndx = 0;
+   while ( type_nm[ndx].typeId )
+   {
+      if ( lltBuf[lltDmpNdx].type == type_nm[ndx].typeId )
+         break;
+      ndx ++ ;
+   }
+   strcat( trcDmpBuf, type_nm[ ndx ].typeNm );
+
+   // register write/read or something else
+   if ( lltBuf[lltDmpNdx].type < TRC_LLT_S_CFG )
+   {
+      // reg name and value
+      strcat( trcDmpBuf, reg_nm[ lltBuf[lltDmpNdx].addr ] );
+      if ( lltBuf[lltDmpNdx].addr == CB_DATA )
+         strcpy( prtBuf, "-- " );
+      else
+         sprintf( prtBuf, "%02X ", lltBuf[lltDmpNdx].data );
+      strcat( trcDmpBuf, prtBuf );
+      // write to Dev Ctrl
+      if (    ( lltBuf[lltDmpNdx].addr == CB_DC )
+           && ( lltBuf[lltDmpNdx].type == TRC_LLT_OUTB )
+         )
+      {
+         if ( lltBuf[lltDmpNdx].data & CB_DC_SRST )
+         {
+            strcat( trcDmpBuf, "START: " );
+            strcat( trcDmpBuf, (char *)trc_get_cmd_name( CMD_SRST ) );
+            strcat( trcDmpBuf, ", " );
+         }
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & CB_DC_HOB )
+                       ? "HOB=1" : "HOB=0" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & CB_DC_SRST )
+                       ? " SRST=1" : " SRST=0" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & CB_DC_NIEN )
+                       ? " nIEN=1" : " nIEN=0" );
+      }
+      // write to Command reg
+      if (    ( lltBuf[lltDmpNdx].addr == CB_CMD )
+           && ( lltBuf[lltDmpNdx].type == TRC_LLT_OUTB )
+         )
+      {
+         strcat( trcDmpBuf, "START: " );
+         strcat( trcDmpBuf, (char *)trc_get_cmd_name( lltBuf[lltDmpNdx].data ) );
+      }
+      // write to Device/Head
+      if (    ( lltBuf[lltDmpNdx].addr == CB_DH )
+           && ( lltBuf[lltDmpNdx].type == TRC_LLT_OUTB )
+         )
+      {
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x10 )
+                       ? "DEV=1" : "DEV=0" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x40 )
+                       ? " LBA=1" : " LBA=0" );
+      }
+      // read of Status or Alt Status
+      if (    (    ( lltBuf[lltDmpNdx].addr == CB_STAT )
+                || ( lltBuf[lltDmpNdx].addr == CB_ASTAT )
+              )
+           && ( lltBuf[lltDmpNdx].type == TRC_LLT_INB )
+         )
+         strcat( trcDmpBuf, (char *)trc_get_st_bit_name( lltBuf[lltDmpNdx].data ) );
+      // read of Error
+      if (    ( lltBuf[lltDmpNdx].addr == CB_ERR )
+           && ( lltBuf[lltDmpNdx].type == TRC_LLT_INB )
+         )
+         strcat( trcDmpBuf, (char *)trc_get_er_bit_name( lltBuf[lltDmpNdx].data ) );
+   }
+   else
+   // start/end/debug/etc entry or something else
+   if ( lltBuf[lltDmpNdx].type >= TRC_LLT_DEBUG )
+   {
+      sprintf( prtBuf, "%02X ", lltBuf[lltDmpNdx].data );
+      strcat( trcDmpBuf, prtBuf );
+      // write/read of BMIDE Command reg
+      if (    ( lltBuf[lltDmpNdx].type == TRC_LLT_R_BM_CR )
+           || ( lltBuf[lltDmpNdx].type == TRC_LLT_W_BM_CR )
+         )
+      {
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x08 )
+                       ? " Dir=1(MemWr)" : " Dir=0(MemRd)" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x01 )
+                       ? " Go=1(Start)" : " Go=0(Stop)" );
+      }
+      // write/read of BMIDE Status reg
+      if (    ( lltBuf[lltDmpNdx].type == TRC_LLT_R_BM_SR )
+           || ( lltBuf[lltDmpNdx].type == TRC_LLT_W_BM_SR )
+         )
+      {
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x40 )
+                       ? " D1=1" : " D1=0" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x20 )
+                       ? " D0=1" : " D0=0" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x04 )
+                       ? " Int=1" : " Int=0" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x02 )
+                       ? " Err=1" : " Err=0" );
+         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x01 )
+                       ? " Act=1" : " Act=0" );
+      }
+   }
+   else
+   // driver error
+   if ( lltBuf[lltDmpNdx].type == TRC_LLT_ERROR )
+   {
+      sprintf( prtBuf, "%02X ", lltBuf[lltDmpNdx].data );
+      strcat( trcDmpBuf, prtBuf );
+      strcat( trcDmpBuf, (char *)trc_get_err_name( lltBuf[lltDmpNdx].data ) );
+   }
+
+   // increment to next trace entry
+   lltDmpNdx ++ ;
+   if ( lltDmpNdx >= MAX_LLT )
+      lltDmpNdx = 0;
+
+   // return trace entry string
+   return trcDmpBuf;
+}
+
+// end ataiotrc.c
diff --git a/haribote/ata/DOSFUNC.C b/haribote/ata/DOSFUNC.C
new file mode 100644 (file)
index 0000000..beedc50
--- /dev/null
@@ -0,0 +1,38 @@
+#include "ataio.h"
+
+
+char inportb(unsigned int port){
+       // read a byte from a port
+       unsigned char ret;
+       asm volatile ("in al,dx":"=a"(ret):"d"(port));
+       return ret;
+}
+
+void outportb(unsigned int port,unsigned char value) {
+       // write a byte to a port
+       asm volatile ("out dx, al": :"d"(port),"a"(value));
+}
+
+WORD inportw(unsigned int port){
+       // read a byte from a port
+       WORD ret;
+       asm volatile ("in ax,dx":"=a"(ret):"d"(port));
+       return ret;
+}
+void outportw(unsigned int port,WORD value) {
+       // write a byte to a port
+       asm volatile ("out dx, ax": :"d"(port),"a"(value));
+}
+void enable(){
+       asm volatile("sti");
+}
+void disable(){
+       asm volatile("cli");
+}
+void setvect(int no, inthdlr_t func){
+       asm volatile("int 0x03");//not implemented
+}
+inthdlr_t getvect(int no){
+       asm volatile("int 0x03");//not implemented
+}
+
diff --git a/haribote/ata/Makefile b/haribote/ata/Makefile
new file mode 100644 (file)
index 0000000..0d4b6e0
--- /dev/null
@@ -0,0 +1,15 @@
+LINK = ar rv
+CC   = gcc -c -masm=intel -funsigned-char -traditional -Wno-write-strings -I../../include -I.
+OBJS = ATAIOINT.OBJ ATAIOPIO.OBJ ATAIOREG.OBJ ATAIOSUB.OBJ ATAIOTMR.OBJ ATAIOTRC.OBJ DOSFUNC.OBJ
+
+default:
+       make ataio.lib
+
+ataio.lib : $(OBJS) Makefile
+       $(LINK) ataio.lib $(OBJS) 
+
+%.OBJ : %.C Makefile
+       $(CC) $*.C -o $*.OBJ
+
+clean : 
+       -rm $(OBJS)
\ No newline at end of file
diff --git a/haribote/ata/TEST.C b/haribote/ata/TEST.C
new file mode 100644 (file)
index 0000000..171eba9
--- /dev/null
@@ -0,0 +1,4 @@
+#include "ataio.h"
+
+int main(){
+}
\ No newline at end of file
diff --git a/haribote/ata/ataio.lib b/haribote/ata/ataio.lib
new file mode 100644 (file)
index 0000000..bf82391
Binary files /dev/null and b/haribote/ata/ataio.lib differ
diff --git a/haribote/ata/dos.h b/haribote/ata/dos.h
new file mode 100644 (file)
index 0000000..ad24ddd
--- /dev/null
@@ -0,0 +1,24 @@
+#pragma once
+
+#define MK_FP(seg, addr) (char *)(((seg) << 4) | (addr))
+#define far 
+#define interrupt
+char inportb(unsigned int port);
+void outportb(unsigned int port,unsigned char value);
+typedef unsigned short WORD;
+WORD inportw(unsigned int port);
+void outportw(unsigned int port,WORD value);
+
+typedef void interrupt far (*inthdlr_t)( void );
+void enable();
+void disable();
+void setvect(int no, inthdlr_t func);
+inthdlr_t getvect(int no);
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+void debugprint(const char *format,...);
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
\ No newline at end of file
diff --git a/haribote/bootpack.cpp b/haribote/bootpack.cpp
new file mode 100644 (file)
index 0000000..e56afea
--- /dev/null
@@ -0,0 +1,80 @@
+#include "bootpack.h"
+#include "filesystem.h"
+#include "typedefs.h"
+#include "screen.h"
+#include "timer.h"
+#include "desctable.h"
+#include "ata/ataio.h"
+#include "pic.h"
+#include "naskfunc.h"
+#include "MemMan.h"
+#include "debug.h"
+#include "ProcessMan.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+BOOTINFO *binfo = (BOOTINFO *)ADR_BOOTINFO;
+
+extern "C" int __cdecl _main(int p1){
+       Screen::Init(binfo);
+       init_gdtidt();
+
+       init_pit();
+       init_pic();
+       
+       io_sti();
+
+       io_out8(PIC0_IMR, 0xfa); /* PIT\82ÆPIC1\82ð\8b\96\89Â(11111010) */
+       io_out8(PIC1_IMR, 0xff); /* \91S\95\94\96³\8e\8b(11111111) */
+
+       FileSystem::Init(binfo);
+
+       MemMan::Init();
+       ProcessMan::Init();
+       ThreadMan::Init();
+
+       BITMAPFILEHEADER fileheader;
+       BITMAPINFOHEADER infoheader;
+
+       /*
+       FileSystem::File *file = FileSystem::Inst().CreateFile(L"c:\\curtain_.bmp", 0, 0, 0, 0, 0, 0);
+       debugprint("file:%p\n", file);
+
+       file->Read((BYTE *)&fileheader, sizeof(fileheader));
+
+       file->Read((BYTE *)&infoheader, sizeof(infoheader));
+       //debugprint("%X %X %X\n", fileheader.bfType, fileheader.bfSize, fileheader.bfOffBits);
+
+       //for(;;){__asm ("hlt");}
+
+       file->Seek(fileheader.bfOffBits, FileSystem::File::SEEK_ORG::SET);
+
+       int stride = (infoheader.biWidth * 3 + 3) / 4 * 4;
+       BYTE *p = new BYTE [stride];
+       //debugprint("%d %d\n", infoheader.biHeight,infoheader.biWidth );
+       for(int i = 0; i < infoheader.biHeight; i++){
+               file->Read(p, stride);
+
+               for(int j = 0; j < infoheader.biWidth; j++){
+                       //binfo->vram[((infoheader.biHeight - i - 1) * binfo->screenx + j) * 3 + 0] = p[j * 3 + 0];
+                       //binfo->vram[((infoheader.biHeight - i - 1) * binfo->screenx + j) * 3 + 1] = p[j * 3 + 1];
+                       //binfo->vram[((infoheader.biHeight - i - 1) * binfo->screenx + j) * 3 + 2] = p[j * 3 + 2];
+               }
+       }
+       delete [] p;
+       delete file;
+       */
+       ProcessMan::Inst().CreateProcess(L"c:\\ostestapp.exe");
+
+       int t = 0;
+       for(;;){
+               for(volatile int i = 0; i < 0x10000; i++){
+                       volatile int x = i * i;
+               }
+               //Screen::Inst().printf("%d", t++);
+               __asm ("hlt");
+       }
+       return 0;
+}
diff --git a/haribote/bootpack.exe b/haribote/bootpack.exe
new file mode 100644 (file)
index 0000000..e9c321a
Binary files /dev/null and b/haribote/bootpack.exe differ
diff --git a/haribote/bootpack.h b/haribote/bootpack.h
new file mode 100644 (file)
index 0000000..7a7ae68
--- /dev/null
@@ -0,0 +1,15 @@
+#pragma once
+#include "typedefs.h"
+#pragma pack(push, 1)
+struct BOOTINFO { /* 0x0ff0-0x0fff */
+       BYTE bootdrive; // \83u\81[\83g\82µ\82½\83h\83\89\83C\83u\82Ì\94Ô\8d\86
+       BYTE leds; /* \83u\81[\83g\8e\9e\82Ì\83L\81[\83{\81[\83h\82ÌLED\82Ì\8fó\91Ô */
+       BYTE vmode; /* \83r\83f\83I\83\82\81[\83h  \89½\83r\83b\83g\83J\83\89\81[\82© */
+       BYTE reserve;
+       WORD screenx, screeny; /* \89æ\96Ê\89ð\91\9c\93x */
+       BYTE *vram;
+};
+#pragma pack(pop)
+#define ADR_BOOTINFO   0x00000ff0
+#define ADR_DISKIMG            0x00100000
+
diff --git a/haribote/bootpack.sln b/haribote/bootpack.sln
new file mode 100644 (file)
index 0000000..0095f5a
--- /dev/null
@@ -0,0 +1,32 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bootpack", "bootpack.vcxproj", "{A7009D9C-120D-51E5-3BEE-E001572DFC7E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fatmgr", "..\fatmgr\fatmgr.vcxproj", "{84F34813-8B38-4C65-9B9D-CA81FCD18521}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ntdll", "..\ntdll\ntdll.vcxproj", "{5C782ED0-884E-41DC-8E9D-BD3E13972D38}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Win32 = Debug|Win32
+               Release|Win32 = Release|Win32
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {A7009D9C-120D-51E5-3BEE-E001572DFC7E}.Debug|Win32.ActiveCfg = Debug|Win32
+               {A7009D9C-120D-51E5-3BEE-E001572DFC7E}.Debug|Win32.Build.0 = Debug|Win32
+               {A7009D9C-120D-51E5-3BEE-E001572DFC7E}.Release|Win32.ActiveCfg = Release|Win32
+               {A7009D9C-120D-51E5-3BEE-E001572DFC7E}.Release|Win32.Build.0 = Release|Win32
+               {84F34813-8B38-4C65-9B9D-CA81FCD18521}.Debug|Win32.ActiveCfg = Debug|Win32
+               {84F34813-8B38-4C65-9B9D-CA81FCD18521}.Debug|Win32.Build.0 = Debug|Win32
+               {84F34813-8B38-4C65-9B9D-CA81FCD18521}.Release|Win32.ActiveCfg = Release|Win32
+               {84F34813-8B38-4C65-9B9D-CA81FCD18521}.Release|Win32.Build.0 = Release|Win32
+               {5C782ED0-884E-41DC-8E9D-BD3E13972D38}.Debug|Win32.ActiveCfg = Debug|Win32
+               {5C782ED0-884E-41DC-8E9D-BD3E13972D38}.Debug|Win32.Build.0 = Debug|Win32
+               {5C782ED0-884E-41DC-8E9D-BD3E13972D38}.Release|Win32.ActiveCfg = Release|Win32
+               {5C782ED0-884E-41DC-8E9D-BD3E13972D38}.Release|Win32.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/haribote/bootpack.suo b/haribote/bootpack.suo
new file mode 100644 (file)
index 0000000..a754aa5
Binary files /dev/null and b/haribote/bootpack.suo differ
diff --git a/haribote/bootpack.sys b/haribote/bootpack.sys
new file mode 100644 (file)
index 0000000..f902ec0
Binary files /dev/null and b/haribote/bootpack.sys differ
diff --git a/haribote/bootpack.vcxproj b/haribote/bootpack.vcxproj
new file mode 100644 (file)
index 0000000..3987f5a
--- /dev/null
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <Keyword>MakeFileProj</Keyword>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Makefile</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Makefile</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <NMakeBuildCommandLine>cd .. &amp;&amp; make</NMakeBuildCommandLine>
+    <NMakeCleanCommandLine>make clean</NMakeCleanCommandLine>
+    <NMakeReBuildCommandLine>make </NMakeReBuildCommandLine>
+    <NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+    <NMakeIncludeSearchPath>../include;$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <NMakeBuildCommandLine>make</NMakeBuildCommandLine>
+    <NMakeCleanCommandLine>make clean</NMakeCleanCommandLine>
+    <NMakeReBuildCommandLine>make all</NMakeReBuildCommandLine>
+    <NMakePreprocessorDefinitions>WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+    <NMakeIncludeSearchPath>../include;$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+  </PropertyGroup>
+  <ItemDefinitionGroup>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="bootpack.cpp" />
+    <ClCompile Include="debug.cpp" />
+    <ClCompile Include="desctable.cpp" />
+    <ClCompile Include="filesystem.cpp" />
+    <ClCompile Include="MemMan.cpp" />
+    <ClCompile Include="pic.cpp" />
+    <ClCompile Include="ProcessMan.cpp" />
+    <ClCompile Include="screen.cpp" />
+    <ClCompile Include="startup.cpp" />
+    <ClCompile Include="ProcessMem.cpp" />
+    <ClCompile Include="ThreadMan.cpp" />
+    <ClCompile Include="timer.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="bootpack.h" />
+    <ClInclude Include="debug.h" />
+    <ClInclude Include="desctable.h" />
+    <ClInclude Include="fat32.h" />
+    <ClInclude Include="filesystem.h" />
+    <ClInclude Include="hankaku.h" />
+    <ClInclude Include="MemMan.h" />
+    <ClInclude Include="naskfunc.h" />
+    <ClInclude Include="pic.h" />
+    <ClInclude Include="ProcessMan.h" />
+    <ClInclude Include="screen.h" />
+    <ClInclude Include="ProcessMem.h" />
+    <ClInclude Include="ThreadMan.h" />
+    <ClInclude Include="timer.h" />
+    <ClInclude Include="typedefs.h" />
+    <ClInclude Include="Vector.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="asmhead.asm" />
+    <None Include="naskfunc.asm" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/haribote/c.bin b/haribote/c.bin
new file mode 100644 (file)
index 0000000..8ed0651
Binary files /dev/null and b/haribote/c.bin differ
diff --git a/haribote/c.gas b/haribote/c.gas
new file mode 100644 (file)
index 0000000..716963b
--- /dev/null
@@ -0,0 +1 @@
+       .byte 0
diff --git a/haribote/console.c b/haribote/console.c
new file mode 100644 (file)
index 0000000..e24191a
--- /dev/null
@@ -0,0 +1,706 @@
+/* \83R\83\93\83\\81[\83\8b\8aÖ\8cW */
+
+#include "bootpack.h"
+#include <stdio.h>
+#include <string.h>
+
+void console_task(struct SHEET *sheet, int memtotal)
+{
+       struct TASK *task = task_now();
+       struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
+       int i, *fat = (int *) memman_alloc_4k(memman, 4 * 2880);
+       struct CONSOLE cons;
+       struct FILEHANDLE fhandle[8];
+       char cmdline[30];
+       unsigned char *nihongo = (char *) *((int *) 0x0fe8);
+
+       cons.sht = sheet;
+       cons.cur_x =  8;
+       cons.cur_y = 28;
+       cons.cur_c = -1;
+       task->cons = &cons;
+       task->cmdline = cmdline;
+
+       if (cons.sht != 0) {
+               cons.timer = timer_alloc();
+               timer_init(cons.timer, &task->fifo, 1);
+               timer_settime(cons.timer, 50);
+       }
+       file_readfat(fat, (unsigned char *) (ADR_DISKIMG + 0x000200));
+       for (i = 0; i < 8; i++) {
+               fhandle[i].buf = 0;     /* \96¢\8eg\97p\83}\81[\83N */
+       }
+       task->fhandle = fhandle;
+       task->fat = fat;
+       if (nihongo[4096] != 0xff) {    /* \93ú\96{\8cê\83t\83H\83\93\83g\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82ß\82½\82©\81H */
+               task->langmode = 1;
+       } else {
+               task->langmode = 0;
+       }
+       task->langbyte1 = 0;
+
+       /* \83v\83\8d\83\93\83v\83g\95\\8e¦ */
+       cons_putchar(&cons, '>', 1);
+
+       for (;;) {
+               io_cli();
+               if (fifo32_status(&task->fifo) == 0) {
+                       task_sleep(task);
+                       io_sti();
+               } else {
+                       i = fifo32_get(&task->fifo);
+                       io_sti();
+                       if (i <= 1 && cons.sht != 0) { /* \83J\81[\83\\83\8b\97p\83^\83C\83} */
+                               if (i != 0) {
+                                       timer_init(cons.timer, &task->fifo, 0); /* \8e\9f\82Í0\82ð */
+                                       if (cons.cur_c >= 0) {
+                                               cons.cur_c = COL8_FFFFFF;
+                                       }
+                               } else {
+                                       timer_init(cons.timer, &task->fifo, 1); /* \8e\9f\82Í1\82ð */
+                                       if (cons.cur_c >= 0) {
+                                               cons.cur_c = COL8_000000;
+                                       }
+                               }
+                               timer_settime(cons.timer, 50);
+                       }
+                       if (i == 2) {   /* \83J\81[\83\\83\8bON */
+                               cons.cur_c = COL8_FFFFFF;
+                       }
+                       if (i == 3) {   /* \83J\81[\83\\83\8bOFF */
+                               if (cons.sht != 0) {
+                                       boxfill8(cons.sht->buf, cons.sht->bxsize, COL8_000000,
+                                               cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15);
+                               }
+                               cons.cur_c = -1;
+                       }
+                       if (i == 4) {   /* \83R\83\93\83\\81[\83\8b\82Ì\81u\81~\81v\83{\83^\83\93\83N\83\8a\83b\83N */
+                               cmd_exit(&cons, fat);
+                       }
+                       if (256 <= i && i <= 511) { /* \83L\81[\83{\81[\83h\83f\81[\83^\81i\83^\83X\83NA\8co\97R\81j */
+                               if (i == 8 + 256) {
+                                       /* \83o\83b\83N\83X\83y\81[\83X */
+                                       if (cons.cur_x > 16) {
+                                               /* \83J\81[\83\\83\8b\82ð\83X\83y\81[\83X\82Å\8fÁ\82µ\82Ä\82©\82ç\81A\83J\81[\83\\83\8b\82ð1\82Â\96ß\82· */
+                                               cons_putchar(&cons, ' ', 0);
+                                               cons.cur_x -= 8;
+                                       }
+                               } else if (i == 10 + 256) {
+                                       /* Enter */
+                                       /* \83J\81[\83\\83\8b\82ð\83X\83y\81[\83X\82Å\8fÁ\82µ\82Ä\82©\82ç\89ü\8ds\82·\82é */
+                                       cons_putchar(&cons, ' ', 0);
+                                       cmdline[cons.cur_x / 8 - 2] = 0;
+                                       cons_newline(&cons);
+                                       cons_runcmd(cmdline, &cons, fat, memtotal);     /* \83R\83}\83\93\83h\8eÀ\8ds */
+                                       if (cons.sht == 0) {
+                                               cmd_exit(&cons, fat);
+                                       }
+                                       /* \83v\83\8d\83\93\83v\83g\95\\8e¦ */
+                                       cons_putchar(&cons, '>', 1);
+                               } else {
+                                       /* \88ê\94Ê\95\8e\9a */
+                                       if (cons.cur_x < 240) {
+                                               /* \88ê\95\8e\9a\95\\8e¦\82µ\82Ä\82©\82ç\81A\83J\81[\83\\83\8b\82ð1\82Â\90i\82ß\82é */
+                                               cmdline[cons.cur_x / 8 - 2] = i - 256;
+                                               cons_putchar(&cons, i - 256, 1);
+                                       }
+                               }
+                       }
+                       /* \83J\81[\83\\83\8b\8dÄ\95\\8e¦ */
+                       if (cons.sht != 0) {
+                               if (cons.cur_c >= 0) {
+                                       boxfill8(cons.sht->buf, cons.sht->bxsize, cons.cur_c, 
+                                               cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15);
+                               }
+                               sheet_refresh(cons.sht, cons.cur_x, cons.cur_y, cons.cur_x + 8, cons.cur_y + 16);
+                       }
+               }
+       }
+}
+
+void cons_putchar(struct CONSOLE *cons, int chr, char move)
+{
+       char s[2];
+       s[0] = chr;
+       s[1] = 0;
+       if (s[0] == 0x09) {     /* \83^\83u */
+               for (;;) {
+                       if (cons->sht != 0) {
+                               putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, " ", 1);
+                       }
+                       cons->cur_x += 8;
+                       if (cons->cur_x == 8 + 240) {
+                               cons_newline(cons);
+                       }
+                       if (((cons->cur_x - 8) & 0x1f) == 0) {
+                               break;  /* 32\82Å\8a\84\82è\90Ø\82ê\82½\82çbreak */
+                       }
+               }
+       } else if (s[0] == 0x0a) {      /* \89ü\8ds */
+               cons_newline(cons);
+       } else if (s[0] == 0x0d) {      /* \95\9c\8bA */
+               /* \82Æ\82è\82 \82¦\82¸\82È\82É\82à\82µ\82È\82¢ */
+       } else {        /* \95\81\92Ê\82Ì\95\8e\9a */
+               if (cons->sht != 0) {
+                       putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, s, 1);
+               }
+               if (move != 0) {
+                       /* move\82ª0\82Ì\82Æ\82«\82Í\83J\81[\83\\83\8b\82ð\90i\82ß\82È\82¢ */
+                       cons->cur_x += 8;
+                       if (cons->cur_x == 8 + 240) {
+                               cons_newline(cons);
+                       }
+               }
+       }
+       return;
+}
+
+void cons_newline(struct CONSOLE *cons)
+{
+       int x, y;
+       struct SHEET *sheet = cons->sht;
+       struct TASK *task = task_now();
+       if (cons->cur_y < 28 + 112) {
+               cons->cur_y += 16; /* \8e\9f\82Ì\8ds\82Ö */
+       } else {
+               /* \83X\83N\83\8d\81[\83\8b */
+               if (sheet != 0) {
+                       for (y = 28; y < 28 + 112; y++) {
+                               for (x = 8; x < 8 + 240; x++) {
+                                       sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) * sheet->bxsize];
+                               }
+                       }
+                       for (y = 28 + 112; y < 28 + 128; y++) {
+                               for (x = 8; x < 8 + 240; x++) {
+                                       sheet->buf[x + y * sheet->bxsize] = COL8_000000;
+                               }
+                       }
+                       sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128);
+               }
+       }
+       cons->cur_x = 8;
+       if (task->langmode == 1 && task->langbyte1 != 0) {
+               cons->cur_x = 16;
+       }
+       return;
+}
+
+void cons_putstr0(struct CONSOLE *cons, char *s)
+{
+       for (; *s != 0; s++) {
+               cons_putchar(cons, *s, 1);
+       }
+       return;
+}
+
+void cons_putstr1(struct CONSOLE *cons, char *s, int l)
+{
+       int i;
+       for (i = 0; i < l; i++) {
+               cons_putchar(cons, s[i], 1);
+       }
+       return;
+}
+
+void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, int memtotal)
+{
+       if (strcmp(cmdline, "mem") == 0 && cons->sht != 0) {
+               cmd_mem(cons, memtotal);
+       } else if (strcmp(cmdline, "cls") == 0 && cons->sht != 0) {
+               cmd_cls(cons);
+       } else if (strcmp(cmdline, "dir") == 0 && cons->sht != 0) {
+               cmd_dir(cons);
+       } else if (strcmp(cmdline, "exit") == 0) {
+               cmd_exit(cons, fat);
+       } else if (strncmp(cmdline, "start ", 6) == 0) {
+               cmd_start(cons, cmdline, memtotal);
+       } else if (strncmp(cmdline, "ncst ", 5) == 0) {
+               cmd_ncst(cons, cmdline, memtotal);
+       } else if (strncmp(cmdline, "langmode ", 9) == 0) {
+               cmd_langmode(cons, cmdline);
+       } else if (cmdline[0] != 0) {
+               if (cmd_app(cons, fat, cmdline) == 0) {
+                       /* \83R\83}\83\93\83h\82Å\82Í\82È\82­\81A\83A\83v\83\8a\82Å\82à\82È\82­\81A\82³\82ç\82É\8bó\8ds\82Å\82à\82È\82¢ */
+                       cons_putstr0(cons, "Bad command.\n\n");
+               }
+       }
+       return;
+}
+
+void cmd_mem(struct CONSOLE *cons, int memtotal)
+{
+       struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
+       char s[60];
+       sprintf(s, "total   %dMB\nfree %dKB\n\n", memtotal / (1024 * 1024), memman_total(memman) / 1024);
+       cons_putstr0(cons, s);
+       return;
+}
+
+void cmd_cls(struct CONSOLE *cons)
+{
+       int x, y;
+       struct SHEET *sheet = cons->sht;
+       for (y = 28; y < 28 + 128; y++) {
+               for (x = 8; x < 8 + 240; x++) {
+                       sheet->buf[x + y * sheet->bxsize] = COL8_000000;
+               }
+       }
+       sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128);
+       cons->cur_y = 28;
+       return;
+}
+
+void cmd_dir(struct CONSOLE *cons)
+{
+       struct FILEINFO *finfo = (struct FILEINFO *) (ADR_DISKIMG + 0x002600);
+       int i, j;
+       char s[30];
+       for (i = 0; i < 224; i++) {
+               if (finfo[i].name[0] == 0x00) {
+                       break;
+               }
+               if (finfo[i].name[0] != 0xe5) {
+                       if ((finfo[i].type & 0x18) == 0) {
+                               sprintf(s, "filename.ext   %7d\n", finfo[i].size);
+                               for (j = 0; j < 8; j++) {
+                                       s[j] = finfo[i].name[j];
+                               }
+                               s[ 9] = finfo[i].ext[0];
+                               s[10] = finfo[i].ext[1];
+                               s[11] = finfo[i].ext[2];
+                               cons_putstr0(cons, s);
+                       }
+               }
+       }
+       cons_newline(cons);
+       return;
+}
+
+void cmd_exit(struct CONSOLE *cons, int *fat)
+{
+       struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
+       struct TASK *task = task_now();
+       struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4);
+       struct FIFO32 *fifo = (struct FIFO32 *) *((int *) 0x0fec);
+       if (cons->sht != 0) {
+               timer_cancel(cons->timer);
+       }
+       memman_free_4k(memman, (int) fat, 4 * 2880);
+       io_cli();
+       if (cons->sht != 0) {
+               fifo32_put(fifo, cons->sht - shtctl->sheets0 + 768);    /* 768\81`1023 */
+       } else {
+               fifo32_put(fifo, task - taskctl->tasks0 + 1024);        /* 1024\81`2023 */
+       }
+       io_sti();
+       for (;;) {
+               task_sleep(task);
+       }
+}
+
+void cmd_start(struct CONSOLE *cons, char *cmdline, int memtotal)
+{
+       struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4);
+       struct SHEET *sht = open_console(shtctl, memtotal);
+       struct FIFO32 *fifo = &sht->task->fifo;
+       int i;
+       sheet_slide(sht, 32, 4);
+       sheet_updown(sht, shtctl->top);
+       /* \83R\83}\83\93\83h\83\89\83C\83\93\82É\93ü\97Í\82³\82ê\82½\95\8e\9a\97ñ\82ð\81A\88ê\95\8e\9a\82¸\82Â\90V\82µ\82¢\83R\83\93\83\\81[\83\8b\82É\93ü\97Í */
+       for (i = 6; cmdline[i] != 0; i++) {
+               fifo32_put(fifo, cmdline[i] + 256);
+       }
+       fifo32_put(fifo, 10 + 256);     /* Enter */
+       cons_newline(cons);
+       return;
+}
+
+void cmd_ncst(struct CONSOLE *cons, char *cmdline, int memtotal)
+{
+       struct TASK *task = open_constask(0, memtotal);
+       struct FIFO32 *fifo = &task->fifo;
+       int i;
+       /* \83R\83}\83\93\83h\83\89\83C\83\93\82É\93ü\97Í\82³\82ê\82½\95\8e\9a\97ñ\82ð\81A\88ê\95\8e\9a\82¸\82Â\90V\82µ\82¢\83R\83\93\83\\81[\83\8b\82É\93ü\97Í */
+       for (i = 5; cmdline[i] != 0; i++) {
+               fifo32_put(fifo, cmdline[i] + 256);
+       }
+       fifo32_put(fifo, 10 + 256);     /* Enter */
+       cons_newline(cons);
+       return;
+}
+
+void cmd_langmode(struct CONSOLE *cons, char *cmdline)
+{
+       struct TASK *task = task_now();
+       unsigned char mode = cmdline[9] - '0';
+       if (mode <= 2) {
+               task->langmode = mode;
+       } else {
+               cons_putstr0(cons, "mode number error.\n");
+       }
+       cons_newline(cons);
+       return;
+}
+
+int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
+{
+       struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
+       struct FILEINFO *finfo;
+       char name[18], *p, *q;
+       struct TASK *task = task_now();
+       int i, segsiz, datsiz, esp, dathrb, appsiz;
+       struct SHTCTL *shtctl;
+       struct SHEET *sht;
+
+       /* \83R\83}\83\93\83h\83\89\83C\83\93\82©\82ç\83t\83@\83C\83\8b\96¼\82ð\90\90¬ */
+       for (i = 0; i < 13; i++) {
+               if (cmdline[i] <= ' ') {
+                       break;
+               }
+               name[i] = cmdline[i];
+       }
+       name[i] = 0; /* \82Æ\82è\82 \82¦\82¸\83t\83@\83C\83\8b\96¼\82Ì\8cã\82ë\82ð0\82É\82·\82é */
+
+       /* \83t\83@\83C\83\8b\82ð\92T\82· */
+       finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
+       if (finfo == 0 && name[i - 1] != '.') {
+               /* \8c©\82Â\82©\82ç\82È\82©\82Á\82½\82Ì\82Å\8cã\82ë\82É".HRB"\82ð\82Â\82¯\82Ä\82à\82¤\88ê\93x\92T\82µ\82Ä\82Ý\82é */
+               name[i    ] = '.';
+               name[i + 1] = 'H';
+               name[i + 2] = 'R';
+               name[i + 3] = 'B';
+               name[i + 4] = 0;
+               finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
+       }
+
+       if (finfo != 0) {
+               /* \83t\83@\83C\83\8b\82ª\8c©\82Â\82©\82Á\82½\8fê\8d\87 */
+               appsiz = finfo->size;
+               p = file_loadfile2(finfo->clustno, &appsiz, fat);
+               if (appsiz >= 36 && strncmp(p + 4, "Hari", 4) == 0 && *p == 0x00) {
+                       segsiz = *((int *) (p + 0x0000));
+                       esp    = *((int *) (p + 0x000c));
+                       datsiz = *((int *) (p + 0x0010));
+                       dathrb = *((int *) (p + 0x0014));
+                       q = (char *) memman_alloc_4k(memman, segsiz);
+                       task->ds_base = (int) q;
+                       set_segmdesc(task->ldt + 0, appsiz - 1, (int) p, AR_CODE32_ER + 0x60);
+                       set_segmdesc(task->ldt + 1, segsiz - 1, (int) q, AR_DATA32_RW + 0x60);
+                       for (i = 0; i < datsiz; i++) {
+                               q[esp + i] = p[dathrb + i];
+                       }
+                       start_app(0x1b, 0 * 8 + 4, esp, 1 * 8 + 4, &(task->tss.esp0));
+                       shtctl = (struct SHTCTL *) *((int *) 0x0fe4);
+                       for (i = 0; i < MAX_SHEETS; i++) {
+                               sht = &(shtctl->sheets0[i]);
+                               if ((sht->flags & 0x11) == 0x11 && sht->task == task) {
+                                       /* \83A\83v\83\8a\82ª\8aJ\82«\82Á\82Ï\82È\82µ\82É\82µ\82½\89º\82\82«\82ð\94­\8c© */
+                                       sheet_free(sht);        /* \95Â\82\82é */
+                               }
+                       }
+                       for (i = 0; i < 8; i++) {       /* \83N\83\8d\81[\83Y\82µ\82Ä\82È\82¢\83t\83@\83C\83\8b\82ð\83N\83\8d\81[\83Y */
+                               if (task->fhandle[i].buf != 0) {
+                                       memman_free_4k(memman, (int) task->fhandle[i].buf, task->fhandle[i].size);
+                                       task->fhandle[i].buf = 0;
+                               }
+                       }
+                       timer_cancelall(&task->fifo);
+                       memman_free_4k(memman, (int) q, segsiz);
+                       task->langbyte1 = 0;
+               } else {
+                       cons_putstr0(cons, ".hrb file format error.\n");
+               }
+               memman_free_4k(memman, (int) p, appsiz);
+               cons_newline(cons);
+               return 1;
+       }
+       /* \83t\83@\83C\83\8b\82ª\8c©\82Â\82©\82ç\82È\82©\82Á\82½\8fê\8d\87 */
+       return 0;
+}
+
+int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
+{
+       struct TASK *task = task_now();
+       int ds_base = task->ds_base;
+       struct CONSOLE *cons = task->cons;
+       struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4);
+       struct SHEET *sht;
+       struct FIFO32 *sys_fifo = (struct FIFO32 *) *((int *) 0x0fec);
+       int *reg = &eax + 1;    /* eax\82Ì\8e\9f\82Ì\94Ô\92n */
+               /* \95Û\91\82Ì\82½\82ß\82ÌPUSHAD\82ð\8b­\88ø\82É\8f\91\82«\8a·\82¦\82é */
+               /* reg[0] : EDI,   reg[1] : ESI,   reg[2] : EBP,   reg[3] : ESP */
+               /* reg[4] : EBX,   reg[5] : EDX,   reg[6] : ECX,   reg[7] : EAX */
+       int i;
+       struct FILEINFO *finfo;
+       struct FILEHANDLE *fh;
+       struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
+
+       if (edx == 1) {
+               cons_putchar(cons, eax & 0xff, 1);
+       } else if (edx == 2) {
+               cons_putstr0(cons, (char *) ebx + ds_base);
+       } else if (edx == 3) {
+               cons_putstr1(cons, (char *) ebx + ds_base, ecx);
+       } else if (edx == 4) {
+               return &(task->tss.esp0);
+       } else if (edx == 5) {
+               sht = sheet_alloc(shtctl);
+               sht->task = task;
+               sht->flags |= 0x10;
+               sheet_setbuf(sht, (char *) ebx + ds_base, esi, edi, eax);
+               make_window8((char *) ebx + ds_base, esi, edi, (char *) ecx + ds_base, 0);
+               sheet_slide(sht, ((shtctl->xsize - esi) / 2) & ~3, (shtctl->ysize - edi) / 2);
+               sheet_updown(sht, shtctl->top); /* \8d¡\82Ì\83}\83E\83X\82Æ\93¯\82\8d\82\82³\82É\82È\82é\82æ\82¤\82É\8ew\92è\81\83}\83E\83X\82Í\82±\82Ì\8fã\82É\82È\82é */
+               reg[7] = (int) sht;
+       } else if (edx == 6) {
+               sht = (struct SHEET *) (ebx & 0xfffffffe);
+               putfonts8_asc(sht->buf, sht->bxsize, esi, edi, eax, (char *) ebp + ds_base);
+               if ((ebx & 1) == 0) {
+                       sheet_refresh(sht, esi, edi, esi + ecx * 8, edi + 16);
+               }
+       } else if (edx == 7) {
+               sht = (struct SHEET *) (ebx & 0xfffffffe);
+               boxfill8(sht->buf, sht->bxsize, ebp, eax, ecx, esi, edi);
+               if ((ebx & 1) == 0) {
+                       sheet_refresh(sht, eax, ecx, esi + 1, edi + 1);
+               }
+       } else if (edx == 8) {
+               memman_init((struct MEMMAN *) (ebx + ds_base));
+               ecx &= 0xfffffff0;      /* 16\83o\83C\83g\92P\88Ê\82É */
+               memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx);
+       } else if (edx == 9) {
+               ecx = (ecx + 0x0f) & 0xfffffff0; /* 16\83o\83C\83g\92P\88Ê\82É\90Ø\82è\8fã\82° */
+               reg[7] = memman_alloc((struct MEMMAN *) (ebx + ds_base), ecx);
+       } else if (edx == 10) {
+               ecx = (ecx + 0x0f) & 0xfffffff0; /* 16\83o\83C\83g\92P\88Ê\82É\90Ø\82è\8fã\82° */
+               memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx);
+       } else if (edx == 11) {
+               sht = (struct SHEET *) (ebx & 0xfffffffe);
+               sht->buf[sht->bxsize * edi + esi] = eax;
+               if ((ebx & 1) == 0) {
+                       sheet_refresh(sht, esi, edi, esi + 1, edi + 1);
+               }
+       } else if (edx == 12) {
+               sht = (struct SHEET *) ebx;
+               sheet_refresh(sht, eax, ecx, esi, edi);
+       } else if (edx == 13) {
+               sht = (struct SHEET *) (ebx & 0xfffffffe);
+               hrb_api_linewin(sht, eax, ecx, esi, edi, ebp);
+               if ((ebx & 1) == 0) {
+                       if (eax > esi) {
+                               i = eax;
+                               eax = esi;
+                               esi = i;
+                       }
+                       if (ecx > edi) {
+                               i = ecx;
+                               ecx = edi;
+                               edi = i;
+                       }
+                       sheet_refresh(sht, eax, ecx, esi + 1, edi + 1);
+               }
+       } else if (edx == 14) {
+               sheet_free((struct SHEET *) ebx);
+       } else if (edx == 15) {
+               for (;;) {
+                       io_cli();
+                       if (fifo32_status(&task->fifo) == 0) {
+                               if (eax != 0) {
+                                       task_sleep(task);       /* FIFO\82ª\8bó\82È\82Ì\82Å\90Q\82Ä\91Ò\82 */
+                               } else {
+                                       io_sti();
+                                       reg[7] = -1;
+                                       return 0;
+                               }
+                       }
+                       i = fifo32_get(&task->fifo);
+                       io_sti();
+                       if (i <= 1 && cons->sht != 0) { /* \83J\81[\83\\83\8b\97p\83^\83C\83} */
+                               /* \83A\83v\83\8a\8eÀ\8ds\92\86\82Í\83J\81[\83\\83\8b\82ª\8fo\82È\82¢\82Ì\82Å\81A\82¢\82Â\82à\8e\9f\82Í\95\\8e¦\97p\82Ì1\82ð\92\8d\95\82µ\82Ä\82¨\82­ */
+                               timer_init(cons->timer, &task->fifo, 1); /* \8e\9f\82Í1\82ð */
+                               timer_settime(cons->timer, 50);
+                       }
+                       if (i == 2) {   /* \83J\81[\83\\83\8bON */
+                               cons->cur_c = COL8_FFFFFF;
+                       }
+                       if (i == 3) {   /* \83J\81[\83\\83\8bOFF */
+                               cons->cur_c = -1;
+                       }
+                       if (i == 4) {   /* \83R\83\93\83\\81[\83\8b\82¾\82¯\82ð\95Â\82\82é */
+                               timer_cancel(cons->timer);
+                               io_cli();
+                               fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024);       /* 2024\81`2279 */
+                               cons->sht = 0;
+                               io_sti();
+                       }
+                       if (i >= 256) { /* \83L\81[\83{\81[\83h\83f\81[\83^\81i\83^\83X\83NA\8co\97R\81j\82È\82Ç */
+                               reg[7] = i - 256;
+                               return 0;
+                       }
+               }
+       } else if (edx == 16) {
+               reg[7] = (int) timer_alloc();
+               ((struct TIMER *) reg[7])->flags2 = 1;  /* \8e©\93®\83L\83\83\83\93\83Z\83\8b\97L\8cø */
+       } else if (edx == 17) {
+               timer_init((struct TIMER *) ebx, &task->fifo, eax + 256);
+       } else if (edx == 18) {
+               timer_settime((struct TIMER *) ebx, eax);
+       } else if (edx == 19) {
+               timer_free((struct TIMER *) ebx);
+       } else if (edx == 20) {
+               if (eax == 0) {
+                       i = io_in8(0x61);
+                       io_out8(0x61, i & 0x0d);
+               } else {
+                       i = 1193180000 / eax;
+                       io_out8(0x43, 0xb6);
+                       io_out8(0x42, i & 0xff);
+                       io_out8(0x42, i >> 8);
+                       i = io_in8(0x61);
+                       io_out8(0x61, (i | 0x03) & 0x0f);
+               }
+       } else if (edx == 21) {
+               for (i = 0; i < 8; i++) {
+                       if (task->fhandle[i].buf == 0) {
+                               break;
+                       }
+               }
+               fh = &task->fhandle[i];
+               reg[7] = 0;
+               if (i < 8) {
+                       finfo = file_search((char *) ebx + ds_base,
+                                       (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
+                       if (finfo != 0) {
+                               reg[7] = (int) fh;
+                               fh->size = finfo->size;
+                               fh->pos = 0;
+                               fh->buf = file_loadfile2(finfo->clustno, &fh->size, task->fat);
+                       }
+               }
+       } else if (edx == 22) {
+               fh = (struct FILEHANDLE *) eax;
+               memman_free_4k(memman, (int) fh->buf, fh->size);
+               fh->buf = 0;
+       } else if (edx == 23) {
+               fh = (struct FILEHANDLE *) eax;
+               if (ecx == 0) {
+                       fh->pos = ebx;
+               } else if (ecx == 1) {
+                       fh->pos += ebx;
+               } else if (ecx == 2) {
+                       fh->pos = fh->size + ebx;
+               }
+               if (fh->pos < 0) {
+                       fh->pos = 0;
+               }
+               if (fh->pos > fh->size) {
+                       fh->pos = fh->size;
+               }
+       } else if (edx == 24) {
+               fh = (struct FILEHANDLE *) eax;
+               if (ecx == 0) {
+                       reg[7] = fh->size;
+               } else if (ecx == 1) {
+                       reg[7] = fh->pos;
+               } else if (ecx == 2) {
+                       reg[7] = fh->pos - fh->size;
+               }
+       } else if (edx == 25) {
+               fh = (struct FILEHANDLE *) eax;
+               for (i = 0; i < ecx; i++) {
+                       if (fh->pos == fh->size) {
+                               break;
+                       }
+                       *((char *) ebx + ds_base + i) = fh->buf[fh->pos];
+                       fh->pos++;
+               }
+               reg[7] = i;
+       } else if (edx == 26) {
+               i = 0;
+               for (;;) {
+                       *((char *) ebx + ds_base + i) =  task->cmdline[i];
+                       if (task->cmdline[i] == 0) {
+                               break;
+                       }
+                       if (i >= ecx) {
+                               break;
+                       }
+                       i++;
+               }
+               reg[7] = i;
+       } else if (edx == 27) {
+               reg[7] = task->langmode;
+       }
+       return 0;
+}
+
+int *inthandler0c(int *esp)
+{
+       struct TASK *task = task_now();
+       struct CONSOLE *cons = task->cons;
+       char s[30];
+       cons_putstr0(cons, "\nINT 0C :\n Stack Exception.\n");
+       sprintf(s, "EIP = %08X\n", esp[11]);
+       cons_putstr0(cons, s);
+       return &(task->tss.esp0);       /* \88Ù\8fí\8fI\97¹\82³\82¹\82é */
+}
+
+int *inthandler0d(int *esp)
+{
+       struct TASK *task = task_now();
+       struct CONSOLE *cons = task->cons;
+       char s[30];
+       cons_putstr0(cons, "\nINT 0D :\n General Protected Exception.\n");
+       sprintf(s, "EIP = %08X\n", esp[11]);
+       cons_putstr0(cons, s);
+       return &(task->tss.esp0);       /* \88Ù\8fí\8fI\97¹\82³\82¹\82é */
+}
+
+void hrb_api_linewin(struct SHEET *sht, int x0, int y0, int x1, int y1, int col)
+{
+       int i, x, y, len, dx, dy;
+
+       dx = x1 - x0;
+       dy = y1 - y0;
+       x = x0 << 10;
+       y = y0 << 10;
+       if (dx < 0) {
+               dx = - dx;
+       }
+       if (dy < 0) {
+               dy = - dy;
+       }
+       if (dx >= dy) {
+               len = dx + 1;
+               if (x0 > x1) {
+                       dx = -1024;
+               } else {
+                       dx =  1024;
+               }
+               if (y0 <= y1) {
+                       dy = ((y1 - y0 + 1) << 10) / len;
+               } else {
+                       dy = ((y1 - y0 - 1) << 10) / len;
+               }
+       } else {
+               len = dy + 1;
+               if (y0 > y1) {
+                       dy = -1024;
+               } else {
+                       dy =  1024;
+               }
+               if (x0 <= x1) {
+                       dx = ((x1 - x0 + 1) << 10) / len;
+               } else {
+                       dx = ((x1 - x0 - 1) << 10) / len;
+               }
+       }
+
+       for (i = 0; i < len; i++) {
+               sht->buf[(y >> 10) * sht->bxsize + (x >> 10)] = col;
+               x += dx;
+               y += dy;
+       }
+
+       return;
+}
diff --git a/haribote/console.lst b/haribote/console.lst
new file mode 100644 (file)
index 0000000..39deeb6
--- /dev/null
@@ -0,0 +1,2047 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _task_now
+     7 00000000                                        EXTERN  _memman_alloc_4k
+     8 00000000                                        EXTERN  _timer_alloc
+     9 00000000                                        EXTERN  _timer_init
+    10 00000000                                        EXTERN  _timer_settime
+    11 00000000                                        EXTERN  _file_readfat
+    12 00000000                                        EXTERN  _io_cli
+    13 00000000                                        EXTERN  _fifo32_status
+    14 00000000                                        EXTERN  _fifo32_get
+    15 00000000                                        EXTERN  _io_sti
+    16 00000000                                        EXTERN  _boxfill8
+    17 00000000                                        EXTERN  _sheet_refresh
+    18 00000000                                        EXTERN  _task_sleep
+    19 00000000                                        EXTERN  _putfonts8_asc_sht
+    20 00000000                                        EXTERN  _memman_total
+    21 00000000                                        EXTERN  _sprintf
+    22 00000000                                        EXTERN  _timer_cancel
+    23 00000000                                        EXTERN  _memman_free_4k
+    24 00000000                                        EXTERN  _fifo32_put
+    25 00000000                                        EXTERN  _taskctl
+    26 00000000                                        EXTERN  _open_console
+    27 00000000                                        EXTERN  _sheet_slide
+    28 00000000                                        EXTERN  _sheet_updown
+    29 00000000                                        EXTERN  _open_constask
+    30 00000000                                        EXTERN  _file_search
+    31 00000000                                        EXTERN  _file_loadfile2
+    32 00000000                                        EXTERN  _set_segmdesc
+    33 00000000                                        EXTERN  _start_app
+    34 00000000                                        EXTERN  _timer_cancelall
+    35 00000000                                        EXTERN  _sheet_free
+    36 00000000                                        EXTERN  _io_in8
+    37 00000000                                        EXTERN  _io_out8
+    38 00000000                                        EXTERN  _timer_free
+    39 00000000                                        EXTERN  _memman_free
+    40 00000000                                        EXTERN  _memman_alloc
+    41 00000000                                        EXTERN  _memman_init
+    42 00000000                                        EXTERN  _putfonts8_asc
+    43 00000000                                        EXTERN  _sheet_alloc
+    44 00000000                                        EXTERN  _sheet_setbuf
+    45 00000000                                        EXTERN  _make_window8
+    46 00000000                                 [FILE "console.c"]
+    47                                          [SECTION .text]
+    48 00000000                                        GLOBAL  _console_task
+    49 00000000                                 _console_task:
+    50 00000000 55                                     PUSH    EBP
+    51 00000001 89 E5                                  MOV     EBP,ESP
+    52 00000003 57                                     PUSH    EDI
+    53 00000004 56                                     PUSH    ESI
+    54 00000005 53                                     PUSH    EBX
+    55 00000006 81 EC 000000AC                         SUB     ESP,172
+    56 0000000C 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+    57 0000000F E8 [00000000]                          CALL    _task_now
+    58 00000014 68 00002D00                            PUSH    11520
+    59 00000019 89 C7                                  MOV     EDI,EAX
+    60 0000001B 68 003C0000                            PUSH    3932160
+    61 00000020 E8 [00000000]                          CALL    _memman_alloc_4k
+    62 00000025 85 DB                                  TEST    EBX,EBX
+    63 00000027 89 5D D4                               MOV     DWORD [-44+EBP],EBX
+    64 0000002A 89 85 FFFFFF50                         MOV     DWORD [-176+EBP],EAX
+    65 00000030 A1 00000FE8                            MOV     EAX,DWORD [4072]
+    66 00000035 89 85 FFFFFF4C                         MOV     DWORD [-180+EBP],EAX
+    67 0000003B 8D 45 D4                               LEA     EAX,DWORD [-44+EBP]
+    68 0000003E 89 87 000000A4                         MOV     DWORD [164+EDI],EAX
+    69 00000044 8D 85 FFFFFF54                         LEA     EAX,DWORD [-172+EBP]
+    70 0000004A 89 87 000000B8                         MOV     DWORD [184+EDI],EAX
+    71 00000050 59                                     POP     ECX
+    72 00000051 C7 45 D8 00000008                      MOV     DWORD [-40+EBP],8
+    73 00000058 C7 45 DC 0000001C                      MOV     DWORD [-36+EBP],28
+    74 0000005F C7 45 E0 FFFFFFFF                      MOV     DWORD [-32+EBP],-1
+    75 00000066 5E                                     POP     ESI
+    76 00000067 74 21                                  JE      L2
+    77 00000069 E8 [00000000]                          CALL    _timer_alloc
+    78 0000006E 8D 57 10                               LEA     EDX,DWORD [16+EDI]
+    79 00000071 6A 01                                  PUSH    1
+    80 00000073 52                                     PUSH    EDX
+    81 00000074 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+    82 00000077 50                                     PUSH    EAX
+    83 00000078 E8 [00000000]                          CALL    _timer_init
+    84 0000007D 6A 32                                  PUSH    50
+    85 0000007F FF 75 E4                               PUSH    DWORD [-28+EBP]
+    86 00000082 E8 [00000000]                          CALL    _timer_settime
+    87 00000087 83 C4 14                               ADD     ESP,20
+    88 0000008A                                 L2:
+    89 0000008A 68 00100200                            PUSH    1049088
+    90 0000008F BE 00000007                            MOV     ESI,7
+    91 00000094 FF B5 FFFFFF50                         PUSH    DWORD [-176+EBP]
+    92 0000009A E8 [00000000]                          CALL    _file_readfat
+    93 0000009F 58                                     POP     EAX
+    94 000000A0 5A                                     POP     EDX
+    95 000000A1 31 C0                                  XOR     EAX,EAX
+    96 000000A3                                 L7:
+    97 000000A3 C7 84 05 FFFFFF74 00000000             MOV     DWORD [-140+EBP+EAX*1],0
+    98 000000AE 83 C0 0C                               ADD     EAX,12
+    99 000000B1 4E                                     DEC     ESI
+   100 000000B2 79 EF                                  JNS     L7
+   101 000000B4 8B 8D FFFFFF50                         MOV     ECX,DWORD [-176+EBP]
+   102 000000BA 8B 9D FFFFFF4C                         MOV     EBX,DWORD [-180+EBP]
+   103 000000C0 8D 85 FFFFFF74                         LEA     EAX,DWORD [-140+EBP]
+   104 000000C6 89 8F 000000B4                         MOV     DWORD [180+EDI],ECX
+   105 000000CC 89 87 000000B0                         MOV     DWORD [176+EDI],EAX
+   106 000000D2 8D 45 D4                               LEA     EAX,DWORD [-44+EBP]
+   107 000000D5 80 BB 00001000 FF                      CMP     BYTE [4096+EBX],-1
+   108 000000DC C6 87 000000BD 00                      MOV     BYTE [189+EDI],0
+   109 000000E3 0F 95 87 000000BC                      SETNE   BYTE [188+EDI]
+   110 000000EA 6A 01                                  PUSH    1
+   111 000000EC 6A 3E                                  PUSH    62
+   112 000000EE 50                                     PUSH    EAX
+   113 000000EF E8 0000023B                            CALL    _cons_putchar
+   114 000000F4 83 C4 0C                               ADD     ESP,12
+   115 000000F7                                 L10:
+   116 000000F7 8D 5F 10                               LEA     EBX,DWORD [16+EDI]
+   117 000000FA E8 [00000000]                          CALL    _io_cli
+   118 000000FF 53                                     PUSH    EBX
+   119 00000100 E8 [00000000]                          CALL    _fifo32_status
+   120 00000105 5E                                     POP     ESI
+   121 00000106 85 C0                                  TEST    EAX,EAX
+   122 00000108 0F 84 00000210                         JE      L38
+   123 0000010E 53                                     PUSH    EBX
+   124 0000010F E8 [00000000]                          CALL    _fifo32_get
+   125 00000114 89 C6                                  MOV     ESI,EAX
+   126 00000116 E8 [00000000]                          CALL    _io_sti
+   127 0000011B 59                                     POP     ECX
+   128 0000011C 83 FE 01                               CMP     ESI,1
+   129 0000011F 0F 8E 000001A2                         JLE     L39
+   130 00000125                                 L15:
+   131 00000125 83 FE 02                               CMP     ESI,2
+   132 00000128 0F 84 0000018D                         JE      L40
+   133 0000012E                                 L20:
+   134 0000012E 83 FE 03                               CMP     ESI,3
+   135 00000131 0F 84 00000152                         JE      L41
+   136 00000137                                 L21:
+   137 00000137 83 FE 04                               CMP     ESI,4
+   138 0000013A 0F 84 00000133                         JE      L42
+   139 00000140                                 L23:
+   140 00000140 8D 86 FFFFFF00                         LEA     EAX,DWORD [-256+ESI]
+   141 00000146 89 85 FFFFFF48                         MOV     DWORD [-184+EBP],EAX
+   142 0000014C 3D 000000FF                            CMP     EAX,255
+   143 00000151 77 4E                                  JA      L24
+   144 00000153 81 FE 00000108                         CMP     ESI,264
+   145 00000159 0F 84 000000F4                         JE      L43
+   146 0000015F 81 FE 0000010A                         CMP     ESI,266
+   147 00000165 0F 84 00000089                         JE      L44
+   148 0000016B 8B 4D D8                               MOV     ECX,DWORD [-40+EBP]
+   149 0000016E 81 F9 000000EF                         CMP     ECX,239
+   150 00000174 7F 2B                                  JG      L24
+   151 00000176 89 C8                                  MOV     EAX,ECX
+   152 00000178 BA 00000008                            MOV     EDX,8
+   153 0000017D 89 D3                                  MOV     EBX,EDX
+   154 0000017F 6A 01                                  PUSH    1
+   155 00000181 99                                     CDQ
+   156 00000182 F7 FB                                  IDIV    EBX
+   157 00000184 89 C1                                  MOV     ECX,EAX
+   158 00000186 89 F0                                  MOV     EAX,ESI
+   159 00000188 88 84 0D FFFFFF52                      MOV     BYTE [-174+EBP+ECX*1],AL
+   160 0000018F 8D 45 D4                               LEA     EAX,DWORD [-44+EBP]
+   161 00000192 FF B5 FFFFFF48                         PUSH    DWORD [-184+EBP]
+   162 00000198 50                                     PUSH    EAX
+   163 00000199                                 L36:
+   164 00000199 E8 00000191                            CALL    _cons_putchar
+   165 0000019E                                 L37:
+   166 0000019E 83 C4 0C                               ADD     ESP,12
+   167 000001A1                                 L24:
+   168 000001A1 8B 5D D4                               MOV     EBX,DWORD [-44+EBP]
+   169 000001A4 85 DB                                  TEST    EBX,EBX
+   170 000001A6 0F 84 FFFFFF4B                         JE      L10
+   171 000001AC 83 7D E0 00                            CMP     DWORD [-32+EBP],0
+   172 000001B0 78 22                                  JS      L33
+   173 000001B2 8B 4D DC                               MOV     ECX,DWORD [-36+EBP]
+   174 000001B5 8B 55 D8                               MOV     EDX,DWORD [-40+EBP]
+   175 000001B8 8D 41 0F                               LEA     EAX,DWORD [15+ECX]
+   176 000001BB 50                                     PUSH    EAX
+   177 000001BC 8D 42 07                               LEA     EAX,DWORD [7+EDX]
+   178 000001BF 50                                     PUSH    EAX
+   179 000001C0 51                                     PUSH    ECX
+   180 000001C1 52                                     PUSH    EDX
+   181 000001C2 0F B6 45 E0                            MOVZX   EAX,BYTE [-32+EBP]
+   182 000001C6 50                                     PUSH    EAX
+   183 000001C7 FF 73 04                               PUSH    DWORD [4+EBX]
+   184 000001CA FF 33                                  PUSH    DWORD [EBX]
+   185 000001CC E8 [00000000]                          CALL    _boxfill8
+   186 000001D1 83 C4 1C                               ADD     ESP,28
+   187 000001D4                                 L33:
+   188 000001D4 8B 4D DC                               MOV     ECX,DWORD [-36+EBP]
+   189 000001D7 8B 55 D8                               MOV     EDX,DWORD [-40+EBP]
+   190 000001DA 8D 41 10                               LEA     EAX,DWORD [16+ECX]
+   191 000001DD 50                                     PUSH    EAX
+   192 000001DE 8D 42 08                               LEA     EAX,DWORD [8+EDX]
+   193 000001E1 50                                     PUSH    EAX
+   194 000001E2 51                                     PUSH    ECX
+   195 000001E3 52                                     PUSH    EDX
+   196 000001E4 FF 75 D4                               PUSH    DWORD [-44+EBP]
+   197 000001E7 E8 [00000000]                          CALL    _sheet_refresh
+   198 000001EC 83 C4 14                               ADD     ESP,20
+   199 000001EF E9 FFFFFF03                            JMP     L10
+   200 000001F4                                 L44:
+   201 000001F4 6A 00                                  PUSH    0
+   202 000001F6 8D 5D D4                               LEA     EBX,DWORD [-44+EBP]
+   203 000001F9 6A 20                                  PUSH    32
+   204 000001FB 53                                     PUSH    EBX
+   205 000001FC E8 0000012E                            CALL    _cons_putchar
+   206 00000201 53                                     PUSH    EBX
+   207 00000202 8B 45 D8                               MOV     EAX,DWORD [-40+EBP]
+   208 00000205 BA 00000008                            MOV     EDX,8
+   209 0000020A 89 D1                                  MOV     ECX,EDX
+   210 0000020C 99                                     CDQ
+   211 0000020D F7 F9                                  IDIV    ECX
+   212 0000020F C6 84 05 FFFFFF52 00                   MOV     BYTE [-174+EBP+EAX*1],0
+   213 00000217 E8 000001C4                            CALL    _cons_newline
+   214 0000021C 8D 85 FFFFFF54                         LEA     EAX,DWORD [-172+EBP]
+   215 00000222 FF 75 0C                               PUSH    DWORD [12+EBP]
+   216 00000225 FF B5 FFFFFF50                         PUSH    DWORD [-176+EBP]
+   217 0000022B 53                                     PUSH    EBX
+   218 0000022C 50                                     PUSH    EAX
+   219 0000022D E8 000002F7                            CALL    _cons_runcmd
+   220 00000232 83 C4 20                               ADD     ESP,32
+   221 00000235 83 7D D4 00                            CMP     DWORD [-44+EBP],0
+   222 00000239 75 0E                                  JNE     L29
+   223 0000023B FF B5 FFFFFF50                         PUSH    DWORD [-176+EBP]
+   224 00000241 53                                     PUSH    EBX
+   225 00000242 E8 000005A3                            CALL    _cmd_exit
+   226 00000247 58                                     POP     EAX
+   227 00000248 5A                                     POP     EDX
+   228 00000249                                 L29:
+   229 00000249 6A 01                                  PUSH    1
+   230 0000024B 6A 3E                                  PUSH    62
+   231 0000024D 53                                     PUSH    EBX
+   232 0000024E E9 FFFFFF46                            JMP     L36
+   233 00000253                                 L43:
+   234 00000253 83 7D D8 10                            CMP     DWORD [-40+EBP],16
+   235 00000257 0F 8E FFFFFF44                         JLE     L24
+   236 0000025D 6A 00                                  PUSH    0
+   237 0000025F 8D 45 D4                               LEA     EAX,DWORD [-44+EBP]
+   238 00000262 6A 20                                  PUSH    32
+   239 00000264 50                                     PUSH    EAX
+   240 00000265 E8 000000C5                            CALL    _cons_putchar
+   241 0000026A 83 6D D8 08                            SUB     DWORD [-40+EBP],8
+   242 0000026E E9 FFFFFF2B                            JMP     L37
+   243 00000273                                 L42:
+   244 00000273 FF B5 FFFFFF50                         PUSH    DWORD [-176+EBP]
+   245 00000279 8D 45 D4                               LEA     EAX,DWORD [-44+EBP]
+   246 0000027C 50                                     PUSH    EAX
+   247 0000027D E8 00000568                            CALL    _cmd_exit
+   248 00000282 59                                     POP     ECX
+   249 00000283 5B                                     POP     EBX
+   250 00000284 E9 FFFFFEB7                            JMP     L23
+   251 00000289                                 L41:
+   252 00000289 8B 5D D4                               MOV     EBX,DWORD [-44+EBP]
+   253 0000028C 85 DB                                  TEST    EBX,EBX
+   254 0000028E 74 1F                                  JE      L22
+   255 00000290 8B 4D DC                               MOV     ECX,DWORD [-36+EBP]
+   256 00000293 8B 55 D8                               MOV     EDX,DWORD [-40+EBP]
+   257 00000296 8D 41 0F                               LEA     EAX,DWORD [15+ECX]
+   258 00000299 50                                     PUSH    EAX
+   259 0000029A 8D 42 07                               LEA     EAX,DWORD [7+EDX]
+   260 0000029D 50                                     PUSH    EAX
+   261 0000029E 51                                     PUSH    ECX
+   262 0000029F 52                                     PUSH    EDX
+   263 000002A0 6A 00                                  PUSH    0
+   264 000002A2 FF 73 04                               PUSH    DWORD [4+EBX]
+   265 000002A5 FF 33                                  PUSH    DWORD [EBX]
+   266 000002A7 E8 [00000000]                          CALL    _boxfill8
+   267 000002AC 83 C4 1C                               ADD     ESP,28
+   268 000002AF                                 L22:
+   269 000002AF C7 45 E0 FFFFFFFF                      MOV     DWORD [-32+EBP],-1
+   270 000002B6 E9 FFFFFE7C                            JMP     L21
+   271 000002BB                                 L40:
+   272 000002BB C7 45 E0 00000007                      MOV     DWORD [-32+EBP],7
+   273 000002C2 E9 FFFFFE67                            JMP     L20
+   274 000002C7                                 L39:
+   275 000002C7 83 7D D4 00                            CMP     DWORD [-44+EBP],0
+   276 000002CB 0F 84 FFFFFE54                         JE      L15
+   277 000002D1 85 F6                                  TEST    ESI,ESI
+   278 000002D3 74 2C                                  JE      L16
+   279 000002D5 6A 00                                  PUSH    0
+   280 000002D7 53                                     PUSH    EBX
+   281 000002D8 FF 75 E4                               PUSH    DWORD [-28+EBP]
+   282 000002DB E8 [00000000]                          CALL    _timer_init
+   283 000002E0 83 C4 0C                               ADD     ESP,12
+   284 000002E3 83 7D E0 00                            CMP     DWORD [-32+EBP],0
+   285 000002E7 78 07                                  JS      L18
+   286 000002E9 C7 45 E0 00000007                      MOV     DWORD [-32+EBP],7
+   287 000002F0                                 L18:
+   288 000002F0 6A 32                                  PUSH    50
+   289 000002F2 FF 75 E4                               PUSH    DWORD [-28+EBP]
+   290 000002F5 E8 [00000000]                          CALL    _timer_settime
+   291 000002FA 58                                     POP     EAX
+   292 000002FB 5A                                     POP     EDX
+   293 000002FC E9 FFFFFE24                            JMP     L15
+   294 00000301                                 L16:
+   295 00000301 6A 01                                  PUSH    1
+   296 00000303 53                                     PUSH    EBX
+   297 00000304 FF 75 E4                               PUSH    DWORD [-28+EBP]
+   298 00000307 E8 [00000000]                          CALL    _timer_init
+   299 0000030C 83 C4 0C                               ADD     ESP,12
+   300 0000030F 83 7D E0 00                            CMP     DWORD [-32+EBP],0
+   301 00000313 78 DB                                  JS      L18
+   302 00000315 C7 45 E0 00000000                      MOV     DWORD [-32+EBP],0
+   303 0000031C EB D2                                  JMP     L18
+   304 0000031E                                 L38:
+   305 0000031E 57                                     PUSH    EDI
+   306 0000031F E8 [00000000]                          CALL    _task_sleep
+   307 00000324 E8 [00000000]                          CALL    _io_sti
+   308 00000329 5B                                     POP     EBX
+   309 0000032A E9 FFFFFDC8                            JMP     L10
+   310                                          [SECTION .data]
+   311 00000000                                 LC0:
+   312 00000000 20 00                                  DB      " ",0x00
+   313                                          [SECTION .text]
+   314 0000032F                                        GLOBAL  _cons_putchar
+   315 0000032F                                 _cons_putchar:
+   316 0000032F 55                                     PUSH    EBP
+   317 00000330 89 E5                                  MOV     EBP,ESP
+   318 00000332 53                                     PUSH    EBX
+   319 00000333 50                                     PUSH    EAX
+   320 00000334 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   321 00000337 8A 55 10                               MOV     DL,BYTE [16+EBP]
+   322 0000033A 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   323 0000033D 88 55 F9                               MOV     BYTE [-7+EBP],DL
+   324 00000340 88 45 FA                               MOV     BYTE [-6+EBP],AL
+   325 00000343 3C 09                                  CMP     AL,9
+   326 00000345 C6 45 FB 00                            MOV     BYTE [-5+EBP],0
+   327 00000349 74 4D                                  JE      L47
+   328 0000034B 3C 0A                                  CMP     AL,10
+   329 0000034D 74 25                                  JE      L61
+   330 0000034F 3C 0D                                  CMP     AL,13
+   331 00000351 74 1C                                  JE      L45
+   332 00000353 8B 13                                  MOV     EDX,DWORD [EBX]
+   333 00000355 85 D2                                  TEST    EDX,EDX
+   334 00000357 75 24                                  JNE     L62
+   335 00000359                                 L58:
+   336 00000359 80 7D F9 00                            CMP     BYTE [-7+EBP],0
+   337 0000035D 74 10                                  JE      L45
+   338 0000035F 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+   339 00000362 83 C0 08                               ADD     EAX,8
+   340 00000365 89 43 04                               MOV     DWORD [4+EBX],EAX
+   341 00000368 3D 000000F8                            CMP     EAX,248
+   342 0000036D 74 05                                  JE      L61
+   343 0000036F                                 L45:
+   344 0000036F 8B 5D FC                               MOV     EBX,DWORD [-4+EBP]
+   345 00000372 C9                                     LEAVE
+   346 00000373 C3                                     RET
+   347 00000374                                 L61:
+   348 00000374 53                                     PUSH    EBX
+   349 00000375 E8 00000066                            CALL    _cons_newline
+   350 0000037A 58                                     POP     EAX
+   351 0000037B EB F2                                  JMP     L45
+   352 0000037D                                 L62:
+   353 0000037D 6A 01                                  PUSH    1
+   354 0000037F 8D 45 FA                               LEA     EAX,DWORD [-6+EBP]
+   355 00000382 50                                     PUSH    EAX
+   356 00000383 6A 00                                  PUSH    0
+   357 00000385 6A 07                                  PUSH    7
+   358 00000387 FF 73 08                               PUSH    DWORD [8+EBX]
+   359 0000038A FF 73 04                               PUSH    DWORD [4+EBX]
+   360 0000038D 52                                     PUSH    EDX
+   361 0000038E E8 [00000000]                          CALL    _putfonts8_asc_sht
+   362 00000393 83 C4 1C                               ADD     ESP,28
+   363 00000396 EB C1                                  JMP     L58
+   364 00000398                                 L47:
+   365 00000398 8B 03                                  MOV     EAX,DWORD [EBX]
+   366 0000039A 85 C0                                  TEST    EAX,EAX
+   367 0000039C 75 26                                  JNE     L63
+   368 0000039E                                 L50:
+   369 0000039E 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+   370 000003A1 83 C0 08                               ADD     EAX,8
+   371 000003A4 89 43 04                               MOV     DWORD [4+EBX],EAX
+   372 000003A7 3D 000000F8                            CMP     EAX,248
+   373 000003AC 74 0D                                  JE      L64
+   374 000003AE                                 L51:
+   375 000003AE 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+   376 000003B1 83 E8 08                               SUB     EAX,8
+   377 000003B4 83 E0 1F                               AND     EAX,31
+   378 000003B7 75 DF                                  JNE     L47
+   379 000003B9 EB B4                                  JMP     L45
+   380 000003BB                                 L64:
+   381 000003BB 53                                     PUSH    EBX
+   382 000003BC E8 0000001F                            CALL    _cons_newline
+   383 000003C1 58                                     POP     EAX
+   384 000003C2 EB EA                                  JMP     L51
+   385 000003C4                                 L63:
+   386 000003C4 6A 01                                  PUSH    1
+   387 000003C6 68 [00000000]                          PUSH    LC0
+   388 000003CB 6A 00                                  PUSH    0
+   389 000003CD 6A 07                                  PUSH    7
+   390 000003CF FF 73 08                               PUSH    DWORD [8+EBX]
+   391 000003D2 FF 73 04                               PUSH    DWORD [4+EBX]
+   392 000003D5 50                                     PUSH    EAX
+   393 000003D6 E8 [00000000]                          CALL    _putfonts8_asc_sht
+   394 000003DB 83 C4 1C                               ADD     ESP,28
+   395 000003DE EB BE                                  JMP     L50
+   396 000003E0                                        GLOBAL  _cons_newline
+   397 000003E0                                 _cons_newline:
+   398 000003E0 55                                     PUSH    EBP
+   399 000003E1 89 E5                                  MOV     EBP,ESP
+   400 000003E3 57                                     PUSH    EDI
+   401 000003E4 56                                     PUSH    ESI
+   402 000003E5 53                                     PUSH    EBX
+   403 000003E6 50                                     PUSH    EAX
+   404 000003E7 50                                     PUSH    EAX
+   405 000003E8 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   406 000003EB 8B 00                                  MOV     EAX,DWORD [EAX]
+   407 000003ED 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   408 000003F0 E8 [00000000]                          CALL    _task_now
+   409 000003F5 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   410 000003F8 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   411 000003FB 8B 42 08                               MOV     EAX,DWORD [8+EDX]
+   412 000003FE 3D 0000008B                            CMP     EAX,139
+   413 00000403 7F 36                                  JG      L66
+   414 00000405 83 C0 10                               ADD     EAX,16
+   415 00000408 89 42 08                               MOV     DWORD [8+EDX],EAX
+   416 0000040B                                 L67:
+   417 0000040B 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   418 0000040E 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   419 00000411 C7 40 04 00000008                      MOV     DWORD [4+EAX],8
+   420 00000418 80 BA 000000BC 01                      CMP     BYTE [188+EDX],1
+   421 0000041F 74 08                                  JE      L98
+   422 00000421                                 L65:
+   423 00000421 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   424 00000424 5B                                     POP     EBX
+   425 00000425 5E                                     POP     ESI
+   426 00000426 5F                                     POP     EDI
+   427 00000427 5D                                     POP     EBP
+   428 00000428 C3                                     RET
+   429 00000429                                 L98:
+   430 00000429 80 BA 000000BD 00                      CMP     BYTE [189+EDX],0
+   431 00000430 74 EF                                  JE      L65
+   432 00000432 C7 40 04 00000010                      MOV     DWORD [4+EAX],16
+   433 00000439 EB E6                                  JMP     L65
+   434 0000043B                                 L66:
+   435 0000043B 83 7D F0 00                            CMP     DWORD [-16+EBP],0
+   436 0000043F 74 CA                                  JE      L67
+   437 00000441 BF 0000001C                            MOV     EDI,28
+   438 00000446                                 L78:
+   439 00000446 BE 00000008                            MOV     ESI,8
+   440 0000044B                                 L77:
+   441 0000044B 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   442 0000044E 89 FA                                  MOV     EDX,EDI
+   443 00000450 8B 48 04                               MOV     ECX,DWORD [4+EAX]
+   444 00000453 8B 18                                  MOV     EBX,DWORD [EAX]
+   445 00000455 8D 47 10                               LEA     EAX,DWORD [16+EDI]
+   446 00000458 0F AF C1                               IMUL    EAX,ECX
+   447 0000045B 0F AF D1                               IMUL    EDX,ECX
+   448 0000045E 8D 04 30                               LEA     EAX,DWORD [EAX+ESI*1]
+   449 00000461 8D 14 32                               LEA     EDX,DWORD [EDX+ESI*1]
+   450 00000464 46                                     INC     ESI
+   451 00000465 8A 04 18                               MOV     AL,BYTE [EAX+EBX*1]
+   452 00000468 81 FE 000000F7                         CMP     ESI,247
+   453 0000046E 88 04 1A                               MOV     BYTE [EDX+EBX*1],AL
+   454 00000471 7E D8                                  JLE     L77
+   455 00000473 47                                     INC     EDI
+   456 00000474 81 FF 0000008B                         CMP     EDI,139
+   457 0000047A 7E CA                                  JLE     L78
+   458 0000047C BF 0000008C                            MOV     EDI,140
+   459 00000481                                 L88:
+   460 00000481 BE 00000008                            MOV     ESI,8
+   461 00000486                                 L87:
+   462 00000486 8B 55 F0                               MOV     EDX,DWORD [-16+EBP]
+   463 00000489 89 F8                                  MOV     EAX,EDI
+   464 0000048B 89 D1                                  MOV     ECX,EDX
+   465 0000048D 0F AF 42 04                            IMUL    EAX,DWORD [4+EDX]
+   466 00000491 8B 12                                  MOV     EDX,DWORD [EDX]
+   467 00000493 8D 04 30                               LEA     EAX,DWORD [EAX+ESI*1]
+   468 00000496 46                                     INC     ESI
+   469 00000497 81 FE 000000F7                         CMP     ESI,247
+   470 0000049D C6 04 10 00                            MOV     BYTE [EAX+EDX*1],0
+   471 000004A1 7E E3                                  JLE     L87
+   472 000004A3 47                                     INC     EDI
+   473 000004A4 81 FF 0000009B                         CMP     EDI,155
+   474 000004AA 7E D5                                  JLE     L88
+   475 000004AC 68 0000009C                            PUSH    156
+   476 000004B1 68 000000F8                            PUSH    248
+   477 000004B6 6A 1C                                  PUSH    28
+   478 000004B8 6A 08                                  PUSH    8
+   479 000004BA 51                                     PUSH    ECX
+   480 000004BB E8 [00000000]                          CALL    _sheet_refresh
+   481 000004C0 83 C4 14                               ADD     ESP,20
+   482 000004C3 E9 FFFFFF43                            JMP     L67
+   483 000004C8                                        GLOBAL  _cons_putstr0
+   484 000004C8                                 _cons_putstr0:
+   485 000004C8 55                                     PUSH    EBP
+   486 000004C9 89 E5                                  MOV     EBP,ESP
+   487 000004CB 56                                     PUSH    ESI
+   488 000004CC 53                                     PUSH    EBX
+   489 000004CD 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   490 000004D0 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   491 000004D3 80 3B 00                               CMP     BYTE [EBX],0
+   492 000004D6 75 07                                  JNE     L104
+   493 000004D8                                 L106:
+   494 000004D8 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   495 000004DB 5B                                     POP     EBX
+   496 000004DC 5E                                     POP     ESI
+   497 000004DD 5D                                     POP     EBP
+   498 000004DE C3                                     RET
+   499 000004DF                                 L104:
+   500 000004DF 6A 01                                  PUSH    1
+   501 000004E1 0F BE 03                               MOVSX   EAX,BYTE [EBX]
+   502 000004E4 50                                     PUSH    EAX
+   503 000004E5 43                                     INC     EBX
+   504 000004E6 56                                     PUSH    ESI
+   505 000004E7 E8 FFFFFE43                            CALL    _cons_putchar
+   506 000004EC 83 C4 0C                               ADD     ESP,12
+   507 000004EF 80 3B 00                               CMP     BYTE [EBX],0
+   508 000004F2 75 EB                                  JNE     L104
+   509 000004F4 EB E2                                  JMP     L106
+   510 000004F6                                        GLOBAL  _cons_putstr1
+   511 000004F6                                 _cons_putstr1:
+   512 000004F6 55                                     PUSH    EBP
+   513 000004F7 89 E5                                  MOV     EBP,ESP
+   514 000004F9 57                                     PUSH    EDI
+   515 000004FA 56                                     PUSH    ESI
+   516 000004FB 53                                     PUSH    EBX
+   517 000004FC 8B 75 10                               MOV     ESI,DWORD [16+EBP]
+   518 000004FF 31 DB                                  XOR     EBX,EBX
+   519 00000501 8B 7D 0C                               MOV     EDI,DWORD [12+EBP]
+   520 00000504 39 F3                                  CMP     EBX,ESI
+   521 00000506 7C 08                                  JL      L112
+   522 00000508                                 L114:
+   523 00000508 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   524 0000050B 5B                                     POP     EBX
+   525 0000050C 5E                                     POP     ESI
+   526 0000050D 5F                                     POP     EDI
+   527 0000050E 5D                                     POP     EBP
+   528 0000050F C3                                     RET
+   529 00000510                                 L112:
+   530 00000510 6A 01                                  PUSH    1
+   531 00000512 0F BE 04 3B                            MOVSX   EAX,BYTE [EBX+EDI*1]
+   532 00000516 50                                     PUSH    EAX
+   533 00000517 43                                     INC     EBX
+   534 00000518 FF 75 08                               PUSH    DWORD [8+EBP]
+   535 0000051B E8 FFFFFE0F                            CALL    _cons_putchar
+   536 00000520 83 C4 0C                               ADD     ESP,12
+   537 00000523 39 F3                                  CMP     EBX,ESI
+   538 00000525 7C E9                                  JL      L112
+   539 00000527 EB DF                                  JMP     L114
+   540                                          [SECTION .data]
+   541 00000002                                 LC1:
+   542 00000002 6D 65 6D 00                            DB      "mem",0x00
+   543 00000006                                 LC2:
+   544 00000006 63 6C 73 00                            DB      "cls",0x00
+   545 0000000A                                 LC3:
+   546 0000000A 64 69 72 00                            DB      "dir",0x00
+   547 0000000E                                 LC4:
+   548 0000000E 65 78 69 74 00                         DB      "exit",0x00
+   549 00000013                                 LC5:
+   550 00000013 73 74 61 72 74 20 00                   DB      "start ",0x00
+   551 0000001A                                 LC6:
+   552 0000001A 6E 63 73 74 20 00                      DB      "ncst ",0x00
+   553 00000020                                 LC7:
+   554 00000020 6C 61 6E 67 6D 6F 64 65 20 00          DB      "langmode ",0x00
+   555 0000002A                                 LC8:
+   556 0000002A 42 61 64 20 63 6F 6D 6D 61 6E          DB      "Bad command.",0x0A,0x0A,0x00
+       00000034 64 2E 0A 0A 00 
+   557                                          [SECTION .text]
+   558 00000529                                        GLOBAL  _cons_runcmd
+   559 00000529                                 _cons_runcmd:
+   560 00000529 55                                     PUSH    EBP
+   561 0000052A 89 E5                                  MOV     EBP,ESP
+   562 0000052C 57                                     PUSH    EDI
+   563 0000052D 56                                     PUSH    ESI
+   564 0000052E BF [00000002]                          MOV     EDI,LC1
+   565 00000533 53                                     PUSH    EBX
+   566 00000534 83 EC 0C                               SUB     ESP,12
+   567 00000537 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   568 0000053A 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+   569 0000053D 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   570 00000540 89 4D F0                               MOV     DWORD [-16+EBP],ECX
+   571 00000543 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+   572 00000546 8B 75 E8                               MOV     ESI,DWORD [-24+EBP]
+   573 00000549 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   574 0000054C 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   575 0000054F B8 00000004                            MOV     EAX,4
+   576 00000554 FC                                     CLD
+   577 00000555 89 C1                                  MOV     ECX,EAX
+   578 00000557 F3                                     REPE
+   579 00000558 A6                                     CMPSB
+   580 00000559 75 09                                  JNE     L116
+   581 0000055B 83 3B 00                               CMP     DWORD [EBX],0
+   582 0000055E 0F 85 00000144                         JNE     L132
+   583 00000564                                 L116:
+   584 00000564 B8 00000004                            MOV     EAX,4
+   585 00000569 8B 75 E8                               MOV     ESI,DWORD [-24+EBP]
+   586 0000056C FC                                     CLD
+   587 0000056D BF [00000006]                          MOV     EDI,LC2
+   588 00000572 89 C1                                  MOV     ECX,EAX
+   589 00000574 F3                                     REPE
+   590 00000575 A6                                     CMPSB
+   591 00000576 75 09                                  JNE     L118
+   592 00000578 83 3B 00                               CMP     DWORD [EBX],0
+   593 0000057B 0F 85 0000011B                         JNE     L133
+   594 00000581                                 L118:
+   595 00000581 B8 00000004                            MOV     EAX,4
+   596 00000586 8B 75 E8                               MOV     ESI,DWORD [-24+EBP]
+   597 00000589 FC                                     CLD
+   598 0000058A BF [0000000A]                          MOV     EDI,LC3
+   599 0000058F 89 C1                                  MOV     ECX,EAX
+   600 00000591 F3                                     REPE
+   601 00000592 A6                                     CMPSB
+   602 00000593 75 09                                  JNE     L120
+   603 00000595 83 3B 00                               CMP     DWORD [EBX],0
+   604 00000598 0F 85 000000EF                         JNE     L134
+   605 0000059E                                 L120:
+   606 0000059E B8 00000005                            MOV     EAX,5
+   607 000005A3 8B 75 E8                               MOV     ESI,DWORD [-24+EBP]
+   608 000005A6 FC                                     CLD
+   609 000005A7 BF [0000000E]                          MOV     EDI,LC4
+   610 000005AC 89 C1                                  MOV     ECX,EAX
+   611 000005AE F3                                     REPE
+   612 000005AF A6                                     CMPSB
+   613 000005B0 0F 84 000000C2                         JE      L135
+   614 000005B6 B8 00000006                            MOV     EAX,6
+   615 000005BB 8B 75 E8                               MOV     ESI,DWORD [-24+EBP]
+   616 000005BE FC                                     CLD
+   617 000005BF BF [00000013]                          MOV     EDI,LC5
+   618 000005C4 89 C1                                  MOV     ECX,EAX
+   619 000005C6 F3                                     REPE
+   620 000005C7 A6                                     CMPSB
+   621 000005C8 0F 84 0000008F                         JE      L136
+   622 000005CE B8 00000005                            MOV     EAX,5
+   623 000005D3 8B 75 E8                               MOV     ESI,DWORD [-24+EBP]
+   624 000005D6 FC                                     CLD
+   625 000005D7 BF [0000001A]                          MOV     EDI,LC6
+   626 000005DC 89 C1                                  MOV     ECX,EAX
+   627 000005DE F3                                     REPE
+   628 000005DF A6                                     CMPSB
+   629 000005E0 74 60                                  JE      L137
+   630 000005E2 B8 00000009                            MOV     EAX,9
+   631 000005E7 8B 75 E8                               MOV     ESI,DWORD [-24+EBP]
+   632 000005EA FC                                     CLD
+   633 000005EB BF [00000020]                          MOV     EDI,LC7
+   634 000005F0 89 C1                                  MOV     ECX,EAX
+   635 000005F2 F3                                     REPE
+   636 000005F3 A6                                     CMPSB
+   637 000005F4 74 37                                  JE      L138
+   638 000005F6 8B 4D E8                               MOV     ECX,DWORD [-24+EBP]
+   639 000005F9 80 39 00                               CMP     BYTE [ECX],0
+   640 000005FC 75 08                                  JNE     L139
+   641 000005FE                                 L115:
+   642 000005FE 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   643 00000601 5B                                     POP     EBX
+   644 00000602 5E                                     POP     ESI
+   645 00000603 5F                                     POP     EDI
+   646 00000604 5D                                     POP     EBP
+   647 00000605 C3                                     RET
+   648 00000606                                 L139:
+   649 00000606 51                                     PUSH    ECX
+   650 00000607 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   651 0000060A 53                                     PUSH    EBX
+   652 0000060B E8 0000039E                            CALL    _cmd_app
+   653 00000610 83 C4 0C                               ADD     ESP,12
+   654 00000613 85 C0                                  TEST    EAX,EAX
+   655 00000615 75 E7                                  JNE     L115
+   656 00000617 C7 45 0C [0000002A]                    MOV     DWORD [12+EBP],LC8
+   657 0000061E 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   658 00000621 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   659 00000624 5B                                     POP     EBX
+   660 00000625 5E                                     POP     ESI
+   661 00000626 5F                                     POP     EDI
+   662 00000627 5D                                     POP     EBP
+   663 00000628 E9 FFFFFE9B                            JMP     _cons_putstr0
+   664 0000062D                                 L138:
+   665 0000062D 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+   666 00000630 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   667 00000633 89 45 0C                               MOV     DWORD [12+EBP],EAX
+   668 00000636 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   669 00000639 5B                                     POP     EBX
+   670 0000063A 5E                                     POP     ESI
+   671 0000063B 5F                                     POP     EDI
+   672 0000063C 5D                                     POP     EBP
+   673 0000063D E9 0000032E                            JMP     _cmd_langmode
+   674 00000642                                 L137:
+   675 00000642 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   676 00000645 8B 4D E8                               MOV     ECX,DWORD [-24+EBP]
+   677 00000648 89 45 10                               MOV     DWORD [16+EBP],EAX
+   678 0000064B 89 4D 0C                               MOV     DWORD [12+EBP],ECX
+   679 0000064E 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   680 00000651 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   681 00000654 5B                                     POP     EBX
+   682 00000655 5E                                     POP     ESI
+   683 00000656 5F                                     POP     EDI
+   684 00000657 5D                                     POP     EBP
+   685 00000658 E9 000002AF                            JMP     _cmd_ncst
+   686 0000065D                                 L136:
+   687 0000065D 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   688 00000660 8B 4D E8                               MOV     ECX,DWORD [-24+EBP]
+   689 00000663 89 45 10                               MOV     DWORD [16+EBP],EAX
+   690 00000666 89 4D 0C                               MOV     DWORD [12+EBP],ECX
+   691 00000669 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   692 0000066C 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   693 0000066F 5B                                     POP     EBX
+   694 00000670 5E                                     POP     ESI
+   695 00000671 5F                                     POP     EDI
+   696 00000672 5D                                     POP     EBP
+   697 00000673 E9 0000020A                            JMP     _cmd_start
+   698 00000678                                 L135:
+   699 00000678 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   700 0000067B 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   701 0000067E 89 45 0C                               MOV     DWORD [12+EBP],EAX
+   702 00000681 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   703 00000684 5B                                     POP     EBX
+   704 00000685 5E                                     POP     ESI
+   705 00000686 5F                                     POP     EDI
+   706 00000687 5D                                     POP     EBP
+   707 00000688 E9 0000015D                            JMP     _cmd_exit
+   708 0000068D                                 L134:
+   709 0000068D 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   710 00000690 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   711 00000693 5B                                     POP     EBX
+   712 00000694 5E                                     POP     ESI
+   713 00000695 5F                                     POP     EDI
+   714 00000696 5D                                     POP     EBP
+   715 00000697 E9 000000B8                            JMP     _cmd_dir
+   716 0000069C                                 L133:
+   717 0000069C 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   718 0000069F 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   719 000006A2 5B                                     POP     EBX
+   720 000006A3 5E                                     POP     ESI
+   721 000006A4 5F                                     POP     EDI
+   722 000006A5 5D                                     POP     EBP
+   723 000006A6 EB 53                                  JMP     _cmd_cls
+   724 000006A8                                 L132:
+   725 000006A8 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   726 000006AB 89 5D 08                               MOV     DWORD [8+EBP],EBX
+   727 000006AE 89 45 0C                               MOV     DWORD [12+EBP],EAX
+   728 000006B1 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   729 000006B4 5B                                     POP     EBX
+   730 000006B5 5E                                     POP     ESI
+   731 000006B6 5F                                     POP     EDI
+   732 000006B7 5D                                     POP     EBP
+   733 000006B8 EB 00                                  JMP     _cmd_mem
+   734                                          [SECTION .data]
+   735 00000039                                 LC9:
+   736 00000039 74 6F 74 61 6C 20 20 20 25 64          DB      "total   %dMB",0x0A,"free %dKB",0x0A,0x0A,0x00
+       00000043 4D 42 0A 66 72 65 65 20 25 64 
+       0000004D 4B 42 0A 0A 00 
+   737                                          [SECTION .text]
+   738 000006BA                                        GLOBAL  _cmd_mem
+   739 000006BA                                 _cmd_mem:
+   740 000006BA 55                                     PUSH    EBP
+   741 000006BB 89 E5                                  MOV     EBP,ESP
+   742 000006BD 53                                     PUSH    EBX
+   743 000006BE 83 EC 40                               SUB     ESP,64
+   744 000006C1 68 003C0000                            PUSH    3932160
+   745 000006C6 E8 [00000000]                          CALL    _memman_total
+   746 000006CB BA 00100000                            MOV     EDX,1048576
+   747 000006D0 C1 E8 0A                               SHR     EAX,10
+   748 000006D3 89 D3                                  MOV     EBX,EDX
+   749 000006D5 89 04 24                               MOV     DWORD [ESP],EAX
+   750 000006D8 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   751 000006DB 99                                     CDQ
+   752 000006DC F7 FB                                  IDIV    EBX
+   753 000006DE 50                                     PUSH    EAX
+   754 000006DF 8D 5D BC                               LEA     EBX,DWORD [-68+EBP]
+   755 000006E2 68 [00000039]                          PUSH    LC9
+   756 000006E7 53                                     PUSH    EBX
+   757 000006E8 E8 [00000000]                          CALL    _sprintf
+   758 000006ED 53                                     PUSH    EBX
+   759 000006EE FF 75 08                               PUSH    DWORD [8+EBP]
+   760 000006F1 E8 FFFFFDD2                            CALL    _cons_putstr0
+   761 000006F6 8B 5D FC                               MOV     EBX,DWORD [-4+EBP]
+   762 000006F9 C9                                     LEAVE
+   763 000006FA C3                                     RET
+   764 000006FB                                        GLOBAL  _cmd_cls
+   765 000006FB                                 _cmd_cls:
+   766 000006FB 55                                     PUSH    EBP
+   767 000006FC 89 E5                                  MOV     EBP,ESP
+   768 000006FE 57                                     PUSH    EDI
+   769 000006FF 56                                     PUSH    ESI
+   770 00000700 BE 0000001C                            MOV     ESI,28
+   771 00000705 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+   772 00000708 53                                     PUSH    EBX
+   773 00000709 8B 1F                                  MOV     EBX,DWORD [EDI]
+   774 0000070B                                 L151:
+   775 0000070B B9 00000008                            MOV     ECX,8
+   776 00000710                                 L150:
+   777 00000710 89 F0                                  MOV     EAX,ESI
+   778 00000712 8B 13                                  MOV     EDX,DWORD [EBX]
+   779 00000714 0F AF 43 04                            IMUL    EAX,DWORD [4+EBX]
+   780 00000718 8D 04 08                               LEA     EAX,DWORD [EAX+ECX*1]
+   781 0000071B 41                                     INC     ECX
+   782 0000071C 81 F9 000000F7                         CMP     ECX,247
+   783 00000722 C6 04 10 00                            MOV     BYTE [EAX+EDX*1],0
+   784 00000726 7E E8                                  JLE     L150
+   785 00000728 46                                     INC     ESI
+   786 00000729 81 FE 0000009B                         CMP     ESI,155
+   787 0000072F 7E DA                                  JLE     L151
+   788 00000731 68 0000009C                            PUSH    156
+   789 00000736 68 000000F8                            PUSH    248
+   790 0000073B 6A 1C                                  PUSH    28
+   791 0000073D 6A 08                                  PUSH    8
+   792 0000073F 53                                     PUSH    EBX
+   793 00000740 E8 [00000000]                          CALL    _sheet_refresh
+   794 00000745 C7 47 08 0000001C                      MOV     DWORD [8+EDI],28
+   795 0000074C 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   796 0000074F 5B                                     POP     EBX
+   797 00000750 5E                                     POP     ESI
+   798 00000751 5F                                     POP     EDI
+   799 00000752 5D                                     POP     EBP
+   800 00000753 C3                                     RET
+   801                                          [SECTION .data]
+   802 00000052                                 LC10:
+   803 00000052 66 69 6C 65 6E 61 6D 65 2E 65          DB      "filename.ext   %7d",0x0A,0x00
+       0000005C 78 74 20 20 20 25 37 64 0A 00 
+   804                                          [SECTION .text]
+   805 00000754                                        GLOBAL  _cmd_dir
+   806 00000754                                 _cmd_dir:
+   807 00000754 55                                     PUSH    EBP
+   808 00000755 89 E5                                  MOV     EBP,ESP
+   809 00000757 57                                     PUSH    EDI
+   810 00000758 56                                     PUSH    ESI
+   811 00000759 31 F6                                  XOR     ESI,ESI
+   812 0000075B 53                                     PUSH    EBX
+   813 0000075C 31 DB                                  XOR     EBX,EBX
+   814 0000075E 83 EC 20                               SUB     ESP,32
+   815 00000761 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+   816 00000764                                 L169:
+   817 00000764 8A 83 00102600                         MOV     AL,BYTE [1058304+EBX]
+   818 0000076A 84 C0                                  TEST    AL,AL
+   819 0000076C 74 19                                  JE      L158
+   820 0000076E 3C E5                                  CMP     AL,-27
+   821 00000770 74 09                                  JE      L159
+   822 00000772 F6 83 0010260B 18                      TEST    BYTE [1058315+EBX],24
+   823 00000779 74 1A                                  JE      L173
+   824 0000077B                                 L159:
+   825 0000077B 46                                     INC     ESI
+   826 0000077C 83 C3 20                               ADD     EBX,32
+   827 0000077F 81 FE 000000DF                         CMP     ESI,223
+   828 00000785 7E DD                                  JLE     L169
+   829 00000787                                 L158:
+   830 00000787 57                                     PUSH    EDI
+   831 00000788 E8 FFFFFC53                            CALL    _cons_newline
+   832 0000078D 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   833 00000790 5B                                     POP     EBX
+   834 00000791 5E                                     POP     ESI
+   835 00000792 5F                                     POP     EDI
+   836 00000793 5D                                     POP     EBP
+   837 00000794 C3                                     RET
+   838 00000795                                 L173:
+   839 00000795 FF B3 0010261C                         PUSH    DWORD [1058332+EBX]
+   840 0000079B 68 [00000052]                          PUSH    LC10
+   841 000007A0 8D 45 D4                               LEA     EAX,DWORD [-44+EBP]
+   842 000007A3 50                                     PUSH    EAX
+   843 000007A4 E8 [00000000]                          CALL    _sprintf
+   844 000007A9 8D 93 00102600                         LEA     EDX,DWORD [1058304+EBX]
+   845 000007AF 31 C9                                  XOR     ECX,ECX
+   846 000007B1 83 C4 0C                               ADD     ESP,12
+   847 000007B4                                 L168:
+   848 000007B4 8A 02                                  MOV     AL,BYTE [EDX]
+   849 000007B6 42                                     INC     EDX
+   850 000007B7 88 44 0D D4                            MOV     BYTE [-44+EBP+ECX*1],AL
+   851 000007BB 41                                     INC     ECX
+   852 000007BC 83 F9 07                               CMP     ECX,7
+   853 000007BF 7E F3                                  JLE     L168
+   854 000007C1 8A 83 00102608                         MOV     AL,BYTE [1058312+EBX]
+   855 000007C7 88 45 DD                               MOV     BYTE [-35+EBP],AL
+   856 000007CA 8A 83 00102609                         MOV     AL,BYTE [1058313+EBX]
+   857 000007D0 88 45 DE                               MOV     BYTE [-34+EBP],AL
+   858 000007D3 8A 83 0010260A                         MOV     AL,BYTE [1058314+EBX]
+   859 000007D9 88 45 DF                               MOV     BYTE [-33+EBP],AL
+   860 000007DC 8D 45 D4                               LEA     EAX,DWORD [-44+EBP]
+   861 000007DF 50                                     PUSH    EAX
+   862 000007E0 57                                     PUSH    EDI
+   863 000007E1 E8 FFFFFCE2                            CALL    _cons_putstr0
+   864 000007E6 58                                     POP     EAX
+   865 000007E7 5A                                     POP     EDX
+   866 000007E8 EB 91                                  JMP     L159
+   867 000007EA                                        GLOBAL  _cmd_exit
+   868 000007EA                                 _cmd_exit:
+   869 000007EA 55                                     PUSH    EBP
+   870 000007EB 89 E5                                  MOV     EBP,ESP
+   871 000007ED 57                                     PUSH    EDI
+   872 000007EE 56                                     PUSH    ESI
+   873 000007EF 53                                     PUSH    EBX
+   874 000007F0 50                                     PUSH    EAX
+   875 000007F1 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   876 000007F4 E8 [00000000]                          CALL    _task_now
+   877 000007F9 8B 35 00000FE4                         MOV     ESI,DWORD [4068]
+   878 000007FF 8B 3D 00000FEC                         MOV     EDI,DWORD [4076]
+   879 00000805 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   880 00000808 83 3B 00                               CMP     DWORD [EBX],0
+   881 0000080B 74 09                                  JE      L175
+   882 0000080D FF 73 10                               PUSH    DWORD [16+EBX]
+   883 00000810 E8 [00000000]                          CALL    _timer_cancel
+   884 00000815 58                                     POP     EAX
+   885 00000816                                 L175:
+   886 00000816 68 00002D00                            PUSH    11520
+   887 0000081B FF 75 0C                               PUSH    DWORD [12+EBP]
+   888 0000081E 68 003C0000                            PUSH    3932160
+   889 00000823 E8 [00000000]                          CALL    _memman_free_4k
+   890 00000828 E8 [00000000]                          CALL    _io_cli
+   891 0000082D 8B 03                                  MOV     EAX,DWORD [EBX]
+   892 0000082F 83 C4 0C                               ADD     ESP,12
+   893 00000832 85 C0                                  TEST    EAX,EAX
+   894 00000834 74 2E                                  JE      L176
+   895 00000836 29 F0                                  SUB     EAX,ESI
+   896 00000838 2D 00000414                            SUB     EAX,1044
+   897 0000083D C1 F8 03                               SAR     EAX,3
+   898 00000840 69 C0 CCCCCCCD                         IMUL    EAX,EAX,-858993459
+   899 00000846 05 00000300                            ADD     EAX,768
+   900 0000084B                                 L181:
+   901 0000084B 50                                     PUSH    EAX
+   902 0000084C 57                                     PUSH    EDI
+   903 0000084D E8 [00000000]                          CALL    _fifo32_put
+   904 00000852 5B                                     POP     EBX
+   905 00000853 5E                                     POP     ESI
+   906 00000854 E8 [00000000]                          CALL    _io_sti
+   907 00000859                                 L178:
+   908 00000859 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   909 0000085C E8 [00000000]                          CALL    _task_sleep
+   910 00000861 59                                     POP     ECX
+   911 00000862 EB F5                                  JMP     L178
+   912 00000864                                 L176:
+   913 00000864 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   914 00000867 2B 05 [00000000]                       SUB     EAX,DWORD [_taskctl]
+   915 0000086D 2D 00000FF8                            SUB     EAX,4088
+   916 00000872 C1 F8 06                               SAR     EAX,6
+   917 00000875 69 C0 AAAAAAAB                         IMUL    EAX,EAX,-1431655765
+   918 0000087B 05 00000400                            ADD     EAX,1024
+   919 00000880 EB C9                                  JMP     L181
+   920 00000882                                        GLOBAL  _cmd_start
+   921 00000882                                 _cmd_start:
+   922 00000882 55                                     PUSH    EBP
+   923 00000883 89 E5                                  MOV     EBP,ESP
+   924 00000885 57                                     PUSH    EDI
+   925 00000886 56                                     PUSH    ESI
+   926 00000887 53                                     PUSH    EBX
+   927 00000888 57                                     PUSH    EDI
+   928 00000889 57                                     PUSH    EDI
+   929 0000088A 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   930 0000088D 8B 7D 0C                               MOV     EDI,DWORD [12+EBP]
+   931 00000890 8B 35 00000FE4                         MOV     ESI,DWORD [4068]
+   932 00000896 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   933 00000899 FF 75 10                               PUSH    DWORD [16+EBP]
+   934 0000089C 56                                     PUSH    ESI
+   935 0000089D E8 [00000000]                          CALL    _open_console
+   936 000008A2 89 C3                                  MOV     EBX,EAX
+   937 000008A4 8B 40 24                               MOV     EAX,DWORD [36+EAX]
+   938 000008A7 83 C0 10                               ADD     EAX,16
+   939 000008AA 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   940 000008AD 6A 04                                  PUSH    4
+   941 000008AF 6A 20                                  PUSH    32
+   942 000008B1 53                                     PUSH    EBX
+   943 000008B2 E8 [00000000]                          CALL    _sheet_slide
+   944 000008B7 FF 76 10                               PUSH    DWORD [16+ESI]
+   945 000008BA 53                                     PUSH    EBX
+   946 000008BB BB 00000006                            MOV     EBX,6
+   947 000008C0 E8 [00000000]                          CALL    _sheet_updown
+   948 000008C5 83 C4 1C                               ADD     ESP,28
+   949 000008C8 80 7F 06 00                            CMP     BYTE [6+EDI],0
+   950 000008CC 75 21                                  JNE     L187
+   951 000008CE                                 L189:
+   952 000008CE 68 0000010A                            PUSH    266
+   953 000008D3 FF 75 EC                               PUSH    DWORD [-20+EBP]
+   954 000008D6 E8 [00000000]                          CALL    _fifo32_put
+   955 000008DB 58                                     POP     EAX
+   956 000008DC 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   957 000008DF 5A                                     POP     EDX
+   958 000008E0 89 45 08                               MOV     DWORD [8+EBP],EAX
+   959 000008E3 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   960 000008E6 5B                                     POP     EBX
+   961 000008E7 5E                                     POP     ESI
+   962 000008E8 5F                                     POP     EDI
+   963 000008E9 5D                                     POP     EBP
+   964 000008EA E9 FFFFFAF1                            JMP     _cons_newline
+   965 000008EF                                 L187:
+   966 000008EF 0F BE 04 3B                            MOVSX   EAX,BYTE [EBX+EDI*1]
+   967 000008F3 05 00000100                            ADD     EAX,256
+   968 000008F8 43                                     INC     EBX
+   969 000008F9 50                                     PUSH    EAX
+   970 000008FA FF 75 EC                               PUSH    DWORD [-20+EBP]
+   971 000008FD E8 [00000000]                          CALL    _fifo32_put
+   972 00000902 80 3C 3B 00                            CMP     BYTE [EBX+EDI*1],0
+   973 00000906 59                                     POP     ECX
+   974 00000907 5E                                     POP     ESI
+   975 00000908 75 E5                                  JNE     L187
+   976 0000090A EB C2                                  JMP     L189
+   977 0000090C                                        GLOBAL  _cmd_ncst
+   978 0000090C                                 _cmd_ncst:
+   979 0000090C 55                                     PUSH    EBP
+   980 0000090D 89 E5                                  MOV     EBP,ESP
+   981 0000090F 57                                     PUSH    EDI
+   982 00000910 56                                     PUSH    ESI
+   983 00000911 BE 00000005                            MOV     ESI,5
+   984 00000916 53                                     PUSH    EBX
+   985 00000917 51                                     PUSH    ECX
+   986 00000918 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   987 0000091B 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   988 0000091E 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   989 00000921 FF 75 10                               PUSH    DWORD [16+EBP]
+   990 00000924 6A 00                                  PUSH    0
+   991 00000926 E8 [00000000]                          CALL    _open_constask
+   992 0000092B 80 7B 05 00                            CMP     BYTE [5+EBX],0
+   993 0000092F 8D 78 10                               LEA     EDI,DWORD [16+EAX]
+   994 00000932 58                                     POP     EAX
+   995 00000933 5A                                     POP     EDX
+   996 00000934 75 1F                                  JNE     L195
+   997 00000936                                 L197:
+   998 00000936 68 0000010A                            PUSH    266
+   999 0000093B 57                                     PUSH    EDI
+  1000 0000093C E8 [00000000]                          CALL    _fifo32_put
+  1001 00000941 58                                     POP     EAX
+  1002 00000942 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+  1003 00000945 5A                                     POP     EDX
+  1004 00000946 89 45 08                               MOV     DWORD [8+EBP],EAX
+  1005 00000949 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1006 0000094C 5B                                     POP     EBX
+  1007 0000094D 5E                                     POP     ESI
+  1008 0000094E 5F                                     POP     EDI
+  1009 0000094F 5D                                     POP     EBP
+  1010 00000950 E9 FFFFFA8B                            JMP     _cons_newline
+  1011 00000955                                 L195:
+  1012 00000955 0F BE 04 1E                            MOVSX   EAX,BYTE [ESI+EBX*1]
+  1013 00000959 05 00000100                            ADD     EAX,256
+  1014 0000095E 46                                     INC     ESI
+  1015 0000095F 50                                     PUSH    EAX
+  1016 00000960 57                                     PUSH    EDI
+  1017 00000961 E8 [00000000]                          CALL    _fifo32_put
+  1018 00000966 80 3C 1E 00                            CMP     BYTE [ESI+EBX*1],0
+  1019 0000096A 59                                     POP     ECX
+  1020 0000096B 58                                     POP     EAX
+  1021 0000096C 75 E7                                  JNE     L195
+  1022 0000096E EB C6                                  JMP     L197
+  1023                                          [SECTION .data]
+  1024 00000066                                 LC11:
+  1025 00000066 6D 6F 64 65 20 6E 75 6D 62 65          DB      "mode number error.",0x0A,0x00
+       00000070 72 20 65 72 72 6F 72 2E 0A 00 
+  1026                                          [SECTION .text]
+  1027 00000970                                        GLOBAL  _cmd_langmode
+  1028 00000970                                 _cmd_langmode:
+  1029 00000970 55                                     PUSH    EBP
+  1030 00000971 89 E5                                  MOV     EBP,ESP
+  1031 00000973 56                                     PUSH    ESI
+  1032 00000974 53                                     PUSH    EBX
+  1033 00000975 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+  1034 00000978 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+  1035 0000097B E8 [00000000]                          CALL    _task_now
+  1036 00000980 8A 53 09                               MOV     DL,BYTE [9+EBX]
+  1037 00000983 83 EA 30                               SUB     EDX,48
+  1038 00000986 80 FA 02                               CMP     DL,2
+  1039 00000989 77 14                                  JA      L199
+  1040 0000098B 88 90 000000BC                         MOV     BYTE [188+EAX],DL
+  1041 00000991                                 L200:
+  1042 00000991 89 75 08                               MOV     DWORD [8+EBP],ESI
+  1043 00000994 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+  1044 00000997 5B                                     POP     EBX
+  1045 00000998 5E                                     POP     ESI
+  1046 00000999 5D                                     POP     EBP
+  1047 0000099A E9 FFFFFA41                            JMP     _cons_newline
+  1048 0000099F                                 L199:
+  1049 0000099F 68 [00000066]                          PUSH    LC11
+  1050 000009A4 56                                     PUSH    ESI
+  1051 000009A5 E8 FFFFFB1E                            CALL    _cons_putstr0
+  1052 000009AA 5B                                     POP     EBX
+  1053 000009AB 58                                     POP     EAX
+  1054 000009AC EB E3                                  JMP     L200
+  1055                                          [SECTION .data]
+  1056 0000007A                                 LC12:
+  1057 0000007A 48 61 72 69 00                         DB      "Hari",0x00
+  1058 0000007F                                 LC13:
+  1059 0000007F 2E 68 72 62 20 66 69 6C 65 20          DB      ".hrb file format error.",0x0A,0x00
+       00000089 66 6F 72 6D 61 74 20 65 72 72 
+       00000093 6F 72 2E 0A 00 
+  1060                                          [SECTION .text]
+  1061 000009AE                                        GLOBAL  _cmd_app
+  1062 000009AE                                 _cmd_app:
+  1063 000009AE 55                                     PUSH    EBP
+  1064 000009AF 89 E5                                  MOV     EBP,ESP
+  1065 000009B1 57                                     PUSH    EDI
+  1066 000009B2 56                                     PUSH    ESI
+  1067 000009B3 31 F6                                  XOR     ESI,ESI
+  1068 000009B5 53                                     PUSH    EBX
+  1069 000009B6 83 EC 34                               SUB     ESP,52
+  1070 000009B9 8B 5D 10                               MOV     EBX,DWORD [16+EBP]
+  1071 000009BC E8 [00000000]                          CALL    _task_now
+  1072 000009C1 89 45 C8                               MOV     DWORD [-56+EBP],EAX
+  1073 000009C4                                 L207:
+  1074 000009C4 8A 04 1E                               MOV     AL,BYTE [ESI+EBX*1]
+  1075 000009C7 3C 20                                  CMP     AL,32
+  1076 000009C9 7E 0A                                  JLE     L203
+  1077 000009CB 88 44 35 D4                            MOV     BYTE [-44+EBP+ESI*1],AL
+  1078 000009CF 46                                     INC     ESI
+  1079 000009D0 83 FE 0C                               CMP     ESI,12
+  1080 000009D3 7E EF                                  JLE     L207
+  1081 000009D5                                 L203:
+  1082 000009D5 68 000000E0                            PUSH    224
+  1083 000009DA 8D 5D D4                               LEA     EBX,DWORD [-44+EBP]
+  1084 000009DD 68 00102600                            PUSH    1058304
+  1085 000009E2 53                                     PUSH    EBX
+  1086 000009E3 C6 44 35 D4 00                         MOV     BYTE [-44+EBP+ESI*1],0
+  1087 000009E8 E8 [00000000]                          CALL    _file_search
+  1088 000009ED 83 C4 0C                               ADD     ESP,12
+  1089 000009F0 89 C2                                  MOV     EDX,EAX
+  1090 000009F2 85 C0                                  TEST    EAX,EAX
+  1091 000009F4 0F 84 000001B6                         JE      L237
+  1092 000009FA                                 L236:
+  1093 000009FA 8B 42 1C                               MOV     EAX,DWORD [28+EDX]
+  1094 000009FD 89 45 D0                               MOV     DWORD [-48+EBP],EAX
+  1095 00000A00 8D 45 D0                               LEA     EAX,DWORD [-48+EBP]
+  1096 00000A03 FF 75 0C                               PUSH    DWORD [12+EBP]
+  1097 00000A06 50                                     PUSH    EAX
+  1098 00000A07 0F B7 42 1A                            MOVZX   EAX,WORD [26+EDX]
+  1099 00000A0B 50                                     PUSH    EAX
+  1100 00000A0C E8 [00000000]                          CALL    _file_loadfile2
+  1101 00000A11 83 C4 0C                               ADD     ESP,12
+  1102 00000A14 83 7D D0 23                            CMP     DWORD [-48+EBP],35
+  1103 00000A18 89 45 CC                               MOV     DWORD [-52+EBP],EAX
+  1104 00000A1B 7E 1C                                  JLE     L210
+  1105 00000A1D 89 C6                                  MOV     ESI,EAX
+  1106 00000A1F BF [0000007A]                          MOV     EDI,LC12
+  1107 00000A24 FC                                     CLD
+  1108 00000A25 83 C6 04                               ADD     ESI,4
+  1109 00000A28 B9 00000004                            MOV     ECX,4
+  1110 00000A2D F3                                     REPE
+  1111 00000A2E A6                                     CMPSB
+  1112 00000A2F 75 08                                  JNE     L210
+  1113 00000A31 8B 45 CC                               MOV     EAX,DWORD [-52+EBP]
+  1114 00000A34 80 38 00                               CMP     BYTE [EAX],0
+  1115 00000A37 74 34                                  JE      L238
+  1116 00000A39                                 L210:
+  1117 00000A39 68 [0000007F]                          PUSH    LC13
+  1118 00000A3E FF 75 08                               PUSH    DWORD [8+EBP]
+  1119 00000A41 E8 FFFFFA82                            CALL    _cons_putstr0
+  1120 00000A46 58                                     POP     EAX
+  1121 00000A47 5A                                     POP     EDX
+  1122 00000A48                                 L228:
+  1123 00000A48 FF 75 D0                               PUSH    DWORD [-48+EBP]
+  1124 00000A4B FF 75 CC                               PUSH    DWORD [-52+EBP]
+  1125 00000A4E 68 003C0000                            PUSH    3932160
+  1126 00000A53 E8 [00000000]                          CALL    _memman_free_4k
+  1127 00000A58 FF 75 08                               PUSH    DWORD [8+EBP]
+  1128 00000A5B E8 FFFFF980                            CALL    _cons_newline
+  1129 00000A60 B8 00000001                            MOV     EAX,1
+  1130 00000A65                                 L201:
+  1131 00000A65 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1132 00000A68 5B                                     POP     EBX
+  1133 00000A69 5E                                     POP     ESI
+  1134 00000A6A 5F                                     POP     EDI
+  1135 00000A6B 5D                                     POP     EBP
+  1136 00000A6C C3                                     RET
+  1137 00000A6D                                 L238:
+  1138 00000A6D 8B 10                                  MOV     EDX,DWORD [EAX]
+  1139 00000A6F 8B 40 0C                               MOV     EAX,DWORD [12+EAX]
+  1140 00000A72 89 55 C4                               MOV     DWORD [-60+EBP],EDX
+  1141 00000A75 89 45 C0                               MOV     DWORD [-64+EBP],EAX
+  1142 00000A78 8B 55 CC                               MOV     EDX,DWORD [-52+EBP]
+  1143 00000A7B 8B 5A 10                               MOV     EBX,DWORD [16+EDX]
+  1144 00000A7E 8B 72 14                               MOV     ESI,DWORD [20+EDX]
+  1145 00000A81 FF 75 C4                               PUSH    DWORD [-60+EBP]
+  1146 00000A84 68 003C0000                            PUSH    3932160
+  1147 00000A89 E8 [00000000]                          CALL    _memman_alloc_4k
+  1148 00000A8E 89 C7                                  MOV     EDI,EAX
+  1149 00000A90 8B 45 C8                               MOV     EAX,DWORD [-56+EBP]
+  1150 00000A93 89 B8 000000A8                         MOV     DWORD [168+EAX],EDI
+  1151 00000A99 8B 45 D0                               MOV     EAX,DWORD [-48+EBP]
+  1152 00000A9C 68 000040FA                            PUSH    16634
+  1153 00000AA1 48                                     DEC     EAX
+  1154 00000AA2 FF 75 CC                               PUSH    DWORD [-52+EBP]
+  1155 00000AA5 50                                     PUSH    EAX
+  1156 00000AA6 8B 45 C8                               MOV     EAX,DWORD [-56+EBP]
+  1157 00000AA9 05 00000094                            ADD     EAX,148
+  1158 00000AAE 50                                     PUSH    EAX
+  1159 00000AAF E8 [00000000]                          CALL    _set_segmdesc
+  1160 00000AB4 8B 45 C4                               MOV     EAX,DWORD [-60+EBP]
+  1161 00000AB7 68 000040F2                            PUSH    16626
+  1162 00000ABC 48                                     DEC     EAX
+  1163 00000ABD 57                                     PUSH    EDI
+  1164 00000ABE 50                                     PUSH    EAX
+  1165 00000ABF 8B 45 C8                               MOV     EAX,DWORD [-56+EBP]
+  1166 00000AC2 05 0000009C                            ADD     EAX,156
+  1167 00000AC7 50                                     PUSH    EAX
+  1168 00000AC8 E8 [00000000]                          CALL    _set_segmdesc
+  1169 00000ACD 83 C4 28                               ADD     ESP,40
+  1170 00000AD0 85 DB                                  TEST    EBX,EBX
+  1171 00000AD2 7E 16                                  JLE     L231
+  1172 00000AD4 8B 45 CC                               MOV     EAX,DWORD [-52+EBP]
+  1173 00000AD7 8B 4D C0                               MOV     ECX,DWORD [-64+EBP]
+  1174 00000ADA 01 F9                                  ADD     ECX,EDI
+  1175 00000ADC 8D 14 30                               LEA     EDX,DWORD [EAX+ESI*1]
+  1176 00000ADF 89 DE                                  MOV     ESI,EBX
+  1177 00000AE1                                 L215:
+  1178 00000AE1 8A 02                                  MOV     AL,BYTE [EDX]
+  1179 00000AE3 42                                     INC     EDX
+  1180 00000AE4 88 01                                  MOV     BYTE [ECX],AL
+  1181 00000AE6 41                                     INC     ECX
+  1182 00000AE7 4E                                     DEC     ESI
+  1183 00000AE8 75 F7                                  JNE     L215
+  1184 00000AEA                                 L231:
+  1185 00000AEA 8B 45 C8                               MOV     EAX,DWORD [-56+EBP]
+  1186 00000AED BE 000000FF                            MOV     ESI,255
+  1187 00000AF2 83 C0 30                               ADD     EAX,48
+  1188 00000AF5 50                                     PUSH    EAX
+  1189 00000AF6 6A 0C                                  PUSH    12
+  1190 00000AF8 FF 75 C0                               PUSH    DWORD [-64+EBP]
+  1191 00000AFB 6A 04                                  PUSH    4
+  1192 00000AFD 6A 1B                                  PUSH    27
+  1193 00000AFF E8 [00000000]                          CALL    _start_app
+  1194 00000B04 8B 1D 00000FE4                         MOV     EBX,DWORD [4068]
+  1195 00000B0A 83 C4 14                               ADD     ESP,20
+  1196 00000B0D 81 C3 00000414                         ADD     EBX,1044
+  1197 00000B13                                 L221:
+  1198 00000B13 8B 43 1C                               MOV     EAX,DWORD [28+EBX]
+  1199 00000B16 83 E0 11                               AND     EAX,17
+  1200 00000B19 83 F8 11                               CMP     EAX,17
+  1201 00000B1C 74 7A                                  JE      L239
+  1202 00000B1E                                 L218:
+  1203 00000B1E 83 C3 28                               ADD     EBX,40
+  1204 00000B21 4E                                     DEC     ESI
+  1205 00000B22 79 EF                                  JNS     L221
+  1206 00000B24 31 DB                                  XOR     EBX,EBX
+  1207 00000B26 BE 00000007                            MOV     ESI,7
+  1208 00000B2B                                 L227:
+  1209 00000B2B 8B 55 C8                               MOV     EDX,DWORD [-56+EBP]
+  1210 00000B2E 8B 82 000000B0                         MOV     EAX,DWORD [176+EDX]
+  1211 00000B34 83 3C 18 00                            CMP     DWORD [EAX+EBX*1],0
+  1212 00000B38 75 32                                  JNE     L240
+  1213 00000B3A                                 L224:
+  1214 00000B3A 83 C3 0C                               ADD     EBX,12
+  1215 00000B3D 4E                                     DEC     ESI
+  1216 00000B3E 79 EB                                  JNS     L227
+  1217 00000B40 8B 45 C8                               MOV     EAX,DWORD [-56+EBP]
+  1218 00000B43 83 C0 10                               ADD     EAX,16
+  1219 00000B46 50                                     PUSH    EAX
+  1220 00000B47 E8 [00000000]                          CALL    _timer_cancelall
+  1221 00000B4C FF 75 C4                               PUSH    DWORD [-60+EBP]
+  1222 00000B4F 57                                     PUSH    EDI
+  1223 00000B50 68 003C0000                            PUSH    3932160
+  1224 00000B55 E8 [00000000]                          CALL    _memman_free_4k
+  1225 00000B5A 83 C4 10                               ADD     ESP,16
+  1226 00000B5D 8B 45 C8                               MOV     EAX,DWORD [-56+EBP]
+  1227 00000B60 C6 80 000000BD 00                      MOV     BYTE [189+EAX],0
+  1228 00000B67 E9 FFFFFEDC                            JMP     L228
+  1229 00000B6C                                 L240:
+  1230 00000B6C FF 74 18 04                            PUSH    DWORD [4+EAX+EBX*1]
+  1231 00000B70 8B 82 000000B0                         MOV     EAX,DWORD [176+EDX]
+  1232 00000B76 FF 34 18                               PUSH    DWORD [EAX+EBX*1]
+  1233 00000B79 68 003C0000                            PUSH    3932160
+  1234 00000B7E E8 [00000000]                          CALL    _memman_free_4k
+  1235 00000B83 83 C4 0C                               ADD     ESP,12
+  1236 00000B86 8B 55 C8                               MOV     EDX,DWORD [-56+EBP]
+  1237 00000B89 8B 82 000000B0                         MOV     EAX,DWORD [176+EDX]
+  1238 00000B8F C7 04 18 00000000                      MOV     DWORD [EAX+EBX*1],0
+  1239 00000B96 EB A2                                  JMP     L224
+  1240 00000B98                                 L239:
+  1241 00000B98 8B 55 C8                               MOV     EDX,DWORD [-56+EBP]
+  1242 00000B9B 39 53 24                               CMP     DWORD [36+EBX],EDX
+  1243 00000B9E 0F 85 FFFFFF7A                         JNE     L218
+  1244 00000BA4 53                                     PUSH    EBX
+  1245 00000BA5 E8 [00000000]                          CALL    _sheet_free
+  1246 00000BAA 59                                     POP     ECX
+  1247 00000BAB E9 FFFFFF6E                            JMP     L218
+  1248 00000BB0                                 L237:
+  1249 00000BB0 80 7C 35 D3 2E                         CMP     BYTE [-45+EBP+ESI*1],46
+  1250 00000BB5 74 2E                                  JE      L208
+  1251 00000BB7 68 000000E0                            PUSH    224
+  1252 00000BBC 68 00102600                            PUSH    1058304
+  1253 00000BC1 53                                     PUSH    EBX
+  1254 00000BC2 C6 44 35 D4 2E                         MOV     BYTE [-44+EBP+ESI*1],46
+  1255 00000BC7 C6 44 35 D5 48                         MOV     BYTE [-43+EBP+ESI*1],72
+  1256 00000BCC C6 44 35 D6 52                         MOV     BYTE [-42+EBP+ESI*1],82
+  1257 00000BD1 C6 44 35 D7 42                         MOV     BYTE [-41+EBP+ESI*1],66
+  1258 00000BD6 C6 44 35 D8 00                         MOV     BYTE [-40+EBP+ESI*1],0
+  1259 00000BDB E8 [00000000]                          CALL    _file_search
+  1260 00000BE0 83 C4 0C                               ADD     ESP,12
+  1261 00000BE3 89 C2                                  MOV     EDX,EAX
+  1262 00000BE5                                 L208:
+  1263 00000BE5 85 D2                                  TEST    EDX,EDX
+  1264 00000BE7 0F 85 FFFFFE0D                         JNE     L236
+  1265 00000BED 31 C0                                  XOR     EAX,EAX
+  1266 00000BEF E9 FFFFFE71                            JMP     L201
+  1267 00000BF4                                        GLOBAL  _hrb_api
+  1268 00000BF4                                 _hrb_api:
+  1269 00000BF4 55                                     PUSH    EBP
+  1270 00000BF5 89 E5                                  MOV     EBP,ESP
+  1271 00000BF7 57                                     PUSH    EDI
+  1272 00000BF8 56                                     PUSH    ESI
+  1273 00000BF9 53                                     PUSH    EBX
+  1274 00000BFA 83 EC 14                               SUB     ESP,20
+  1275 00000BFD 8B 75 1C                               MOV     ESI,DWORD [28+EBP]
+  1276 00000C00 E8 [00000000]                          CALL    _task_now
+  1277 00000C05 8B 0D 00000FE4                         MOV     ECX,DWORD [4068]
+  1278 00000C0B 83 FE 01                               CMP     ESI,1
+  1279 00000C0E 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+  1280 00000C11 89 4D E8                               MOV     DWORD [-24+EBP],ECX
+  1281 00000C14 8B 80 000000A8                         MOV     EAX,DWORD [168+EAX]
+  1282 00000C1A 8B 55 F0                               MOV     EDX,DWORD [-16+EBP]
+  1283 00000C1D 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+  1284 00000C20 A1 00000FEC                            MOV     EAX,DWORD [4076]
+  1285 00000C25 8B 9A 000000A4                         MOV     EBX,DWORD [164+EDX]
+  1286 00000C2B 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+  1287 00000C2E 0F 84 0000066C                         JE      L355
+  1288 00000C34 83 FE 02                               CMP     ESI,2
+  1289 00000C37 0F 84 00000651                         JE      L356
+  1290 00000C3D 83 FE 03                               CMP     ESI,3
+  1291 00000C40 0F 84 00000633                         JE      L357
+  1292 00000C46 83 FE 04                               CMP     ESI,4
+  1293 00000C49 0F 84 0000061F                         JE      L358
+  1294 00000C4F 83 FE 05                               CMP     ESI,5
+  1295 00000C52 0F 84 0000059B                         JE      L359
+  1296 00000C58 83 FE 06                               CMP     ESI,6
+  1297 00000C5B 0F 84 00000546                         JE      L360
+  1298 00000C61 83 FE 07                               CMP     ESI,7
+  1299 00000C64 0F 84 00000507                         JE      L361
+  1300 00000C6A 83 FE 08                               CMP     ESI,8
+  1301 00000C6D 0F 84 000004DA                         JE      L362
+  1302 00000C73 83 FE 09                               CMP     ESI,9
+  1303 00000C76 0F 84 000004B3                         JE      L363
+  1304 00000C7C 83 FE 0A                               CMP     ESI,10
+  1305 00000C7F 0F 84 0000048C                         JE      L364
+  1306 00000C85 83 FE 0B                               CMP     ESI,11
+  1307 00000C88 0F 84 0000044C                         JE      L365
+  1308 00000C8E 83 FE 0C                               CMP     ESI,12
+  1309 00000C91 0F 84 00000432                         JE      L366
+  1310 00000C97 83 FE 0D                               CMP     ESI,13
+  1311 00000C9A 0F 84 000003BE                         JE      L367
+  1312 00000CA0 83 FE 0E                               CMP     ESI,14
+  1313 00000CA3 0F 84 000003A8                         JE      L368
+  1314 00000CA9 83 FE 0F                               CMP     ESI,15
+  1315 00000CAC 0F 84 000002B7                         JE      L277
+  1316 00000CB2 83 FE 10                               CMP     ESI,16
+  1317 00000CB5 0F 84 0000029D                         JE      L369
+  1318 00000CBB 83 FE 11                               CMP     ESI,17
+  1319 00000CBE 0F 84 00000277                         JE      L370
+  1320 00000CC4 83 FE 12                               CMP     ESI,18
+  1321 00000CC7 0F 84 0000025C                         JE      L371
+  1322 00000CCD 83 FE 13                               CMP     ESI,19
+  1323 00000CD0 0F 84 00000245                         JE      L372
+  1324 00000CD6 83 FE 14                               CMP     ESI,20
+  1325 00000CD9 0F 84 000001C9                         JE      L373
+  1326 00000CDF 83 FE 15                               CMP     ESI,21
+  1327 00000CE2 0F 84 0000013D                         JE      L374
+  1328 00000CE8 83 FE 16                               CMP     ESI,22
+  1329 00000CEB 0F 84 00000114                         JE      L375
+  1330 00000CF1 83 FE 17                               CMP     ESI,23
+  1331 00000CF4 0F 84 000000BD                         JE      L376
+  1332 00000CFA 83 FE 18                               CMP     ESI,24
+  1333 00000CFD 0F 84 00000083                         JE      L377
+  1334 00000D03 83 FE 19                               CMP     ESI,25
+  1335 00000D06 74 53                                  JE      L378
+  1336 00000D08 83 FE 1A                               CMP     ESI,26
+  1337 00000D0B 74 1E                                  JE      L379
+  1338 00000D0D 83 FE 1B                               CMP     ESI,27
+  1339 00000D10 74 0A                                  JE      L380
+  1340 00000D12                                 L243:
+  1341 00000D12 31 C0                                  XOR     EAX,EAX
+  1342 00000D14                                 L241:
+  1343 00000D14 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1344 00000D17 5B                                     POP     EBX
+  1345 00000D18 5E                                     POP     ESI
+  1346 00000D19 5F                                     POP     EDI
+  1347 00000D1A 5D                                     POP     EBP
+  1348 00000D1B C3                                     RET
+  1349 00000D1C                                 L380:
+  1350 00000D1C 8B 5D F0                               MOV     EBX,DWORD [-16+EBP]
+  1351 00000D1F 0F B6 83 000000BC                      MOVZX   EAX,BYTE [188+EBX]
+  1352 00000D26                                 L348:
+  1353 00000D26 89 45 44                               MOV     DWORD [68+EBP],EAX
+  1354 00000D29 EB E7                                  JMP     L243
+  1355 00000D2B                                 L379:
+  1356 00000D2B 31 F6                                  XOR     ESI,ESI
+  1357 00000D2D                                 L338:
+  1358 00000D2D 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+  1359 00000D30 8B 55 18                               MOV     EDX,DWORD [24+EBP]
+  1360 00000D33 03 55 EC                               ADD     EDX,DWORD [-20+EBP]
+  1361 00000D36 8B 81 000000B8                         MOV     EAX,DWORD [184+ECX]
+  1362 00000D3C 8A 04 06                               MOV     AL,BYTE [ESI+EAX*1]
+  1363 00000D3F 88 04 16                               MOV     BYTE [ESI+EDX*1],AL
+  1364 00000D42 8B 81 000000B8                         MOV     EAX,DWORD [184+ECX]
+  1365 00000D48 80 3C 06 00                            CMP     BYTE [ESI+EAX*1],0
+  1366 00000D4C 74 08                                  JE      L339
+  1367 00000D4E 3B 75 20                               CMP     ESI,DWORD [32+EBP]
+  1368 00000D51 7D 03                                  JGE     L339
+  1369 00000D53 46                                     INC     ESI
+  1370 00000D54 EB D7                                  JMP     L338
+  1371 00000D56                                 L339:
+  1372 00000D56 89 75 44                               MOV     DWORD [68+EBP],ESI
+  1373 00000D59 EB B7                                  JMP     L243
+  1374 00000D5B                                 L378:
+  1375 00000D5B 31 F6                                  XOR     ESI,ESI
+  1376 00000D5D 8B 5D 24                               MOV     EBX,DWORD [36+EBP]
+  1377 00000D60 3B 75 20                               CMP     ESI,DWORD [32+EBP]
+  1378 00000D63 7D F1                                  JGE     L339
+  1379 00000D65                                 L335:
+  1380 00000D65 8B 4B 08                               MOV     ECX,DWORD [8+EBX]
+  1381 00000D68 3B 4B 04                               CMP     ECX,DWORD [4+EBX]
+  1382 00000D6B 74 E9                                  JE      L339
+  1383 00000D6D 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+  1384 00000D70 8B 13                                  MOV     EDX,DWORD [EBX]
+  1385 00000D72 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1386 00000D75 8A 14 11                               MOV     DL,BYTE [ECX+EDX*1]
+  1387 00000D78 88 14 06                               MOV     BYTE [ESI+EAX*1],DL
+  1388 00000D7B 46                                     INC     ESI
+  1389 00000D7C FF 43 08                               INC     DWORD [8+EBX]
+  1390 00000D7F 3B 75 20                               CMP     ESI,DWORD [32+EBP]
+  1391 00000D82 7C E1                                  JL      L335
+  1392 00000D84 EB D0                                  JMP     L339
+  1393 00000D86                                 L377:
+  1394 00000D86 8B 5D 24                               MOV     EBX,DWORD [36+EBP]
+  1395 00000D89 83 7D 20 00                            CMP     DWORD [32+EBP],0
+  1396 00000D8D 75 05                                  JNE     L323
+  1397 00000D8F 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+  1398 00000D92 EB 92                                  JMP     L348
+  1399 00000D94                                 L323:
+  1400 00000D94 83 7D 20 01                            CMP     DWORD [32+EBP],1
+  1401 00000D98 74 15                                  JE      L381
+  1402 00000D9A 83 7D 20 02                            CMP     DWORD [32+EBP],2
+  1403 00000D9E 0F 85 FFFFFF6E                         JNE     L243
+  1404 00000DA4 8B 43 08                               MOV     EAX,DWORD [8+EBX]
+  1405 00000DA7 2B 43 04                               SUB     EAX,DWORD [4+EBX]
+  1406 00000DAA E9 FFFFFF77                            JMP     L348
+  1407 00000DAF                                 L381:
+  1408 00000DAF 8B 43 08                               MOV     EAX,DWORD [8+EBX]
+  1409 00000DB2 E9 FFFFFF6F                            JMP     L348
+  1410 00000DB7                                 L376:
+  1411 00000DB7 8B 5D 24                               MOV     EBX,DWORD [36+EBP]
+  1412 00000DBA 83 7D 20 00                            CMP     DWORD [32+EBP],0
+  1413 00000DBE 74 35                                  JE      L347
+  1414 00000DC0 83 7D 20 01                            CMP     DWORD [32+EBP],1
+  1415 00000DC4 74 37                                  JE      L382
+  1416 00000DC6 83 7D 20 02                            CMP     DWORD [32+EBP],2
+  1417 00000DCA 74 23                                  JE      L383
+  1418 00000DCC                                 L315:
+  1419 00000DCC 83 7B 08 00                            CMP     DWORD [8+EBX],0
+  1420 00000DD0 78 14                                  JS      L384
+  1421 00000DD2                                 L319:
+  1422 00000DD2 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+  1423 00000DD5 39 43 08                               CMP     DWORD [8+EBX],EAX
+  1424 00000DD8 0F 8E FFFFFF34                         JLE     L243
+  1425 00000DDE 89 43 08                               MOV     DWORD [8+EBX],EAX
+  1426 00000DE1 E9 FFFFFF2C                            JMP     L243
+  1427 00000DE6                                 L384:
+  1428 00000DE6 C7 43 08 00000000                      MOV     DWORD [8+EBX],0
+  1429 00000DED EB E3                                  JMP     L319
+  1430 00000DEF                                 L383:
+  1431 00000DEF 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+  1432 00000DF2 01 45 18                               ADD     DWORD [24+EBP],EAX
+  1433 00000DF5                                 L347:
+  1434 00000DF5 8B 55 18                               MOV     EDX,DWORD [24+EBP]
+  1435 00000DF8 89 53 08                               MOV     DWORD [8+EBX],EDX
+  1436 00000DFB EB CF                                  JMP     L315
+  1437 00000DFD                                 L382:
+  1438 00000DFD 8B 4D 18                               MOV     ECX,DWORD [24+EBP]
+  1439 00000E00 01 4B 08                               ADD     DWORD [8+EBX],ECX
+  1440 00000E03 EB C7                                  JMP     L315
+  1441 00000E05                                 L375:
+  1442 00000E05 8B 5D 24                               MOV     EBX,DWORD [36+EBP]
+  1443 00000E08 FF 73 04                               PUSH    DWORD [4+EBX]
+  1444 00000E0B FF 33                                  PUSH    DWORD [EBX]
+  1445 00000E0D 68 003C0000                            PUSH    3932160
+  1446 00000E12 E8 [00000000]                          CALL    _memman_free_4k
+  1447 00000E17 C7 03 00000000                         MOV     DWORD [EBX],0
+  1448 00000E1D                                 L349:
+  1449 00000E1D 83 C4 0C                               ADD     ESP,12
+  1450 00000E20 E9 FFFFFEED                            JMP     L243
+  1451 00000E25                                 L374:
+  1452 00000E25 31 F6                                  XOR     ESI,ESI
+  1453 00000E27 31 C0                                  XOR     EAX,EAX
+  1454 00000E29                                 L307:
+  1455 00000E29 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+  1456 00000E2C 8B 91 000000B0                         MOV     EDX,DWORD [176+ECX]
+  1457 00000E32 83 3C 02 00                            CMP     DWORD [EDX+EAX*1],0
+  1458 00000E36 74 09                                  JE      L303
+  1459 00000E38 46                                     INC     ESI
+  1460 00000E39 83 C0 0C                               ADD     EAX,12
+  1461 00000E3C 83 FE 07                               CMP     ESI,7
+  1462 00000E3F 7E E8                                  JLE     L307
+  1463 00000E41                                 L303:
+  1464 00000E41 6B C6 0C                               IMUL    EAX,ESI,12
+  1465 00000E44 C7 45 44 00000000                      MOV     DWORD [68+EBP],0
+  1466 00000E4B 8D 1C 10                               LEA     EBX,DWORD [EAX+EDX*1]
+  1467 00000E4E 83 FE 07                               CMP     ESI,7
+  1468 00000E51 0F 8F FFFFFEBB                         JG      L243
+  1469 00000E57 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+  1470 00000E5A 68 000000E0                            PUSH    224
+  1471 00000E5F 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1472 00000E62 68 00102600                            PUSH    1058304
+  1473 00000E67 50                                     PUSH    EAX
+  1474 00000E68 E8 [00000000]                          CALL    _file_search
+  1475 00000E6D 83 C4 0C                               ADD     ESP,12
+  1476 00000E70 89 C2                                  MOV     EDX,EAX
+  1477 00000E72 85 C0                                  TEST    EAX,EAX
+  1478 00000E74 0F 84 FFFFFE98                         JE      L243
+  1479 00000E7A 89 5D 44                               MOV     DWORD [68+EBP],EBX
+  1480 00000E7D 8B 40 1C                               MOV     EAX,DWORD [28+EAX]
+  1481 00000E80 89 43 04                               MOV     DWORD [4+EBX],EAX
+  1482 00000E83 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+  1483 00000E86 C7 43 08 00000000                      MOV     DWORD [8+EBX],0
+  1484 00000E8D FF B0 000000B4                         PUSH    DWORD [180+EAX]
+  1485 00000E93 8D 43 04                               LEA     EAX,DWORD [4+EBX]
+  1486 00000E96 50                                     PUSH    EAX
+  1487 00000E97 0F B7 42 1A                            MOVZX   EAX,WORD [26+EDX]
+  1488 00000E9B 50                                     PUSH    EAX
+  1489 00000E9C E8 [00000000]                          CALL    _file_loadfile2
+  1490 00000EA1 89 03                                  MOV     DWORD [EBX],EAX
+  1491 00000EA3 E9 FFFFFF75                            JMP     L349
+  1492 00000EA8                                 L373:
+  1493 00000EA8 8B 55 24                               MOV     EDX,DWORD [36+EBP]
+  1494 00000EAB 85 D2                                  TEST    EDX,EDX
+  1495 00000EAD 75 19                                  JNE     L298
+  1496 00000EAF 6A 61                                  PUSH    97
+  1497 00000EB1 E8 [00000000]                          CALL    _io_in8
+  1498 00000EB6 89 C6                                  MOV     ESI,EAX
+  1499 00000EB8 83 E6 0D                               AND     ESI,13
+  1500 00000EBB 56                                     PUSH    ESI
+  1501 00000EBC 6A 61                                  PUSH    97
+  1502 00000EBE E8 [00000000]                          CALL    _io_out8
+  1503 00000EC3 E9 FFFFFF55                            JMP     L349
+  1504 00000EC8                                 L298:
+  1505 00000EC8 B9 471E7B60                            MOV     ECX,1193180000
+  1506 00000ECD 89 D3                                  MOV     EBX,EDX
+  1507 00000ECF 89 C8                                  MOV     EAX,ECX
+  1508 00000ED1 68 000000B6                            PUSH    182
+  1509 00000ED6 99                                     CDQ
+  1510 00000ED7 F7 FB                                  IDIV    EBX
+  1511 00000ED9 6A 43                                  PUSH    67
+  1512 00000EDB 89 C6                                  MOV     ESI,EAX
+  1513 00000EDD E8 [00000000]                          CALL    _io_out8
+  1514 00000EE2 89 F0                                  MOV     EAX,ESI
+  1515 00000EE4 C1 FE 08                               SAR     ESI,8
+  1516 00000EE7 25 000000FF                            AND     EAX,255
+  1517 00000EEC 50                                     PUSH    EAX
+  1518 00000EED 6A 42                                  PUSH    66
+  1519 00000EEF E8 [00000000]                          CALL    _io_out8
+  1520 00000EF4 56                                     PUSH    ESI
+  1521 00000EF5 6A 42                                  PUSH    66
+  1522 00000EF7 E8 [00000000]                          CALL    _io_out8
+  1523 00000EFC 6A 61                                  PUSH    97
+  1524 00000EFE E8 [00000000]                          CALL    _io_in8
+  1525 00000F03 89 C6                                  MOV     ESI,EAX
+  1526 00000F05 83 CE 03                               OR      ESI,3
+  1527 00000F08 83 E6 0F                               AND     ESI,15
+  1528 00000F0B 56                                     PUSH    ESI
+  1529 00000F0C 6A 61                                  PUSH    97
+  1530 00000F0E E8 [00000000]                          CALL    _io_out8
+  1531 00000F13 83 C4 24                               ADD     ESP,36
+  1532 00000F16 E9 FFFFFDF7                            JMP     L243
+  1533 00000F1B                                 L372:
+  1534 00000F1B FF 75 18                               PUSH    DWORD [24+EBP]
+  1535 00000F1E E8 [00000000]                          CALL    _timer_free
+  1536 00000F23                                 L350:
+  1537 00000F23 5B                                     POP     EBX
+  1538 00000F24 E9 FFFFFDE9                            JMP     L243
+  1539 00000F29                                 L371:
+  1540 00000F29 FF 75 24                               PUSH    DWORD [36+EBP]
+  1541 00000F2C FF 75 18                               PUSH    DWORD [24+EBP]
+  1542 00000F2F E8 [00000000]                          CALL    _timer_settime
+  1543 00000F34                                 L352:
+  1544 00000F34 5E                                     POP     ESI
+  1545 00000F35 5F                                     POP     EDI
+  1546 00000F36 E9 FFFFFDD7                            JMP     L243
+  1547 00000F3B                                 L370:
+  1548 00000F3B 8B 45 24                               MOV     EAX,DWORD [36+EBP]
+  1549 00000F3E 05 00000100                            ADD     EAX,256
+  1550 00000F43 50                                     PUSH    EAX
+  1551 00000F44 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+  1552 00000F47 83 C0 10                               ADD     EAX,16
+  1553 00000F4A 50                                     PUSH    EAX
+  1554 00000F4B FF 75 18                               PUSH    DWORD [24+EBP]
+  1555 00000F4E E8 [00000000]                          CALL    _timer_init
+  1556 00000F53 E9 FFFFFEC5                            JMP     L349
+  1557 00000F58                                 L369:
+  1558 00000F58 E8 [00000000]                          CALL    _timer_alloc
+  1559 00000F5D 89 45 44                               MOV     DWORD [68+EBP],EAX
+  1560 00000F60 C6 40 09 01                            MOV     BYTE [9+EAX],1
+  1561 00000F64 E9 FFFFFDA9                            JMP     L243
+  1562 00000F69                                 L277:
+  1563 00000F69 E8 [00000000]                          CALL    _io_cli
+  1564 00000F6E 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+  1565 00000F71 83 C0 10                               ADD     EAX,16
+  1566 00000F74 50                                     PUSH    EAX
+  1567 00000F75 E8 [00000000]                          CALL    _fifo32_status
+  1568 00000F7A 5A                                     POP     EDX
+  1569 00000F7B 85 C0                                  TEST    EAX,EAX
+  1570 00000F7D 75 13                                  JNE     L280
+  1571 00000F7F 83 7D 24 00                            CMP     DWORD [36+EBP],0
+  1572 00000F83 0F 84 000000B7                         JE      L281
+  1573 00000F89 FF 75 F0                               PUSH    DWORD [-16+EBP]
+  1574 00000F8C E8 [00000000]                          CALL    _task_sleep
+  1575 00000F91 58                                     POP     EAX
+  1576 00000F92                                 L280:
+  1577 00000F92 8B 7D F0                               MOV     EDI,DWORD [-16+EBP]
+  1578 00000F95 83 C7 10                               ADD     EDI,16
+  1579 00000F98 57                                     PUSH    EDI
+  1580 00000F99 E8 [00000000]                          CALL    _fifo32_get
+  1581 00000F9E 89 C6                                  MOV     ESI,EAX
+  1582 00000FA0 E8 [00000000]                          CALL    _io_sti
+  1583 00000FA5 58                                     POP     EAX
+  1584 00000FA6 83 FE 01                               CMP     ESI,1
+  1585 00000FA9 7E 73                                  JLE     L385
+  1586 00000FAB                                 L283:
+  1587 00000FAB 83 FE 02                               CMP     ESI,2
+  1588 00000FAE 74 65                                  JE      L386
+  1589 00000FB0                                 L284:
+  1590 00000FB0 83 FE 03                               CMP     ESI,3
+  1591 00000FB3 74 57                                  JE      L387
+  1592 00000FB5                                 L285:
+  1593 00000FB5 83 FE 04                               CMP     ESI,4
+  1594 00000FB8 74 14                                  JE      L388
+  1595 00000FBA                                 L286:
+  1596 00000FBA 8D 86 FFFFFF00                         LEA     EAX,DWORD [-256+ESI]
+  1597 00000FC0 81 FE 000000FF                         CMP     ESI,255
+  1598 00000FC6 0F 8F FFFFFD5A                         JG      L348
+  1599 00000FCC EB 9B                                  JMP     L277
+  1600 00000FCE                                 L388:
+  1601 00000FCE FF 73 10                               PUSH    DWORD [16+EBX]
+  1602 00000FD1 E8 [00000000]                          CALL    _timer_cancel
+  1603 00000FD6 E8 [00000000]                          CALL    _io_cli
+  1604 00000FDB 8B 03                                  MOV     EAX,DWORD [EBX]
+  1605 00000FDD 2B 45 E8                               SUB     EAX,DWORD [-24+EBP]
+  1606 00000FE0 2D 00000414                            SUB     EAX,1044
+  1607 00000FE5 C1 F8 03                               SAR     EAX,3
+  1608 00000FE8 69 C0 CCCCCCCD                         IMUL    EAX,EAX,-858993459
+  1609 00000FEE 05 000007E8                            ADD     EAX,2024
+  1610 00000FF3 50                                     PUSH    EAX
+  1611 00000FF4 FF 75 E4                               PUSH    DWORD [-28+EBP]
+  1612 00000FF7 E8 [00000000]                          CALL    _fifo32_put
+  1613 00000FFC C7 03 00000000                         MOV     DWORD [EBX],0
+  1614 00001002 E8 [00000000]                          CALL    _io_sti
+  1615 00001007 83 C4 0C                               ADD     ESP,12
+  1616 0000100A EB AE                                  JMP     L286
+  1617 0000100C                                 L387:
+  1618 0000100C C7 43 0C FFFFFFFF                      MOV     DWORD [12+EBX],-1
+  1619 00001013 EB A0                                  JMP     L285
+  1620 00001015                                 L386:
+  1621 00001015 C7 43 0C 00000007                      MOV     DWORD [12+EBX],7
+  1622 0000101C EB 92                                  JMP     L284
+  1623 0000101E                                 L385:
+  1624 0000101E 83 3B 00                               CMP     DWORD [EBX],0
+  1625 00001021 74 88                                  JE      L283
+  1626 00001023 6A 01                                  PUSH    1
+  1627 00001025 57                                     PUSH    EDI
+  1628 00001026 FF 73 10                               PUSH    DWORD [16+EBX]
+  1629 00001029 E8 [00000000]                          CALL    _timer_init
+  1630 0000102E 6A 32                                  PUSH    50
+  1631 00001030 FF 73 10                               PUSH    DWORD [16+EBX]
+  1632 00001033 E8 [00000000]                          CALL    _timer_settime
+  1633 00001038 83 C4 14                               ADD     ESP,20
+  1634 0000103B E9 FFFFFF6B                            JMP     L283
+  1635 00001040                                 L281:
+  1636 00001040 E8 [00000000]                          CALL    _io_sti
+  1637 00001045 C7 45 44 FFFFFFFF                      MOV     DWORD [68+EBP],-1
+  1638 0000104C E9 FFFFFCC1                            JMP     L243
+  1639 00001051                                 L368:
+  1640 00001051 FF 75 18                               PUSH    DWORD [24+EBP]
+  1641 00001054 E8 [00000000]                          CALL    _sheet_free
+  1642 00001059 E9 FFFFFEC5                            JMP     L350
+  1643 0000105E                                 L367:
+  1644 0000105E FF 75 10                               PUSH    DWORD [16+EBP]
+  1645 00001061 FF 75 08                               PUSH    DWORD [8+EBP]
+  1646 00001064 FF 75 0C                               PUSH    DWORD [12+EBP]
+  1647 00001067 FF 75 20                               PUSH    DWORD [32+EBP]
+  1648 0000106A 8B 7D 18                               MOV     EDI,DWORD [24+EBP]
+  1649 0000106D FF 75 24                               PUSH    DWORD [36+EBP]
+  1650 00001070 83 E7 FE                               AND     EDI,-2
+  1651 00001073 57                                     PUSH    EDI
+  1652 00001074 E8 000002CB                            CALL    _hrb_api_linewin
+  1653 00001079 83 C4 18                               ADD     ESP,24
+  1654 0000107C F7 45 18 00000001                      TEST    DWORD [24+EBP],1
+  1655 00001083 0F 85 FFFFFC89                         JNE     L243
+  1656 00001089 8B 45 24                               MOV     EAX,DWORD [36+EBP]
+  1657 0000108C 3B 45 0C                               CMP     EAX,DWORD [12+EBP]
+  1658 0000108F 7E 09                                  JLE     L271
+  1659 00001091 8B 4D 0C                               MOV     ECX,DWORD [12+EBP]
+  1660 00001094 89 45 0C                               MOV     DWORD [12+EBP],EAX
+  1661 00001097 89 4D 24                               MOV     DWORD [36+EBP],ECX
+  1662 0000109A                                 L271:
+  1663 0000109A 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+  1664 0000109D 39 5D 20                               CMP     DWORD [32+EBP],EBX
+  1665 000010A0 7E 09                                  JLE     L272
+  1666 000010A2 8B 75 20                               MOV     ESI,DWORD [32+EBP]
+  1667 000010A5 89 5D 20                               MOV     DWORD [32+EBP],EBX
+  1668 000010A8 89 75 08                               MOV     DWORD [8+EBP],ESI
+  1669 000010AB                                 L272:
+  1670 000010AB 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1671 000010AE 40                                     INC     EAX
+  1672 000010AF 50                                     PUSH    EAX
+  1673 000010B0 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+  1674 000010B3 40                                     INC     EAX
+  1675 000010B4 50                                     PUSH    EAX
+  1676 000010B5 FF 75 20                               PUSH    DWORD [32+EBP]
+  1677 000010B8 FF 75 24                               PUSH    DWORD [36+EBP]
+  1678 000010BB                                 L354:
+  1679 000010BB 57                                     PUSH    EDI
+  1680 000010BC                                 L351:
+  1681 000010BC E8 [00000000]                          CALL    _sheet_refresh
+  1682 000010C1                                 L353:
+  1683 000010C1 83 C4 14                               ADD     ESP,20
+  1684 000010C4 E9 FFFFFC49                            JMP     L243
+  1685 000010C9                                 L366:
+  1686 000010C9 FF 75 08                               PUSH    DWORD [8+EBP]
+  1687 000010CC FF 75 0C                               PUSH    DWORD [12+EBP]
+  1688 000010CF FF 75 20                               PUSH    DWORD [32+EBP]
+  1689 000010D2 FF 75 24                               PUSH    DWORD [36+EBP]
+  1690 000010D5 FF 75 18                               PUSH    DWORD [24+EBP]
+  1691 000010D8 EB E2                                  JMP     L351
+  1692 000010DA                                 L365:
+  1693 000010DA 8B 7D 18                               MOV     EDI,DWORD [24+EBP]
+  1694 000010DD 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1695 000010E0 83 E7 FE                               AND     EDI,-2
+  1696 000010E3 8A 55 24                               MOV     DL,BYTE [36+EBP]
+  1697 000010E6 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+  1698 000010EA 03 45 0C                               ADD     EAX,DWORD [12+EBP]
+  1699 000010ED 8B 0F                                  MOV     ECX,DWORD [EDI]
+  1700 000010EF 88 14 08                               MOV     BYTE [EAX+ECX*1],DL
+  1701 000010F2 F7 45 18 00000001                      TEST    DWORD [24+EBP],1
+  1702 000010F9 0F 85 FFFFFC13                         JNE     L243
+  1703 000010FF 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1704 00001102 40                                     INC     EAX
+  1705 00001103 50                                     PUSH    EAX
+  1706 00001104 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+  1707 00001107 40                                     INC     EAX
+  1708 00001108 50                                     PUSH    EAX
+  1709 00001109 FF 75 08                               PUSH    DWORD [8+EBP]
+  1710 0000110C FF 75 0C                               PUSH    DWORD [12+EBP]
+  1711 0000110F EB AA                                  JMP     L354
+  1712 00001111                                 L364:
+  1713 00001111 8B 45 20                               MOV     EAX,DWORD [32+EBP]
+  1714 00001114 83 C0 0F                               ADD     EAX,15
+  1715 00001117 83 E0 F0                               AND     EAX,-16
+  1716 0000111A 50                                     PUSH    EAX
+  1717 0000111B 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+  1718 0000111E 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1719 00001121 FF 75 24                               PUSH    DWORD [36+EBP]
+  1720 00001124 50                                     PUSH    EAX
+  1721 00001125 E8 [00000000]                          CALL    _memman_free
+  1722 0000112A E9 FFFFFCEE                            JMP     L349
+  1723 0000112F                                 L363:
+  1724 0000112F 8B 45 20                               MOV     EAX,DWORD [32+EBP]
+  1725 00001132 83 C0 0F                               ADD     EAX,15
+  1726 00001135 83 E0 F0                               AND     EAX,-16
+  1727 00001138 50                                     PUSH    EAX
+  1728 00001139 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+  1729 0000113C 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1730 0000113F 50                                     PUSH    EAX
+  1731 00001140 E8 [00000000]                          CALL    _memman_alloc
+  1732 00001145 89 45 44                               MOV     DWORD [68+EBP],EAX
+  1733 00001148 E9 FFFFFDE7                            JMP     L352
+  1734 0000114D                                 L362:
+  1735 0000114D 8B 5D 18                               MOV     EBX,DWORD [24+EBP]
+  1736 00001150 03 5D EC                               ADD     EBX,DWORD [-20+EBP]
+  1737 00001153 53                                     PUSH    EBX
+  1738 00001154 E8 [00000000]                          CALL    _memman_init
+  1739 00001159 83 65 20 F0                            AND     DWORD [32+EBP],-16
+  1740 0000115D FF 75 20                               PUSH    DWORD [32+EBP]
+  1741 00001160 FF 75 24                               PUSH    DWORD [36+EBP]
+  1742 00001163 53                                     PUSH    EBX
+  1743 00001164 E8 [00000000]                          CALL    _memman_free
+  1744 00001169 83 C4 10                               ADD     ESP,16
+  1745 0000116C E9 FFFFFBA1                            JMP     L243
+  1746 00001171                                 L361:
+  1747 00001171 FF 75 08                               PUSH    DWORD [8+EBP]
+  1748 00001174 FF 75 0C                               PUSH    DWORD [12+EBP]
+  1749 00001177 FF 75 20                               PUSH    DWORD [32+EBP]
+  1750 0000117A 8B 7D 18                               MOV     EDI,DWORD [24+EBP]
+  1751 0000117D FF 75 24                               PUSH    DWORD [36+EBP]
+  1752 00001180 83 E7 FE                               AND     EDI,-2
+  1753 00001183 0F B6 45 10                            MOVZX   EAX,BYTE [16+EBP]
+  1754 00001187 50                                     PUSH    EAX
+  1755 00001188 FF 77 04                               PUSH    DWORD [4+EDI]
+  1756 0000118B FF 37                                  PUSH    DWORD [EDI]
+  1757 0000118D E8 [00000000]                          CALL    _boxfill8
+  1758 00001192 83 C4 1C                               ADD     ESP,28
+  1759 00001195 F7 45 18 00000001                      TEST    DWORD [24+EBP],1
+  1760 0000119C 0F 85 FFFFFB70                         JNE     L243
+  1761 000011A2 E9 FFFFFF04                            JMP     L272
+  1762 000011A7                                 L360:
+  1763 000011A7 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+  1764 000011AA 8B 7D 18                               MOV     EDI,DWORD [24+EBP]
+  1765 000011AD 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1766 000011B0 83 E7 FE                               AND     EDI,-2
+  1767 000011B3 50                                     PUSH    EAX
+  1768 000011B4 0F BE 45 24                            MOVSX   EAX,BYTE [36+EBP]
+  1769 000011B8 50                                     PUSH    EAX
+  1770 000011B9 FF 75 08                               PUSH    DWORD [8+EBP]
+  1771 000011BC FF 75 0C                               PUSH    DWORD [12+EBP]
+  1772 000011BF FF 77 04                               PUSH    DWORD [4+EDI]
+  1773 000011C2 FF 37                                  PUSH    DWORD [EDI]
+  1774 000011C4 E8 [00000000]                          CALL    _putfonts8_asc
+  1775 000011C9 83 C4 18                               ADD     ESP,24
+  1776 000011CC F7 45 18 00000001                      TEST    DWORD [24+EBP],1
+  1777 000011D3 0F 85 FFFFFB39                         JNE     L243
+  1778 000011D9 8B 55 0C                               MOV     EDX,DWORD [12+EBP]
+  1779 000011DC 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1780 000011DF 8B 5D 20                               MOV     EBX,DWORD [32+EBP]
+  1781 000011E2 83 C0 10                               ADD     EAX,16
+  1782 000011E5 50                                     PUSH    EAX
+  1783 000011E6 8D 04 DA                               LEA     EAX,DWORD [EDX+EBX*8]
+  1784 000011E9 50                                     PUSH    EAX
+  1785 000011EA FF 75 08                               PUSH    DWORD [8+EBP]
+  1786 000011ED 52                                     PUSH    EDX
+  1787 000011EE E9 FFFFFEC8                            JMP     L354
+  1788 000011F3                                 L359:
+  1789 000011F3 FF 75 E8                               PUSH    DWORD [-24+EBP]
+  1790 000011F6 E8 [00000000]                          CALL    _sheet_alloc
+  1791 000011FB 8B 5D 18                               MOV     EBX,DWORD [24+EBP]
+  1792 000011FE 8B 55 F0                               MOV     EDX,DWORD [-16+EBP]
+  1793 00001201 89 C7                                  MOV     EDI,EAX
+  1794 00001203 89 50 24                               MOV     DWORD [36+EAX],EDX
+  1795 00001206 03 5D EC                               ADD     EBX,DWORD [-20+EBP]
+  1796 00001209 83 48 1C 10                            OR      DWORD [28+EAX],16
+  1797 0000120D FF 75 24                               PUSH    DWORD [36+EBP]
+  1798 00001210 FF 75 08                               PUSH    DWORD [8+EBP]
+  1799 00001213 FF 75 0C                               PUSH    DWORD [12+EBP]
+  1800 00001216 53                                     PUSH    EBX
+  1801 00001217 50                                     PUSH    EAX
+  1802 00001218 E8 [00000000]                          CALL    _sheet_setbuf
+  1803 0000121D 8B 45 20                               MOV     EAX,DWORD [32+EBP]
+  1804 00001220 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1805 00001223 6A 00                                  PUSH    0
+  1806 00001225 50                                     PUSH    EAX
+  1807 00001226 FF 75 08                               PUSH    DWORD [8+EBP]
+  1808 00001229 FF 75 0C                               PUSH    DWORD [12+EBP]
+  1809 0000122C 53                                     PUSH    EBX
+  1810 0000122D BB 00000002                            MOV     EBX,2
+  1811 00001232 E8 [00000000]                          CALL    _make_window8
+  1812 00001237 8B 4D E8                               MOV     ECX,DWORD [-24+EBP]
+  1813 0000123A 83 C4 2C                               ADD     ESP,44
+  1814 0000123D 8B 41 0C                               MOV     EAX,DWORD [12+ECX]
+  1815 00001240 2B 45 08                               SUB     EAX,DWORD [8+EBP]
+  1816 00001243 99                                     CDQ
+  1817 00001244 F7 FB                                  IDIV    EBX
+  1818 00001246 50                                     PUSH    EAX
+  1819 00001247 8B 41 08                               MOV     EAX,DWORD [8+ECX]
+  1820 0000124A 2B 45 0C                               SUB     EAX,DWORD [12+EBP]
+  1821 0000124D 99                                     CDQ
+  1822 0000124E F7 FB                                  IDIV    EBX
+  1823 00001250 83 E0 FC                               AND     EAX,-4
+  1824 00001253 50                                     PUSH    EAX
+  1825 00001254 57                                     PUSH    EDI
+  1826 00001255 E8 [00000000]                          CALL    _sheet_slide
+  1827 0000125A 8B 4D E8                               MOV     ECX,DWORD [-24+EBP]
+  1828 0000125D FF 71 10                               PUSH    DWORD [16+ECX]
+  1829 00001260 57                                     PUSH    EDI
+  1830 00001261 E8 [00000000]                          CALL    _sheet_updown
+  1831 00001266 89 7D 44                               MOV     DWORD [68+EBP],EDI
+  1832 00001269 E9 FFFFFE53                            JMP     L353
+  1833 0000126E                                 L358:
+  1834 0000126E 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+  1835 00001271 83 C0 30                               ADD     EAX,48
+  1836 00001274 E9 FFFFFA9B                            JMP     L241
+  1837 00001279                                 L357:
+  1838 00001279 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+  1839 0000127C 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1840 0000127F FF 75 20                               PUSH    DWORD [32+EBP]
+  1841 00001282 50                                     PUSH    EAX
+  1842 00001283 53                                     PUSH    EBX
+  1843 00001284 E8 FFFFF26D                            CALL    _cons_putstr1
+  1844 00001289 E9 FFFFFB8F                            JMP     L349
+  1845 0000128E                                 L356:
+  1846 0000128E 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+  1847 00001291 03 45 EC                               ADD     EAX,DWORD [-20+EBP]
+  1848 00001294 50                                     PUSH    EAX
+  1849 00001295 53                                     PUSH    EBX
+  1850 00001296 E8 FFFFF22D                            CALL    _cons_putstr0
+  1851 0000129B E9 FFFFFC94                            JMP     L352
+  1852 000012A0                                 L355:
+  1853 000012A0 6A 01                                  PUSH    1
+  1854 000012A2 0F B6 45 24                            MOVZX   EAX,BYTE [36+EBP]
+  1855 000012A6 50                                     PUSH    EAX
+  1856 000012A7 53                                     PUSH    EBX
+  1857 000012A8 E8 FFFFF082                            CALL    _cons_putchar
+  1858 000012AD E9 FFFFFB6B                            JMP     L349
+  1859                                          [SECTION .data]
+  1860 00000098                                 LC14:
+  1861 00000098 0A 49 4E 54 20 30 43 20 3A 0A          DB      0x0A,"INT 0C :",0x0A," Stack Exception.",0x0A,0x00
+       000000A2 20 53 74 61 63 6B 20 45 78 63 
+       000000AC 65 70 74 69 6F 6E 2E 0A 00 
+  1862 000000B5                                 LC15:
+  1863 000000B5 45 49 50 20 3D 20 25 30 38 58          DB      "EIP = %08X",0x0A,0x00
+       000000BF 0A 00 
+  1864                                          [SECTION .text]
+  1865 000012B2                                        GLOBAL  _inthandler0c
+  1866 000012B2                                 _inthandler0c:
+  1867 000012B2 55                                     PUSH    EBP
+  1868 000012B3 89 E5                                  MOV     EBP,ESP
+  1869 000012B5 57                                     PUSH    EDI
+  1870 000012B6 56                                     PUSH    ESI
+  1871 000012B7 53                                     PUSH    EBX
+  1872 000012B8 8D 5D D4                               LEA     EBX,DWORD [-44+EBP]
+  1873 000012BB 83 EC 20                               SUB     ESP,32
+  1874 000012BE E8 [00000000]                          CALL    _task_now
+  1875 000012C3 89 C6                                  MOV     ESI,EAX
+  1876 000012C5 8B B8 000000A4                         MOV     EDI,DWORD [164+EAX]
+  1877 000012CB 83 C6 30                               ADD     ESI,48
+  1878 000012CE 68 [00000098]                          PUSH    LC14
+  1879 000012D3 57                                     PUSH    EDI
+  1880 000012D4 E8 FFFFF1EF                            CALL    _cons_putstr0
+  1881 000012D9 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1882 000012DC FF 70 2C                               PUSH    DWORD [44+EAX]
+  1883 000012DF 68 [000000B5]                          PUSH    LC15
+  1884 000012E4 53                                     PUSH    EBX
+  1885 000012E5 E8 [00000000]                          CALL    _sprintf
+  1886 000012EA 53                                     PUSH    EBX
+  1887 000012EB 57                                     PUSH    EDI
+  1888 000012EC E8 FFFFF1D7                            CALL    _cons_putstr0
+  1889 000012F1 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1890 000012F4 5B                                     POP     EBX
+  1891 000012F5 89 F0                                  MOV     EAX,ESI
+  1892 000012F7 5E                                     POP     ESI
+  1893 000012F8 5F                                     POP     EDI
+  1894 000012F9 5D                                     POP     EBP
+  1895 000012FA C3                                     RET
+  1896                                          [SECTION .data]
+  1897 000000C1                                 LC16:
+  1898 000000C1 0A 49 4E 54 20 30 44 20 3A 0A          DB      0x0A,"INT 0D :",0x0A," General Protected Exception.",0x0A,0x00
+       000000CB 20 47 65 6E 65 72 61 6C 20 50 
+       000000D5 72 6F 74 65 63 74 65 64 20 45 
+       000000DF 78 63 65 70 74 69 6F 6E 2E 0A 
+       000000E9 00 
+  1899                                          [SECTION .text]
+  1900 000012FB                                        GLOBAL  _inthandler0d
+  1901 000012FB                                 _inthandler0d:
+  1902 000012FB 55                                     PUSH    EBP
+  1903 000012FC 89 E5                                  MOV     EBP,ESP
+  1904 000012FE 57                                     PUSH    EDI
+  1905 000012FF 56                                     PUSH    ESI
+  1906 00001300 53                                     PUSH    EBX
+  1907 00001301 8D 5D D4                               LEA     EBX,DWORD [-44+EBP]
+  1908 00001304 83 EC 20                               SUB     ESP,32
+  1909 00001307 E8 [00000000]                          CALL    _task_now
+  1910 0000130C 89 C6                                  MOV     ESI,EAX
+  1911 0000130E 8B B8 000000A4                         MOV     EDI,DWORD [164+EAX]
+  1912 00001314 83 C6 30                               ADD     ESI,48
+  1913 00001317 68 [000000C1]                          PUSH    LC16
+  1914 0000131C 57                                     PUSH    EDI
+  1915 0000131D E8 FFFFF1A6                            CALL    _cons_putstr0
+  1916 00001322 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1917 00001325 FF 70 2C                               PUSH    DWORD [44+EAX]
+  1918 00001328 68 [000000B5]                          PUSH    LC15
+  1919 0000132D 53                                     PUSH    EBX
+  1920 0000132E E8 [00000000]                          CALL    _sprintf
+  1921 00001333 53                                     PUSH    EBX
+  1922 00001334 57                                     PUSH    EDI
+  1923 00001335 E8 FFFFF18E                            CALL    _cons_putstr0
+  1924 0000133A 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1925 0000133D 5B                                     POP     EBX
+  1926 0000133E 89 F0                                  MOV     EAX,ESI
+  1927 00001340 5E                                     POP     ESI
+  1928 00001341 5F                                     POP     EDI
+  1929 00001342 5D                                     POP     EBP
+  1930 00001343 C3                                     RET
+  1931 00001344                                        GLOBAL  _hrb_api_linewin
+  1932 00001344                                 _hrb_api_linewin:
+  1933 00001344 55                                     PUSH    EBP
+  1934 00001345 89 E5                                  MOV     EBP,ESP
+  1935 00001347 57                                     PUSH    EDI
+  1936 00001348 56                                     PUSH    ESI
+  1937 00001349 53                                     PUSH    EBX
+  1938 0000134A 83 EC 0C                               SUB     ESP,12
+  1939 0000134D 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+  1940 00001350 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+  1941 00001353 89 D9                                  MOV     ECX,EBX
+  1942 00001355 8B 55 18                               MOV     EDX,DWORD [24+EBP]
+  1943 00001358 C1 E1 0A                               SAL     ECX,10
+  1944 0000135B 89 D7                                  MOV     EDI,EDX
+  1945 0000135D 89 4D F0                               MOV     DWORD [-16+EBP],ECX
+  1946 00001360 89 C6                                  MOV     ESI,EAX
+  1947 00001362 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+  1948 00001365 2B 7D 10                               SUB     EDI,DWORD [16+EBP]
+  1949 00001368 C1 E1 0A                               SAL     ECX,10
+  1950 0000136B 29 DE                                  SUB     ESI,EBX
+  1951 0000136D 89 4D EC                               MOV     DWORD [-20+EBP],ECX
+  1952 00001370 0F 88 000000A3                         JS      L413
+  1953 00001376                                 L392:
+  1954 00001376 85 FF                                  TEST    EDI,EDI
+  1955 00001378 0F 88 00000094                         JS      L414
+  1956 0000137E                                 L393:
+  1957 0000137E 39 FE                                  CMP     ESI,EDI
+  1958 00001380 7C 62                                  JL      L394
+  1959 00001382 8D 4E 01                               LEA     ECX,DWORD [1+ESI]
+  1960 00001385 39 C3                                  CMP     EBX,EAX
+  1961 00001387 BE FFFFFC00                            MOV     ESI,-1024
+  1962 0000138C 7F 05                                  JG      L396
+  1963 0000138E BE 00000400                            MOV     ESI,1024
+  1964 00001393                                 L396:
+  1965 00001393 39 55 10                               CMP     DWORD [16+EBP],EDX
+  1966 00001396 7F 46                                  JG      L397
+  1967 00001398 2B 55 10                               SUB     EDX,DWORD [16+EBP]
+  1968 0000139B 42                                     INC     EDX
+  1969 0000139C                                 L412:
+  1970 0000139C C1 E2 0A                               SAL     EDX,10
+  1971 0000139F 89 D0                                  MOV     EAX,EDX
+  1972 000013A1 99                                     CDQ
+  1973 000013A2 F7 F9                                  IDIV    ECX
+  1974 000013A4 89 C7                                  MOV     EDI,EAX
+  1975 000013A6                                 L399:
+  1976 000013A6 85 C9                                  TEST    ECX,ECX
+  1977 000013A8 7E 2C                                  JLE     L410
+  1978 000013AA 89 CB                                  MOV     EBX,ECX
+  1979 000013AC                                 L408:
+  1980 000013AC 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+  1981 000013AF 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+  1982 000013B2 C1 F8 0A                               SAR     EAX,10
+  1983 000013B5 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+  1984 000013B8 0F AF 42 04                            IMUL    EAX,DWORD [4+EDX]
+  1985 000013BC C1 F9 0A                               SAR     ECX,10
+  1986 000013BF 89 4D E8                               MOV     DWORD [-24+EBP],ECX
+  1987 000013C2 8B 0A                                  MOV     ECX,DWORD [EDX]
+  1988 000013C4 03 45 E8                               ADD     EAX,DWORD [-24+EBP]
+  1989 000013C7 8A 55 1C                               MOV     DL,BYTE [28+EBP]
+  1990 000013CA 88 14 08                               MOV     BYTE [EAX+ECX*1],DL
+  1991 000013CD 01 75 F0                               ADD     DWORD [-16+EBP],ESI
+  1992 000013D0 01 7D EC                               ADD     DWORD [-20+EBP],EDI
+  1993 000013D3 4B                                     DEC     EBX
+  1994 000013D4 75 D6                                  JNE     L408
+  1995 000013D6                                 L410:
+  1996 000013D6 83 C4 0C                               ADD     ESP,12
+  1997 000013D9 5B                                     POP     EBX
+  1998 000013DA 5E                                     POP     ESI
+  1999 000013DB 5F                                     POP     EDI
+  2000 000013DC 5D                                     POP     EBP
+  2001 000013DD C3                                     RET
+  2002 000013DE                                 L397:
+  2003 000013DE 2B 55 10                               SUB     EDX,DWORD [16+EBP]
+  2004 000013E1 4A                                     DEC     EDX
+  2005 000013E2 EB B8                                  JMP     L412
+  2006 000013E4                                 L394:
+  2007 000013E4 8D 4F 01                               LEA     ECX,DWORD [1+EDI]
+  2008 000013E7 39 55 10                               CMP     DWORD [16+EBP],EDX
+  2009 000013EA BF FFFFFC00                            MOV     EDI,-1024
+  2010 000013EF 7F 05                                  JG      L401
+  2011 000013F1 BF 00000400                            MOV     EDI,1024
+  2012 000013F6                                 L401:
+  2013 000013F6 39 C3                                  CMP     EBX,EAX
+  2014 000013F8 7F 11                                  JG      L402
+  2015 000013FA 29 D8                                  SUB     EAX,EBX
+  2016 000013FC 8D 50 01                               LEA     EDX,DWORD [1+EAX]
+  2017 000013FF                                 L411:
+  2018 000013FF C1 E2 0A                               SAL     EDX,10
+  2019 00001402 89 D0                                  MOV     EAX,EDX
+  2020 00001404 99                                     CDQ
+  2021 00001405 F7 F9                                  IDIV    ECX
+  2022 00001407 89 C6                                  MOV     ESI,EAX
+  2023 00001409 EB 9B                                  JMP     L399
+  2024 0000140B                                 L402:
+  2025 0000140B 29 D8                                  SUB     EAX,EBX
+  2026 0000140D 8D 50 FF                               LEA     EDX,DWORD [-1+EAX]
+  2027 00001410 EB ED                                  JMP     L411
+  2028 00001412                                 L414:
+  2029 00001412 F7 DF                                  NEG     EDI
+  2030 00001414 E9 FFFFFF65                            JMP     L393
+  2031 00001419                                 L413:
+  2032 00001419 F7 DE                                  NEG     ESI
+  2033 0000141B E9 FFFFFF56                            JMP     L392
diff --git a/haribote/debug.cpp b/haribote/debug.cpp
new file mode 100644 (file)
index 0000000..7539bfa
--- /dev/null
@@ -0,0 +1,60 @@
+#include "debug.h"
+#include "screen.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include <exception>
+#include "MemMan.h"
+
+
+extern "C" void debugprint(const char *format,...){
+       int i;
+       va_list ap;
+
+       va_start(ap, format);
+       Screen::Inst().vprintf(format, ap);
+       va_end(ap);
+}
+
+extern "C" void hung(){
+       for(;;){}
+}
+
+void *operator new (size_t size) {
+       //debugprint("newed %d\n", size);
+       return MemMan::Inst().sys_malloc(size);
+}
+void *operator new[] (size_t size){
+       //debugprint("new[]ed %d\n", size);
+       return MemMan::Inst().sys_malloc(size);
+}
+
+void operator delete(void *p) throw(){
+       //debugprint("deleteed %p\n", p);
+       MemMan::Inst().sys_free(p);
+}
+
+void operator delete[](void *p) throw(){
+       //debugprint("delete[]ed %p\n", p);
+       MemMan::Inst().sys_free(p);
+}
+
+
+
+extern "C" {
+void __cxa_pure_virtual(){
+}
+
+void __cxa_end_catch(){
+}
+
+void __cxa_begin_catch(){
+}
+
+void __cxa_rethrow(){
+}
+void __cxa_call_unexpected(){}
+};
+
+namespace boost{
+       void throw_exception(std::exception const&){}
+};
diff --git a/haribote/debug.h b/haribote/debug.h
new file mode 100644 (file)
index 0000000..b4f58d9
--- /dev/null
@@ -0,0 +1,17 @@
+#pragma once
+
+extern "C"{
+void debugprint(const char *fotmat,...);
+void hung();
+};
+
+class placementdeleter {
+public:
+       placementdeleter(){
+       }
+       template <class T>
+       void operator ()(T *p){
+               p->~T();
+       }
+};
+
diff --git a/haribote/desctable.cpp b/haribote/desctable.cpp
new file mode 100644 (file)
index 0000000..d3ac92f
--- /dev/null
@@ -0,0 +1,209 @@
+/* GDT\82âIDT\82È\82Ç\82Ì\81A descriptor table \8aÖ\8cW */
+
+#include "bootpack.h"
+#include "desctable.h"
+#include "naskfunc.h"
+#include "screen.h"
+#include "debug.h"
+#include "processman.h"
+
+TSS32 tss_a;
+TSS32 tss_b;
+DWORD taska;
+DWORD taskb;
+char global_dt_buf[sizeof(GDT_IDT)];
+GDT_IDT *global_dt = (GDT_IDT *)global_dt_buf;
+
+void init_gdtidt(void)
+{
+       global_dt = new ((void *)global_dt_buf) GDT_IDT(NEW_GDT, NEW_IDT, LIMIT_GDT, LIMIT_IDT);
+
+       DWORD *pagedir = (DWORD *)SYSTEM_PAGE_DIRECTORY_PHY;
+       //debugprint("te2 %p\n", pagedir[SYSTEM_PAGE_FOR_PD >> 22]);
+       DWORD *pagedirent = &pagedir[SYSTEM_PAGE_FOR_DT >> 22];
+
+       *pagedirent = 0;//0xC0000000 -> 0x00000000 \82Ì4M\82Ì\83y\81[\83W\82ð\8dì\82é
+       *pagedirent |= ePAGE_DIR_ENT::PRESENT;
+       *pagedirent |= ePAGE_DIR_ENT::READ_WRITE;
+       *pagedirent |= ePAGE_DIR_ENT::PAGE_SIZE_4M;
+       *pagedirent |= ePAGE_DIR_ENT::GLOBAL;
+       *pagedirent |= ePAGE_DIR_ENT::ACCESS;
+       *pagedirent |= ePAGE_DIR_ENT::DIRTY;
+
+       tss_a.ldtr = 0;
+       tss_a.iomap = 0x40000000;
+       tss_a.cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
+
+       tss_b.ldtr = 0;
+       tss_b.iomap = 0x40000000;
+       tss_b.fs = tss_b.ds = tss_b.es = tss_b.gs = tss_b.ss = 1 << 3;
+       tss_b.cs = 2 << 3;
+       tss_b.esp = 0xf00000;
+       tss_b.cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
+       tss_b.eflags = 0x00000202;
+       //tss_b.eip = (DWORD)test;
+       tss_b.eax = tss_b.ecx = tss_b.edx = tss_b.edi = tss_b.esi = tss_b.ebp = tss_b.ebx = 0;
+
+       /* GDT\82Ì\8f\89\8aú\89» */
+       for (int i = 0; i < global_dt->getgdtcount(); i++) {
+               global_dt->set_segmdesc(i, 0, 0, 0);
+       }
+       int i = 1;
+       global_dt->set_segmdesc(i++, 0xffffffff, 0x00000000, AR_DATA32_RW);
+       global_dt->set_segmdesc(i++, 0xffffffff, 0x00000000, AR_CODE32_ER);
+       global_dt->set_segmdesc(i++, 0xffffffff, 0x00000000, AR_DATA32_RW | AR_DPL_3);
+       global_dt->set_segmdesc(i++, 0xffffffff, 0x00000000, AR_CODE32_ER | AR_DPL_3);
+
+       taska = i;
+       global_dt->set_segmdesc(i++, 103, (DWORD)&tss_a, AR_TSS32);
+       taskb = i;
+       global_dt->set_segmdesc(i++, 103, (DWORD)&tss_b, AR_TSS32);
+
+
+       /* IDT\82Ì\8f\89\8aú\89» */
+       for (int i = 0; i < global_dt->getidtcount(); i++) {
+               global_dt->set_gatedesc(i, 0, 0, 0);
+       }
+       /* IDT\82Ì\90Ý\92è */
+       global_dt->set_gatedesc(0x00, (DWORD) asm_inthandler00, 2 * 8, AR_INTGATE32);
+       global_dt->set_gatedesc(0x0a, (DWORD) asm_inthandler0a, 2 * 8, AR_INTGATE32);
+       global_dt->set_gatedesc(0x0b, (DWORD) asm_inthandler0b, 2 * 8, AR_INTGATE32);
+       global_dt->set_gatedesc(0x0c, (DWORD) asm_inthandler0c, 2 * 8, AR_INTGATE32);
+       global_dt->set_gatedesc(0x0d, (DWORD) asm_inthandler0d, 2 * 8, AR_INTGATE32);
+       global_dt->set_gatedesc(0x0e, (DWORD) asm_inthandler0e, 2 * 8, AR_INTGATE32);
+       global_dt->set_gatedesc(0x20, (DWORD) asm_inthandler20, 2 * 8, AR_INTGATE32);
+       //global_dt->set_gatedesc(0x21, (DWORD) asm_inthandler21, 2 * 8, AR_INTGATE32);
+       //global_dt->set_gatedesc(0x2c, (DWORD) asm_inthandler2c, 2 * 8, AR_INTGATE32);
+       //global_dt->set_gatedesc(0x40, (DWORD) asm_hrb_api,      2 * 8, AR_INTGATE32 + 0x60);
+       global_dt->load();
+       load_tr(taska << 3);
+
+
+       return;
+}
+
+void GDT_IDT::init_app_gdtidt(TSS32 *tss, TSS32 *systss){
+       /* GDT\82Ì\8f\89\8aú\89» */
+       for (int i = 0; i <= LIMIT_GDT / 8; i++) {
+               set_segmdesc(i, 0, 0, 0);
+       }
+       int i = 1;
+       set_segmdesc(i++, 0xffffffff, 0x00000000, AR_DATA32_RW);
+       set_segmdesc(i++, 0xffffffff, 0x00000000, AR_CODE32_ER);
+       set_segmdesc(i++, 0xffffffff, 0x00000000, AR_DATA32_RW | AR_DPL_3);
+       set_segmdesc(i++, 0xffffffff, 0x00000000, AR_CODE32_ER | AR_DPL_3);
+       tasktr = i;
+       set_segmdesc(i++, 103, (DWORD)tss, AR_TSS32 | AR_DPL_0);
+       systr = i;
+       set_segmdesc(i++, 103, (DWORD)systss, AR_TSS32 | AR_DPL_0);
+
+       for (int i = 0; i <= LIMIT_IDT / 8; i++) {
+               set_gatedesc(i, 0, 0, 0);
+       }
+       /*set_gatedesc(0x20, (DWORD) asm_inthandler20, 2 * 8, AR_INTGATE32);
+       set_gatedesc(0x00, (DWORD) asm_inthandler00, 2 * 8, AR_INTGATE32);
+       set_gatedesc(0x0a, (DWORD) asm_inthandler0a, 2 * 8, AR_INTGATE32);
+       set_gatedesc(0x0b, (DWORD) asm_inthandler0b, 2 * 8, AR_INTGATE32);
+       set_gatedesc(0x0c, (DWORD) asm_inthandler0c, 2 * 8, AR_INTGATE32);
+       set_gatedesc(0x0d, (DWORD) asm_inthandler0d, 2 * 8, AR_INTGATE32);
+       set_gatedesc(0x0e, (DWORD) asm_inthandler0e, 2 * 8, AR_INTGATE32);*/
+}
+
+
+GDT_IDT::GDT_IDT(DWORD gdtaddr, DWORD idtaddr, DWORD gdtlimit, DWORD idtlimit){
+       init(gdtaddr, idtaddr, gdtlimit, idtlimit);
+       ismine = false;
+}
+
+GDT_IDT::GDT_IDT(){
+       ismine = false;
+}
+
+GDT_IDT::~GDT_IDT(){
+}
+
+void GDT_IDT::init(DWORD gdtaddr, DWORD idtaddr, DWORD gdtlimit, DWORD idtlimit){
+       this->gdt = (SEGMENT_DESCRIPTOR *)gdtaddr;
+       this->idt = (GATE_DESCRIPTOR    *)idtaddr;
+       this->gdtlimit = gdtlimit;
+       this->idtlimit = idtlimit;
+}
+
+void GDT_IDT::set_segmdesc(DWORD i, DWORD limit, DWORD base, DWORD ar)
+{
+       SEGMENT_DESCRIPTOR *sd = gdt + i;
+       if (limit > 0xfffff) {
+               ar |= 0x8000; /* G_bit = 1 */
+               limit /= 0x1000;
+       }
+       sd->limit_low    = limit & 0xffff;
+       sd->base_low     = base & 0xffff;
+       sd->base_mid     = (base >> 16) & 0xff;
+       sd->access_right = ar & 0xff;
+       sd->limit_high   = ((limit >> 16) & 0x0f) | ((ar >> 8) & 0xf0);
+       sd->base_high    = (base >> 24) & 0xff;
+       return;
+}
+
+void GDT_IDT::set_gatedesc(DWORD i, DWORD offset, DWORD selector, DWORD ar)
+{
+       GATE_DESCRIPTOR *gd = idt + i;
+       gd->offset_low   = offset & 0xffff;
+       gd->selector     = selector;
+       gd->dw_count     = (ar >> 8) & 0xff;
+       gd->access_right = ar & 0xff;
+       gd->offset_high  = (offset >> 16) & 0xffff;
+       return;
+}
+
+void GDT_IDT::load(){
+       load_gdtr(gdtlimit, (DWORD)gdt);
+       load_idtr(idtlimit, (DWORD)idt);
+}
+
+DWORD GDT_IDT::getgdtcount()
+{
+       return (gdtlimit + 1) / sizeof(SEGMENT_DESCRIPTOR);
+}
+
+DWORD GDT_IDT::getidtcount()
+{
+       return (idtlimit + 1) / sizeof(GATE_DESCRIPTOR);
+}
+
+
+extern "C" void inthandler00(int *esp){
+       debugprint("inthandler00 div error \n");
+       for(;;){asm("hlt");}
+}
+
+extern "C" void inthandler21(int *esp){}
+extern "C" void inthandler2c(int *esp){}
+extern "C" void inthandler0a(int *esp){
+       debugprint("inthandler0a invalid tss\n");
+       for(;;){asm("hlt");}
+}
+extern "C" void inthandler0b(int *esp){
+       debugprint("inthandler0b \n");
+       for(;;){asm("hlt");}
+}
+extern "C" void inthandler0c(int *esp){
+       debugprint("inthandler0c \n");
+
+       for(;;){asm("hlt");}
+}
+extern "C" void inthandler0d(int *esp){
+       debugprint("inthandler0d generic protection exception\n");
+
+       for(;;){asm("hlt");}
+}
+
+extern "C" void inthandler0e(DWORD *esp){
+       debugprint("inthandler0e  paging fault %p\n", *esp);
+       for(;;){asm("hlt");}
+       if(*esp & 1 == 0){
+               //P\83t\83\89\83O\82ª\83N\83\8a\83A\82³\82ê\82½\83Z\83O\83\81\83\93\83g\82Ö\82Ì\83A\83N\83Z\83X
+       }else{
+               //\83t\83H\83\8b\83g\82Ì\8c´\88ö\82ª\83y\81[\83W\83\8c\83x\83\8b\95Û\8cì\88á\94½\82Å\82 \82Á\82½\81B
+       }
+}
diff --git a/haribote/desctable.h b/haribote/desctable.h
new file mode 100644 (file)
index 0000000..7f5d7bd
--- /dev/null
@@ -0,0 +1,84 @@
+#pragma once
+#include "typedefs.h"
+#include "naskfunc.h"
+
+#pragma pack(push, 1)
+struct SEGMENT_DESCRIPTOR {
+       WORD limit_low, base_low;
+       BYTE base_mid, access_right;
+       BYTE limit_high, base_high;
+};
+struct GATE_DESCRIPTOR {
+       WORD offset_low, selector;
+       BYTE dw_count, access_right;
+       WORD offset_high;
+};
+
+struct TSS32 {
+       DWORD backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
+       DWORD eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
+       DWORD es, cs, ss, ds, fs, gs;
+       DWORD ldtr, iomap;
+};
+#pragma pack(pop)
+
+
+
+class GDT_IDT{
+       SEGMENT_DESCRIPTOR *gdt;
+       GATE_DESCRIPTOR    *idt;
+       DWORD gdtlimit;
+       DWORD idtlimit;
+       bool ismine;
+
+       DWORD tasktr;
+       DWORD systr;
+public:
+       GDT_IDT(DWORD gdtaddr, DWORD idtaddr, DWORD gdtlimit, DWORD idtlimit);
+       GDT_IDT();
+       ~GDT_IDT();
+
+       void init(DWORD gdtaddr, DWORD idtaddr, DWORD gdtlimit, DWORD idtlimit);
+
+       void set_segmdesc(DWORD i, DWORD limit, DWORD base, DWORD ar);
+       void set_gatedesc(DWORD i, DWORD offset, DWORD selector, DWORD ar);
+       DWORD getgdtcount();
+       DWORD getidtcount();
+       void load();
+
+       void init_app_gdtidt(TSS32 *tss, TSS32 *systss);
+
+       void load_systr(){
+               load_tr(systr << 3);
+       }
+       void load_tasktr(){
+               load_tr(tasktr << 3);
+       }
+       void jump_to_task(){
+               farjmp(0, tasktr << 3);
+       }
+};
+
+
+void init_gdtidt(void);
+
+const DWORD ADR_GDT = 0x00270000;
+const DWORD LIMIT_GDT = 0x000007ff;
+const DWORD ADR_IDT = 0x00270800;
+const DWORD LIMIT_IDT = 0x000007ff;
+
+const DWORD AR_DPL_0 = 0 << 5;
+const DWORD AR_DPL_1 = 1 << 5;
+const DWORD AR_DPL_2 = 2 << 5;
+const DWORD AR_DPL_3 = 3 << 5;
+
+#define AR_DATA32_RW   0x4092
+#define AR_CODE32_ER   0x409a
+#define AR_LDT                 0x0082
+#define AR_TSS32               0x0089
+#define AR_INTGATE32   0x008e
+
+const DWORD SYSTEM_PAGE_DIRECTORY_PHY = 0x00100000;
+const DWORD SYSTEM_PAGE_FOR_DT     = 0xC0000000;
+const DWORD NEW_GDT     = SYSTEM_PAGE_FOR_DT + ADR_GDT;
+const DWORD NEW_IDT     = SYSTEM_PAGE_FOR_DT + ADR_GDT + 0x800;
diff --git a/haribote/fat32.h b/haribote/fat32.h
new file mode 100644 (file)
index 0000000..3afc1fb
--- /dev/null
@@ -0,0 +1,86 @@
+#pragma once
+#include "typedefs.h"
+
+#pragma pack(push, 1)
+struct MBR_SECTOR{
+       BYTE code[0x1BE];
+       struct{
+               BYTE bootflag;
+               BYTE partition_begin_CHS[3];
+               BYTE type;
+               BYTE partition_end_CHS[3];
+               DWORD begin_lba;
+               DWORD size_lba;
+       }pt[4];
+       WORD magic;//0xAA55
+};
+
+struct FAT32_BOOTSECTOR
+{
+BYTE BS_jmpBoot[3]; // Jump Instruction to boot code
+char BS_OEMName[8]; // "MSWIN4.1" is recommended setting
+WORD BPB_BytsPerSec; // Count of bytes per Sector
+BYTE BPB_SecPerClus; // Number of Sectors per Allocation Unit which must be a power of 2
+WORD BPB_RsvdSecCnt; // Number of Reserved Sectors in the Reserved Region of the volume starting at the first sector of the volume
+BYTE BPB_NumFATs; // Count of FAT data structures on the volume
+WORD BPB_RootEntCnt; // Count of 32byte directory entries in the root directory for FAT12 and FAT16 volumes
+WORD BPB_TotSec16; // Old 16-bit total count of sectors on the volume
+BYTE BPB_Media; // 0xF8 for fixed media, 0xF0 for removable media
+WORD BPB_FATSz16; //@ FAT12/FAT16 16bit-count of sectors occupied by ONE FAT
+
+WORD BPB_SecPerTrk; // Sectors per Track for interrupt 0x13 (um... it is Wintel culture... x_x;)
+WORD BPB_NumHeads; // Number of Heads for interrupt 0x13 (um... it is Wintel culture... x_x;)
+DWORD BPB_HiddSec; // Count of Hidden Sectors preceding the partition that contains this FAT volume
+DWORD BPB_TotSec32; // New 32-bit total count of sectors on the volume
+// Following structure is prepared for FAT12 and FAT16 (not for FAT32)
+DWORD BPB_FATSz32; //@ FAT32 32bit-count of sectors occupied by ONE FAT\81©\82±\82±\82ð\92Ç\89Á
+WORD BPB_ExtFlags;
+WORD BPB_FSVer;
+DWORD BPB_RootClus;
+WORD BPB_FSInfo;
+WORD BPB_BkBootSec;
+BYTE BPB_Reserved[12];
+BYTE BS_DrvNum; // Int0x13 drive number (um... it is Wintel culture... x_x;)
+BYTE BS_Reserved1; // Reserved for WindowsNT (um... it is MS culture... x_x;)
+BYTE BS_BootSig; // Extended Boot Signature (0x29) which indicates following three fields in the boot sector are present
+DWORD BS_VolID; // Volume Serial Number
+BYTE BS_VolLab[11]; // Volume Label
+BYTE BS_FilSysType[8]; // Type of File System (it is no more than a hint)
+} ;
+
+
+
+struct DIRENT{
+       char DIR_Name[11];
+       BYTE DIR_Attr;
+       BYTE DIR_NTRes;
+       BYTE DIR_CrtTimeTenth;
+       WORD DIR_CrtTime;
+       WORD DIR_CrtDate;
+       WORD DIR_LstAccDate;
+       WORD DIR_FstClusHI;
+       WORD DIR_WrtTime;
+       WORD DIR_WrtDate;
+       WORD DIR_FstClusLO;
+       DWORD DIR_FileSize;
+       
+       DWORD getfirstclus(){
+               return DIR_FstClusHI << 16 | DIR_FstClusLO;
+       }
+       void setfirstclus(DWORD clus){
+               DIR_FstClusHI = (clus & 0xffff0000) >> 16;
+               DIR_FstClusLO = clus & 0x0000ffff;
+       }
+};
+
+enum FAT_ATTR{
+       ATTR_READ_ONLY = 0x01,
+       ATTR_HIDDEN = 0x02,
+       ATTR_SYSTEM = 0x04,
+       ATTR_VOLUME_ID = 0x08,
+       ATTR_DIRECTORY = 0x10,
+       ATTR_ARCHIVE = 0x20,
+       ATTR_LONG_NAME = ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID
+};
+
+#pragma pack(pop)
diff --git a/haribote/fifo.c b/haribote/fifo.c
new file mode 100644 (file)
index 0000000..420ddb3
--- /dev/null
@@ -0,0 +1,63 @@
+/* FIFO\83\89\83C\83u\83\89\83\8a */
+
+#include "bootpack.h"
+
+#define FLAGS_OVERRUN          0x0001
+
+void fifo32_init(struct FIFO32 *fifo, int size, int *buf, struct TASK *task)
+/* FIFO\83o\83b\83t\83@\82Ì\8f\89\8aú\89» */
+{
+       fifo->size = size;
+       fifo->buf = buf;
+       fifo->free = size; /* \8bó\82« */
+       fifo->flags = 0;
+       fifo->p = 0; /* \8f\91\82«\8d\9e\82Ý\88Ê\92u */
+       fifo->q = 0; /* \93Ç\82Ý\8d\9e\82Ý\88Ê\92u */
+       fifo->task = task; /* \83f\81[\83^\82ª\93ü\82Á\82½\82Æ\82«\82É\8bN\82±\82·\83^\83X\83N */
+       return;
+}
+
+int fifo32_put(struct FIFO32 *fifo, int data)
+/* FIFO\82Ö\83f\81[\83^\82ð\91\97\82è\8d\9e\82ñ\82Å\92~\82¦\82é */
+{
+       if (fifo->free == 0) {
+               /* \8bó\82«\82ª\82È\82­\82Ä\82 \82Ó\82ê\82½ */
+               fifo->flags |= FLAGS_OVERRUN;
+               return -1;
+       }
+       fifo->buf[fifo->p] = data;
+       fifo->p++;
+       if (fifo->p == fifo->size) {
+               fifo->p = 0;
+       }
+       fifo->free--;
+       if (fifo->task != 0) {
+               if (fifo->task->flags != 2) { /* \83^\83X\83N\82ª\90Q\82Ä\82¢\82½\82ç */
+                       task_run(fifo->task, -1, 0); /* \8bN\82±\82µ\82Ä\82 \82°\82é */
+               }
+       }
+       return 0;
+}
+
+int fifo32_get(struct FIFO32 *fifo)
+/* FIFO\82©\82ç\83f\81[\83^\82ð\88ê\82Â\82Æ\82Á\82Ä\82­\82é */
+{
+       int data;
+       if (fifo->free == fifo->size) {
+               /* \83o\83b\83t\83@\82ª\8bó\82Á\82Û\82Ì\82Æ\82«\82Í\81A\82Æ\82è\82 \82¦\82¸-1\82ª\95Ô\82³\82ê\82é */
+               return -1;
+       }
+       data = fifo->buf[fifo->q];
+       fifo->q++;
+       if (fifo->q == fifo->size) {
+               fifo->q = 0;
+       }
+       fifo->free++;
+       return data;
+}
+
+int fifo32_status(struct FIFO32 *fifo)
+/* \82Ç\82Ì\82­\82ç\82¢\83f\81[\83^\82ª\97­\82Ü\82Á\82Ä\82¢\82é\82©\82ð\95ñ\8d\90\82·\82é */
+{
+       return fifo->size - fifo->free;
+}
diff --git a/haribote/fifo.lst b/haribote/fifo.lst
new file mode 100644 (file)
index 0000000..04f149d
--- /dev/null
@@ -0,0 +1,107 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _task_run
+     7 00000000                                 [FILE "fifo.c"]
+     8                                          [SECTION .text]
+     9 00000000                                        GLOBAL  _fifo32_init
+    10 00000000                                 _fifo32_init:
+    11 00000000 55                                     PUSH    EBP
+    12 00000001 89 E5                                  MOV     EBP,ESP
+    13 00000003 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    14 00000006 8B 55 10                               MOV     EDX,DWORD [16+EBP]
+    15 00000009 8B 4D 0C                               MOV     ECX,DWORD [12+EBP]
+    16 0000000C 89 10                                  MOV     DWORD [EAX],EDX
+    17 0000000E 89 48 0C                               MOV     DWORD [12+EAX],ECX
+    18 00000011 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+    19 00000014 89 48 10                               MOV     DWORD [16+EAX],ECX
+    20 00000017 C7 40 14 00000000                      MOV     DWORD [20+EAX],0
+    21 0000001E C7 40 04 00000000                      MOV     DWORD [4+EAX],0
+    22 00000025 C7 40 08 00000000                      MOV     DWORD [8+EAX],0
+    23 0000002C 89 50 18                               MOV     DWORD [24+EAX],EDX
+    24 0000002F 5D                                     POP     EBP
+    25 00000030 C3                                     RET
+    26 00000031                                        GLOBAL  _fifo32_put
+    27 00000031                                 _fifo32_put:
+    28 00000031 55                                     PUSH    EBP
+    29 00000032 89 E5                                  MOV     EBP,ESP
+    30 00000034 53                                     PUSH    EBX
+    31 00000035 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+    32 00000038 83 7B 10 00                            CMP     DWORD [16+EBX],0
+    33 0000003C 75 0C                                  JNE     L3
+    34 0000003E 83 4B 14 01                            OR      DWORD [20+EBX],1
+    35 00000042 83 C8 FF                               OR      EAX,-1
+    36 00000045                                 L2:
+    37 00000045 8B 5D FC                               MOV     EBX,DWORD [-4+EBP]
+    38 00000048 C9                                     LEAVE
+    39 00000049 C3                                     RET
+    40 0000004A                                 L3:
+    41 0000004A 8B 4B 04                               MOV     ECX,DWORD [4+EBX]
+    42 0000004D 8B 13                                  MOV     EDX,DWORD [EBX]
+    43 0000004F 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+    44 00000052 89 04 8A                               MOV     DWORD [EDX+ECX*4],EAX
+    45 00000055 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+    46 00000058 40                                     INC     EAX
+    47 00000059 89 43 04                               MOV     DWORD [4+EBX],EAX
+    48 0000005C 3B 43 0C                               CMP     EAX,DWORD [12+EBX]
+    49 0000005F 74 21                                  JE      L7
+    50 00000061                                 L4:
+    51 00000061 8B 43 18                               MOV     EAX,DWORD [24+EBX]
+    52 00000064 FF 4B 10                               DEC     DWORD [16+EBX]
+    53 00000067 85 C0                                  TEST    EAX,EAX
+    54 00000069 74 13                                  JE      L5
+    55 0000006B 83 78 04 02                            CMP     DWORD [4+EAX],2
+    56 0000006F 74 0D                                  JE      L5
+    57 00000071 6A 00                                  PUSH    0
+    58 00000073 6A FF                                  PUSH    -1
+    59 00000075 50                                     PUSH    EAX
+    60 00000076 E8 [00000000]                          CALL    _task_run
+    61 0000007B 83 C4 0C                               ADD     ESP,12
+    62 0000007E                                 L5:
+    63 0000007E 31 C0                                  XOR     EAX,EAX
+    64 00000080 EB C3                                  JMP     L2
+    65 00000082                                 L7:
+    66 00000082 C7 43 04 00000000                      MOV     DWORD [4+EBX],0
+    67 00000089 EB D6                                  JMP     L4
+    68 0000008B                                        GLOBAL  _fifo32_get
+    69 0000008B                                 _fifo32_get:
+    70 0000008B 55                                     PUSH    EBP
+    71 0000008C 83 C8 FF                               OR      EAX,-1
+    72 0000008F 89 E5                                  MOV     EBP,ESP
+    73 00000091 56                                     PUSH    ESI
+    74 00000092 53                                     PUSH    EBX
+    75 00000093 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+    76 00000096 8B 71 10                               MOV     ESI,DWORD [16+ECX]
+    77 00000099 8B 59 0C                               MOV     EBX,DWORD [12+ECX]
+    78 0000009C 39 DE                                  CMP     ESI,EBX
+    79 0000009E 74 18                                  JE      L8
+    80 000000A0 8B 41 08                               MOV     EAX,DWORD [8+ECX]
+    81 000000A3 8B 11                                  MOV     EDX,DWORD [ECX]
+    82 000000A5 8B 14 82                               MOV     EDX,DWORD [EDX+EAX*4]
+    83 000000A8 40                                     INC     EAX
+    84 000000A9 89 41 08                               MOV     DWORD [8+ECX],EAX
+    85 000000AC 39 D8                                  CMP     EAX,EBX
+    86 000000AE 74 0C                                  JE      L11
+    87 000000B0                                 L10:
+    88 000000B0 8D 46 01                               LEA     EAX,DWORD [1+ESI]
+    89 000000B3 89 41 10                               MOV     DWORD [16+ECX],EAX
+    90 000000B6 89 D0                                  MOV     EAX,EDX
+    91 000000B8                                 L8:
+    92 000000B8 5B                                     POP     EBX
+    93 000000B9 5E                                     POP     ESI
+    94 000000BA 5D                                     POP     EBP
+    95 000000BB C3                                     RET
+    96 000000BC                                 L11:
+    97 000000BC C7 41 08 00000000                      MOV     DWORD [8+ECX],0
+    98 000000C3 EB EB                                  JMP     L10
+    99 000000C5                                        GLOBAL  _fifo32_status
+   100 000000C5                                 _fifo32_status:
+   101 000000C5 55                                     PUSH    EBP
+   102 000000C6 89 E5                                  MOV     EBP,ESP
+   103 000000C8 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   104 000000CB 5D                                     POP     EBP
+   105 000000CC 8B 42 0C                               MOV     EAX,DWORD [12+EDX]
+   106 000000CF 2B 42 10                               SUB     EAX,DWORD [16+EDX]
+   107 000000D2 C3                                     RET
diff --git a/haribote/file.c b/haribote/file.c
new file mode 100644 (file)
index 0000000..268c1e6
--- /dev/null
@@ -0,0 +1,94 @@
+/* \83t\83@\83C\83\8b\8aÖ\8cW */
+
+#include "bootpack.h"
+
+void file_readfat(int *fat, unsigned char *img)
+/* \83f\83B\83X\83N\83C\83\81\81[\83W\93à\82ÌFAT\82Ì\88³\8fk\82ð\82Æ\82­ */
+{
+       int i, j = 0;
+       for (i = 0; i < 2880; i += 2) {
+               fat[i + 0] = (img[j + 0]      | img[j + 1] << 8) & 0xfff;
+               fat[i + 1] = (img[j + 1] >> 4 | img[j + 2] << 4) & 0xfff;
+               j += 3;
+       }
+       return;
+}
+
+void file_loadfile(int clustno, int size, char *buf, int *fat, char *img)
+{
+       int i;
+       for (;;) {
+               if (size <= 512) {
+                       for (i = 0; i < size; i++) {
+                               buf[i] = img[clustno * 512 + i];
+                       }
+                       break;
+               }
+               for (i = 0; i < 512; i++) {
+                       buf[i] = img[clustno * 512 + i];
+               }
+               size -= 512;
+               buf += 512;
+               clustno = fat[clustno];
+       }
+       return;
+}
+
+struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max)
+{
+       int i, j;
+       char s[12];
+       for (j = 0; j < 11; j++) {
+               s[j] = ' ';
+       }
+       j = 0;
+       for (i = 0; name[i] != 0; i++) {
+               if (j >= 11) { return 0; /* \8c©\82Â\82©\82ç\82È\82©\82Á\82½ */ }
+               if (name[i] == '.' && j <= 8) {
+                       j = 8;
+               } else {
+                       s[j] = name[i];
+                       if ('a' <= s[j] && s[j] <= 'z') {
+                               /* \8f¬\95\8e\9a\82Í\91å\95\8e\9a\82É\92¼\82· */
+                               s[j] -= 0x20;
+                       } 
+                       j++;
+               }
+       }
+       for (i = 0; i < max; ) {
+               if (finfo->name[0] == 0x00) {
+                       break;
+               }
+               if ((finfo[i].type & 0x18) == 0) {
+                       for (j = 0; j < 11; j++) {
+                               if (finfo[i].name[j] != s[j]) {
+                                       goto next;
+                               }
+                       }
+                       return finfo + i; /* \83t\83@\83C\83\8b\82ª\8c©\82Â\82©\82Á\82½ */
+               }
+next:
+               i++;
+       }
+       return 0; /* \8c©\82Â\82©\82ç\82È\82©\82Á\82½ */
+}
+
+char *file_loadfile2(int clustno, int *psize, int *fat)
+{
+       int size = *psize, size2;
+       struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
+       char *buf, *buf2;
+       buf = (char *) memman_alloc_4k(memman, size);
+       file_loadfile(clustno, size, buf, fat, (char *) (ADR_DISKIMG + 0x003e00));
+       if (size >= 17) {
+               size2 = tek_getsize(buf);
+               if (size2 > 0) {        /* tek\88³\8fk\82ª\82©\82©\82Á\82Ä\82¢\82½ */
+                       buf2 = (char *) memman_alloc_4k(memman, size2);
+                       tek_decomp(buf, buf2, size2);
+                       memman_free_4k(memman, (int) buf, size);
+                       buf = buf2;
+                       *psize = size2;
+               }
+       }
+       return buf;
+}
diff --git a/haribote/file.lst b/haribote/file.lst
new file mode 100644 (file)
index 0000000..5910ff1
--- /dev/null
@@ -0,0 +1,235 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _memman_alloc_4k
+     7 00000000                                        EXTERN  _tek_getsize
+     8 00000000                                        EXTERN  _tek_decomp
+     9 00000000                                        EXTERN  _memman_free_4k
+    10 00000000                                 [FILE "file.c"]
+    11                                          [SECTION .text]
+    12 00000000                                        GLOBAL  _file_readfat
+    13 00000000                                 _file_readfat:
+    14 00000000 55                                     PUSH    EBP
+    15 00000001 31 C9                                  XOR     ECX,ECX
+    16 00000003 89 E5                                  MOV     EBP,ESP
+    17 00000005 57                                     PUSH    EDI
+    18 00000006 56                                     PUSH    ESI
+    19 00000007 53                                     PUSH    EBX
+    20 00000008 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+    21 0000000B 8B 75 0C                               MOV     ESI,DWORD [12+EBP]
+    22 0000000E 31 DB                                  XOR     EBX,EBX
+    23 00000010                                 L6:
+    24 00000010 0F B6 44 31 01                         MOVZX   EAX,BYTE [1+ECX+ESI*1]
+    25 00000015 0F B6 14 31                            MOVZX   EDX,BYTE [ECX+ESI*1]
+    26 00000019 C1 E0 08                               SAL     EAX,8
+    27 0000001C 09 C2                                  OR      EDX,EAX
+    28 0000001E 81 E2 00000FFF                         AND     EDX,4095
+    29 00000024 89 14 9F                               MOV     DWORD [EDI+EBX*4],EDX
+    30 00000027 8A 44 31 01                            MOV     AL,BYTE [1+ECX+ESI*1]
+    31 0000002B 0F B6 54 31 02                         MOVZX   EDX,BYTE [2+ECX+ESI*1]
+    32 00000030 C0 E8 04                               SHR     AL,4
+    33 00000033 83 C1 03                               ADD     ECX,3
+    34 00000036 C1 E2 04                               SAL     EDX,4
+    35 00000039 0F B6 C0                               MOVZX   EAX,AL
+    36 0000003C 09 D0                                  OR      EAX,EDX
+    37 0000003E 89 44 9F 04                            MOV     DWORD [4+EDI+EBX*4],EAX
+    38 00000042 83 C3 02                               ADD     EBX,2
+    39 00000045 81 FB 00000B3F                         CMP     EBX,2879
+    40 0000004B 7E C3                                  JLE     L6
+    41 0000004D 5B                                     POP     EBX
+    42 0000004E 5E                                     POP     ESI
+    43 0000004F 5F                                     POP     EDI
+    44 00000050 5D                                     POP     EBP
+    45 00000051 C3                                     RET
+    46 00000052                                        GLOBAL  _file_loadfile
+    47 00000052                                 _file_loadfile:
+    48 00000052 55                                     PUSH    EBP
+    49 00000053 89 E5                                  MOV     EBP,ESP
+    50 00000055 57                                     PUSH    EDI
+    51 00000056 56                                     PUSH    ESI
+    52 00000057 53                                     PUSH    EBX
+    53 00000058 8B 4D 0C                               MOV     ECX,DWORD [12+EBP]
+    54 0000005B 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+    55 0000005E 8B 5D 10                               MOV     EBX,DWORD [16+EBP]
+    56 00000061                                 L10:
+    57 00000061 81 F9 00000200                         CMP     ECX,512
+    58 00000067 7E 2F                                  JLE     L27
+    59 00000069 31 D2                                  XOR     EDX,EDX
+    60 0000006B                                 L23:
+    61 0000006B 89 F0                                  MOV     EAX,ESI
+    62 0000006D 8B 7D 18                               MOV     EDI,DWORD [24+EBP]
+    63 00000070 C1 E0 09                               SAL     EAX,9
+    64 00000073 01 D0                                  ADD     EAX,EDX
+    65 00000075 8A 04 38                               MOV     AL,BYTE [EAX+EDI*1]
+    66 00000078 88 04 1A                               MOV     BYTE [EDX+EBX*1],AL
+    67 0000007B 42                                     INC     EDX
+    68 0000007C 81 FA 000001FF                         CMP     EDX,511
+    69 00000082 7E E7                                  JLE     L23
+    70 00000084 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+    71 00000087 81 E9 00000200                         SUB     ECX,512
+    72 0000008D 81 C3 00000200                         ADD     EBX,512
+    73 00000093 8B 34 B0                               MOV     ESI,DWORD [EAX+ESI*4]
+    74 00000096 EB C9                                  JMP     L10
+    75 00000098                                 L27:
+    76 00000098 31 D2                                  XOR     EDX,EDX
+    77 0000009A 39 CA                                  CMP     EDX,ECX
+    78 0000009C 7D 15                                  JGE     L9
+    79 0000009E                                 L18:
+    80 0000009E 89 F0                                  MOV     EAX,ESI
+    81 000000A0 8B 7D 18                               MOV     EDI,DWORD [24+EBP]
+    82 000000A3 C1 E0 09                               SAL     EAX,9
+    83 000000A6 01 D0                                  ADD     EAX,EDX
+    84 000000A8 8A 04 38                               MOV     AL,BYTE [EAX+EDI*1]
+    85 000000AB 88 04 1A                               MOV     BYTE [EDX+EBX*1],AL
+    86 000000AE 42                                     INC     EDX
+    87 000000AF 39 CA                                  CMP     EDX,ECX
+    88 000000B1 7C EB                                  JL      L18
+    89 000000B3                                 L9:
+    90 000000B3 5B                                     POP     EBX
+    91 000000B4 5E                                     POP     ESI
+    92 000000B5 5F                                     POP     EDI
+    93 000000B6 5D                                     POP     EBP
+    94 000000B7 C3                                     RET
+    95 000000B8                                        GLOBAL  _file_search
+    96 000000B8                                 _file_search:
+    97 000000B8 55                                     PUSH    EBP
+    98 000000B9 31 C9                                  XOR     ECX,ECX
+    99 000000BB 89 E5                                  MOV     EBP,ESP
+   100 000000BD 57                                     PUSH    EDI
+   101 000000BE 56                                     PUSH    ESI
+   102 000000BF 53                                     PUSH    EBX
+   103 000000C0 83 EC 14                               SUB     ESP,20
+   104 000000C3 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   105 000000C6                                 L33:
+   106 000000C6 C6 44 0D E4 20                         MOV     BYTE [-28+EBP+ECX*1],32
+   107 000000CB 41                                     INC     ECX
+   108 000000CC 83 F9 0A                               CMP     ECX,10
+   109 000000CF 7E F5                                  JLE     L33
+   110 000000D1 31 C9                                  XOR     ECX,ECX
+   111 000000D3 31 FF                                  XOR     EDI,EDI
+   112 000000D5 80 3B 00                               CMP     BYTE [EBX],0
+   113 000000D8 74 29                                  JE      L60
+   114 000000DA                                 L42:
+   115 000000DA 31 C0                                  XOR     EAX,EAX
+   116 000000DC 83 F9 0A                               CMP     ECX,10
+   117 000000DF 7F 5D                                  JG      L28
+   118 000000E1 8A 14 1F                               MOV     DL,BYTE [EDI+EBX*1]
+   119 000000E4 80 FA 2E                               CMP     DL,46
+   120 000000E7 74 6E                                  JE      L64
+   121 000000E9                                 L39:
+   122 000000E9 8D 42 9F                               LEA     EAX,DWORD [-97+EDX]
+   123 000000EC 88 54 0D E4                            MOV     BYTE [-28+EBP+ECX*1],DL
+   124 000000F0 3C 19                                  CMP     AL,25
+   125 000000F2 77 07                                  JA      L41
+   126 000000F4 8D 42 E0                               LEA     EAX,DWORD [-32+EDX]
+   127 000000F7 88 44 0D E4                            MOV     BYTE [-28+EBP+ECX*1],AL
+   128 000000FB                                 L41:
+   129 000000FB 41                                     INC     ECX
+   130 000000FC                                 L36:
+   131 000000FC 47                                     INC     EDI
+   132 000000FD 80 3C 1F 00                            CMP     BYTE [EDI+EBX*1],0
+   133 00000101 75 D7                                  JNE     L42
+   134 00000103                                 L60:
+   135 00000103 31 FF                                  XOR     EDI,EDI
+   136 00000105 3B 7D 10                               CMP     EDI,DWORD [16+EBP]
+   137 00000108 7D 49                                  JGE     L44
+   138 0000010A 8B 75 0C                               MOV     ESI,DWORD [12+EBP]
+   139 0000010D C7 45 E0 00000000                      MOV     DWORD [-32+EBP],0
+   140 00000114                                 L56:
+   141 00000114 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   142 00000117 80 38 00                               CMP     BYTE [EAX],0
+   143 0000011A 74 37                                  JE      L44
+   144 0000011C F6 46 0B 18                            TEST    BYTE [11+ESI],24
+   145 00000120 75 24                                  JNE     L54
+   146 00000122 89 C3                                  MOV     EBX,EAX
+   147 00000124 31 C9                                  XOR     ECX,ECX
+   148 00000126 03 5D E0                               ADD     EBX,DWORD [-32+EBP]
+   149 00000129                                 L55:
+   150 00000129 0F B6 13                               MOVZX   EDX,BYTE [EBX]
+   151 0000012C 0F BE 44 0D E4                         MOVSX   EAX,BYTE [-28+EBP+ECX*1]
+   152 00000131 39 C2                                  CMP     EDX,EAX
+   153 00000133 75 11                                  JNE     L54
+   154 00000135 41                                     INC     ECX
+   155 00000136 43                                     INC     EBX
+   156 00000137 89 F0                                  MOV     EAX,ESI
+   157 00000139 83 F9 0A                               CMP     ECX,10
+   158 0000013C 7E EB                                  JLE     L55
+   159 0000013E                                 L28:
+   160 0000013E 83 C4 14                               ADD     ESP,20
+   161 00000141 5B                                     POP     EBX
+   162 00000142 5E                                     POP     ESI
+   163 00000143 5F                                     POP     EDI
+   164 00000144 5D                                     POP     EBP
+   165 00000145 C3                                     RET
+   166 00000146                                 L54:
+   167 00000146 47                                     INC     EDI
+   168 00000147 83 C6 20                               ADD     ESI,32
+   169 0000014A 83 45 E0 20                            ADD     DWORD [-32+EBP],32
+   170 0000014E 3B 7D 10                               CMP     EDI,DWORD [16+EBP]
+   171 00000151 7C C1                                  JL      L56
+   172 00000153                                 L44:
+   173 00000153 31 C0                                  XOR     EAX,EAX
+   174 00000155 EB E7                                  JMP     L28
+   175 00000157                                 L64:
+   176 00000157 83 F9 08                               CMP     ECX,8
+   177 0000015A 7F 8D                                  JG      L39
+   178 0000015C B9 00000008                            MOV     ECX,8
+   179 00000161 EB 99                                  JMP     L36
+   180 00000163                                        GLOBAL  _file_loadfile2
+   181 00000163                                 _file_loadfile2:
+   182 00000163 55                                     PUSH    EBP
+   183 00000164 89 E5                                  MOV     EBP,ESP
+   184 00000166 57                                     PUSH    EDI
+   185 00000167 56                                     PUSH    ESI
+   186 00000168 53                                     PUSH    EBX
+   187 00000169 52                                     PUSH    EDX
+   188 0000016A 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   189 0000016D 8B 00                                  MOV     EAX,DWORD [EAX]
+   190 0000016F 50                                     PUSH    EAX
+   191 00000170 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   192 00000173 68 003C0000                            PUSH    3932160
+   193 00000178 E8 [00000000]                          CALL    _memman_alloc_4k
+   194 0000017D 68 00103E00                            PUSH    1064448
+   195 00000182 FF 75 10                               PUSH    DWORD [16+EBP]
+   196 00000185 50                                     PUSH    EAX
+   197 00000186 89 C7                                  MOV     EDI,EAX
+   198 00000188 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   199 0000018B FF 75 08                               PUSH    DWORD [8+EBP]
+   200 0000018E E8 FFFFFEBF                            CALL    _file_loadfile
+   201 00000193 83 C4 1C                               ADD     ESP,28
+   202 00000196 83 7D F0 10                            CMP     DWORD [-16+EBP],16
+   203 0000019A 7F 0A                                  JG      L68
+   204 0000019C                                 L66:
+   205 0000019C 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   206 0000019F 89 F8                                  MOV     EAX,EDI
+   207 000001A1 5B                                     POP     EBX
+   208 000001A2 5E                                     POP     ESI
+   209 000001A3 5F                                     POP     EDI
+   210 000001A4 5D                                     POP     EBP
+   211 000001A5 C3                                     RET
+   212 000001A6                                 L68:
+   213 000001A6 57                                     PUSH    EDI
+   214 000001A7 E8 [00000000]                          CALL    _tek_getsize
+   215 000001AC 89 C6                                  MOV     ESI,EAX
+   216 000001AE 58                                     POP     EAX
+   217 000001AF 85 F6                                  TEST    ESI,ESI
+   218 000001B1 7E E9                                  JLE     L66
+   219 000001B3 56                                     PUSH    ESI
+   220 000001B4 68 003C0000                            PUSH    3932160
+   221 000001B9 E8 [00000000]                          CALL    _memman_alloc_4k
+   222 000001BE 56                                     PUSH    ESI
+   223 000001BF 89 C3                                  MOV     EBX,EAX
+   224 000001C1 50                                     PUSH    EAX
+   225 000001C2 57                                     PUSH    EDI
+   226 000001C3 E8 [00000000]                          CALL    _tek_decomp
+   227 000001C8 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   228 000001CB 57                                     PUSH    EDI
+   229 000001CC 89 DF                                  MOV     EDI,EBX
+   230 000001CE 68 003C0000                            PUSH    3932160
+   231 000001D3 E8 [00000000]                          CALL    _memman_free_4k
+   232 000001D8 83 C4 20                               ADD     ESP,32
+   233 000001DB 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   234 000001DE 89 30                                  MOV     DWORD [EAX],ESI
+   235 000001E0 EB BA                                  JMP     L66
diff --git a/haribote/filesyste.s b/haribote/filesyste.s
new file mode 100644 (file)
index 0000000..210df82
--- /dev/null
@@ -0,0 +1,2727 @@
+       .file   "filesystem.cpp"
+       .intel_syntax noprefix
+       .section        .debug_abbrev,"dr"
+Ldebug_abbrev0:
+       .section        .debug_info,"dr"
+Ldebug_info0:
+       .section        .debug_line,"dr"
+Ldebug_line0:
+       .text
+Ltext0:
+       .section        .text$_ZdlPvS_,"x"
+       .linkonce discard
+.globl __ZdlPvS_
+       .def    __ZdlPvS_;      .scl    2;      .type   32;     .endef
+__ZdlPvS_:
+LFB11:
+       .file 1 "g:/mingw/bin/../lib/gcc/mingw32/4.5.0/include/c++/new"
+       .loc 1 107 0
+       push    ebp
+LCFI0:
+       mov     ebp, esp
+LCFI1:
+       .loc 1 107 0
+       leave
+LCFI2:
+       ret
+LFE11:
+       .section        .text$_ZN10FileSystemnwEjPv,"x"
+       .linkonce discard
+.globl __ZN10FileSystemnwEjPv
+       .def    __ZN10FileSystemnwEjPv; .scl    2;      .type   32;     .endef
+__ZN10FileSystemnwEjPv:
+LFB14:
+       .file 2 "filesystem.h"
+       .loc 2 17 0
+       push    ebp
+LCFI3:
+       mov     ebp, esp
+LCFI4:
+       .loc 2 17 0
+       mov     eax, DWORD PTR [ebp+12]
+       leave
+LCFI5:
+       ret
+LFE14:
+       .section        .text$_ZN6Screen4InstEv,"x"
+       .linkonce discard
+.globl __ZN6Screen4InstEv
+       .def    __ZN6Screen4InstEv;     .scl    2;      .type   32;     .endef
+__ZN6Screen4InstEv:
+LFB15:
+       .file 3 "screen.h"
+       .loc 3 8 0
+       push    ebp
+LCFI6:
+       mov     ebp, esp
+LCFI7:
+       .loc 3 9 0
+       mov     eax, OFFSET FLAT:__ZN6Screen3bufE
+       .loc 3 10 0
+       leave
+LCFI8:
+       ret
+LFE15:
+.globl __ZN10FileSystem3bufE
+       .bss
+       .align 32
+__ZN10FileSystem3bufE:
+       .space 4104
+       .text
+       .align 2
+.globl __ZN10FileSystem4InitEP8BOOTINFO
+       .def    __ZN10FileSystem4InitEP8BOOTINFO;       .scl    2;      .type   32;     .endef
+__ZN10FileSystem4InitEP8BOOTINFO:
+LFB28:
+       .file 4 "filesystem.cpp"
+       .loc 4 9 0
+       push    ebp
+LCFI9:
+       mov     ebp, esp
+LCFI10:
+       push    edi
+LCFI11:
+       push    esi
+LCFI12:
+       push    ebx
+LCFI13:
+       sub     esp, 28
+LCFI14:
+       .loc 4 10 0
+       mov     esi, OFFSET FLAT:__ZN10FileSystem3bufE
+       mov     DWORD PTR [esp+4], esi
+       mov     DWORD PTR [esp], 4104
+       call    __ZN10FileSystemnwEjPv
+       mov     ebx, eax
+       mov     eax, ebx
+       mov     edx, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+LEHB0:
+       call    __ZN10FileSystemC1EP8BOOTINFO
+LEHE0:
+       .loc 4 11 0
+       jmp     L7
+L6:
+       mov     edi, eax
+       .loc 4 10 0
+       mov     DWORD PTR [esp+4], esi
+       mov     DWORD PTR [esp], ebx
+       call    __ZdlPvS_
+       mov     eax, edi
+       mov     DWORD PTR [esp], eax
+LEHB1:
+       call    __Unwind_Resume
+LEHE1:
+L7:
+       .loc 4 11 0
+       add     esp, 28
+       pop     ebx
+LCFI15:
+       pop     esi
+LCFI16:
+       pop     edi
+LCFI17:
+       leave
+LCFI18:
+       ret
+LFE28:
+       .def    ___gxx_personality_v0;  .scl    2;      .type   32;     .endef
+       .section        .gcc_except_table,"w"
+LLSDA28:
+       .byte   0xff
+       .byte   0xff
+       .byte   0x1
+       .uleb128 LLSDACSE28-LLSDACSB28
+LLSDACSB28:
+       .uleb128 LEHB0-LFB28
+       .uleb128 LEHE0-LEHB0
+       .uleb128 L6-LFB28
+       .uleb128 0x0
+       .uleb128 LEHB1-LFB28
+       .uleb128 LEHE1-LEHB1
+       .uleb128 0x0
+       .uleb128 0x0
+LLSDACSE28:
+       .text
+       .section .rdata,"dr"
+LC0:
+       .ascii "Found %d devices\12\0"
+       .align 4
+LC1:
+       .ascii "ATA Read Sectors, LBA48, polling...\12\0"
+       .text
+       .align 2
+.globl __ZN10FileSystemC2EP8BOOTINFO
+       .def    __ZN10FileSystemC2EP8BOOTINFO;  .scl    2;      .type   32;     .endef
+__ZN10FileSystemC2EP8BOOTINFO:
+LFB30:
+       .loc 4 13 0
+       push    ebp
+LCFI19:
+       mov     ebp, esp
+LCFI20:
+       sub     esp, 40
+LCFI21:
+LBB2:
+       .loc 4 13 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     edx, DWORD PTR [ebp+12]
+       mov     DWORD PTR [eax], edx
+LBB3:
+       .loc 4 15 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax+4], 0
+       .loc 4 17 0
+       mov     DWORD PTR _reg_buffer_size, 4096
+       .loc 4 20 0
+       mov     DWORD PTR [esp+8], 0
+       mov     DWORD PTR [esp+4], 1008
+       mov     DWORD PTR [esp], 496
+       call    __Z19pio_set_iobase_addrjjj
+       .loc 4 22 0
+       mov     DWORD PTR [ebp-12], 0
+       .loc 4 24 0
+       call    __Z10reg_configv
+       mov     DWORD PTR [ebp-16], eax
+       .loc 4 26 0
+       call    __ZN6Screen4InstEv
+       mov     edx, DWORD PTR [ebp-16]
+       mov     DWORD PTR [esp+8], edx
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC0
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6printfEPKcz
+       .loc 4 37 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       mov     DWORD PTR [esp+4], eax
+       mov     DWORD PTR [esp], 0
+       call    __Z9reg_resetii
+       mov     DWORD PTR [ebp-12], eax
+       .loc 4 42 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC1
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6printfEPKcz
+LBE3:
+LBE2:
+       .loc 4 44 0
+       leave
+LCFI22:
+       ret
+LFE30:
+.globl __ZN10FileSystemC1EP8BOOTINFO
+       .def    __ZN10FileSystemC1EP8BOOTINFO;  .scl    2;      .type   32;     .endef
+       .set    __ZN10FileSystemC1EP8BOOTINFO,__ZN10FileSystemC2EP8BOOTINFO
+       .align 2
+.globl __ZN10FileSystemD2Ev
+       .def    __ZN10FileSystemD2Ev;   .scl    2;      .type   32;     .endef
+__ZN10FileSystemD2Ev:
+LFB33:
+       .loc 4 47 0
+       push    ebp
+LCFI23:
+       mov     ebp, esp
+LCFI24:
+       .loc 4 48 0
+       leave
+LCFI25:
+       ret
+LFE33:
+.globl __ZN10FileSystemD1Ev
+       .def    __ZN10FileSystemD1Ev;   .scl    2;      .type   32;     .endef
+       .set    __ZN10FileSystemD1Ev,__ZN10FileSystemD2Ev
+       .align 2
+.globl __ZN10FileSystem10ClearTraceEv
+       .def    __ZN10FileSystem10ClearTraceEv; .scl    2;      .type   32;     .endef
+__ZN10FileSystem10ClearTraceEv:
+LFB35:
+       .loc 4 51 0
+       push    ebp
+LCFI26:
+       mov     ebp, esp
+LCFI27:
+       sub     esp, 8
+LCFI28:
+       .loc 4 53 0
+       call    __Z13trc_cht_dump0v
+       .loc 4 54 0
+       call    __Z13trc_llt_dump0v
+       .loc 4 55 0
+       leave
+LCFI29:
+       ret
+LFE35:
+       .align 2
+.globl __ZN10FileSystem5pauseEv
+       .def    __ZN10FileSystem5pauseEv;       .scl    2;      .type   32;     .endef
+__ZN10FileSystem5pauseEv:
+LFB36:
+       .loc 4 57 0
+       push    ebp
+LCFI30:
+       mov     ebp, esp
+LCFI31:
+       .loc 4 57 0
+       leave
+LCFI32:
+       ret
+LFE36:
+       .section .rdata,"dr"
+LC2:
+       .ascii "ERROR !\12\0"
+LC3:
+       .ascii "1 END\12\0"
+LC4:
+       .ascii "1 \0"
+LC5:
+       .ascii "\12\0"
+LC6:
+       .ascii "2 END\12\0"
+LC7:
+       .ascii "2 \0"
+LC8:
+       .ascii "3 END\12\0"
+LC9:
+       .ascii "3 \0"
+       .text
+       .align 2
+.globl __ZN10FileSystem7ShowAllEv
+       .def    __ZN10FileSystem7ShowAllEv;     .scl    2;      .type   32;     .endef
+__ZN10FileSystem7ShowAllEv:
+LFB37:
+       .loc 4 59 0
+       push    ebp
+LCFI33:
+       mov     ebp, esp
+LCFI34:
+       sub     esp, 40
+LCFI35:
+LBB4:
+       .loc 4 60 0
+       mov     DWORD PTR [ebp-12], 0
+       .loc 4 63 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC2
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6printfEPKcz
+       .loc 4 66 0
+       call    __Z13trc_err_dump1v
+L16:
+       .loc 4 68 0
+       inc     DWORD PTR [ebp-12]
+       .loc 4 69 0
+       call    __Z13trc_err_dump2v
+       mov     DWORD PTR [ebp-16], eax
+       .loc 4 70 0
+       cmp     DWORD PTR [ebp-16], 0
+       jne     L14
+       .loc 4 76 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN10FileSystem5pauseEv
+       .loc 4 77 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC3
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6printfEPKcz
+       .loc 4 81 0
+       call    __Z13trc_cht_dump1v
+       jmp     L15
+L14:
+       .loc 4 72 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC4
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 73 0
+       call    __ZN6Screen4InstEv
+       mov     edx, DWORD PTR [ebp-16]
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 74 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC5
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 67 0
+       jmp     L16
+L24:
+       .loc 4 82 0
+       nop
+L15:
+       .loc 4 84 0
+       call    __Z13trc_cht_dump2v
+       mov     DWORD PTR [ebp-16], eax
+       .loc 4 85 0
+       cmp     DWORD PTR [ebp-16], 0
+       jne     L17
+       .loc 4 94 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC6
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6printfEPKcz
+       .loc 4 97 0
+       call    __Z13trc_llt_dump1v
+       jmp     L18
+L17:
+       .loc 4 87 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC7
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 88 0
+       call    __ZN6Screen4InstEv
+       mov     edx, DWORD PTR [ebp-16]
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 89 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC5
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 90 0
+       inc     DWORD PTR [ebp-12]
+       .loc 4 91 0
+       mov     eax, DWORD PTR [ebp-12]
+       and     eax, 15
+       test    eax, eax
+       jne     L24
+       .loc 4 92 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN10FileSystem5pauseEv
+       .loc 4 82 0
+       jmp     L15
+L25:
+       .loc 4 98 0
+       nop
+L18:
+       .loc 4 100 0
+       call    __Z13trc_llt_dump2v
+       mov     DWORD PTR [ebp-16], eax
+       .loc 4 101 0
+       cmp     DWORD PTR [ebp-16], 0
+       jne     L20
+       .loc 4 110 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC8
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6printfEPKcz
+       .loc 4 111 0
+       mov     eax, DWORD PTR [ebp-12]
+       and     eax, 15
+       test    eax, eax
+       jne     L21
+       jmp     L13
+L20:
+       .loc 4 103 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC9
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 104 0
+       call    __ZN6Screen4InstEv
+       mov     edx, DWORD PTR [ebp-16]
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 105 0
+       call    __ZN6Screen4InstEv
+       mov     DWORD PTR [esp+4], OFFSET FLAT:LC5
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+       .loc 4 106 0
+       inc     DWORD PTR [ebp-12]
+       .loc 4 107 0
+       mov     eax, DWORD PTR [ebp-12]
+       and     eax, 15
+       test    eax, eax
+       jne     L25
+       .loc 4 108 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN10FileSystem5pauseEv
+       .loc 4 98 0
+       jmp     L18
+L21:
+       .loc 4 112 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN10FileSystem5pauseEv
+L13:
+LBE4:
+       .loc 4 113 0
+       leave
+LCFI36:
+       ret
+LFE37:
+       .align 2
+.globl __ZN10FileSystem10ReadSectorEiiyPhii
+       .def    __ZN10FileSystem10ReadSectorEiiyPhii;   .scl    2;      .type   32;     .endef
+__ZN10FileSystem10ReadSectorEiiyPhii:
+LFB38:
+       .loc 4 116 0
+       push    ebp
+LCFI37:
+       mov     ebp, esp
+LCFI38:
+       push    edi
+LCFI39:
+       push    esi
+LCFI40:
+       push    ebx
+LCFI41:
+       sub     esp, 92
+LCFI42:
+       mov     eax, DWORD PTR [ebp+20]
+       mov     DWORD PTR [ebp-48], eax
+       mov     eax, DWORD PTR [ebp+24]
+       mov     DWORD PTR [ebp-44], eax
+LBB5:
+       .loc 4 117 0
+       mov     eax, DWORD PTR [ebp+32]
+       mov     DWORD PTR _reg_buffer_size, eax
+       .loc 4 119 0
+       mov     eax, DWORD PTR [ebp+32]
+       mov     DWORD PTR [esp+8], eax
+       mov     DWORD PTR [esp+4], 0
+       mov     eax, DWORD PTR [ebp+28]
+       mov     DWORD PTR [esp], eax
+       call    _memset
+       .loc 4 120 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN10FileSystem10ClearTraceEv
+       .loc 4 124 0
+       mov     edi, DWORD PTR [ebp+28]
+       mov     ecx, DWORD PTR [ebp-48]
+       mov     eax, DWORD PTR [ebp-48]
+       mov     ebx, eax
+       and     ebx, 0
+       mov     eax, DWORD PTR [ebp-44]
+       movzx   esi, ax
+       mov     eax, ebx
+       mov     edx, esi
+       mov     eax, edx
+       xor     edx, edx
+       mov     edx, eax
+       mov     eax, DWORD PTR [ebp+16]
+       mov     DWORD PTR [esp+36], 0
+       mov     ebx, DWORD PTR [ebp+36]
+       mov     DWORD PTR [esp+32], ebx
+       mov     DWORD PTR [esp+28], edi
+       mov     DWORD PTR [esp+24], 0
+       mov     DWORD PTR [esp+20], ecx
+       mov     DWORD PTR [esp+16], edx
+       mov     DWORD PTR [esp+12], eax
+       mov     DWORD PTR [esp+8], 0
+       mov     DWORD PTR [esp+4], 36
+       mov     eax, DWORD PTR [ebp+12]
+       mov     DWORD PTR [esp], eax
+       call    __Z21reg_pio_data_in_lba48iijjmmjjli
+       mov     DWORD PTR [ebp-28], eax
+       .loc 4 125 0
+       mov     eax, DWORD PTR [ebp-28]
+LBE5:
+       .loc 4 133 0
+       add     esp, 92
+       pop     ebx
+LCFI43:
+       pop     esi
+LCFI44:
+       pop     edi
+LCFI45:
+       leave
+LCFI46:
+       ret
+LFE38:
+       .section        .debug_frame,"dr"
+Lframe0:
+       .long   LECIE0-LSCIE0
+LSCIE0:
+       .long   0xffffffff
+       .byte   0x1
+       .ascii "\0"
+       .uleb128 0x1
+       .sleb128 -4
+       .byte   0x8
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .byte   0x88
+       .uleb128 0x1
+       .align 4
+LECIE0:
+LSFDE0:
+       .long   LEFDE0-LASFDE0
+LASFDE0:
+       .secrel32       Lframe0
+       .long   LFB11
+       .long   LFE11-LFB11
+       .byte   0x4
+       .long   LCFI0-LFB11
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI1-LCFI0
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI2-LCFI1
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE0:
+LSFDE2:
+       .long   LEFDE2-LASFDE2
+LASFDE2:
+       .secrel32       Lframe0
+       .long   LFB14
+       .long   LFE14-LFB14
+       .byte   0x4
+       .long   LCFI3-LFB14
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI4-LCFI3
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI5-LCFI4
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE2:
+LSFDE4:
+       .long   LEFDE4-LASFDE4
+LASFDE4:
+       .secrel32       Lframe0
+       .long   LFB15
+       .long   LFE15-LFB15
+       .byte   0x4
+       .long   LCFI6-LFB15
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI7-LCFI6
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI8-LCFI7
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE4:
+LSFDE6:
+       .long   LEFDE6-LASFDE6
+LASFDE6:
+       .secrel32       Lframe0
+       .long   LFB28
+       .long   LFE28-LFB28
+       .byte   0x4
+       .long   LCFI9-LFB28
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI10-LCFI9
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI14-LCFI10
+       .byte   0x83
+       .uleb128 0x5
+       .byte   0x86
+       .uleb128 0x4
+       .byte   0x87
+       .uleb128 0x3
+       .byte   0x4
+       .long   LCFI15-LCFI14
+       .byte   0xc3
+       .byte   0x4
+       .long   LCFI16-LCFI15
+       .byte   0xc6
+       .byte   0x4
+       .long   LCFI17-LCFI16
+       .byte   0xc7
+       .byte   0x4
+       .long   LCFI18-LCFI17
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE6:
+LSFDE8:
+       .long   LEFDE8-LASFDE8
+LASFDE8:
+       .secrel32       Lframe0
+       .long   LFB30
+       .long   LFE30-LFB30
+       .byte   0x4
+       .long   LCFI19-LFB30
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI20-LCFI19
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI22-LCFI20
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE8:
+LSFDE10:
+       .long   LEFDE10-LASFDE10
+LASFDE10:
+       .secrel32       Lframe0
+       .long   LFB33
+       .long   LFE33-LFB33
+       .byte   0x4
+       .long   LCFI23-LFB33
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI24-LCFI23
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI25-LCFI24
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE10:
+LSFDE12:
+       .long   LEFDE12-LASFDE12
+LASFDE12:
+       .secrel32       Lframe0
+       .long   LFB35
+       .long   LFE35-LFB35
+       .byte   0x4
+       .long   LCFI26-LFB35
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI27-LCFI26
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI29-LCFI27
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE12:
+LSFDE14:
+       .long   LEFDE14-LASFDE14
+LASFDE14:
+       .secrel32       Lframe0
+       .long   LFB36
+       .long   LFE36-LFB36
+       .byte   0x4
+       .long   LCFI30-LFB36
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI31-LCFI30
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI32-LCFI31
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE14:
+LSFDE16:
+       .long   LEFDE16-LASFDE16
+LASFDE16:
+       .secrel32       Lframe0
+       .long   LFB37
+       .long   LFE37-LFB37
+       .byte   0x4
+       .long   LCFI33-LFB37
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI34-LCFI33
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI36-LCFI34
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE16:
+LSFDE18:
+       .long   LEFDE18-LASFDE18
+LASFDE18:
+       .secrel32       Lframe0
+       .long   LFB38
+       .long   LFE38-LFB38
+       .byte   0x4
+       .long   LCFI37-LFB38
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI38-LCFI37
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI42-LCFI38
+       .byte   0x83
+       .uleb128 0x5
+       .byte   0x86
+       .uleb128 0x4
+       .byte   0x87
+       .uleb128 0x3
+       .byte   0x4
+       .long   LCFI43-LCFI42
+       .byte   0xc3
+       .byte   0x4
+       .long   LCFI44-LCFI43
+       .byte   0xc6
+       .byte   0x4
+       .long   LCFI45-LCFI44
+       .byte   0xc7
+       .byte   0x4
+       .long   LCFI46-LCFI45
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE18:
+       .section        .eh_frame,"w"
+Lframe1:
+       .long   LECIE1-LSCIE1
+LSCIE1:
+       .long   0x0
+       .byte   0x1
+       .ascii "zPL\0"
+       .uleb128 0x1
+       .sleb128 -4
+       .byte   0x8
+       .uleb128 0x6
+       .byte   0x0
+       .long   ___gxx_personality_v0
+       .byte   0x0
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .byte   0x88
+       .uleb128 0x1
+       .align 4
+LECIE1:
+LSFDE21:
+       .long   LEFDE21-LASFDE21
+LASFDE21:
+       .long   LASFDE21-Lframe1
+       .long   LFB28
+       .long   LFE28-LFB28
+       .uleb128 0x4
+       .long   LLSDA28
+       .byte   0x4
+       .long   LCFI9-LFB28
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI10-LCFI9
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI14-LCFI10
+       .byte   0x83
+       .uleb128 0x5
+       .byte   0x86
+       .uleb128 0x4
+       .byte   0x87
+       .uleb128 0x3
+       .byte   0x4
+       .long   LCFI15-LCFI14
+       .byte   0xc3
+       .byte   0x4
+       .long   LCFI16-LCFI15
+       .byte   0xc6
+       .byte   0x4
+       .long   LCFI17-LCFI16
+       .byte   0xc7
+       .byte   0x4
+       .long   LCFI18-LCFI17
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE21:
+LSFDE23:
+       .long   LEFDE23-LASFDE23
+LASFDE23:
+       .long   LASFDE23-Lframe1
+       .long   LFB30
+       .long   LFE30-LFB30
+       .uleb128 0x4
+       .long   0x0
+       .byte   0x4
+       .long   LCFI19-LFB30
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI20-LCFI19
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI22-LCFI20
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE23:
+LSFDE25:
+       .long   LEFDE25-LASFDE25
+LASFDE25:
+       .long   LASFDE25-Lframe1
+       .long   LFB35
+       .long   LFE35-LFB35
+       .uleb128 0x4
+       .long   0x0
+       .byte   0x4
+       .long   LCFI26-LFB35
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI27-LCFI26
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI29-LCFI27
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE25:
+LSFDE27:
+       .long   LEFDE27-LASFDE27
+LASFDE27:
+       .long   LASFDE27-Lframe1
+       .long   LFB37
+       .long   LFE37-LFB37
+       .uleb128 0x4
+       .long   0x0
+       .byte   0x4
+       .long   LCFI33-LFB37
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI34-LCFI33
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI36-LCFI34
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE27:
+LSFDE29:
+       .long   LEFDE29-LASFDE29
+LASFDE29:
+       .long   LASFDE29-Lframe1
+       .long   LFB38
+       .long   LFE38-LFB38
+       .uleb128 0x4
+       .long   0x0
+       .byte   0x4
+       .long   LCFI37-LFB38
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI38-LCFI37
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI42-LCFI38
+       .byte   0x83
+       .uleb128 0x5
+       .byte   0x86
+       .uleb128 0x4
+       .byte   0x87
+       .uleb128 0x3
+       .byte   0x4
+       .long   LCFI43-LCFI42
+       .byte   0xc3
+       .byte   0x4
+       .long   LCFI44-LCFI43
+       .byte   0xc6
+       .byte   0x4
+       .long   LCFI45-LCFI44
+       .byte   0xc7
+       .byte   0x4
+       .long   LCFI46-LCFI45
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE29:
+       .text
+Letext0:
+       .section        .debug_loc,"dr"
+Ldebug_loc0:
+LLST0:
+       .long   LFB11
+       .long   LCFI0
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI0
+       .long   LCFI1
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI1
+       .long   LCFI2
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI2
+       .long   LFE11
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST1:
+       .long   LFB14
+       .long   LCFI3
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI3
+       .long   LCFI4
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI4
+       .long   LCFI5
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI5
+       .long   LFE14
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST2:
+       .long   LFB15
+       .long   LCFI6
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI6
+       .long   LCFI7
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI7
+       .long   LCFI8
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI8
+       .long   LFE15
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST3:
+       .long   LFB28
+       .long   LCFI9
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI9
+       .long   LCFI10
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI10
+       .long   LCFI18
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI18
+       .long   LFE28
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST4:
+       .long   LFB30
+       .long   LCFI19
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI19
+       .long   LCFI20
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI20
+       .long   LCFI22
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI22
+       .long   LFE30
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST5:
+       .long   LFB33
+       .long   LCFI23
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI23
+       .long   LCFI24
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI24
+       .long   LCFI25
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI25
+       .long   LFE33
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST6:
+       .long   LFB35
+       .long   LCFI26
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI26
+       .long   LCFI27
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI27
+       .long   LCFI29
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI29
+       .long   LFE35
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST7:
+       .long   LFB36
+       .long   LCFI30
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI30
+       .long   LCFI31
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI31
+       .long   LCFI32
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI32
+       .long   LFE36
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST8:
+       .long   LFB37
+       .long   LCFI33
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI33
+       .long   LCFI34
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI34
+       .long   LCFI36
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI36
+       .long   LFE37
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST9:
+       .long   LFB38
+       .long   LCFI37
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI37
+       .long   LCFI38
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI38
+       .long   LCFI46
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI46
+       .long   LFE38
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+       .file 5 "g:/mingw/bin/../lib/gcc/mingw32/4.5.0/include/c++/cstddef"
+       .file 6 "g:/mingw/bin/../lib/gcc/mingw32/4.5.0/include/stddef.h"
+       .file 7 "typedefs.h"
+       .file 8 "bootpack.h"
+       .file 9 "<built-in>"
+       .file 10 "ata/ataio.h"
+       .section        .debug_info,"dr"
+       .long   0x767
+       .word   0x2
+       .secrel32       Ldebug_abbrev0
+       .byte   0x4
+       .uleb128 0x1
+       .ascii "GNU C++ 4.5.0\0"
+       .byte   0x4
+       .ascii "filesystem.cpp\0"
+       .ascii "G:\\c\\os\\harib27f\\haribote\0"
+       .long   0x0
+       .long   0x0
+       .secrel32       Ldebug_ranges0+0x0
+       .secrel32       Ldebug_line0
+       .uleb128 0x2
+       .byte   0x4
+       .byte   0x5
+       .ascii "int\0"
+       .uleb128 0x3
+       .ascii "size_t\0"
+       .byte   0x6
+       .byte   0xd3
+       .long   0x69
+       .uleb128 0x2
+       .byte   0x4
+       .byte   0x7
+       .ascii "unsigned int\0"
+       .uleb128 0x4
+       .ascii "std\0"
+       .byte   0x9
+       .byte   0x0
+       .long   0x93
+       .uleb128 0x5
+       .byte   0x5
+       .byte   0x33
+       .long   0x93
+       .uleb128 0x5
+       .byte   0x5
+       .byte   0x34
+       .long   0x96
+       .byte   0x0
+       .uleb128 0x6
+       .byte   0x4
+       .byte   0x5
+       .uleb128 0x6
+       .byte   0x4
+       .byte   0x7
+       .uleb128 0x3
+       .ascii "BYTE\0"
+       .byte   0x7
+       .byte   0x3
+       .long   0xa5
+       .uleb128 0x2
+       .byte   0x1
+       .byte   0x8
+       .ascii "unsigned char\0"
+       .uleb128 0x3
+       .ascii "WORD\0"
+       .byte   0x7
+       .byte   0x4
+       .long   0xc2
+       .uleb128 0x2
+       .byte   0x2
+       .byte   0x7
+       .ascii "short unsigned int\0"
+       .uleb128 0x3
+       .ascii "DWORD\0"
+       .byte   0x7
+       .byte   0x5
+       .long   0x69
+       .uleb128 0x3
+       .ascii "QWORD\0"
+       .byte   0x7
+       .byte   0x6
+       .long   0xf2
+       .uleb128 0x2
+       .byte   0x8
+       .byte   0x7
+       .ascii "long long unsigned int\0"
+       .uleb128 0x7
+       .ascii "BOOTINFO\0"
+       .byte   0xc
+       .byte   0x8
+       .byte   0x4
+       .long   0x196
+       .uleb128 0x8
+       .ascii "bootdrive\0"
+       .byte   0x8
+       .byte   0x5
+       .long   0x99
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x0
+       .uleb128 0x8
+       .ascii "leds\0"
+       .byte   0x8
+       .byte   0x6
+       .long   0x99
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x1
+       .uleb128 0x8
+       .ascii "vmode\0"
+       .byte   0x8
+       .byte   0x7
+       .long   0x99
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x2
+       .uleb128 0x8
+       .ascii "reserve\0"
+       .byte   0x8
+       .byte   0x8
+       .long   0x99
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x3
+       .uleb128 0x8
+       .ascii "screenx\0"
+       .byte   0x8
+       .byte   0x9
+       .long   0xb6
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x4
+       .uleb128 0x8
+       .ascii "screeny\0"
+       .byte   0x8
+       .byte   0x9
+       .long   0xb6
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x6
+       .uleb128 0x8
+       .ascii "vram\0"
+       .byte   0x8
+       .byte   0xa
+       .long   0x196
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x8
+       .byte   0x0
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x99
+       .uleb128 0x2
+       .byte   0x4
+       .byte   0x5
+       .ascii "long int\0"
+       .uleb128 0x2
+       .byte   0x4
+       .byte   0x7
+       .ascii "long unsigned int\0"
+       .uleb128 0xa
+       .secrel32       LASF0
+       .word   0x1008
+       .byte   0x2
+       .byte   0x8
+       .long   0x42a
+       .uleb128 0xb
+       .ascii "buf\0"
+       .byte   0x2
+       .byte   0x10
+       .ascii "_ZN10FileSystem3bufE\0"
+       .long   0x42a
+       .byte   0x1
+       .byte   0x3
+       .byte   0x1
+       .uleb128 0xc
+       .ascii "binfo\0"
+       .byte   0x2
+       .byte   0x1b
+       .long   0x435
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x0
+       .byte   0x3
+       .uleb128 0xc
+       .ascii "m_drivenum\0"
+       .byte   0x2
+       .byte   0x1c
+       .long   0x54
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x4
+       .byte   0x3
+       .uleb128 0xd
+       .ascii "READBUFSIZE\0"
+       .byte   0x2
+       .byte   0x1d
+       .ascii "_ZN10FileSystem11READBUFSIZEE\0"
+       .long   0x43b
+       .byte   0x1
+       .byte   0x3
+       .byte   0x1
+       .word   0x1000
+       .uleb128 0xc
+       .ascii "readbuf\0"
+       .byte   0x2
+       .byte   0x1e
+       .long   0x440
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x8
+       .byte   0x3
+       .uleb128 0xe
+       .byte   0x1
+       .ascii "Init\0"
+       .byte   0x2
+       .byte   0xa
+       .ascii "_ZN10FileSystem4InitEP8BOOTINFO\0"
+       .byte   0x1
+       .long   0x291
+       .uleb128 0xf
+       .long   0x435
+       .byte   0x0
+       .uleb128 0x10
+       .byte   0x1
+       .ascii "Inst\0"
+       .byte   0x2
+       .byte   0xc
+       .ascii "_ZN10FileSystem4InstEv\0"
+       .long   0x454
+       .byte   0x1
+       .uleb128 0x11
+       .byte   0x1
+       .ascii "operator new\0"
+       .byte   0x2
+       .byte   0x11
+       .ascii "_ZN10FileSystemnwEjPv\0"
+       .long   0x456
+       .byte   0x3
+       .byte   0x1
+       .long   0x2f2
+       .uleb128 0xf
+       .long   0x5b
+       .uleb128 0xf
+       .long   0x456
+       .byte   0x0
+       .uleb128 0x12
+       .byte   0x1
+       .secrel32       LASF0
+       .byte   0x2
+       .byte   0x12
+       .byte   0x3
+       .byte   0x1
+       .long   0x30c
+       .uleb128 0x13
+       .long   0x458
+       .byte   0x1
+       .uleb128 0xf
+       .long   0x435
+       .byte   0x0
+       .uleb128 0x14
+       .byte   0x1
+       .ascii "~FileSystem\0"
+       .byte   0x2
+       .byte   0x13
+       .byte   0x3
+       .byte   0x1
+       .long   0x32f
+       .uleb128 0x13
+       .long   0x458
+       .byte   0x1
+       .uleb128 0x13
+       .long   0x54
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x15
+       .byte   0x1
+       .ascii "ClearTrace\0"
+       .byte   0x2
+       .byte   0x15
+       .ascii "_ZN10FileSystem10ClearTraceEv\0"
+       .byte   0x3
+       .byte   0x1
+       .long   0x369
+       .uleb128 0x13
+       .long   0x458
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x15
+       .byte   0x1
+       .ascii "pause\0"
+       .byte   0x2
+       .byte   0x16
+       .ascii "_ZN10FileSystem5pauseEv\0"
+       .byte   0x3
+       .byte   0x1
+       .long   0x398
+       .uleb128 0x13
+       .long   0x458
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x15
+       .byte   0x1
+       .ascii "ShowAll\0"
+       .byte   0x2
+       .byte   0x17
+       .ascii "_ZN10FileSystem7ShowAllEv\0"
+       .byte   0x3
+       .byte   0x1
+       .long   0x3cb
+       .uleb128 0x13
+       .long   0x458
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x16
+       .byte   0x1
+       .ascii "ReadSector\0"
+       .byte   0x2
+       .byte   0x19
+       .ascii "_ZN10FileSystem10ReadSectorEiiyPhii\0"
+       .long   0x54
+       .byte   0x3
+       .byte   0x1
+       .uleb128 0x13
+       .long   0x458
+       .byte   0x1
+       .uleb128 0xf
+       .long   0x54
+       .uleb128 0xf
+       .long   0x54
+       .uleb128 0xf
+       .long   0xe5
+       .uleb128 0xf
+       .long   0x196
+       .uleb128 0xf
+       .long   0x54
+       .uleb128 0xf
+       .long   0x54
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x17
+       .long   0xa5
+       .long   0x435
+       .uleb128 0x18
+       .byte   0x0
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x10c
+       .uleb128 0x19
+       .long   0x54
+       .uleb128 0x17
+       .long   0xa5
+       .long   0x451
+       .uleb128 0x1a
+       .long   0x451
+       .word   0xfff
+       .byte   0x0
+       .uleb128 0x6
+       .byte   0x4
+       .byte   0x7
+       .uleb128 0x1b
+       .byte   0x4
+       .uleb128 0x1c
+       .byte   0x4
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x1bd
+       .uleb128 0x1d
+       .ascii "Screen\0"
+       .byte   0x14
+       .byte   0x3
+       .byte   0x5
+       .long   0x48e
+       .uleb128 0x10
+       .byte   0x1
+       .ascii "Inst\0"
+       .byte   0x3
+       .byte   0x8
+       .ascii "_ZN6Screen4InstEv\0"
+       .long   0x48e
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x1b
+       .byte   0x4
+       .uleb128 0x2
+       .byte   0x1
+       .byte   0x6
+       .ascii "char\0"
+       .uleb128 0x1e
+       .byte   0x1
+       .ascii "operator delete\0"
+       .byte   0x1
+       .byte   0x6b
+       .ascii "_ZdlPvS_\0"
+       .long   LFB11
+       .long   LFE11
+       .secrel32       LLST0
+       .long   0x4d6
+       .uleb128 0x1f
+       .long   0x456
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x1f
+       .long   0x456
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .byte   0x0
+       .uleb128 0x20
+       .long   0x2b6
+       .long   LFB14
+       .long   LFE14
+       .secrel32       LLST1
+       .long   0x509
+       .uleb128 0x21
+       .ascii "size\0"
+       .byte   0x2
+       .byte   0x11
+       .long   0x5b
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x21
+       .ascii "buf\0"
+       .byte   0x2
+       .byte   0x11
+       .long   0x456
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .byte   0x0
+       .uleb128 0x22
+       .long   0x46d
+       .long   LFB15
+       .long   LFE15
+       .secrel32       LLST2
+       .uleb128 0x23
+       .long   0x25d
+       .byte   0x4
+       .byte   0x9
+       .long   LFB28
+       .long   LFE28
+       .secrel32       LLST3
+       .long   0x542
+       .uleb128 0x21
+       .ascii "binfo\0"
+       .byte   0x4
+       .byte   0x9
+       .long   0x435
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x24
+       .long   0x2f2
+       .byte   0x4
+       .byte   0xd
+       .byte   0x0
+       .long   0x580
+       .uleb128 0x25
+       .secrel32       LASF1
+       .long   0x580
+       .byte   0x1
+       .uleb128 0x26
+       .ascii "binfo\0"
+       .byte   0x4
+       .byte   0xd
+       .long   0x435
+       .uleb128 0x27
+       .uleb128 0x28
+       .ascii "rc\0"
+       .byte   0x4
+       .byte   0x16
+       .long   0x54
+       .uleb128 0x28
+       .ascii "numDev\0"
+       .byte   0x4
+       .byte   0x18
+       .long   0x54
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x19
+       .long   0x458
+       .uleb128 0x29
+       .long   0x542
+       .long   LFB30
+       .long   LFE30
+       .secrel32       LLST4
+       .long   0x5c5
+       .uleb128 0x2a
+       .long   0x54e
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x2a
+       .long   0x558
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .uleb128 0x2b
+       .long   LBB3
+       .long   LBE3
+       .uleb128 0x2c
+       .long   0x566
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -20
+       .uleb128 0x2c
+       .long   0x570
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -24
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x24
+       .long   0x30c
+       .byte   0x4
+       .byte   0x2f
+       .byte   0x0
+       .long   0x5ec
+       .uleb128 0x25
+       .secrel32       LASF1
+       .long   0x580
+       .byte   0x1
+       .uleb128 0x2d
+       .ascii "__in_chrg\0"
+       .long   0x43b
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x29
+       .long   0x5c5
+       .long   LFB33
+       .long   LFE33
+       .secrel32       LLST5
+       .long   0x60a
+       .uleb128 0x2a
+       .long   0x5d1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x23
+       .long   0x32f
+       .byte   0x4
+       .byte   0x33
+       .long   LFB35
+       .long   LFE35
+       .secrel32       LLST6
+       .long   0x62f
+       .uleb128 0x2e
+       .secrel32       LASF1
+       .long   0x580
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x23
+       .long   0x369
+       .byte   0x4
+       .byte   0x39
+       .long   LFB36
+       .long   LFE36
+       .secrel32       LLST7
+       .long   0x654
+       .uleb128 0x2e
+       .secrel32       LASF1
+       .long   0x580
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x23
+       .long   0x398
+       .byte   0x4
+       .byte   0x3b
+       .long   LFB37
+       .long   LFE37
+       .secrel32       LLST8
+       .long   0x69d
+       .uleb128 0x2e
+       .secrel32       LASF1
+       .long   0x580
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x2b
+       .long   LBB4
+       .long   LBE4
+       .uleb128 0x2f
+       .ascii "lc\0"
+       .byte   0x4
+       .byte   0x3c
+       .long   0x54
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -20
+       .uleb128 0x2f
+       .ascii "cp\0"
+       .byte   0x4
+       .byte   0x3d
+       .long   0x69d
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -24
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x490
+       .uleb128 0x23
+       .long   0x3cb
+       .byte   0x4
+       .byte   0x74
+       .long   LFB38
+       .long   LFE38
+       .secrel32       LLST9
+       .long   0x743
+       .uleb128 0x2e
+       .secrel32       LASF1
+       .long   0x580
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x21
+       .ascii "dev\0"
+       .byte   0x4
+       .byte   0x74
+       .long   0x54
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .uleb128 0x21
+       .ascii "sectorcount\0"
+       .byte   0x4
+       .byte   0x74
+       .long   0x54
+       .byte   0x2
+       .byte   0x91
+       .sleb128 8
+       .uleb128 0x21
+       .ascii "lba\0"
+       .byte   0x4
+       .byte   0x74
+       .long   0xe5
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -56
+       .uleb128 0x21
+       .ascii "buf\0"
+       .byte   0x4
+       .byte   0x74
+       .long   0x196
+       .byte   0x2
+       .byte   0x91
+       .sleb128 20
+       .uleb128 0x21
+       .ascii "bufsize\0"
+       .byte   0x4
+       .byte   0x74
+       .long   0x54
+       .byte   0x2
+       .byte   0x91
+       .sleb128 24
+       .uleb128 0x21
+       .ascii "numsect\0"
+       .byte   0x4
+       .byte   0x74
+       .long   0x54
+       .byte   0x2
+       .byte   0x91
+       .sleb128 28
+       .uleb128 0x2b
+       .long   LBB5
+       .long   LBE5
+       .uleb128 0x2f
+       .ascii "rc\0"
+       .byte   0x4
+       .byte   0x79
+       .long   0x54
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -36
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x30
+       .ascii "reg_buffer_size\0"
+       .byte   0xa
+       .word   0x1a2
+       .long   0x19c
+       .byte   0x1
+       .byte   0x1
+       .uleb128 0x31
+       .long   0x1ca
+       .byte   0x4
+       .byte   0x7
+       .byte   0x5
+       .byte   0x3
+       .long   __ZN10FileSystem3bufE
+       .byte   0x0
+       .section        .debug_abbrev,"dr"
+       .uleb128 0x1
+       .uleb128 0x11
+       .byte   0x1
+       .uleb128 0x25
+       .uleb128 0x8
+       .uleb128 0x13
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x1b
+       .uleb128 0x8
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x52
+       .uleb128 0x1
+       .uleb128 0x55
+       .uleb128 0x6
+       .uleb128 0x10
+       .uleb128 0x6
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2
+       .uleb128 0x24
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3e
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0x8
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x16
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x4
+       .uleb128 0x39
+       .byte   0x1
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x5
+       .uleb128 0x8
+       .byte   0x0
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x18
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x6
+       .uleb128 0x24
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3e
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x7
+       .uleb128 0x13
+       .byte   0x1
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x8
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x38
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x9
+       .uleb128 0xf
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xa
+       .uleb128 0x2
+       .byte   0x1
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0xb
+       .uleb128 0x5
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xc
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x38
+       .uleb128 0xa
+       .uleb128 0x32
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xd
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1c
+       .uleb128 0x5
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xe
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xf
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x10
+       .uleb128 0x2e
+       .byte   0x0
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x11
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x12
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x13
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x14
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x15
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x16
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x17
+       .uleb128 0x1
+       .byte   0x1
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x18
+       .uleb128 0x21
+       .byte   0x0
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x19
+       .uleb128 0x26
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1a
+       .uleb128 0x21
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2f
+       .uleb128 0x5
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1b
+       .uleb128 0x10
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1c
+       .uleb128 0xf
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1d
+       .uleb128 0x2
+       .byte   0x1
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1e
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1f
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x20
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x21
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x22
+       .uleb128 0x2e
+       .byte   0x0
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x23
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x24
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x20
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x25
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x26
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x27
+       .uleb128 0xb
+       .byte   0x1
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x28
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x29
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x31
+       .uleb128 0x13
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2a
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x31
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2b
+       .uleb128 0xb
+       .byte   0x1
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2c
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x31
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2d
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2e
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0xc
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2f
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x30
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0x5
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x31
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .byte   0x0
+       .section        .debug_pubnames,"dr"
+       .long   0x114
+       .word   0x2
+       .secrel32       Ldebug_info0
+       .long   0x76b
+       .long   0x498
+       .ascii "operator delete\0"
+       .long   0x4d6
+       .ascii "FileSystem::operator new\0"
+       .long   0x509
+       .ascii "Screen::Inst\0"
+       .long   0x51a
+       .ascii "FileSystem::Init\0"
+       .long   0x585
+       .ascii "FileSystem::FileSystem\0"
+       .long   0x5ec
+       .ascii "FileSystem::~FileSystem\0"
+       .long   0x60a
+       .ascii "FileSystem::ClearTrace\0"
+       .long   0x62f
+       .ascii "FileSystem::pause\0"
+       .long   0x654
+       .ascii "FileSystem::ShowAll\0"
+       .long   0x6a3
+       .ascii "FileSystem::ReadSector\0"
+       .long   0x75d
+       .ascii "FileSystem::buf\0"
+       .long   0x0
+       .section        .debug_pubtypes,"dr"
+       .long   0x66
+       .word   0x2
+       .secrel32       Ldebug_info0
+       .long   0x76b
+       .long   0x5b
+       .ascii "size_t\0"
+       .long   0x99
+       .ascii "BYTE\0"
+       .long   0xb6
+       .ascii "WORD\0"
+       .long   0xd8
+       .ascii "DWORD\0"
+       .long   0xe5
+       .ascii "QWORD\0"
+       .long   0x10c
+       .ascii "BOOTINFO\0"
+       .long   0x1bd
+       .ascii "FileSystem\0"
+       .long   0x45e
+       .ascii "Screen\0"
+       .long   0x0
+       .section        .debug_aranges,"dr"
+       .long   0x34
+       .word   0x2
+       .secrel32       Ldebug_info0
+       .byte   0x4
+       .byte   0x0
+       .word   0x0
+       .word   0x0
+       .long   Ltext0
+       .long   Letext0-Ltext0
+       .long   LFB11
+       .long   LFE11-LFB11
+       .long   LFB14
+       .long   LFE14-LFB14
+       .long   LFB15
+       .long   LFE15-LFB15
+       .long   0x0
+       .long   0x0
+       .section        .debug_ranges,"dr"
+Ldebug_ranges0:
+       .long   Ltext0
+       .long   Letext0
+       .long   LFB11
+       .long   LFE11
+       .long   LFB14
+       .long   LFE14
+       .long   LFB15
+       .long   LFE15
+       .long   0x0
+       .long   0x0
+       .section        .debug_str,"dr"
+LASF1:
+       .ascii "this\0"
+LASF0:
+       .ascii "FileSystem\0"
+       .def    __Unwind_Resume;        .scl    2;      .type   32;     .endef
+       .def    __Z19pio_set_iobase_addrjjj;    .scl    2;      .type   32;     .endef
+       .def    __Z10reg_configv;       .scl    2;      .type   32;     .endef
+       .def    __ZN6Screen6printfEPKcz;        .scl    2;      .type   32;     .endef
+       .def    __Z9reg_resetii;        .scl    2;      .type   32;     .endef
+       .def    __Z13trc_cht_dump0v;    .scl    2;      .type   32;     .endef
+       .def    __Z13trc_llt_dump0v;    .scl    2;      .type   32;     .endef
+       .def    __Z13trc_err_dump1v;    .scl    2;      .type   32;     .endef
+       .def    __Z13trc_err_dump2v;    .scl    2;      .type   32;     .endef
+       .def    __Z13trc_cht_dump1v;    .scl    2;      .type   32;     .endef
+       .def    __ZN6Screen4putsEPKc;   .scl    2;      .type   32;     .endef
+       .def    __Z13trc_cht_dump2v;    .scl    2;      .type   32;     .endef
+       .def    __Z13trc_llt_dump1v;    .scl    2;      .type   32;     .endef
+       .def    __Z13trc_llt_dump2v;    .scl    2;      .type   32;     .endef
+       .def    _memset;        .scl    2;      .type   32;     .endef
+       .def    __Z21reg_pio_data_in_lba48iijjmmjjli;   .scl    2;      .type   32;     .endef
diff --git a/haribote/filesystem.cpp b/haribote/filesystem.cpp
new file mode 100644 (file)
index 0000000..778e7ce
--- /dev/null
@@ -0,0 +1,478 @@
+#include "filesystem.h"
+#include "screen.h"
+#include "debug.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <boost/scoped_array.hpp>
+
+BYTE FileSystem::buf[sizeof(FileSystem)];
+
+void FileSystem::Init(BOOTINFO *binfo){
+       new ((void *)buf) FileSystem(binfo);
+}
+
+FileSystem::FileSystem(BOOTINFO *binfo):binfo(binfo){
+       //m_drivenum = binfo->bootdrive & ~0x80;
+       m_drivenum = 0;
+       
+       //ClearTrace();
+       pio_set_iobase_addr(0x1f0, 0x3f0 , 0); // primary
+       //ShowAll();
+       int rc = 0;
+       //ClearTrace();
+       int numDev = reg_config();
+       //ShowAll();
+       debugprint("Found %d devices\n", numDev);
+
+       //---------- Try some commands in "polling" mode
+
+       //debugprint("Polling mode...\n" );
+
+       // do an ATA soft reset (SRST) and return the command block
+       // regs for device 0 in struct reg_cmd_info
+
+       //debugprint("Soft Reset...\n" );
+       ClearTrace();
+       rc = reg_reset(0, m_drivenum);
+       //debugprint("result:%d\n", rc);
+       //ShowAll();
+       if(rc){
+               debugprint("error! reg_reset failed\n");
+               ShowAll();
+               hung();
+       }
+       //\83p\81[\83e\83B\83V\83\87\83\93\83e\81[\83u\83\8b\82ð\93Ç\82Þ
+       if(ReadSector(m_drivenum, 1, 0, (BYTE *)&mbr, sizeof(mbr), 1)){
+               debugprint("error! ReadSector failed\n");
+               ShowAll();
+               hung();
+       }
+       /*for(int i = 0; i < 32; i++){
+               for(int j = 0; j < 16; j++){
+                       debugprint("%02X ", ((BYTE *)&mbr)[i * 16 + j]);
+               }
+               debugprint("\n");
+       }*/
+       
+       //debugprint("beginlba:0x%X\n", mbr.pt[pat_index].begin_lba);
+       if(ReadSector(m_drivenum, 1, mbr.pt[pat_index].begin_lba, readbuf, READBUFSIZE, 1)){
+               debugprint("error! ReadSector failed\n");
+               ShowAll();
+               hung();
+       }
+       memcpy(&bootsect, readbuf, sizeof(bootsect));
+
+       if(getclustersize() > READBUFSIZE){
+               debugprint("error! getclustersize()(%d) > READBUFSIZE(%d)\n", getclustersize(), READBUFSIZE);
+               ShowAll();
+               hung();
+       }
+
+       FileList(bootsect.BPB_RootClus);
+}
+
+//----------------------class FileSystem::File--------------------------//
+FileSystem::File::File(FileSystem *fs, const wchar_t *filename, DIRENT *ent, DWORD pos):fs(fs){
+       int len = wcslen(filename);
+       this->filename = new wchar_t [len + 1];
+       memcpy(this->filename, filename, (len + 1) * sizeof(wchar_t));
+       size = ent->DIR_FileSize;
+       curpos = pos;
+       startclus = ent->getfirstclus();
+       curclus = INVLID_CLUS;
+       //debugprint("ad:%d %p\n", fs->bootsect.BPB_BytsPerSec, &fs->bootsect.BPB_BytsPerSec);
+
+}
+
+int FileSystem::File::Seek(DWORD offset, SEEK_ORG seekorg){
+       DWORD newoffset = 0;
+
+
+       if(seekorg == SEEK_ORG::SET){
+               newoffset = offset;
+       }else if(seekorg == SEEK_ORG::CUR){
+               newoffset = curpos + offset;
+       }else if(seekorg == SEEK_ORG::END){
+               newoffset = size + offset;
+       }else{
+               debugprint("can not recognize seekorg:%d in %s\n", seekorg, __FUNCTION__);
+               return 1;
+       }
+
+       DWORD virtual_clus = fs->getclusindexbysize(newoffset);
+       DWORD virtual_cur_clus = fs->getclusindexbysize(curpos);
+       if(virtual_clus != virtual_cur_clus){
+               curclus = -1;
+       }
+       curpos = newoffset;
+       return 0;
+}
+
+int FileSystem::File::Read(BYTE *buf, int len){
+       if(size < (len + curpos)){
+               len = size - curpos;
+       }
+       //debugprint("c:%d %d %d\n", curpos, curclus, fs->getclustersize());
+
+       BYTE *oldbuf = buf;
+       reload_curclus();
+       DWORD readclus = ((size + len - 1) / fs->getclustersize()) - (size / fs->getclustersize()) + 1;
+       //debugprint("a:%d %d\n", curpos, curclus);
+
+
+       //\8dÅ\8f\89\82Ì\83N\83\89\83X\83^\82ð\93Ç\82Þ
+       DWORD firstremaind = fs->getclustersize() - curpos % fs->getclustersize();
+       DWORD firstreadbyte = firstremaind > len ? len : firstremaind;
+       fs->ReadCluster(curclus);
+       memcpy(buf, fs->readbuf + curpos % fs->getclustersize(), firstreadbyte);
+       buf += firstreadbyte;
+       curpos += firstreadbyte;
+       //debugprint("firstreadbyte:%d\n", firstreadbyte);
+       if(firstremaind <= len){
+               curclus = fs->GetNextCluster(curclus);
+       }
+
+       //debugprint("2:%d\n", (len - firstreadbyte) / fs->getclustersize());
+       //hung();
+
+       //\90^\82ñ\92\86\95Ó\82Ì\83N\83\89\83X\83^\82ð\93Ç\82Þ
+       for(int i = 0; i < (len - firstreadbyte) / fs->getclustersize(); i++){
+               fs->ReadCluster(curclus);
+               memcpy(buf, fs->readbuf, fs->getclustersize());
+               buf += fs->getclustersize();
+               curclus = fs->GetNextCluster(curclus);
+               curpos += fs->getclustersize();
+       }
+
+       //\8dÅ\8cã\82Ì\83N\83\89\83X\83^\82ð\93Ç\82Þ
+       int remaind = (oldbuf + len) - buf;
+       //debugprint("3:%d\n", remaind);
+
+       if(remaind){
+               fs->ReadCluster(curclus);
+               memcpy(buf, fs->readbuf, remaind);
+               curpos += remaind;
+       }
+       return len;
+}
+
+void FileSystem::File::reload_curclus(){
+       if(curclus == INVLID_CLUS){
+               curclus = startclus;
+
+               for(int i = 0; i < curpos / fs->getclustersize(); i++){
+                       curclus = fs->GetNextCluster(curclus);
+               }
+       }
+}
+
+
+void FileSystem::ClearTrace( void ){
+       // clear the command history and low level traces
+       trc_cht_dump0();     // zero the command history
+       trc_llt_dump0();     // zero the low level trace
+}
+
+void FileSystem::pause(){}
+
+void FileSystem::ShowAll( void ){
+       int lc = 0;
+       char * cp;
+
+       debugprint( "ERROR !\n" );
+
+       // display the command error information
+       trc_err_dump1();           // start
+       while ( 1 ){
+               lc++;
+               cp = trc_err_dump2();   // get and display a line
+               if ( cp == NULL )
+               break;
+               Screen::Inst().puts("1 ");
+               Screen::Inst().puts(cp);
+               Screen::Inst().puts("\n");
+               }
+       pause();
+       debugprint("1 END\n");
+//     for(;;);
+
+       // display the command history
+       trc_cht_dump1();           // start
+       while ( 1 )
+       {
+               cp = trc_cht_dump2();   // get and display a line
+               if ( cp == NULL )
+               break;
+               Screen::Inst().puts("2 ");
+               Screen::Inst().puts(cp);
+               Screen::Inst().puts("\n");
+               lc ++ ;
+               if ( ! ( lc & 0x000f ) )
+               pause();
+       }
+       debugprint("2 END\n");
+
+       // display the low level trace
+       trc_llt_dump1();           // start
+       while ( 1 )
+       {
+               cp = trc_llt_dump2();   // get and display a line
+               if ( cp == NULL )
+               break;
+               Screen::Inst().puts("3 ");
+               Screen::Inst().puts(cp);
+               Screen::Inst().puts("\n");
+               lc ++ ;
+               if ( ! ( lc & 0x000f ) )
+               pause();
+       }
+       debugprint("3 END\n");
+       if ( lc & 0x000f )
+       pause();
+}
+
+
+int FileSystem::ReadSector(int dev, int sectorcount, QWORD lba, BYTE *buf, int bufsize, int numsect){
+       reg_buffer_size = bufsize;
+
+       memset(buf, 0, bufsize);
+       ClearTrace();
+       int rc = reg_pio_data_in_lba48(dev, CMD_READ_SECTORS_EXT, 0, sectorcount,
+       (DWORD)((lba & 0xFFFF00000000LLU) >> 32), (DWORD)(lba & 0xFFFFFFFF),
+       0, (int)buf, numsect, 0
+       );
+       return rc;
+       //ShowAll();
+}
+
+DWORD FileSystem::getclustersize()const{
+       //debugprint("getclustersize %d * %d", bootsect.BPB_BytsPerSec, bootsect.BPB_SecPerClus);
+       return bootsect.BPB_BytsPerSec * bootsect.BPB_SecPerClus;
+}
+
+DWORD FileSystem::firstdatasector()const{
+       //FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
+       //RootDirSectors : always zero
+       return bootsect.BPB_RsvdSecCnt + (bootsect.BPB_NumFATs * bootsect.BPB_FATSz32) + mbr.pt[pat_index].begin_lba;
+}
+
+DWORD FileSystem::getsectorbyclus(DWORD clus)const{
+       return (clus - 2) * bootsect.BPB_SecPerClus + firstdatasector();
+}
+
+//size\82Ì\83f\81[\83^\82ð\8eû\82ß\82é\82Ì\82É\95K\97v\82È\83N\83\89\83X\83^\90\94
+DWORD FileSystem::getcluscountbysize(DWORD size)const{
+       return (size + getclustersize() - 1) / getclustersize();
+}
+
+//size\82Ì\8fê\8f\8a\82ª\8f\8a\91®\82·\82é\83N\83\89\83X\83^\82Ì\83C\83\93\83f\83b\83N\83X
+DWORD FileSystem::getclusindexbysize(DWORD size)const{
+       return (size / getclustersize());
+}
+
+//n\94Ô\96Ú\82ÌFAT\83N\83\89\83X\83^\83G\83\93\83g\83\8a\82Ì\83Z\83N\83^\81[
+DWORD FileSystem::getfatsector(DWORD n)const{
+       return bootsect.BPB_RsvdSecCnt + (n * bootsect.BPB_FATSz32) + mbr.pt[pat_index].begin_lba;
+}
+
+
+int FileSystem::ReadCluster(int clusternum){
+       DWORD clus = getsectorbyclus(clusternum);
+       if(ReadSector(m_drivenum, bootsect.BPB_SecPerClus
+               , clus, readbuf, getclustersize(), bootsect.BPB_SecPerClus)){
+               debugprint("error! ReadSector failed\n");
+               ShowAll();
+               hung();
+       }
+       return 1;
+}
+
+
+int FileSystem::FileList(DWORD dirclus){
+       ReadCluster(dirclus);
+       DIRENT *dirent = (DIRENT *)readbuf;
+
+       int i = 0;
+       for(i = 0; i < READBUFSIZE / sizeof(DIRENT); i++){
+               if(dirent[i].DIR_Name[0] == '\0'){
+                       break;
+               }
+               char s[100] = "";
+               int p = 0;
+               for(int j = 0; j < 8; j++){
+                       if(dirent[i].DIR_Name[j] == '\x20'){
+                               break;
+                       }
+                       
+                       s[p++] = dirent[i].DIR_Name[j];
+               }
+               if(dirent[i].DIR_Name[8] != '\x20'){
+                       s[p++] = '.';
+               }
+               for(int j = 8; j < 11; j++){
+                       if(dirent[i].DIR_Name[j] == '\x20'){
+                               break;
+                       }
+                       s[p++] = dirent[i].DIR_Name[j];
+               }
+               //debugprint("%s %d\n", s, dirent[i].DIR_FileSize);
+       }
+       //debugprint("ab:%d %p\n", bootsect.BPB_BytsPerSec, &bootsect.BPB_BytsPerSec);
+
+       return i;
+}
+
+
+
+FileSystem::File *FileSystem::CreateFile(
+       const wchar_t *filename,
+       DWORD  dwAccess,             // \83A\83N\83Z\83X\8ew\92è
+       DWORD  dwShare,              // \8b¤\97L\95û\96@
+       DWORD psa,    // \83Z\83L\83\85\83\8a\83e\83B\91®\90«
+       DWORD  dwCreateDisposition,  // \93®\8dì\8ew\92è
+       DWORD  dwFlagsAndAttributes, // \83t\83\89\83O\82Æ\91®\90«
+       HANDLE hTemplate             // \83e\83\93\83v\83\8c\81[\83g\83t\83@\83C\83\8b
+){
+       //debugprint("test:%c %c %c\n", filename[1], filename[3], filename[4]);
+
+       if(iswalpha(filename[0]) && filename[1] == L':'){
+               //\90â\91Î\83p\83X\8ew\92è
+               if(towupper(filename[0]) == L'C'){
+                       int pos = 3, prevpos = pos;
+                       DWORD curclus = bootsect.BPB_RootClus;
+
+                       //debugprint("finding:%p\n", wcslen(filename) + 1);
+                       boost::scoped_array<wchar_t> finding(new wchar_t[wcslen(filename) + 1]);
+
+                       while(1){
+                               for(; filename[pos] != L'\\' && filename[pos] != L'/' && filename[pos] != L'\0'; pos++){
+                                       finding[pos - prevpos] = filename[pos];
+                               }
+                               finding[pos - prevpos] = L'\0';
+                               pos++;
+                               prevpos = pos;
+
+                               bool found = false;
+                               DIRENT ent;
+                               if(!FindEnt(curclus, finding.get(), &ent)){
+                                       //\8c©\82Â\82©\82ç\82È\82©\82Á\82½
+                                       debugprint("not found %c %c %c\n", finding[0], finding[1], finding[2]);
+                                       return NULL;
+                               }
+                               
+                               if(filename[pos - 1] == L'\0'){
+                                       //\8dÅ\8cã\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a(\83t\83@\83C\83\8b)\82È\82ç
+
+                                       if(ent.DIR_Attr & ATTR_DIRECTORY){
+                                               debugprint("opening directory... not implemented\n");
+                                               hung();
+                                       }
+
+                                       return new File(this, filename, &ent, 0);
+                               }
+                               if((ent.DIR_Attr & ATTR_DIRECTORY) == 0){
+                                       //\8dÅ\8cã\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a(\83t\83@\83C\83\8b)\82\82á\82È\82¢\82Ì\82É\95\81\92Ê\82Ì\83t\83@\83C\83\8b\82¾\82Á\82½
+                                       //c:\dir\file.txt\dir \82Ý\82½\82¢\82È
+                                       return NULL;
+                               }
+                               curclus = ent.getfirstclus();
+                       }
+               }else{
+                       return 0;
+               }
+       }
+}
+
+
+
+void FileSystem::ConvertShortName(char *dest, const char *name){
+       int p = 0;
+       for(int j = 0; j < 8; j++){
+               if(name[j] == '\x20'){
+                       break;
+               }
+               dest[p++] = name[j];
+       }
+       if(name[8] != '\x20'){
+               dest[p++] = '.';
+       }
+       for(int j = 8; j < 11; j++){
+               if(name[j] == '\x20'){
+                       break;
+               }
+               dest[p++] = name[j];
+       }
+       dest[p] = '\0';
+}
+
+bool FileSystem::FindEnt(DWORD dirclus, const wchar_t *finding, DIRENT *fdirent){
+       char name[20];
+       bool found = false;
+       while(1){
+               dirclus &= 0x0FFFFFFF;
+               //\83N\83\89\83X\83^\83`\83F\81[\83\93\82Ì\8fI\97¹==\8dÅ\8cã\82Ì\83G\83\93\83g\83\8a\82Ü\82Å\92T\82µ\82½\82¯\82Ç\8c©\82Â\82©\82ç\82È\82©\82Á\82½
+               if(dirclus >= 0x0ffffff8){
+                       break;
+               }
+
+               ReadCluster(dirclus);
+               DIRENT *dirent = (DIRENT *)readbuf;
+               int i = 0;
+               for(; i < getclustersize() / sizeof(DIRENT); i++){
+                       if(dirent[i].DIR_Name[0] == 0xE5){//\96¢\8eg\97p\83G\83\93\83g\83\8a
+                               continue;
+                       }
+                       if(dirent[i].DIR_Name[0] == 0x00){//\8dÅ\8fI\83G\83\93\83g\83\8a
+                               break;
+                       }
+                       if(dirent[i].DIR_Attr & 0x0F){//long name \83G\83\93\83g\83\8a
+                               continue;
+                       }
+                       ConvertShortName(name, dirent[i].DIR_Name);
+
+                       //\83t\83@\83C\83\8b\96¼\82Ì\94ä\8ar
+                       wchar_t wname[50];
+                       mbstowcs(wname, name, sizeof(wname) / sizeof(wname[0]));
+                       if(wcslen(wname) == wcslen(finding)){
+                               if(wcsicmp(wname, finding) == 0){
+                                       found = true;
+                                       *fdirent = dirent[i];
+                                       break;
+                               }
+                       }
+                       /*char test[300];
+                       for(int j = 0; j < 300; j++){
+                               if(!(test[j] = finding[j])){
+                                       break;
+                               }
+                       }*/
+                       //debugprint("s:%s %s %d\n", name, test, found);
+
+               }
+               //\96Ú\93I\82Ì\83t\83@\83C\83\8b\82ª\8c©\82Â\82©\82Á\82½\82Ì\82Å\8e\9f\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a\92T\82µ\82Ö
+               if(found){
+                       break;
+               }
+               //\82±\82Ì\83N\83\89\83X\83^\82Å\83f\83B\83\8c\83N\83g\83\8a\83G\83\93\83g\83\8a\82ª\8fI\82í\82Á\82Ä\82¢\82½
+               if(i != getclustersize() / sizeof(DIRENT)){
+                       break;
+               }
+               dirclus = GetNextCluster(dirclus);
+       }
+       return found;
+}
+
+DWORD FileSystem::GetNextCluster(DWORD clus){
+       clus &= 0x0fffffff;
+
+       DWORD sector = getfatsector() + (clus * 4 / bootsect.BPB_BytsPerSec);
+       ReadSector(m_drivenum, 1, sector, readbuf, bootsect.BPB_BytsPerSec, 1);
+
+       DWORD next = ((DWORD *)readbuf)[clus % (bootsect.BPB_BytsPerSec / 4)];
+       //debugprint("n:%d -> %d\n", clus, next);
+
+       return next;
+}
diff --git a/haribote/filesystem.h b/haribote/filesystem.h
new file mode 100644 (file)
index 0000000..f879c2f
--- /dev/null
@@ -0,0 +1,90 @@
+#pragma once
+#include <new>
+#include "bootpack.h"
+#include "ata/ataio.h"
+#include "typedefs.h"
+#include "fat32.h"
+
+class FileSystem{
+public:
+       static void Init(BOOTINFO *binfo);
+       
+       static FileSystem &Inst(){
+               return *(FileSystem *)buf;
+       }
+       
+       class File{
+       public:
+               File(FileSystem *fs, const wchar_t *filename, DIRENT *ent, DWORD pos);
+               
+               enum class SEEK_ORG{
+                       SET,CUR,END
+               };
+               int Seek(DWORD offset, SEEK_ORG seekorg);
+               int Read(BYTE *buf, int len);
+               DWORD Size(){
+                       return size;
+               }
+       private:
+               DWORD size;
+               DWORD curpos;
+               DWORD curclus;
+               DWORD startclus;
+               wchar_t *filename;
+               static const DWORD INVLID_CLUS = 0xffffffff;
+
+               FileSystem *fs;
+               void reload_curclus();
+
+       };
+       DWORD getclustersize()const;
+       DWORD firstdatasector()const;
+       DWORD getsectorbyclus(DWORD clus)const;
+
+       DWORD getcluscountbysize(DWORD size)const;
+       DWORD getclusindexbysize(DWORD size)const;
+       DWORD getfatsector(DWORD n = 0)const;
+
+       File *CreateFile(
+               const wchar_t *filename,
+               DWORD  dwAccess,             // \83A\83N\83Z\83X\8ew\92è
+               DWORD  dwShare,              // \8b¤\97L\95û\96@
+               DWORD psa,    // \83Z\83L\83\85\83\8a\83e\83B\91®\90«
+               DWORD  dwCreateDisposition,  // \93®\8dì\8ew\92è
+               DWORD  dwFlagsAndAttributes, // \83t\83\89\83O\82Æ\91®\90«
+               HANDLE hTemplate             // \83e\83\93\83v\83\8c\81[\83g\83t\83@\83C\83\8b
+       );
+private:
+       static BYTE buf[];
+       static void* operator new(size_t size, void* pbuf){ return pbuf; }
+       FileSystem(BOOTINFO *binfo);
+       
+       void ClearTrace( void );
+       void pause();
+       void ShowAll( void );
+       
+       int ReadSector(int dev, int sectorcount, QWORD lba, BYTE *buf, int bufsize, int numsect);
+
+       static const int pat_index = 0;
+       BOOTINFO *binfo;
+       int m_drivenum;
+       static const int READBUFSIZE = 4096;
+       BYTE readbuf[READBUFSIZE];
+       MBR_SECTOR mbr;
+
+       //----------------------FAT32------------------------
+       FAT32_BOOTSECTOR bootsect;
+       struct FILEHANDLE{
+               bool used;
+               wchar_t *filename;
+
+       };
+
+       int FileList(DWORD dirclus);
+       int ReadCluster(int clusternum);
+       static void ConvertShortName(char *dest, const char *name);
+       DWORD GetNextCluster(DWORD clus);
+
+       bool FindEnt(DWORD dirclus, const wchar_t *finding, DIRENT *fdirent);
+};
+
diff --git a/haribote/graphic.c b/haribote/graphic.c
new file mode 100644 (file)
index 0000000..0c9863e
--- /dev/null
@@ -0,0 +1,221 @@
+/* \83O\83\89\83t\83B\83b\83N\8f\88\97\9d\8aÖ\8cW */
+
+#include "bootpack.h"
+
+void init_palette(void)
+{
+       static unsigned char table_rgb[16 * 3] = {
+               0x00, 0x00, 0x00,       /*  0:\8d\95 */
+               0xff, 0x00, 0x00,       /*  1:\96¾\82é\82¢\90Ô */
+               0x00, 0xff, 0x00,       /*  2:\96¾\82é\82¢\97Π*/
+               0xff, 0xff, 0x00,       /*  3:\96¾\82é\82¢\89©\90F */
+               0x00, 0x00, 0xff,       /*  4:\96¾\82é\82¢\90 */
+               0xff, 0x00, 0xff,       /*  5:\96¾\82é\82¢\8e\87 */
+               0x00, 0xff, 0xff,       /*  6:\96¾\82é\82¢\90\85\90F */
+               0xff, 0xff, 0xff,       /*  7:\94\92 */
+               0xc6, 0xc6, 0xc6,       /*  8:\96¾\82é\82¢\8aD\90F */
+               0x84, 0x00, 0x00,       /*  9:\88Ã\82¢\90Ô */
+               0x00, 0x84, 0x00,       /* 10:\88Ã\82¢\97Π*/
+               0x84, 0x84, 0x00,       /* 11:\88Ã\82¢\89©\90F */
+               0x00, 0x00, 0x84,       /* 12:\88Ã\82¢\90 */
+               0x84, 0x00, 0x84,       /* 13:\88Ã\82¢\8e\87 */
+               0x00, 0x84, 0x84,       /* 14:\88Ã\82¢\90\85\90F */
+               0x84, 0x84, 0x84        /* 15:\88Ã\82¢\8aD\90F */
+       };
+       unsigned char table2[216 * 3];
+       int r, g, b;
+       set_palette(0, 15, table_rgb);
+       for (b = 0; b < 6; b++) {
+               for (g = 0; g < 6; g++) {
+                       for (r = 0; r < 6; r++) {
+                               table2[(r + g * 6 + b * 36) * 3 + 0] = r * 51;
+                               table2[(r + g * 6 + b * 36) * 3 + 1] = g * 51;
+                               table2[(r + g * 6 + b * 36) * 3 + 2] = b * 51;
+                       }
+               }
+       }
+       set_palette(16, 231, table2);
+       return;
+}
+
+void set_palette(int start, int end, unsigned char *rgb)
+{
+       int i, eflags;
+       eflags = io_load_eflags();      /* \8a\84\82è\8d\9e\82Ý\8b\96\89Â\83t\83\89\83O\82Ì\92l\82ð\8bL\98^\82·\82é */
+       io_cli();                                       /* \8b\96\89Â\83t\83\89\83O\82ð0\82É\82µ\82Ä\8a\84\82è\8d\9e\82Ý\8bÖ\8e~\82É\82·\82é */
+       io_out8(0x03c8, start);
+       for (i = start; i <= end; i++) {
+               io_out8(0x03c9, rgb[0] / 4);
+               io_out8(0x03c9, rgb[1] / 4);
+               io_out8(0x03c9, rgb[2] / 4);
+               rgb += 3;
+       }
+       io_store_eflags(eflags);        /* \8a\84\82è\8d\9e\82Ý\8b\96\89Â\83t\83\89\83O\82ð\8c³\82É\96ß\82· */
+       return;
+}
+
+void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
+{
+       int x, y;
+       for (y = y0; y <= y1; y++) {
+               for (x = x0; x <= x1; x++)
+                       vram[y * xsize + x] = c;
+       }
+       return;
+}
+
+void init_screen8(char *vram, int x, int y)
+{
+       boxfill8(vram, x, COL8_008484,  0,     0,      x -  1, y - 29);
+       boxfill8(vram, x, COL8_C6C6C6,  0,     y - 28, x -  1, y - 28);
+       boxfill8(vram, x, COL8_FFFFFF,  0,     y - 27, x -  1, y - 27);
+       boxfill8(vram, x, COL8_C6C6C6,  0,     y - 26, x -  1, y -  1);
+
+       boxfill8(vram, x, COL8_FFFFFF,  3,     y - 24, 59,     y - 24);
+       boxfill8(vram, x, COL8_FFFFFF,  2,     y - 24,  2,     y -  4);
+       boxfill8(vram, x, COL8_848484,  3,     y -  4, 59,     y -  4);
+       boxfill8(vram, x, COL8_848484, 59,     y - 23, 59,     y -  5);
+       boxfill8(vram, x, COL8_000000,  2,     y -  3, 59,     y -  3);
+       boxfill8(vram, x, COL8_000000, 60,     y - 24, 60,     y -  3);
+
+       boxfill8(vram, x, COL8_848484, x - 47, y - 24, x -  4, y - 24);
+       boxfill8(vram, x, COL8_848484, x - 47, y - 23, x - 47, y -  4);
+       boxfill8(vram, x, COL8_FFFFFF, x - 47, y -  3, x -  4, y -  3);
+       boxfill8(vram, x, COL8_FFFFFF, x -  3, y - 24, x -  3, y -  3);
+       return;
+}
+
+void putfont8(char *vram, int xsize, int x, int y, char c, char *font)
+{
+       int i;
+       char *p, d /* data */;
+       for (i = 0; i < 16; i++) {
+               p = vram + (y + i) * xsize + x;
+               d = font[i];
+               if ((d & 0x80) != 0) { p[0] = c; }
+               if ((d & 0x40) != 0) { p[1] = c; }
+               if ((d & 0x20) != 0) { p[2] = c; }
+               if ((d & 0x10) != 0) { p[3] = c; }
+               if ((d & 0x08) != 0) { p[4] = c; }
+               if ((d & 0x04) != 0) { p[5] = c; }
+               if ((d & 0x02) != 0) { p[6] = c; }
+               if ((d & 0x01) != 0) { p[7] = c; }
+       }
+       return;
+}
+
+void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s)
+{
+       extern char hankaku[4096];
+       struct TASK *task = task_now();
+       char *nihongo = (char *) *((int *) 0x0fe8), *font;
+       int k, t;
+
+       if (task->langmode == 0) {
+               for (; *s != 0x00; s++) {
+                       putfont8(vram, xsize, x, y, c, hankaku + *s * 16);
+                       x += 8;
+               }
+       }
+       if (task->langmode == 1) {
+               for (; *s != 0x00; s++) {
+                       if (task->langbyte1 == 0) {
+                               if ((0x81 <= *s && *s <= 0x9f) || (0xe0 <= *s && *s <= 0xfc)) {
+                                       task->langbyte1 = *s;
+                               } else {
+                                       putfont8(vram, xsize, x, y, c, nihongo + *s * 16);
+                               }
+                       } else {
+                               if (0x81 <= task->langbyte1 && task->langbyte1 <= 0x9f) {
+                                       k = (task->langbyte1 - 0x81) * 2;
+                               } else {
+                                       k = (task->langbyte1 - 0xe0) * 2 + 62;
+                               }
+                               if (0x40 <= *s && *s <= 0x7e) {
+                                       t = *s - 0x40;
+                               } else if (0x80 <= *s && *s <= 0x9e) {
+                                       t = *s - 0x80 + 63;
+                               } else {
+                                       t = *s - 0x9f;
+                                       k++;
+                               }
+                               task->langbyte1 = 0;
+                               font = nihongo + 256 * 16 + (k * 94 + t) * 32;
+                               putfont8(vram, xsize, x - 8, y, c, font     );  /* \8d\94¼\95ª */
+                               putfont8(vram, xsize, x    , y, c, font + 16);  /* \89E\94¼\95ª */
+                       }
+                       x += 8;
+               }
+       }
+       if (task->langmode == 2) {
+               for (; *s != 0x00; s++) {
+                       if (task->langbyte1 == 0) {
+                               if (0x81 <= *s && *s <= 0xfe) {
+                                       task->langbyte1 = *s;
+                               } else {
+                                       putfont8(vram, xsize, x, y, c, nihongo + *s * 16);
+                               }
+                       } else {
+                               k = task->langbyte1 - 0xa1;
+                               t = *s - 0xa1;
+                               task->langbyte1 = 0;
+                               font = nihongo + 256 * 16 + (k * 94 + t) * 32;
+                               putfont8(vram, xsize, x - 8, y, c, font     );  /* \8d\94¼\95ª */
+                               putfont8(vram, xsize, x    , y, c, font + 16);  /* \89E\94¼\95ª */
+                       }
+                       x += 8;
+               }
+       }
+       return;
+}
+
+void init_mouse_cursor8(char *mouse, char bc)
+/* \83}\83E\83X\83J\81[\83\\83\8b\82ð\8f\80\94õ\81i16x16\81j */
+{
+       static char cursor[16][16] = {
+               "**************..",
+               "*OOOOOOOOOOO*...",
+               "*OOOOOOOOOO*....",
+               "*OOOOOOOOO*.....",
+               "*OOOOOOOO*......",
+               "*OOOOOOO*.......",
+               "*OOOOOOO*.......",
+               "*OOOOOOOO*......",
+               "*OOOO**OOO*.....",
+               "*OOO*..*OOO*....",
+               "*OO*....*OOO*...",
+               "*O*......*OOO*..",
+               "**........*OOO*.",
+               "*..........*OOO*",
+               "............*OO*",
+               ".............***"
+       };
+       int x, y;
+
+       for (y = 0; y < 16; y++) {
+               for (x = 0; x < 16; x++) {
+                       if (cursor[y][x] == '*') {
+                               mouse[y * 16 + x] = COL8_000000;
+                       }
+                       if (cursor[y][x] == 'O') {
+                               mouse[y * 16 + x] = COL8_FFFFFF;
+                       }
+                       if (cursor[y][x] == '.') {
+                               mouse[y * 16 + x] = bc;
+                       }
+               }
+       }
+       return;
+}
+
+void putblock8_8(char *vram, int vxsize, int pxsize,
+       int pysize, int px0, int py0, char *buf, int bxsize)
+{
+       int x, y;
+       for (y = 0; y < pysize; y++) {
+               for (x = 0; x < pxsize; x++) {
+                       vram[(py0 + y) * vxsize + (px0 + x)] = buf[y * bxsize + x];
+               }
+       }
+       return;
+}
diff --git a/haribote/graphic.lst b/haribote/graphic.lst
new file mode 100644 (file)
index 0000000..00505ed
--- /dev/null
@@ -0,0 +1,800 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _table_rgb.0
+     7 00000000                                        EXTERN  _io_load_eflags
+     8 00000000                                        EXTERN  _io_cli
+     9 00000000                                        EXTERN  _io_out8
+    10 00000000                                        EXTERN  _io_store_eflags
+    11 00000000                                        EXTERN  _task_now
+    12 00000000                                        EXTERN  _hankaku
+    13 00000000                                 [FILE "graphic.c"]
+    14                                          [SECTION .data]
+    15 00000000                                 _table_rgb.0:
+    16 00000000 00                                     DB      0
+    17 00000001 00                                     DB      0
+    18 00000002 00                                     DB      0
+    19 00000003 FF                                     DB      -1
+    20 00000004 00                                     DB      0
+    21 00000005 00                                     DB      0
+    22 00000006 00                                     DB      0
+    23 00000007 FF                                     DB      -1
+    24 00000008 00                                     DB      0
+    25 00000009 FF                                     DB      -1
+    26 0000000A FF                                     DB      -1
+    27 0000000B 00                                     DB      0
+    28 0000000C 00                                     DB      0
+    29 0000000D 00                                     DB      0
+    30 0000000E FF                                     DB      -1
+    31 0000000F FF                                     DB      -1
+    32 00000010 00                                     DB      0
+    33 00000011 FF                                     DB      -1
+    34 00000012 00                                     DB      0
+    35 00000013 FF                                     DB      -1
+    36 00000014 FF                                     DB      -1
+    37 00000015 FF                                     DB      -1
+    38 00000016 FF                                     DB      -1
+    39 00000017 FF                                     DB      -1
+    40 00000018 C6                                     DB      -58
+    41 00000019 C6                                     DB      -58
+    42 0000001A C6                                     DB      -58
+    43 0000001B 84                                     DB      -124
+    44 0000001C 00                                     DB      0
+    45 0000001D 00                                     DB      0
+    46 0000001E 00                                     DB      0
+    47 0000001F 84                                     DB      -124
+    48 00000020 00                                     DB      0
+    49 00000021 84                                     DB      -124
+    50 00000022 84                                     DB      -124
+    51 00000023 00                                     DB      0
+    52 00000024 00                                     DB      0
+    53 00000025 00                                     DB      0
+    54 00000026 84                                     DB      -124
+    55 00000027 84                                     DB      -124
+    56 00000028 00                                     DB      0
+    57 00000029 84                                     DB      -124
+    58 0000002A 00                                     DB      0
+    59 0000002B 84                                     DB      -124
+    60 0000002C 84                                     DB      -124
+    61 0000002D 84                                     DB      -124
+    62 0000002E 84                                     DB      -124
+    63 0000002F 84                                     DB      -124
+    64                                          [SECTION .text]
+    65 00000000                                        GLOBAL  _init_palette
+    66 00000000                                 _init_palette:
+    67 00000000 55                                     PUSH    EBP
+    68 00000001 89 E5                                  MOV     EBP,ESP
+    69 00000003 57                                     PUSH    EDI
+    70 00000004 56                                     PUSH    ESI
+    71 00000005 53                                     PUSH    EBX
+    72 00000006 81 EC 000002A4                         SUB     ESP,676
+    73 0000000C 68 [00000000]                          PUSH    _table_rgb.0
+    74 00000011 6A 0F                                  PUSH    15
+    75 00000013 6A 00                                  PUSH    0
+    76 00000015 E8 000000B4                            CALL    _set_palette
+    77 0000001A 83 C4 0C                               ADD     ESP,12
+    78 0000001D C7 85 FFFFFD60 00000000                MOV     DWORD [-672+EBP],0
+    79 00000027 C7 85 FFFFFD5C 00000000                MOV     DWORD [-676+EBP],0
+    80 00000031 C7 85 FFFFFD58 00000000                MOV     DWORD [-680+EBP],0
+    81 0000003B                                 L16:
+    82 0000003B 31 FF                                  XOR     EDI,EDI
+    83 0000003D 31 F6                                  XOR     ESI,ESI
+    84 0000003F 31 DB                                  XOR     EBX,EBX
+    85 00000041                                 L15:
+    86 00000041 31 D2                                  XOR     EDX,EDX
+    87 00000043 C7 85 FFFFFD50 00000000                MOV     DWORD [-688+EBP],0
+    88 0000004D                                 L14:
+    89 0000004D 8B 85 FFFFFD58                         MOV     EAX,DWORD [-680+EBP]
+    90 00000053 8A 8D FFFFFD50                         MOV     CL,BYTE [-688+EBP]
+    91 00000059 01 D8                                  ADD     EAX,EBX
+    92 0000005B 01 D0                                  ADD     EAX,EDX
+    93 0000005D 42                                     INC     EDX
+    94 0000005E 6B C0 03                               IMUL    EAX,EAX,3
+    95 00000061 88 8C 05 FFFFFD64                      MOV     BYTE [-668+EBP+EAX*1],CL
+    96 00000068 89 F1                                  MOV     ECX,ESI
+    97 0000006A 88 8C 05 FFFFFD65                      MOV     BYTE [-667+EBP+EAX*1],CL
+    98 00000071 8A 8D FFFFFD5C                         MOV     CL,BYTE [-676+EBP]
+    99 00000077 88 8C 05 FFFFFD66                      MOV     BYTE [-666+EBP+EAX*1],CL
+   100 0000007E 83 85 FFFFFD50 33                      ADD     DWORD [-688+EBP],51
+   101 00000085 83 FA 05                               CMP     EDX,5
+   102 00000088 7E C3                                  JLE     L14
+   103 0000008A 47                                     INC     EDI
+   104 0000008B 83 C6 33                               ADD     ESI,51
+   105 0000008E 83 C3 06                               ADD     EBX,6
+   106 00000091 83 FF 05                               CMP     EDI,5
+   107 00000094 7E AB                                  JLE     L15
+   108 00000096 FF 85 FFFFFD60                         INC     DWORD [-672+EBP]
+   109 0000009C 83 85 FFFFFD5C 33                      ADD     DWORD [-676+EBP],51
+   110 000000A3 83 85 FFFFFD58 24                      ADD     DWORD [-680+EBP],36
+   111 000000AA 83 BD FFFFFD60 05                      CMP     DWORD [-672+EBP],5
+   112 000000B1 7E 88                                  JLE     L16
+   113 000000B3 8D 85 FFFFFD64                         LEA     EAX,DWORD [-668+EBP]
+   114 000000B9 50                                     PUSH    EAX
+   115 000000BA 68 000000E7                            PUSH    231
+   116 000000BF 6A 10                                  PUSH    16
+   117 000000C1 E8 00000008                            CALL    _set_palette
+   118 000000C6 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   119 000000C9 5B                                     POP     EBX
+   120 000000CA 5E                                     POP     ESI
+   121 000000CB 5F                                     POP     EDI
+   122 000000CC 5D                                     POP     EBP
+   123 000000CD C3                                     RET
+   124 000000CE                                        GLOBAL  _set_palette
+   125 000000CE                                 _set_palette:
+   126 000000CE 55                                     PUSH    EBP
+   127 000000CF 89 E5                                  MOV     EBP,ESP
+   128 000000D1 57                                     PUSH    EDI
+   129 000000D2 56                                     PUSH    ESI
+   130 000000D3 53                                     PUSH    EBX
+   131 000000D4 51                                     PUSH    ECX
+   132 000000D5 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   133 000000D8 8B 7D 0C                               MOV     EDI,DWORD [12+EBP]
+   134 000000DB 8B 75 10                               MOV     ESI,DWORD [16+EBP]
+   135 000000DE E8 [00000000]                          CALL    _io_load_eflags
+   136 000000E3 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   137 000000E6 E8 [00000000]                          CALL    _io_cli
+   138 000000EB 53                                     PUSH    EBX
+   139 000000EC 68 000003C8                            PUSH    968
+   140 000000F1 E8 [00000000]                          CALL    _io_out8
+   141 000000F6 39 FB                                  CMP     EBX,EDI
+   142 000000F8 58                                     POP     EAX
+   143 000000F9 5A                                     POP     EDX
+   144 000000FA 7E 12                                  JLE     L28
+   145 000000FC                                 L30:
+   146 000000FC 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   147 000000FF 89 45 08                               MOV     DWORD [8+EBP],EAX
+   148 00000102 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   149 00000105 5B                                     POP     EBX
+   150 00000106 5E                                     POP     ESI
+   151 00000107 5F                                     POP     EDI
+   152 00000108 5D                                     POP     EBP
+   153 00000109 E9 [00000000]                          JMP     _io_store_eflags
+   154 0000010E                                 L28:
+   155 0000010E 8A 06                                  MOV     AL,BYTE [ESI]
+   156 00000110 43                                     INC     EBX
+   157 00000111 C0 E8 02                               SHR     AL,2
+   158 00000114 0F B6 C0                               MOVZX   EAX,AL
+   159 00000117 50                                     PUSH    EAX
+   160 00000118 68 000003C9                            PUSH    969
+   161 0000011D E8 [00000000]                          CALL    _io_out8
+   162 00000122 8A 46 01                               MOV     AL,BYTE [1+ESI]
+   163 00000125 C0 E8 02                               SHR     AL,2
+   164 00000128 0F B6 C0                               MOVZX   EAX,AL
+   165 0000012B 50                                     PUSH    EAX
+   166 0000012C 68 000003C9                            PUSH    969
+   167 00000131 E8 [00000000]                          CALL    _io_out8
+   168 00000136 8A 46 02                               MOV     AL,BYTE [2+ESI]
+   169 00000139 C0 E8 02                               SHR     AL,2
+   170 0000013C 83 C6 03                               ADD     ESI,3
+   171 0000013F 0F B6 C0                               MOVZX   EAX,AL
+   172 00000142 50                                     PUSH    EAX
+   173 00000143 68 000003C9                            PUSH    969
+   174 00000148 E8 [00000000]                          CALL    _io_out8
+   175 0000014D 83 C4 18                               ADD     ESP,24
+   176 00000150 39 FB                                  CMP     EBX,EDI
+   177 00000152 7E BA                                  JLE     L28
+   178 00000154 EB A6                                  JMP     L30
+   179 00000156                                        GLOBAL  _boxfill8
+   180 00000156                                 _boxfill8:
+   181 00000156 55                                     PUSH    EBP
+   182 00000157 89 E5                                  MOV     EBP,ESP
+   183 00000159 57                                     PUSH    EDI
+   184 0000015A 56                                     PUSH    ESI
+   185 0000015B 53                                     PUSH    EBX
+   186 0000015C 57                                     PUSH    EDI
+   187 0000015D 57                                     PUSH    EDI
+   188 0000015E 8A 45 10                               MOV     AL,BYTE [16+EBP]
+   189 00000161 8B 4D 18                               MOV     ECX,DWORD [24+EBP]
+   190 00000164 8B 7D 1C                               MOV     EDI,DWORD [28+EBP]
+   191 00000167 88 45 F3                               MOV     BYTE [-13+EBP],AL
+   192 0000016A 3B 4D 20                               CMP     ECX,DWORD [32+EBP]
+   193 0000016D 7F 31                                  JG      L43
+   194 0000016F 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   195 00000172 0F AF D9                               IMUL    EBX,ECX
+   196 00000175                                 L41:
+   197 00000175 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+   198 00000178 39 FA                                  CMP     EDX,EDI
+   199 0000017A 7F 1B                                  JG      L45
+   200 0000017C 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   201 0000017F 01 DE                                  ADD     ESI,EBX
+   202 00000181 01 D6                                  ADD     ESI,EDX
+   203 00000183 89 75 EC                               MOV     DWORD [-20+EBP],ESI
+   204 00000186                                 L40:
+   205 00000186 8B 75 EC                               MOV     ESI,DWORD [-20+EBP]
+   206 00000189 8A 45 F3                               MOV     AL,BYTE [-13+EBP]
+   207 0000018C 42                                     INC     EDX
+   208 0000018D 88 06                                  MOV     BYTE [ESI],AL
+   209 0000018F 46                                     INC     ESI
+   210 00000190 89 75 EC                               MOV     DWORD [-20+EBP],ESI
+   211 00000193 39 FA                                  CMP     EDX,EDI
+   212 00000195 7E EF                                  JLE     L40
+   213 00000197                                 L45:
+   214 00000197 41                                     INC     ECX
+   215 00000198 03 5D 0C                               ADD     EBX,DWORD [12+EBP]
+   216 0000019B 3B 4D 20                               CMP     ECX,DWORD [32+EBP]
+   217 0000019E 7E D5                                  JLE     L41
+   218 000001A0                                 L43:
+   219 000001A0 5B                                     POP     EBX
+   220 000001A1 5E                                     POP     ESI
+   221 000001A2 5B                                     POP     EBX
+   222 000001A3 5E                                     POP     ESI
+   223 000001A4 5F                                     POP     EDI
+   224 000001A5 5D                                     POP     EBP
+   225 000001A6 C3                                     RET
+   226 000001A7                                        GLOBAL  _init_screen8
+   227 000001A7                                 _init_screen8:
+   228 000001A7 55                                     PUSH    EBP
+   229 000001A8 89 E5                                  MOV     EBP,ESP
+   230 000001AA 57                                     PUSH    EDI
+   231 000001AB 56                                     PUSH    ESI
+   232 000001AC 53                                     PUSH    EBX
+   233 000001AD 83 EC 0C                               SUB     ESP,12
+   234 000001B0 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   235 000001B3 8B 7D 0C                               MOV     EDI,DWORD [12+EBP]
+   236 000001B6 83 E8 1D                               SUB     EAX,29
+   237 000001B9 4F                                     DEC     EDI
+   238 000001BA 50                                     PUSH    EAX
+   239 000001BB 57                                     PUSH    EDI
+   240 000001BC 6A 00                                  PUSH    0
+   241 000001BE 6A 00                                  PUSH    0
+   242 000001C0 6A 0E                                  PUSH    14
+   243 000001C2 FF 75 0C                               PUSH    DWORD [12+EBP]
+   244 000001C5 FF 75 08                               PUSH    DWORD [8+EBP]
+   245 000001C8 E8 FFFFFF89                            CALL    _boxfill8
+   246 000001CD 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   247 000001D0 83 E8 1C                               SUB     EAX,28
+   248 000001D3 50                                     PUSH    EAX
+   249 000001D4 57                                     PUSH    EDI
+   250 000001D5 50                                     PUSH    EAX
+   251 000001D6 6A 00                                  PUSH    0
+   252 000001D8 6A 08                                  PUSH    8
+   253 000001DA FF 75 0C                               PUSH    DWORD [12+EBP]
+   254 000001DD FF 75 08                               PUSH    DWORD [8+EBP]
+   255 000001E0 E8 FFFFFF71                            CALL    _boxfill8
+   256 000001E5 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   257 000001E8 83 C4 38                               ADD     ESP,56
+   258 000001EB 83 E8 1B                               SUB     EAX,27
+   259 000001EE 50                                     PUSH    EAX
+   260 000001EF 57                                     PUSH    EDI
+   261 000001F0 50                                     PUSH    EAX
+   262 000001F1 6A 00                                  PUSH    0
+   263 000001F3 6A 07                                  PUSH    7
+   264 000001F5 FF 75 0C                               PUSH    DWORD [12+EBP]
+   265 000001F8 FF 75 08                               PUSH    DWORD [8+EBP]
+   266 000001FB E8 FFFFFF56                            CALL    _boxfill8
+   267 00000200 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   268 00000203 48                                     DEC     EAX
+   269 00000204 50                                     PUSH    EAX
+   270 00000205 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   271 00000208 57                                     PUSH    EDI
+   272 00000209 83 E8 1A                               SUB     EAX,26
+   273 0000020C 50                                     PUSH    EAX
+   274 0000020D 6A 00                                  PUSH    0
+   275 0000020F 6A 08                                  PUSH    8
+   276 00000211 FF 75 0C                               PUSH    DWORD [12+EBP]
+   277 00000214 FF 75 08                               PUSH    DWORD [8+EBP]
+   278 00000217 E8 FFFFFF3A                            CALL    _boxfill8
+   279 0000021C 8B 75 10                               MOV     ESI,DWORD [16+EBP]
+   280 0000021F 83 C4 38                               ADD     ESP,56
+   281 00000222 83 EE 18                               SUB     ESI,24
+   282 00000225 56                                     PUSH    ESI
+   283 00000226 6A 3B                                  PUSH    59
+   284 00000228 56                                     PUSH    ESI
+   285 00000229 6A 03                                  PUSH    3
+   286 0000022B 6A 07                                  PUSH    7
+   287 0000022D FF 75 0C                               PUSH    DWORD [12+EBP]
+   288 00000230 FF 75 08                               PUSH    DWORD [8+EBP]
+   289 00000233 E8 FFFFFF1E                            CALL    _boxfill8
+   290 00000238 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   291 0000023B 83 E8 04                               SUB     EAX,4
+   292 0000023E 50                                     PUSH    EAX
+   293 0000023F 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   294 00000242 6A 02                                  PUSH    2
+   295 00000244 56                                     PUSH    ESI
+   296 00000245 6A 02                                  PUSH    2
+   297 00000247 6A 07                                  PUSH    7
+   298 00000249 FF 75 0C                               PUSH    DWORD [12+EBP]
+   299 0000024C FF 75 08                               PUSH    DWORD [8+EBP]
+   300 0000024F E8 FFFFFF02                            CALL    _boxfill8
+   301 00000254 83 C4 38                               ADD     ESP,56
+   302 00000257 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   303 0000025A 6A 3B                                  PUSH    59
+   304 0000025C FF 75 F0                               PUSH    DWORD [-16+EBP]
+   305 0000025F 6A 03                                  PUSH    3
+   306 00000261 6A 0F                                  PUSH    15
+   307 00000263 FF 75 0C                               PUSH    DWORD [12+EBP]
+   308 00000266 FF 75 08                               PUSH    DWORD [8+EBP]
+   309 00000269 E8 FFFFFEE8                            CALL    _boxfill8
+   310 0000026E 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   311 00000271 83 E8 05                               SUB     EAX,5
+   312 00000274 50                                     PUSH    EAX
+   313 00000275 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   314 00000278 6A 3B                                  PUSH    59
+   315 0000027A 83 E8 17                               SUB     EAX,23
+   316 0000027D 50                                     PUSH    EAX
+   317 0000027E 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   318 00000281 6A 3B                                  PUSH    59
+   319 00000283 6A 0F                                  PUSH    15
+   320 00000285 FF 75 0C                               PUSH    DWORD [12+EBP]
+   321 00000288 FF 75 08                               PUSH    DWORD [8+EBP]
+   322 0000028B E8 FFFFFEC6                            CALL    _boxfill8
+   323 00000290 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   324 00000293 83 C4 38                               ADD     ESP,56
+   325 00000296 83 E8 03                               SUB     EAX,3
+   326 00000299 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   327 0000029C 50                                     PUSH    EAX
+   328 0000029D 6A 3B                                  PUSH    59
+   329 0000029F 50                                     PUSH    EAX
+   330 000002A0 6A 02                                  PUSH    2
+   331 000002A2 6A 00                                  PUSH    0
+   332 000002A4 FF 75 0C                               PUSH    DWORD [12+EBP]
+   333 000002A7 FF 75 08                               PUSH    DWORD [8+EBP]
+   334 000002AA E8 FFFFFEA7                            CALL    _boxfill8
+   335 000002AF FF 75 E8                               PUSH    DWORD [-24+EBP]
+   336 000002B2 6A 3C                                  PUSH    60
+   337 000002B4 56                                     PUSH    ESI
+   338 000002B5 6A 3C                                  PUSH    60
+   339 000002B7 6A 00                                  PUSH    0
+   340 000002B9 FF 75 0C                               PUSH    DWORD [12+EBP]
+   341 000002BC FF 75 08                               PUSH    DWORD [8+EBP]
+   342 000002BF E8 FFFFFE92                            CALL    _boxfill8
+   343 000002C4 8B 7D 0C                               MOV     EDI,DWORD [12+EBP]
+   344 000002C7 83 C4 38                               ADD     ESP,56
+   345 000002CA 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   346 000002CD 83 EB 04                               SUB     EBX,4
+   347 000002D0 83 EF 2F                               SUB     EDI,47
+   348 000002D3 56                                     PUSH    ESI
+   349 000002D4 53                                     PUSH    EBX
+   350 000002D5 56                                     PUSH    ESI
+   351 000002D6 57                                     PUSH    EDI
+   352 000002D7 6A 0F                                  PUSH    15
+   353 000002D9 FF 75 0C                               PUSH    DWORD [12+EBP]
+   354 000002DC FF 75 08                               PUSH    DWORD [8+EBP]
+   355 000002DF E8 FFFFFE72                            CALL    _boxfill8
+   356 000002E4 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   357 000002E7 57                                     PUSH    EDI
+   358 000002E8 FF 75 EC                               PUSH    DWORD [-20+EBP]
+   359 000002EB 57                                     PUSH    EDI
+   360 000002EC 6A 0F                                  PUSH    15
+   361 000002EE FF 75 0C                               PUSH    DWORD [12+EBP]
+   362 000002F1 FF 75 08                               PUSH    DWORD [8+EBP]
+   363 000002F4 E8 FFFFFE5D                            CALL    _boxfill8
+   364 000002F9 83 C4 38                               ADD     ESP,56
+   365 000002FC FF 75 E8                               PUSH    DWORD [-24+EBP]
+   366 000002FF 53                                     PUSH    EBX
+   367 00000300 FF 75 E8                               PUSH    DWORD [-24+EBP]
+   368 00000303 57                                     PUSH    EDI
+   369 00000304 6A 07                                  PUSH    7
+   370 00000306 FF 75 0C                               PUSH    DWORD [12+EBP]
+   371 00000309 FF 75 08                               PUSH    DWORD [8+EBP]
+   372 0000030C E8 FFFFFE45                            CALL    _boxfill8
+   373 00000311 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   374 00000314 FF 75 E8                               PUSH    DWORD [-24+EBP]
+   375 00000317 83 E8 03                               SUB     EAX,3
+   376 0000031A 50                                     PUSH    EAX
+   377 0000031B 56                                     PUSH    ESI
+   378 0000031C 50                                     PUSH    EAX
+   379 0000031D 6A 07                                  PUSH    7
+   380 0000031F FF 75 0C                               PUSH    DWORD [12+EBP]
+   381 00000322 FF 75 08                               PUSH    DWORD [8+EBP]
+   382 00000325 E8 FFFFFE2C                            CALL    _boxfill8
+   383 0000032A 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   384 0000032D 5B                                     POP     EBX
+   385 0000032E 5E                                     POP     ESI
+   386 0000032F 5F                                     POP     EDI
+   387 00000330 5D                                     POP     EBP
+   388 00000331 C3                                     RET
+   389 00000332                                        GLOBAL  _putfont8
+   390 00000332                                 _putfont8:
+   391 00000332 55                                     PUSH    EBP
+   392 00000333 89 E5                                  MOV     EBP,ESP
+   393 00000335 57                                     PUSH    EDI
+   394 00000336 56                                     PUSH    ESI
+   395 00000337 31 F6                                  XOR     ESI,ESI
+   396 00000339 53                                     PUSH    EBX
+   397 0000033A 8B 7D 1C                               MOV     EDI,DWORD [28+EBP]
+   398 0000033D 8A 5D 18                               MOV     BL,BYTE [24+EBP]
+   399 00000340                                 L60:
+   400 00000340 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+   401 00000343 8B 55 10                               MOV     EDX,DWORD [16+EBP]
+   402 00000346 01 F0                                  ADD     EAX,ESI
+   403 00000348 0F AF 45 0C                            IMUL    EAX,DWORD [12+EBP]
+   404 0000034C 03 45 08                               ADD     EAX,DWORD [8+EBP]
+   405 0000034F 8D 0C 02                               LEA     ECX,DWORD [EDX+EAX*1]
+   406 00000352 8A 14 3E                               MOV     DL,BYTE [ESI+EDI*1]
+   407 00000355 84 D2                                  TEST    DL,DL
+   408 00000357 79 02                                  JNS     L52
+   409 00000359 88 19                                  MOV     BYTE [ECX],BL
+   410 0000035B                                 L52:
+   411 0000035B 88 D0                                  MOV     AL,DL
+   412 0000035D 83 E0 40                               AND     EAX,64
+   413 00000360 84 C0                                  TEST    AL,AL
+   414 00000362 74 03                                  JE      L53
+   415 00000364 88 59 01                               MOV     BYTE [1+ECX],BL
+   416 00000367                                 L53:
+   417 00000367 88 D0                                  MOV     AL,DL
+   418 00000369 83 E0 20                               AND     EAX,32
+   419 0000036C 84 C0                                  TEST    AL,AL
+   420 0000036E 74 03                                  JE      L54
+   421 00000370 88 59 02                               MOV     BYTE [2+ECX],BL
+   422 00000373                                 L54:
+   423 00000373 88 D0                                  MOV     AL,DL
+   424 00000375 83 E0 10                               AND     EAX,16
+   425 00000378 84 C0                                  TEST    AL,AL
+   426 0000037A 74 03                                  JE      L55
+   427 0000037C 88 59 03                               MOV     BYTE [3+ECX],BL
+   428 0000037F                                 L55:
+   429 0000037F 88 D0                                  MOV     AL,DL
+   430 00000381 83 E0 08                               AND     EAX,8
+   431 00000384 84 C0                                  TEST    AL,AL
+   432 00000386 74 03                                  JE      L56
+   433 00000388 88 59 04                               MOV     BYTE [4+ECX],BL
+   434 0000038B                                 L56:
+   435 0000038B 88 D0                                  MOV     AL,DL
+   436 0000038D 83 E0 04                               AND     EAX,4
+   437 00000390 84 C0                                  TEST    AL,AL
+   438 00000392 74 03                                  JE      L57
+   439 00000394 88 59 05                               MOV     BYTE [5+ECX],BL
+   440 00000397                                 L57:
+   441 00000397 88 D0                                  MOV     AL,DL
+   442 00000399 83 E0 02                               AND     EAX,2
+   443 0000039C 84 C0                                  TEST    AL,AL
+   444 0000039E 74 03                                  JE      L58
+   445 000003A0 88 59 06                               MOV     BYTE [6+ECX],BL
+   446 000003A3                                 L58:
+   447 000003A3 83 E2 01                               AND     EDX,1
+   448 000003A6 84 D2                                  TEST    DL,DL
+   449 000003A8 74 03                                  JE      L50
+   450 000003AA 88 59 07                               MOV     BYTE [7+ECX],BL
+   451 000003AD                                 L50:
+   452 000003AD 46                                     INC     ESI
+   453 000003AE 83 FE 0F                               CMP     ESI,15
+   454 000003B1 7E 8D                                  JLE     L60
+   455 000003B3 5B                                     POP     EBX
+   456 000003B4 5E                                     POP     ESI
+   457 000003B5 5F                                     POP     EDI
+   458 000003B6 5D                                     POP     EBP
+   459 000003B7 C3                                     RET
+   460 000003B8                                        GLOBAL  _putfonts8_asc
+   461 000003B8                                 _putfonts8_asc:
+   462 000003B8 55                                     PUSH    EBP
+   463 000003B9 89 E5                                  MOV     EBP,ESP
+   464 000003BB 57                                     PUSH    EDI
+   465 000003BC 56                                     PUSH    ESI
+   466 000003BD 53                                     PUSH    EBX
+   467 000003BE 83 EC 0C                               SUB     ESP,12
+   468 000003C1 8A 45 18                               MOV     AL,BYTE [24+EBP]
+   469 000003C4 8B 7D 1C                               MOV     EDI,DWORD [28+EBP]
+   470 000003C7 88 45 F3                               MOV     BYTE [-13+EBP],AL
+   471 000003CA E8 [00000000]                          CALL    _task_now
+   472 000003CF 8B 15 00000FE8                         MOV     EDX,DWORD [4072]
+   473 000003D5 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   474 000003D8 89 55 E8                               MOV     DWORD [-24+EBP],EDX
+   475 000003DB 80 B8 000000BC 00                      CMP     BYTE [188+EAX],0
+   476 000003E2 75 09                                  JNE     L64
+   477 000003E4 80 3F 00                               CMP     BYTE [EDI],0
+   478 000003E7 0F 85 000001E2                         JNE     L69
+   479 000003ED                                 L64:
+   480 000003ED 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   481 000003F0 80 B8 000000BC 01                      CMP     BYTE [188+EAX],1
+   482 000003F7 0F 84 000000CB                         JE      L100
+   483 000003FD                                 L70:
+   484 000003FD 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   485 00000400 80 B8 000000BC 02                      CMP     BYTE [188+EAX],2
+   486 00000407 74 08                                  JE      L101
+   487 00000409                                 L63:
+   488 00000409 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   489 0000040C 5B                                     POP     EBX
+   490 0000040D 5E                                     POP     ESI
+   491 0000040E 5F                                     POP     EDI
+   492 0000040F 5D                                     POP     EBP
+   493 00000410 C3                                     RET
+   494 00000411                                 L101:
+   495 00000411 80 3F 00                               CMP     BYTE [EDI],0
+   496 00000414 74 F3                                  JE      L63
+   497 00000416                                 L96:
+   498 00000416 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   499 00000419 8A 82 000000BD                         MOV     AL,BYTE [189+EDX]
+   500 0000041F 84 C0                                  TEST    AL,AL
+   501 00000421 75 43                                  JNE     L92
+   502 00000423 8A 17                                  MOV     DL,BYTE [EDI]
+   503 00000425 8D 42 7F                               LEA     EAX,DWORD [127+EDX]
+   504 00000428 3C 7D                                  CMP     AL,125
+   505 0000042A 77 15                                  JA      L93
+   506 0000042C 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   507 0000042F 88 90 000000BD                         MOV     BYTE [189+EAX],DL
+   508 00000435                                 L95:
+   509 00000435 83 45 10 08                            ADD     DWORD [16+EBP],8
+   510 00000439 47                                     INC     EDI
+   511 0000043A 80 3F 00                               CMP     BYTE [EDI],0
+   512 0000043D 75 D7                                  JNE     L96
+   513 0000043F EB C8                                  JMP     L63
+   514 00000441                                 L93:
+   515 00000441 0F B6 C2                               MOVZX   EAX,DL
+   516 00000444 C1 E0 04                               SAL     EAX,4
+   517 00000447 03 45 E8                               ADD     EAX,DWORD [-24+EBP]
+   518 0000044A 50                                     PUSH    EAX
+   519 0000044B 0F BE 45 F3                            MOVSX   EAX,BYTE [-13+EBP]
+   520 0000044F 50                                     PUSH    EAX
+   521 00000450 FF 75 14                               PUSH    DWORD [20+EBP]
+   522 00000453 FF 75 10                               PUSH    DWORD [16+EBP]
+   523 00000456 FF 75 0C                               PUSH    DWORD [12+EBP]
+   524 00000459 FF 75 08                               PUSH    DWORD [8+EBP]
+   525 0000045C E8 FFFFFED1                            CALL    _putfont8
+   526 00000461 83 C4 18                               ADD     ESP,24
+   527 00000464 EB CF                                  JMP     L95
+   528 00000466                                 L92:
+   529 00000466 0F B6 D8                               MOVZX   EBX,AL
+   530 00000469 6B DB 5E                               IMUL    EBX,EBX,94
+   531 0000046C 0F B6 07                               MOVZX   EAX,BYTE [EDI]
+   532 0000046F 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   533 00000472 8D 9C 18 FFFFC441                      LEA     EBX,DWORD [-15295+EAX+EBX*1]
+   534 00000479 C6 82 000000BD 00                      MOV     BYTE [189+EDX],0
+   535 00000480 C1 E3 05                               SAL     EBX,5
+   536 00000483 03 5D E8                               ADD     EBX,DWORD [-24+EBP]
+   537 00000486 0F BE 75 F3                            MOVSX   ESI,BYTE [-13+EBP]
+   538 0000048A 8D 83 00001000                         LEA     EAX,DWORD [4096+EBX]
+   539 00000490 81 C3 00001010                         ADD     EBX,4112
+   540 00000496 50                                     PUSH    EAX
+   541 00000497 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   542 0000049A 56                                     PUSH    ESI
+   543 0000049B 83 E8 08                               SUB     EAX,8
+   544 0000049E FF 75 14                               PUSH    DWORD [20+EBP]
+   545 000004A1 50                                     PUSH    EAX
+   546 000004A2 FF 75 0C                               PUSH    DWORD [12+EBP]
+   547 000004A5 FF 75 08                               PUSH    DWORD [8+EBP]
+   548 000004A8 E8 FFFFFE85                            CALL    _putfont8
+   549 000004AD 53                                     PUSH    EBX
+   550 000004AE 56                                     PUSH    ESI
+   551 000004AF FF 75 14                               PUSH    DWORD [20+EBP]
+   552 000004B2 FF 75 10                               PUSH    DWORD [16+EBP]
+   553 000004B5 FF 75 0C                               PUSH    DWORD [12+EBP]
+   554 000004B8 FF 75 08                               PUSH    DWORD [8+EBP]
+   555 000004BB E8 FFFFFE72                            CALL    _putfont8
+   556 000004C0 83 C4 30                               ADD     ESP,48
+   557 000004C3 E9 FFFFFF6D                            JMP     L95
+   558 000004C8                                 L100:
+   559 000004C8 80 3F 00                               CMP     BYTE [EDI],0
+   560 000004CB 0F 84 FFFFFF2C                         JE      L70
+   561 000004D1                                 L86:
+   562 000004D1 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   563 000004D4 8A 90 000000BD                         MOV     DL,BYTE [189+EAX]
+   564 000004DA 84 D2                                  TEST    DL,DL
+   565 000004DC 75 4D                                  JNE     L75
+   566 000004DE 8A 17                                  MOV     DL,BYTE [EDI]
+   567 000004E0 8D 42 7F                               LEA     EAX,DWORD [127+EDX]
+   568 000004E3 3C 1E                                  CMP     AL,30
+   569 000004E5 76 07                                  JBE     L77
+   570 000004E7 8D 42 20                               LEA     EAX,DWORD [32+EDX]
+   571 000004EA 3C 1C                                  CMP     AL,28
+   572 000004EC 77 18                                  JA      L76
+   573 000004EE                                 L77:
+   574 000004EE 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   575 000004F1 88 90 000000BD                         MOV     BYTE [189+EAX],DL
+   576 000004F7                                 L79:
+   577 000004F7 83 45 10 08                            ADD     DWORD [16+EBP],8
+   578 000004FB 47                                     INC     EDI
+   579 000004FC 80 3F 00                               CMP     BYTE [EDI],0
+   580 000004FF 75 D0                                  JNE     L86
+   581 00000501 E9 FFFFFEF7                            JMP     L70
+   582 00000506                                 L76:
+   583 00000506 0F B6 C2                               MOVZX   EAX,DL
+   584 00000509 C1 E0 04                               SAL     EAX,4
+   585 0000050C 03 45 E8                               ADD     EAX,DWORD [-24+EBP]
+   586 0000050F 50                                     PUSH    EAX
+   587 00000510 0F BE 45 F3                            MOVSX   EAX,BYTE [-13+EBP]
+   588 00000514 50                                     PUSH    EAX
+   589 00000515 FF 75 14                               PUSH    DWORD [20+EBP]
+   590 00000518 FF 75 10                               PUSH    DWORD [16+EBP]
+   591 0000051B FF 75 0C                               PUSH    DWORD [12+EBP]
+   592 0000051E FF 75 08                               PUSH    DWORD [8+EBP]
+   593 00000521 E8 FFFFFE0C                            CALL    _putfont8
+   594 00000526 83 C4 18                               ADD     ESP,24
+   595 00000529 EB CC                                  JMP     L79
+   596 0000052B                                 L75:
+   597 0000052B 8D 42 7F                               LEA     EAX,DWORD [127+EDX]
+   598 0000052E 3C 1E                                  CMP     AL,30
+   599 00000530 0F 87 0000008A                         JA      L80
+   600 00000536 0F B6 C2                               MOVZX   EAX,DL
+   601 00000539 8D 8C 00 FFFFFEFE                      LEA     ECX,DWORD [-258+EAX+EAX*1]
+   602 00000540                                 L81:
+   603 00000540 8A 17                                  MOV     DL,BYTE [EDI]
+   604 00000542 8D 42 C0                               LEA     EAX,DWORD [-64+EDX]
+   605 00000545 3C 3E                                  CMP     AL,62
+   606 00000547 77 5D                                  JA      L82
+   607 00000549 0F B6 C2                               MOVZX   EAX,DL
+   608 0000054C 83 E8 40                               SUB     EAX,64
+   609 0000054F                                 L83:
+   610 0000054F 6B D9 5E                               IMUL    EBX,ECX,94
+   611 00000552 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   612 00000555 01 C3                                  ADD     EBX,EAX
+   613 00000557 C1 E3 05                               SAL     EBX,5
+   614 0000055A C6 82 000000BD 00                      MOV     BYTE [189+EDX],0
+   615 00000561 03 5D E8                               ADD     EBX,DWORD [-24+EBP]
+   616 00000564 0F BE 75 F3                            MOVSX   ESI,BYTE [-13+EBP]
+   617 00000568 8D 83 00001000                         LEA     EAX,DWORD [4096+EBX]
+   618 0000056E 81 C3 00001010                         ADD     EBX,4112
+   619 00000574 50                                     PUSH    EAX
+   620 00000575 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   621 00000578 56                                     PUSH    ESI
+   622 00000579 83 E8 08                               SUB     EAX,8
+   623 0000057C FF 75 14                               PUSH    DWORD [20+EBP]
+   624 0000057F 50                                     PUSH    EAX
+   625 00000580 FF 75 0C                               PUSH    DWORD [12+EBP]
+   626 00000583 FF 75 08                               PUSH    DWORD [8+EBP]
+   627 00000586 E8 FFFFFDA7                            CALL    _putfont8
+   628 0000058B 53                                     PUSH    EBX
+   629 0000058C 56                                     PUSH    ESI
+   630 0000058D FF 75 14                               PUSH    DWORD [20+EBP]
+   631 00000590 FF 75 10                               PUSH    DWORD [16+EBP]
+   632 00000593 FF 75 0C                               PUSH    DWORD [12+EBP]
+   633 00000596 FF 75 08                               PUSH    DWORD [8+EBP]
+   634 00000599 E8 FFFFFD94                            CALL    _putfont8
+   635 0000059E 83 C4 30                               ADD     ESP,48
+   636 000005A1 E9 FFFFFF51                            JMP     L79
+   637 000005A6                                 L82:
+   638 000005A6 8D 42 80                               LEA     EAX,DWORD [-128+EDX]
+   639 000005A9 3C 1E                                  CMP     AL,30
+   640 000005AB 77 08                                  JA      L84
+   641 000005AD 0F B6 C2                               MOVZX   EAX,DL
+   642 000005B0 83 E8 41                               SUB     EAX,65
+   643 000005B3 EB 9A                                  JMP     L83
+   644 000005B5                                 L84:
+   645 000005B5 0F B6 C2                               MOVZX   EAX,DL
+   646 000005B8 2D 0000009F                            SUB     EAX,159
+   647 000005BD 41                                     INC     ECX
+   648 000005BE EB 8F                                  JMP     L83
+   649 000005C0                                 L80:
+   650 000005C0 0F B6 C2                               MOVZX   EAX,DL
+   651 000005C3 8D 8C 00 FFFFFE7E                      LEA     ECX,DWORD [-386+EAX+EAX*1]
+   652 000005CA E9 FFFFFF71                            JMP     L81
+   653 000005CF                                 L69:
+   654 000005CF 0F B6 07                               MOVZX   EAX,BYTE [EDI]
+   655 000005D2 C1 E0 04                               SAL     EAX,4
+   656 000005D5 47                                     INC     EDI
+   657 000005D6 05 [00000000]                          ADD     EAX,_hankaku
+   658 000005DB 50                                     PUSH    EAX
+   659 000005DC 0F BE 45 F3                            MOVSX   EAX,BYTE [-13+EBP]
+   660 000005E0 50                                     PUSH    EAX
+   661 000005E1 FF 75 14                               PUSH    DWORD [20+EBP]
+   662 000005E4 FF 75 10                               PUSH    DWORD [16+EBP]
+   663 000005E7 FF 75 0C                               PUSH    DWORD [12+EBP]
+   664 000005EA FF 75 08                               PUSH    DWORD [8+EBP]
+   665 000005ED E8 FFFFFD40                            CALL    _putfont8
+   666 000005F2 83 C4 18                               ADD     ESP,24
+   667 000005F5 83 45 10 08                            ADD     DWORD [16+EBP],8
+   668 000005F9 80 3F 00                               CMP     BYTE [EDI],0
+   669 000005FC 75 D1                                  JNE     L69
+   670 000005FE E9 FFFFFDEA                            JMP     L64
+   671                                          [SECTION .data]
+   672 00000030                                 _cursor.1:
+   673 00000030 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A          DB      "**************.."
+       0000003A 2A 2A 2A 2A 2E 2E 
+   674 00000040 2A 4F 4F 4F 4F 4F 4F 4F 4F 4F          DB      "*OOOOOOOOOOO*..."
+       0000004A 4F 4F 2A 2E 2E 2E 
+   675 00000050 2A 4F 4F 4F 4F 4F 4F 4F 4F 4F          DB      "*OOOOOOOOOO*...."
+       0000005A 4F 2A 2E 2E 2E 2E 
+   676 00000060 2A 4F 4F 4F 4F 4F 4F 4F 4F 4F          DB      "*OOOOOOOOO*....."
+       0000006A 2A 2E 2E 2E 2E 2E 
+   677 00000070 2A 4F 4F 4F 4F 4F 4F 4F 4F 2A          DB      "*OOOOOOOO*......"
+       0000007A 2E 2E 2E 2E 2E 2E 
+   678 00000080 2A 4F 4F 4F 4F 4F 4F 4F 2A 2E          DB      "*OOOOOOO*......."
+       0000008A 2E 2E 2E 2E 2E 2E 
+   679 00000090 2A 4F 4F 4F 4F 4F 4F 4F 2A 2E          DB      "*OOOOOOO*......."
+       0000009A 2E 2E 2E 2E 2E 2E 
+   680 000000A0 2A 4F 4F 4F 4F 4F 4F 4F 4F 2A          DB      "*OOOOOOOO*......"
+       000000AA 2E 2E 2E 2E 2E 2E 
+   681 000000B0 2A 4F 4F 4F 4F 2A 2A 4F 4F 4F          DB      "*OOOO**OOO*....."
+       000000BA 2A 2E 2E 2E 2E 2E 
+   682 000000C0 2A 4F 4F 4F 2A 2E 2E 2A 4F 4F          DB      "*OOO*..*OOO*...."
+       000000CA 4F 2A 2E 2E 2E 2E 
+   683 000000D0 2A 4F 4F 2A 2E 2E 2E 2E 2A 4F          DB      "*OO*....*OOO*..."
+       000000DA 4F 4F 2A 2E 2E 2E 
+   684 000000E0 2A 4F 2A 2E 2E 2E 2E 2E 2E 2A          DB      "*O*......*OOO*.."
+       000000EA 4F 4F 4F 2A 2E 2E 
+   685 000000F0 2A 2A 2E 2E 2E 2E 2E 2E 2E 2E          DB      "**........*OOO*."
+       000000FA 2A 4F 4F 4F 2A 2E 
+   686 00000100 2A 2E 2E 2E 2E 2E 2E 2E 2E 2E          DB      "*..........*OOO*"
+       0000010A 2E 2A 4F 4F 4F 2A 
+   687 00000110 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E          DB      "............*OO*"
+       0000011A 2E 2E 2A 4F 4F 2A 
+   688 00000120 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E          DB      ".............***"
+       0000012A 2E 2E 2E 2A 2A 2A 
+   689                                          [SECTION .text]
+   690 00000603                                        GLOBAL  _init_mouse_cursor8
+   691 00000603                                 _init_mouse_cursor8:
+   692 00000603 55                                     PUSH    EBP
+   693 00000604 89 E5                                  MOV     EBP,ESP
+   694 00000606 57                                     PUSH    EDI
+   695 00000607 56                                     PUSH    ESI
+   696 00000608 31 FF                                  XOR     EDI,EDI
+   697 0000060A 53                                     PUSH    EBX
+   698 0000060B 31 DB                                  XOR     EBX,EBX
+   699 0000060D 50                                     PUSH    EAX
+   700 0000060E 8A 45 0C                               MOV     AL,BYTE [12+EBP]
+   701 00000611 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   702 00000614 88 45 F3                               MOV     BYTE [-13+EBP],AL
+   703 00000617                                 L115:
+   704 00000617 31 D2                                  XOR     EDX,EDX
+   705 00000619                                 L114:
+   706 00000619 8D 04 3A                               LEA     EAX,DWORD [EDX+EDI*1]
+   707 0000061C 80 B8 [00000030] 2A                    CMP     BYTE [_cursor.1+EAX],42
+   708 00000623 74 35                                  JE      L120
+   709 00000625                                 L111:
+   710 00000625 80 B8 [00000030] 4F                    CMP     BYTE [_cursor.1+EAX],79
+   711 0000062C 74 26                                  JE      L121
+   712 0000062E                                 L112:
+   713 0000062E 80 B8 [00000030] 2E                    CMP     BYTE [_cursor.1+EAX],46
+   714 00000635 74 15                                  JE      L122
+   715 00000637                                 L109:
+   716 00000637 42                                     INC     EDX
+   717 00000638 83 FA 0F                               CMP     EDX,15
+   718 0000063B 7E DC                                  JLE     L114
+   719 0000063D 43                                     INC     EBX
+   720 0000063E 83 C7 10                               ADD     EDI,16
+   721 00000641 83 FB 0F                               CMP     EBX,15
+   722 00000644 7E D1                                  JLE     L115
+   723 00000646 58                                     POP     EAX
+   724 00000647 5B                                     POP     EBX
+   725 00000648 5E                                     POP     ESI
+   726 00000649 5F                                     POP     EDI
+   727 0000064A 5D                                     POP     EBP
+   728 0000064B C3                                     RET
+   729 0000064C                                 L122:
+   730 0000064C 8A 4D F3                               MOV     CL,BYTE [-13+EBP]
+   731 0000064F 88 0C 30                               MOV     BYTE [EAX+ESI*1],CL
+   732 00000652 EB E3                                  JMP     L109
+   733 00000654                                 L121:
+   734 00000654 C6 04 30 07                            MOV     BYTE [EAX+ESI*1],7
+   735 00000658 EB D4                                  JMP     L112
+   736 0000065A                                 L120:
+   737 0000065A C6 04 30 00                            MOV     BYTE [EAX+ESI*1],0
+   738 0000065E EB C5                                  JMP     L111
+   739 00000660                                        GLOBAL  _putblock8_8
+   740 00000660                                 _putblock8_8:
+   741 00000660 55                                     PUSH    EBP
+   742 00000661 89 E5                                  MOV     EBP,ESP
+   743 00000663 57                                     PUSH    EDI
+   744 00000664 56                                     PUSH    ESI
+   745 00000665 31 F6                                  XOR     ESI,ESI
+   746 00000667 53                                     PUSH    EBX
+   747 00000668 83 EC 0C                               SUB     ESP,12
+   748 0000066B 3B 75 14                               CMP     ESI,DWORD [20+EBP]
+   749 0000066E 7D 3E                                  JGE     L135
+   750 00000670 31 FF                                  XOR     EDI,EDI
+   751 00000672                                 L133:
+   752 00000672 31 DB                                  XOR     EBX,EBX
+   753 00000674 3B 5D 10                               CMP     EBX,DWORD [16+EBP]
+   754 00000677 7D 2C                                  JGE     L137
+   755 00000679 8B 45 20                               MOV     EAX,DWORD [32+EBP]
+   756 0000067C 01 F8                                  ADD     EAX,EDI
+   757 0000067E 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   758 00000681                                 L132:
+   759 00000681 8B 45 1C                               MOV     EAX,DWORD [28+EBP]
+   760 00000684 8B 55 18                               MOV     EDX,DWORD [24+EBP]
+   761 00000687 01 F0                                  ADD     EAX,ESI
+   762 00000689 01 DA                                  ADD     EDX,EBX
+   763 0000068B 0F AF 45 0C                            IMUL    EAX,DWORD [12+EBP]
+   764 0000068F 01 D0                                  ADD     EAX,EDX
+   765 00000691 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   766 00000694 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   767 00000697 43                                     INC     EBX
+   768 00000698 8A 12                                  MOV     DL,BYTE [EDX]
+   769 0000069A 88 14 08                               MOV     BYTE [EAX+ECX*1],DL
+   770 0000069D FF 45 EC                               INC     DWORD [-20+EBP]
+   771 000006A0 3B 5D 10                               CMP     EBX,DWORD [16+EBP]
+   772 000006A3 7C DC                                  JL      L132
+   773 000006A5                                 L137:
+   774 000006A5 46                                     INC     ESI
+   775 000006A6 03 7D 24                               ADD     EDI,DWORD [36+EBP]
+   776 000006A9 3B 75 14                               CMP     ESI,DWORD [20+EBP]
+   777 000006AC 7C C4                                  JL      L133
+   778 000006AE                                 L135:
+   779 000006AE 83 C4 0C                               ADD     ESP,12
+   780 000006B1 5B                                     POP     EBX
+   781 000006B2 5E                                     POP     ESI
+   782 000006B3 5F                                     POP     EDI
+   783 000006B4 5D                                     POP     EBP
+   784 000006B5 C3                                     RET
diff --git a/haribote/hankaku.bin b/haribote/hankaku.bin
new file mode 100644 (file)
index 0000000..171b735
Binary files /dev/null and b/haribote/hankaku.bin differ
diff --git a/haribote/hankaku.h b/haribote/hankaku.h
new file mode 100644 (file)
index 0000000..444e177
--- /dev/null
@@ -0,0 +1,258 @@
+BYTE hankakufont[256][16] = {
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x38, 0x44, 0x82, 0xAA, 0xAA, 0x82, 0x82, 0xAA, 0x92, 0x44, 0x38, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x38, 0x7C, 0xFE, 0xD6, 0xD6, 0xFE, 0xFE, 0xD6, 0xEE, 0x7C, 0x38, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x54, 0xFE, 0x54, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0xD6, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+{0x00, 0x10, 0x38, 0x54, 0x92, 0x10, 0x10, 0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x00, 0x00, 0x0C, 0x0E, 0x0B, 0x0B, 0x0A, 0x08, 0x08, 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x1F, 0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x77, 0xFF, 0x66, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x54, 0x38, 0x28, 0x38, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00},
+{0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0x7E, 0xFE, 0x7E, 0x3E, 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00},
+{0x00, 0x00, 0x10, 0x38, 0x54, 0x92, 0x10, 0x10, 0x10, 0x92, 0x54, 0x38, 0x10, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00},
+{0x00, 0x3E, 0x4A, 0x8A, 0x8A, 0x8A, 0x8A, 0x4A, 0x3A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00},
+{0x7C, 0x82, 0x40, 0x20, 0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0x08, 0x04, 0x82, 0x7C, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00},
+{0x00, 0x00, 0x10, 0x38, 0x54, 0x92, 0x10, 0x10, 0x10, 0x92, 0x54, 0x38, 0x10, 0x7C, 0x00, 0x00},
+{0x00, 0x10, 0x38, 0x54, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x92, 0x54, 0x38, 0x10, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x04, 0xFE, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0xFE, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xFE, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x44, 0xFE, 0x44, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00},
+{0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x44, 0x44, 0x44, 0xFE, 0x44, 0x44, 0x44, 0x44, 0x44, 0xFE, 0x44, 0x44, 0x44, 0x00, 0x00},
+{0x10, 0x3A, 0x56, 0x92, 0x92, 0x90, 0x50, 0x38, 0x14, 0x12, 0x92, 0x92, 0xD4, 0xB8, 0x10, 0x10},
+{0x62, 0x92, 0x94, 0x94, 0x68, 0x08, 0x10, 0x10, 0x20, 0x2C, 0x52, 0x52, 0x92, 0x8C, 0x00, 0x00},
+{0x00, 0x70, 0x88, 0x88, 0x88, 0x90, 0x60, 0x47, 0xA2, 0x92, 0x8A, 0x84, 0x46, 0x39, 0x00, 0x00},
+{0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00},
+{0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00},
+{0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80},
+{0x00, 0x18, 0x24, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x00, 0x00},
+{0x00, 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00},
+{0x00, 0x18, 0x24, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00},
+{0x00, 0x18, 0x24, 0x42, 0x02, 0x02, 0x04, 0x18, 0x04, 0x02, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00},
+{0x00, 0x0C, 0x0C, 0x0C, 0x14, 0x14, 0x14, 0x24, 0x24, 0x44, 0x7E, 0x04, 0x04, 0x1E, 0x00, 0x00},
+{0x00, 0x7C, 0x40, 0x40, 0x40, 0x58, 0x64, 0x02, 0x02, 0x02, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00},
+{0x00, 0x18, 0x24, 0x42, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00},
+{0x00, 0x7E, 0x42, 0x42, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00},
+{0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00},
+{0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10},
+{0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00},
+{0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x04, 0x08, 0x10, 0x10, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00},
+{0x00, 0x38, 0x44, 0x82, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x9C, 0x80, 0x46, 0x38, 0x00, 0x00},
+{0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00},
+{0x00, 0xF0, 0x48, 0x44, 0x44, 0x44, 0x48, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00},
+{0x00, 0x3A, 0x46, 0x42, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x42, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0xF8, 0x44, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0x44, 0xF8, 0x00, 0x00},
+{0x00, 0xFE, 0x42, 0x42, 0x40, 0x40, 0x44, 0x7C, 0x44, 0x40, 0x40, 0x42, 0x42, 0xFE, 0x00, 0x00},
+{0x00, 0xFE, 0x42, 0x42, 0x40, 0x40, 0x44, 0x7C, 0x44, 0x44, 0x40, 0x40, 0x40, 0xF0, 0x00, 0x00},
+{0x00, 0x3A, 0x46, 0x42, 0x82, 0x80, 0x80, 0x9E, 0x82, 0x82, 0x82, 0x42, 0x46, 0x38, 0x00, 0x00},
+{0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00},
+{0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},
+{0x00, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x84, 0x48, 0x30, 0x00},
+{0x00, 0xE7, 0x42, 0x44, 0x48, 0x50, 0x50, 0x60, 0x50, 0x50, 0x48, 0x44, 0x42, 0xE7, 0x00, 0x00},
+{0x00, 0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0xFE, 0x00, 0x00},
+{0x00, 0xC3, 0x42, 0x66, 0x66, 0x66, 0x5A, 0x5A, 0x5A, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00},
+{0x00, 0xC7, 0x42, 0x62, 0x62, 0x52, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00},
+{0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x44, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0xF0, 0x00, 0x00},
+{0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x92, 0x8A, 0x44, 0x3A, 0x00, 0x00},
+{0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00},
+{0x00, 0x3A, 0x46, 0x82, 0x82, 0x80, 0x40, 0x38, 0x04, 0x02, 0x82, 0x82, 0xC4, 0xB8, 0x00, 0x00},
+{0x00, 0xFE, 0x92, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},
+{0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x3C, 0x00, 0x00},
+{0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x24, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00},
+{0x00, 0xE7, 0x42, 0x42, 0x42, 0x5A, 0x5A, 0x5A, 0x5A, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00},
+{0x00, 0xE7, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x24, 0x24, 0x24, 0x42, 0x42, 0xE7, 0x00, 0x00},
+{0x00, 0xEE, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},
+{0x00, 0xFE, 0x84, 0x84, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x42, 0x82, 0xFE, 0x00, 0x00},
+{0x00, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E, 0x00},
+{0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02},
+{0x00, 0x7C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x7C, 0x00},
+{0x00, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00},
+{0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x04, 0x3C, 0x44, 0x84, 0x84, 0x8C, 0x76, 0x00, 0x00},
+{0xC0, 0x40, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x4C, 0x84, 0x84, 0x80, 0x80, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x0C, 0x04, 0x04, 0x04, 0x04, 0x34, 0x4C, 0x84, 0x84, 0x84, 0x84, 0x84, 0x4C, 0x36, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0xFC, 0x80, 0x82, 0x42, 0x3C, 0x00, 0x00},
+{0x0E, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x4C, 0x84, 0x84, 0x84, 0x84, 0x4C, 0x34, 0x04, 0x04, 0x78},
+{0xC0, 0x40, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xE3, 0x00, 0x00},
+{0x00, 0x10, 0x10, 0x00, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00},
+{0x00, 0x04, 0x04, 0x00, 0x00, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x30},
+{0xC0, 0x40, 0x40, 0x40, 0x40, 0x4E, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0xE6, 0x00, 0x00},
+{0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xDB, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xE3, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xE0},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x4C, 0x84, 0x84, 0x84, 0x84, 0x84, 0x4C, 0x34, 0x04, 0x0E},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x86, 0x82, 0xC0, 0x38, 0x06, 0x82, 0xC2, 0xBC, 0x00, 0x00},
+{0x00, 0x00, 0x10, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0E, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x5A, 0x5A, 0x5A, 0x24, 0x24, 0x24, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x44, 0x28, 0x28, 0x10, 0x28, 0x28, 0x44, 0xC6, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x82, 0x84, 0x08, 0x10, 0x20, 0x42, 0x82, 0xFE, 0x00, 0x00},
+{0x00, 0x06, 0x08, 0x10, 0x10, 0x10, 0x10, 0x60, 0x10, 0x10, 0x10, 0x10, 0x08, 0x06, 0x00, 0x00},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x00, 0x60, 0x10, 0x08, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08, 0x10, 0x60, 0x00, 0x00},
+{0x00, 0x72, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x82, 0xFE, 0x82, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x38, 0x44, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x44, 0x38, 0x10, 0x20},
+{0x00, 0x00, 0x24, 0x24, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x42, 0x3E, 0x00, 0x00},
+{0x0C, 0x08, 0x10, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0xFE, 0x80, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x10, 0x28, 0x44, 0x00, 0x78, 0x04, 0x04, 0x3C, 0x44, 0x84, 0x84, 0x44, 0x3E, 0x00, 0x00},
+{0x00, 0x00, 0x24, 0x24, 0x00, 0x78, 0x04, 0x04, 0x3C, 0x44, 0x84, 0x84, 0x44, 0x3E, 0x00, 0x00},
+{0x10, 0x08, 0x04, 0x00, 0x00, 0x78, 0x04, 0x04, 0x3C, 0x44, 0x84, 0x84, 0x44, 0x3E, 0x00, 0x00},
+{0x00, 0x18, 0x24, 0x18, 0x00, 0x78, 0x04, 0x04, 0x3C, 0x44, 0x84, 0x84, 0x44, 0x3E, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x3C, 0x08, 0x10},
+{0x00, 0x10, 0x28, 0x44, 0x00, 0x38, 0x44, 0x82, 0x82, 0xFE, 0x80, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x00, 0x24, 0x24, 0x00, 0x38, 0x44, 0x82, 0x82, 0xFE, 0x80, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x10, 0x08, 0x04, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0xFE, 0x80, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x00, 0x24, 0x24, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x00, 0x10, 0x28, 0x44, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x10, 0x08, 0x04, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x24, 0x24, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00},
+{0x00, 0x38, 0x44, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00},
+{0x0C, 0x08, 0x10, 0xFE, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x80, 0x80, 0x80, 0x80, 0xFE, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1C, 0x12, 0x72, 0x9E, 0x90, 0x90, 0x92, 0x6C, 0x00, 0x00},
+{0x0C, 0x10, 0x20, 0x28, 0x28, 0x28, 0xFE, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00},
+{0x00, 0x10, 0x28, 0x44, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x00, 0x24, 0x24, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x10, 0x08, 0x04, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x10, 0x28, 0x44, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x42, 0x3E, 0x00, 0x00},
+{0x10, 0x08, 0x04, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x42, 0x3E, 0x00, 0x00},
+{0x00, 0x00, 0x24, 0x24, 0x00, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x20, 0x20, 0x40},
+{0x24, 0x24, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x24, 0x24, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x28, 0x28, 0x28, 0x3C, 0x6A, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0x6A, 0x3C, 0x28, 0x28, 0x28},
+{0x00, 0x0C, 0x12, 0x20, 0x20, 0x20, 0xFC, 0x20, 0x20, 0x20, 0x60, 0xA0, 0xB2, 0x4C, 0x00, 0x00},
+{0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0xFE, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x00, 0xE0, 0x90, 0x88, 0x88, 0x88, 0x94, 0xE4, 0x9F, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00},
+{0x00, 0x0C, 0x12, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60, 0x00, 0x00},
+{0x0C, 0x08, 0x10, 0x00, 0x00, 0x78, 0x04, 0x04, 0x3C, 0x44, 0x84, 0x84, 0x44, 0x3E, 0x00, 0x00},
+{0x0C, 0x08, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x0C, 0x08, 0x10, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x0C, 0x08, 0x10, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x42, 0x3E, 0x00, 0x00},
+{0x00, 0x12, 0x2A, 0x24, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00},
+{0x12, 0x2A, 0x24, 0x00, 0x82, 0xC2, 0xC2, 0xA2, 0x92, 0x92, 0x8A, 0x86, 0x86, 0x82, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x78, 0x04, 0x04, 0x3C, 0x44, 0x84, 0x84, 0x44, 0x3E, 0x00, 0xFE, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0xFE, 0x00, 0x00},
+{0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x20, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00},
+{0x00, 0x10, 0x30, 0x10, 0x10, 0x10, 0x00, 0xFE, 0x00, 0x78, 0x04, 0x38, 0x40, 0x7C, 0x00, 0x00},
+{0x00, 0x10, 0x30, 0x10, 0x10, 0x10, 0x00, 0xFE, 0x00, 0x18, 0x28, 0x48, 0x7C, 0x08, 0x00, 0x00},
+{0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x48, 0x90, 0x90, 0x48, 0x24, 0x12, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x90, 0x48, 0x24, 0x12, 0x12, 0x24, 0x48, 0x90, 0x00, 0x00, 0x00, 0x00},
+{0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44},
+{0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA},
+{0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x17, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+{0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0},
+{0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F},
+{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
+};
diff --git a/haribote/hankaku.pl b/haribote/hankaku.pl
new file mode 100644 (file)
index 0000000..d362d09
--- /dev/null
@@ -0,0 +1,22 @@
+use strict;
+use warnings;
+
+
+open(my $fh, "<", "hankaku.bin") or die("open error $!");
+
+print "char hankakufont[256][16] = {\n";
+for my $i(0..255){
+       my $buf;
+       read($fh, $buf, 16);
+       print "{";
+       for my $j(0..15){
+               print sprintf("0x%02X%s", ord(substr($buf, $j, 1)), $j == 15 ? "" : ", ");
+       }
+       print "}";
+       print "," if($i != 255);
+       print "\n";
+}
+print "};\n";
+
+close($fh);
+
diff --git a/haribote/hankaku.txt b/haribote/hankaku.txt
new file mode 100644 (file)
index 0000000..62d56f9
--- /dev/null
@@ -0,0 +1,4609 @@
+OSASK\82Ì\94¼\8ap\83t\83H\83\93\83g\82ð\97¬\97p
+
+char 0x00
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0x01
+........
+........
+..***...
+.*...*..
+*.....*.
+*.*.*.*.
+*.*.*.*.
+*.....*.
+*.....*.
+*.*.*.*.
+*..*..*.
+.*...*..
+..***...
+........
+........
+........
+
+char 0x02
+........
+........
+..***...
+.*****..
+*******.
+**.*.**.
+**.*.**.
+*******.
+*******.
+**.*.**.
+***.***.
+.*****..
+..***...
+........
+........
+........
+
+char 0x03
+........
+........
+........
+........
+.**.**..
+*******.
+*******.
+*******.
+.*****..
+..***...
+...*....
+........
+........
+........
+........
+........
+
+char 0x04
+........
+........
+........
+........
+...*....
+..***...
+.*****..
+*******.
+.*****..
+..***...
+...*....
+........
+........
+........
+........
+........
+
+char 0x05
+........
+........
+........
+........
+...*....
+..***...
+.*.*.*..
+*******.
+.*.*.*..
+...*....
+..***...
+........
+........
+........
+........
+........
+
+char 0x06
+........
+........
+........
+........
+...*....
+..***...
+.*****..
+*******.
+**.*.**.
+...*....
+..***...
+........
+........
+........
+........
+........
+
+char 0x07
+........
+........
+........
+........
+........
+........
+...**...
+..****..
+..****..
+...**...
+........
+........
+........
+........
+........
+........
+
+char 0x08
+********
+********
+********
+********
+********
+********
+***..***
+**....**
+**....**
+***..***
+********
+********
+********
+********
+********
+********
+
+char 0x09
+........
+........
+........
+........
+........
+..****..
+.**..**.
+.*....*.
+.*....*.
+.**..**.
+..****..
+........
+........
+........
+........
+........
+
+char 0x0a
+********
+********
+********
+********
+********
+**....**
+*..**..*
+*.****.*
+*.****.*
+*..**..*
+**....**
+********
+********
+********
+********
+********
+
+char 0x0b
+........
+...*....
+..***...
+.*.*.*..
+*..*..*.
+...*....
+...*....
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x0c
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+...*....
+...*....
+*******.
+...*....
+...*....
+...*....
+........
+........
+
+char 0x0d
+........
+........
+....**..
+....***.
+....*.**
+....*.**
+....*.*.
+....*...
+....*...
+...**...
+.****...
+*****...
+.***....
+........
+........
+........
+
+char 0x0e
+........
+........
+...*****
+...*****
+...*...*
+...*...*
+...*...*
+...*...*
+...*...*
+...*...*
+.***.***
+********
+.**..**.
+........
+........
+........
+
+char 0x0f
+........
+........
+........
+........
+...*....
+.*.*.*..
+..***...
+..*.*...
+..***...
+.*.*.*..
+...*....
+........
+........
+........
+........
+........
+
+char 0x10
+........
+*.......
+**......
+***.....
+****....
+*****...
+******..
+*******.
+******..
+*****...
+****....
+***.....
+**......
+*.......
+........
+........
+
+char 0x11
+........
+......*.
+.....**.
+....***.
+...****.
+..*****.
+.******.
+*******.
+.******.
+..*****.
+...****.
+....***.
+.....**.
+......*.
+........
+........
+
+char 0x12
+........
+........
+...*....
+..***...
+.*.*.*..
+*..*..*.
+...*....
+...*....
+...*....
+*..*..*.
+.*.*.*..
+..***...
+...*....
+........
+........
+........
+
+char 0x13
+........
+........
+.*...*..
+.*...*..
+.*...*..
+.*...*..
+.*...*..
+.*...*..
+.*...*..
+.*...*..
+........
+........
+.*...*..
+.*...*..
+........
+........
+
+char 0x14
+........
+..*****.
+.*..*.*.
+*...*.*.
+*...*.*.
+*...*.*.
+*...*.*.
+.*..*.*.
+..***.*.
+....*.*.
+....*.*.
+....*.*.
+....*.*.
+....*.*.
+........
+........
+
+char 0x15
+.*****..
+*.....*.
+.*......
+..*.....
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+....*...
+.....*..
+*.....*.
+.*****..
+........
+
+char 0x16
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+*******.
+*******.
+*******.
+........
+........
+
+char 0x17
+........
+........
+...*....
+..***...
+.*.*.*..
+*..*..*.
+...*....
+...*....
+...*....
+*..*..*.
+.*.*.*..
+..***...
+...*....
+.*****..
+........
+........
+
+char 0x18
+........
+...*....
+..***...
+.*.*.*..
+*..*..*.
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+........
+........
+
+char 0x19
+........
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+*..*..*.
+.*.*.*..
+..***...
+...*....
+........
+........
+
+char 0x1a
+........
+........
+........
+........
+...*....
+....*...
+.....*..
+*******.
+.....*..
+....*...
+...*....
+........
+........
+........
+........
+........
+
+char 0x1b
+........
+........
+........
+........
+...*....
+..*.....
+.*......
+*******.
+.*......
+..*.....
+...*....
+........
+........
+........
+........
+........
+
+char 0x1c
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+*.......
+*.......
+*******.
+........
+........
+
+char 0x1d
+........
+........
+........
+........
+........
+..*.*...
+.*...*..
+*******.
+.*...*..
+..*.*...
+........
+........
+........
+........
+........
+........
+
+char 0x1e
+........
+........
+........
+........
+...*....
+...*....
+..***...
+..***...
+.*****..
+.*****..
+*******.
+*******.
+........
+........
+........
+........
+
+char 0x1f
+........
+........
+........
+........
+*******.
+*******.
+.*****..
+.*****..
+..***...
+..***...
+...*....
+...*....
+........
+........
+........
+........
+
+char 0x20
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0x21
+........
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+........
+........
+...*....
+...*....
+........
+........
+
+char 0x22
+..*.*...
+..*.*...
+..*.*...
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0x23
+........
+.*...*..
+.*...*..
+.*...*..
+*******.
+.*...*..
+.*...*..
+.*...*..
+.*...*..
+.*...*..
+*******.
+.*...*..
+.*...*..
+.*...*..
+........
+........
+
+char 0x24
+...*....
+..***.*.
+.*.*.**.
+*..*..*.
+*..*..*.
+*..*....
+.*.*....
+..***...
+...*.*..
+...*..*.
+*..*..*.
+*..*..*.
+**.*.*..
+*.***...
+...*....
+...*....
+
+char 0x25
+.**...*.
+*..*..*.
+*..*.*..
+*..*.*..
+.**.*...
+....*...
+...*....
+...*....
+..*.....
+..*.**..
+.*.*..*.
+.*.*..*.
+*..*..*.
+*...**..
+........
+........
+
+char 0x26
+........
+.***....
+*...*...
+*...*...
+*...*...
+*..*....
+.**.....
+.*...***
+*.*...*.
+*..*..*.
+*...*.*.
+*....*..
+.*...**.
+..***..*
+........
+........
+
+char 0x27
+.....*..
+....*...
+...*....
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0x28
+......*.
+.....*..
+....*...
+....*...
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+....*...
+....*...
+.....*..
+......*.
+........
+
+char 0x29
+*.......
+.*......
+..*.....
+..*.....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+..*.....
+..*.....
+.*......
+*.......
+........
+
+char 0x2a
+........
+........
+........
+........
+........
+...*....
+*..*..*.
+.*.*.*..
+..***...
+.*.*.*..
+*..*..*.
+...*....
+........
+........
+........
+........
+
+char 0x2b
+........
+........
+........
+........
+........
+...*....
+...*....
+...*....
+*******.
+...*....
+...*....
+...*....
+........
+........
+........
+........
+
+char 0x2c
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+...**...
+...**...
+....*...
+....*...
+...*....
+
+char 0x2d
+........
+........
+........
+........
+........
+........
+........
+........
+*******.
+........
+........
+........
+........
+........
+........
+........
+
+char 0x2e
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+...**...
+...**...
+........
+........
+
+char 0x2f
+......*.
+......*.
+.....*..
+.....*..
+....*...
+....*...
+....*...
+...*....
+...*....
+..*.....
+..*.....
+.*......
+.*......
+.*......
+*.......
+*.......
+
+char 0x30
+........
+...**...
+..*..*..
+..*..*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+..*..*..
+..*..*..
+...**...
+........
+........
+
+char 0x31
+........
+....*...
+...**...
+..*.*...
+....*...
+....*...
+....*...
+....*...
+....*...
+....*...
+....*...
+....*...
+....*...
+..*****.
+........
+........
+
+char 0x32
+........
+...**...
+..*..*..
+.*....*.
+.*....*.
+......*.
+.....*..
+....*...
+...*....
+..*.....
+..*.....
+.*......
+.*......
+.******.
+........
+........
+
+char 0x33
+........
+...**...
+..*..*..
+.*....*.
+......*.
+......*.
+.....*..
+...**...
+.....*..
+......*.
+......*.
+.*....*.
+..*..*..
+...**...
+........
+........
+
+char 0x34
+........
+....**..
+....**..
+....**..
+...*.*..
+...*.*..
+...*.*..
+..*..*..
+..*..*..
+.*...*..
+.******.
+.....*..
+.....*..
+...****.
+........
+........
+
+char 0x35
+........
+.*****..
+.*......
+.*......
+.*......
+.*.**...
+.**..*..
+......*.
+......*.
+......*.
+......*.
+.*....*.
+..*..*..
+...**...
+........
+........
+
+char 0x36
+........
+...**...
+..*..*..
+.*....*.
+.*......
+.*.**...
+.**..*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+..*..*..
+...**...
+........
+........
+
+char 0x37
+........
+.******.
+.*....*.
+.*....*.
+.....*..
+.....*..
+....*...
+....*...
+....*...
+...*....
+...*....
+...*....
+...*....
+..***...
+........
+........
+
+char 0x38
+........
+...**...
+..*..*..
+.*....*.
+.*....*.
+.*....*.
+..*..*..
+...**...
+..*..*..
+.*....*.
+.*....*.
+.*....*.
+..*..*..
+...**...
+........
+........
+
+char 0x39
+........
+...**...
+..*..*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+..*..**.
+...**.*.
+......*.
+.*....*.
+..*..*..
+...**...
+........
+........
+
+char 0x3a
+........
+........
+........
+........
+........
+...**...
+...**...
+........
+........
+........
+........
+........
+...**...
+...**...
+........
+........
+
+char 0x3b
+........
+........
+........
+........
+........
+...**...
+...**...
+........
+........
+........
+........
+...**...
+...**...
+....*...
+....*...
+...*....
+
+char 0x3c
+........
+......*.
+.....*..
+....*...
+...*....
+..*.....
+.*......
+*.......
+*.......
+.*......
+..*.....
+...*....
+....*...
+.....*..
+......*.
+........
+
+char 0x3d
+........
+........
+........
+........
+........
+........
+*******.
+........
+........
+*******.
+........
+........
+........
+........
+........
+........
+
+char 0x3e
+........
+*.......
+.*......
+..*.....
+...*....
+....*...
+.....*..
+......*.
+......*.
+.....*..
+....*...
+...*....
+..*.....
+.*......
+*.......
+........
+
+char 0x3f
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+.....*..
+....*...
+...*....
+...*....
+........
+........
+...**...
+...**...
+........
+........
+
+char 0x40
+........
+..***...
+.*...*..
+*.....*.
+*..**.*.
+*.*.*.*.
+*.*.*.*.
+*.*.*.*.
+*.*.*.*.
+*.*.*.*.
+*..***..
+*.......
+.*...**.
+..***...
+........
+........
+
+char 0x41
+........
+...**...
+...**...
+...**...
+...**...
+..*..*..
+..*..*..
+..*..*..
+..*..*..
+.******.
+.*....*.
+.*....*.
+.*....*.
+***..***
+........
+........
+
+char 0x42
+........
+****....
+.*..*...
+.*...*..
+.*...*..
+.*...*..
+.*..*...
+.****...
+.*...*..
+.*....*.
+.*....*.
+.*....*.
+.*...*..
+*****...
+........
+........
+
+char 0x43
+........
+..***.*.
+.*...**.
+.*....*.
+*.....*.
+*.......
+*.......
+*.......
+*.......
+*.......
+*.....*.
+.*....*.
+.*...*..
+..***...
+........
+........
+
+char 0x44
+........
+*****...
+.*...*..
+.*...*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*...*..
+.*...*..
+*****...
+........
+........
+
+char 0x45
+........
+*******.
+.*....*.
+.*....*.
+.*......
+.*......
+.*...*..
+.*****..
+.*...*..
+.*......
+.*......
+.*....*.
+.*....*.
+*******.
+........
+........
+
+char 0x46
+........
+*******.
+.*....*.
+.*....*.
+.*......
+.*......
+.*...*..
+.*****..
+.*...*..
+.*...*..
+.*......
+.*......
+.*......
+****....
+........
+........
+
+char 0x47
+........
+..***.*.
+.*...**.
+.*....*.
+*.....*.
+*.......
+*.......
+*..****.
+*.....*.
+*.....*.
+*.....*.
+.*....*.
+.*...**.
+..***...
+........
+........
+
+char 0x48
+........
+***..***
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.******.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+***..***
+........
+........
+
+char 0x49
+........
+.*****..
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+.*****..
+........
+........
+
+char 0x4a
+........
+...*****
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+*....*..
+.*..*...
+..**....
+........
+
+char 0x4b
+........
+***..***
+.*....*.
+.*...*..
+.*..*...
+.*.*....
+.*.*....
+.**.....
+.*.*....
+.*.*....
+.*..*...
+.*...*..
+.*....*.
+***..***
+........
+........
+
+char 0x4c
+........
+****....
+.*......
+.*......
+.*......
+.*......
+.*......
+.*......
+.*......
+.*......
+.*......
+.*....*.
+.*....*.
+*******.
+........
+........
+
+char 0x4d
+........
+**....**
+.*....*.
+.**..**.
+.**..**.
+.**..**.
+.*.**.*.
+.*.**.*.
+.*.**.*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+***..***
+........
+........
+
+char 0x4e
+........
+**...***
+.*....*.
+.**...*.
+.**...*.
+.*.*..*.
+.*.*..*.
+.*.*..*.
+.*..*.*.
+.*..*.*.
+.*..*.*.
+.*...**.
+.*...**.
+***...*.
+........
+........
+
+char 0x4f
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x50
+........
+*****...
+.*...*..
+.*....*.
+.*....*.
+.*....*.
+.*...*..
+.****...
+.*......
+.*......
+.*......
+.*......
+.*......
+****....
+........
+........
+
+char 0x51
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*..*..*.
+*...*.*.
+.*...*..
+..***.*.
+........
+........
+
+char 0x52
+........
+******..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*****..
+.*...*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+***..***
+........
+........
+
+char 0x53
+........
+..***.*.
+.*...**.
+*.....*.
+*.....*.
+*.......
+.*......
+..***...
+.....*..
+......*.
+*.....*.
+*.....*.
+**...*..
+*.***...
+........
+........
+
+char 0x54
+........
+*******.
+*..*..*.
+*..*..*.
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+.*****..
+........
+........
+
+char 0x55
+........
+***..***
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+..*..*..
+..****..
+........
+........
+
+char 0x56
+........
+***..***
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+..*..*..
+..*..*..
+..*..*..
+..*..*..
+...**...
+...**...
+...**...
+...**...
+........
+........
+
+char 0x57
+........
+***..***
+.*....*.
+.*....*.
+.*....*.
+.*.**.*.
+.*.**.*.
+.*.**.*.
+.*.**.*.
+..*..*..
+..*..*..
+..*..*..
+..*..*..
+..*..*..
+........
+........
+
+char 0x58
+........
+***..***
+.*....*.
+.*....*.
+..*..*..
+..*..*..
+..*..*..
+...**...
+..*..*..
+..*..*..
+..*..*..
+.*....*.
+.*....*.
+***..***
+........
+........
+
+char 0x59
+........
+***.***.
+.*...*..
+.*...*..
+.*...*..
+..*.*...
+..*.*...
+..*.*...
+...*....
+...*....
+...*....
+...*....
+...*....
+.*****..
+........
+........
+
+char 0x5a
+........
+*******.
+*....*..
+*....*..
+....*...
+....*...
+...*....
+...*....
+..*.....
+..*.....
+.*......
+.*....*.
+*.....*.
+*******.
+........
+........
+
+char 0x5b
+........
+..*****.
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*.....
+..*****.
+........
+
+char 0x5c
+*.......
+*.......
+.*......
+.*......
+..*.....
+..*.....
+..*.....
+...*....
+...*....
+....*...
+....*...
+.....*..
+.....*..
+.....*..
+......*.
+......*.
+
+char 0x5d
+........
+.*****..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.*****..
+........
+
+char 0x5e
+........
+...*....
+..*.*...
+.*...*..
+*.....*.
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0x5f
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+*******.
+........
+
+char 0x60
+...*....
+....*...
+.....*..
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0x61
+........
+........
+........
+........
+........
+.***....
+....*...
+.....*..
+..****..
+.*...*..
+*....*..
+*....*..
+*...**..
+.***.**.
+........
+........
+
+char 0x62
+**......
+.*......
+.*......
+.*......
+.*......
+.*.**...
+.**..*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.**..*..
+.*.**...
+........
+........
+
+char 0x63
+........
+........
+........
+........
+........
+..**....
+.*..**..
+*....*..
+*....*..
+*.......
+*.......
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x64
+....**..
+.....*..
+.....*..
+.....*..
+.....*..
+..**.*..
+.*..**..
+*....*..
+*....*..
+*....*..
+*....*..
+*....*..
+.*..**..
+..**.**.
+........
+........
+
+char 0x65
+........
+........
+........
+........
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+******..
+*.......
+*.....*.
+.*....*.
+..****..
+........
+........
+
+char 0x66
+....***.
+...*....
+...*....
+...*....
+...*....
+.*****..
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+.*****..
+........
+........
+
+char 0x67
+........
+........
+........
+........
+........
+..**.**.
+.*..**..
+*....*..
+*....*..
+*....*..
+*....*..
+.*..**..
+..**.*..
+.....*..
+.....*..
+.****...
+
+char 0x68
+**......
+.*......
+.*......
+.*......
+.*......
+.*.**...
+.**..*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+***...**
+........
+........
+
+char 0x69
+........
+...*....
+...*....
+........
+........
+..**....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+..***...
+........
+........
+
+char 0x6a
+........
+.....*..
+.....*..
+........
+........
+....**..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+.....*..
+....*...
+....*...
+..**....
+
+char 0x6b
+**......
+.*......
+.*......
+.*......
+.*......
+.*..***.
+.*...*..
+.*..*...
+.*.*....
+.**.....
+.*.*....
+.*..*...
+.*...*..
+***..**.
+........
+........
+
+char 0x6c
+..**....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+..***...
+........
+........
+
+char 0x6d
+........
+........
+........
+........
+........
+****.**.
+.*..*..*
+.*..*..*
+.*..*..*
+.*..*..*
+.*..*..*
+.*..*..*
+.*..*..*
+**.**.**
+........
+........
+
+char 0x6e
+........
+........
+........
+........
+........
+**.**...
+.**..*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+***...**
+........
+........
+
+char 0x6f
+........
+........
+........
+........
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x70
+........
+........
+........
+........
+........
+**.**...
+.**..*..
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.**..*..
+.*.**...
+.*......
+***.....
+
+char 0x71
+........
+........
+........
+........
+........
+..**.*..
+.*..**..
+*....*..
+*....*..
+*....*..
+*....*..
+*....*..
+.*..**..
+..**.*..
+.....*..
+....***.
+
+char 0x72
+........
+........
+........
+........
+........
+**.***..
+.**...*.
+.*....*.
+.*......
+.*......
+.*......
+.*......
+.*......
+***.....
+........
+........
+
+char 0x73
+........
+........
+........
+........
+........
+.****.*.
+*....**.
+*.....*.
+**......
+..***...
+.....**.
+*.....*.
+**....*.
+*.****..
+........
+........
+
+char 0x74
+........
+........
+...*....
+...*....
+...*....
+.*****..
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+....***.
+........
+........
+
+char 0x75
+........
+........
+........
+........
+........
+**...**.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*....*.
+.*...**.
+..***.**
+........
+........
+
+char 0x76
+........
+........
+........
+........
+........
+***..***
+.*....*.
+.*....*.
+.*....*.
+..*..*..
+..*..*..
+..*..*..
+...**...
+...**...
+........
+........
+
+char 0x77
+........
+........
+........
+........
+........
+***..***
+.*....*.
+.*....*.
+.*.**.*.
+.*.**.*.
+.*.**.*.
+..*..*..
+..*..*..
+..*..*..
+........
+........
+
+char 0x78
+........
+........
+........
+........
+........
+**...**.
+.*...*..
+..*.*...
+..*.*...
+...*....
+..*.*...
+..*.*...
+.*...*..
+**...**.
+........
+........
+
+char 0x79
+........
+........
+........
+........
+........
+***..***
+.*....*.
+.*....*.
+..*..*..
+..*..*..
+..*..*..
+...**...
+...**...
+...*....
+...*....
+.**.....
+
+char 0x7a
+........
+........
+........
+........
+........
+*******.
+*.....*.
+*....*..
+....*...
+...*....
+..*.....
+.*....*.
+*.....*.
+*******.
+........
+........
+
+char 0x7b
+........
+.....**.
+....*...
+...*....
+...*....
+...*....
+...*....
+.**.....
+...*....
+...*....
+...*....
+...*....
+....*...
+.....**.
+........
+........
+
+char 0x7c
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0x7d
+........
+.**.....
+...*....
+....*...
+....*...
+....*...
+....*...
+.....**.
+....*...
+....*...
+....*...
+....*...
+...*....
+.**.....
+........
+........
+
+char 0x7e
+........
+.***..*.
+*...**..
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0x7f
+........
+........
+........
+........
+...*....
+..*.*...
+.*...*..
+*.....*.
+*******.
+*.....*.
+*******.
+........
+........
+........
+........
+........
+
+char 0x80
+........
+..***...
+.*...*..
+*.....*.
+*.......
+*.......
+*.......
+*.......
+*.......
+*.......
+*.......
+*.....*.
+.*...*..
+..***...
+...*....
+..*.....
+
+char 0x81
+........
+........
+..*..*..
+..*..*..
+........
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*....*.
+..*****.
+........
+........
+
+char 0x82
+....**..
+....*...
+...*....
+........
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*******.
+*.......
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x83
+........
+...*....
+..*.*...
+.*...*..
+........
+.****...
+.....*..
+.....*..
+..****..
+.*...*..
+*....*..
+*....*..
+.*...*..
+..*****.
+........
+........
+
+char 0x84
+........
+........
+..*..*..
+..*..*..
+........
+.****...
+.....*..
+.....*..
+..****..
+.*...*..
+*....*..
+*....*..
+.*...*..
+..*****.
+........
+........
+
+char 0x85
+...*....
+....*...
+.....*..
+........
+........
+.****...
+.....*..
+.....*..
+..****..
+.*...*..
+*....*..
+*....*..
+.*...*..
+..*****.
+........
+........
+
+char 0x86
+........
+...**...
+..*..*..
+...**...
+........
+.****...
+.....*..
+.....*..
+..****..
+.*...*..
+*....*..
+*....*..
+.*...*..
+..*****.
+........
+........
+
+char 0x87
+........
+........
+........
+........
+........
+..****..
+.*....*.
+*.......
+*.......
+*.......
+*.......
+*.......
+.*....*.
+..****..
+....*...
+...*....
+
+char 0x88
+........
+...*....
+..*.*...
+.*...*..
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*******.
+*.......
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x89
+........
+........
+..*..*..
+..*..*..
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*******.
+*.......
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x8a
+...*....
+....*...
+.....*..
+........
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*******.
+*.......
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x8b
+........
+........
+..*..*..
+..*..*..
+........
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+........
+........
+
+char 0x8c
+........
+...*....
+..*.*...
+.*...*..
+........
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+........
+........
+
+char 0x8d
+...*....
+....*...
+.....*..
+........
+........
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+........
+........
+
+char 0x8e
+..*..*..
+..*..*..
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*******.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+........
+........
+
+char 0x8f
+........
+..***...
+.*...*..
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*******.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+........
+........
+
+char 0x90
+....**..
+....*...
+...*....
+*******.
+*.......
+*.......
+*.......
+*.......
+*****...
+*.......
+*.......
+*.......
+*.......
+*******.
+........
+........
+
+char 0x91
+........
+........
+........
+........
+........
+.**.....
+...***..
+...*..*.
+.***..*.
+*..****.
+*..*....
+*..*....
+*..*..*.
+.**.**..
+........
+........
+
+char 0x92
+....**..
+...*....
+..*.....
+..*.*...
+..*.*...
+..*.*...
+*******.
+..*.*...
+..*.*...
+..*.*...
+..*.*...
+..*.*...
+..*.*...
+..*.*...
+........
+........
+
+char 0x93
+........
+...*....
+..*.*...
+.*...*..
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x94
+........
+........
+..*..*..
+..*..*..
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x95
+...*....
+....*...
+.....*..
+........
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x96
+........
+...*....
+..*.*...
+.*...*..
+........
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*....*.
+..*****.
+........
+........
+
+char 0x97
+...*....
+....*...
+.....*..
+........
+........
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*....*.
+..*****.
+........
+........
+
+char 0x98
+........
+........
+..*..*..
+..*..*..
+........
+*.....*.
+*.....*.
+.*...*..
+.*...*..
+..*.*...
+..*.*...
+...*....
+...*....
+..*.....
+..*.....
+.*......
+
+char 0x99
+..*..*..
+..*..*..
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x9a
+..*..*..
+..*..*..
+........
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0x9b
+........
+..*.*...
+..*.*...
+..*.*...
+..****..
+.**.*.*.
+*.*.*...
+*.*.*...
+*.*.*...
+*.*.*...
+*.*.*...
+.**.*.*.
+..****..
+..*.*...
+..*.*...
+..*.*...
+
+char 0x9c
+........
+....**..
+...*..*.
+..*.....
+..*.....
+..*.....
+******..
+..*.....
+..*.....
+..*.....
+.**.....
+*.*.....
+*.**..*.
+.*..**..
+........
+........
+
+char 0x9d
+........
+*.....*.
+*.....*.
+.*...*..
+..*.*...
+...*....
+*******.
+...*....
+...*....
+*******.
+...*....
+...*....
+...*....
+...*....
+........
+........
+
+char 0x9e
+........
+***.....
+*..*....
+*...*...
+*...*...
+*...*...
+*..*.*..
+***..*..
+*..*****
+*....*..
+*....*..
+*....*..
+*....*..
+*....*..
+........
+........
+
+char 0x9f
+........
+....**..
+...*..*.
+...*....
+...*....
+...*....
+*******.
+...*....
+...*....
+...*....
+...*....
+...*....
+*..*....
+.**.....
+........
+........
+
+char 0xa0
+....**..
+....*...
+...*....
+........
+........
+.****...
+.....*..
+.....*..
+..****..
+.*...*..
+*....*..
+*....*..
+.*...*..
+..*****.
+........
+........
+
+char 0xa1
+....**..
+....*...
+...*....
+........
+........
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+........
+........
+
+char 0xa2
+....**..
+....*...
+...*....
+........
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0xa3
+....**..
+....*...
+...*....
+........
+........
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*....*.
+..*****.
+........
+........
+
+char 0xa4
+........
+...*..*.
+..*.*.*.
+..*..*..
+........
+*****...
+*....*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+........
+........
+
+char 0xa5
+...*..*.
+..*.*.*.
+..*..*..
+........
+*.....*.
+**....*.
+**....*.
+*.*...*.
+*..*..*.
+*..*..*.
+*...*.*.
+*....**.
+*....**.
+*.....*.
+........
+........
+
+char 0xa6
+........
+........
+........
+.****...
+.....*..
+.....*..
+..****..
+.*...*..
+*....*..
+*....*..
+.*...*..
+..*****.
+........
+*******.
+........
+........
+
+char 0xa7
+........
+........
+........
+..***...
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+*******.
+........
+........
+
+char 0xa8
+........
+...*....
+...*....
+........
+........
+...*....
+...*....
+..*.....
+.*...*..
+*.....*.
+*.....*.
+*.....*.
+.*...*..
+..***...
+........
+........
+
+char 0xa9
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+*******.
+*.......
+*.......
+*.......
+........
+........
+
+char 0xaa
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+*******.
+......*.
+......*.
+......*.
+........
+........
+
+char 0xab
+........
+...*....
+..**....
+...*....
+...*....
+...*....
+........
+*******.
+........
+.****...
+.....*..
+..***...
+.*......
+.*****..
+........
+........
+
+char 0xac
+........
+...*....
+..**....
+...*....
+...*....
+...*....
+........
+*******.
+........
+...**...
+..*.*...
+.*..*...
+.*****..
+....*...
+........
+........
+
+char 0xad
+........
+...*....
+...*....
+........
+........
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+........
+........
+
+char 0xae
+........
+........
+........
+........
+...*..*.
+..*..*..
+.*..*...
+*..*....
+*..*....
+.*..*...
+..*..*..
+...*..*.
+........
+........
+........
+........
+
+char 0xaf
+........
+........
+........
+........
+*..*....
+.*..*...
+..*..*..
+...*..*.
+...*..*.
+..*..*..
+.*..*...
+*..*....
+........
+........
+........
+........
+
+char 0xb0
+...*...*
+.*...*..
+...*...*
+.*...*..
+...*...*
+.*...*..
+...*...*
+.*...*..
+...*...*
+.*...*..
+...*...*
+.*...*..
+...*...*
+.*...*..
+...*...*
+.*...*..
+
+char 0xb1
+.*.*.*.*
+*.*.*.*.
+.*.*.*.*
+*.*.*.*.
+.*.*.*.*
+*.*.*.*.
+.*.*.*.*
+*.*.*.*.
+.*.*.*.*
+*.*.*.*.
+.*.*.*.*
+*.*.*.*.
+.*.*.*.*
+*.*.*.*.
+.*.*.*.*
+*.*.*.*.
+
+char 0xb2
+.***.***
+**.***.*
+.***.***
+**.***.*
+.***.***
+**.***.*
+.***.***
+**.***.*
+.***.***
+**.***.*
+.***.***
+**.***.*
+.***.***
+**.***.*
+.***.***
+**.***.*
+
+char 0xb3
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xb4
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+****....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xb5
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+****....
+...*....
+****....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xb6
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+****.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xb7
+........
+........
+........
+........
+........
+........
+........
+******..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xb8
+........
+........
+........
+........
+........
+........
+........
+****....
+...*....
+****....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xb9
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+****.*..
+.....*..
+****.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xba
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xbb
+........
+........
+........
+........
+........
+........
+........
+******..
+.....*..
+****.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xbc
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+****.*..
+.....*..
+******..
+........
+........
+........
+........
+........
+........
+
+char 0xbd
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+******..
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xbe
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+****....
+...*....
+****....
+........
+........
+........
+........
+........
+........
+
+char 0xbf
+........
+........
+........
+........
+........
+........
+........
+****....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xc0
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*****
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xc1
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+********
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xc2
+........
+........
+........
+........
+........
+........
+........
+********
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xc3
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*****
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xc4
+........
+........
+........
+........
+........
+........
+........
+********
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xc5
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+********
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xc6
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*****
+...*....
+...*****
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xc7
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.***
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xc8
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.***
+...*....
+...*****
+........
+........
+........
+........
+........
+........
+
+char 0xc9
+........
+........
+........
+........
+........
+........
+........
+...*****
+...*....
+...*.***
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xca
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+****.***
+........
+********
+........
+........
+........
+........
+........
+........
+
+char 0xcb
+........
+........
+........
+........
+........
+........
+........
+********
+........
+****.***
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xcc
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.***
+...*....
+...*.***
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xcd
+........
+........
+........
+........
+........
+........
+........
+********
+........
+********
+........
+........
+........
+........
+........
+........
+
+char 0xce
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+****.***
+........
+****.***
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xcf
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+********
+........
+********
+........
+........
+........
+........
+........
+........
+
+char 0xd0
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+********
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xd1
+........
+........
+........
+........
+........
+........
+........
+********
+........
+********
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xd2
+........
+........
+........
+........
+........
+........
+........
+********
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xd3
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*****
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xd4
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*****
+...*....
+...*****
+........
+........
+........
+........
+........
+........
+
+char 0xd5
+........
+........
+........
+........
+........
+........
+........
+...*****
+...*....
+...*****
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xd6
+........
+........
+........
+........
+........
+........
+........
+...*****
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xd7
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+****.***
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+...*.*..
+
+char 0xd8
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+********
+...*....
+********
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xd9
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+****....
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xda
+........
+........
+........
+........
+........
+........
+........
+...*****
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+...*....
+
+char 0xdb
+********
+********
+********
+********
+********
+********
+********
+********
+********
+********
+********
+********
+********
+********
+********
+********
+
+char 0xdc
+........
+........
+........
+........
+........
+........
+........
+........
+********
+********
+********
+********
+********
+********
+********
+********
+
+char 0xdd
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+****....
+
+char 0xde
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+....****
+
+char 0xdf
+********
+********
+********
+********
+********
+********
+********
+********
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe0
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe1
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe2
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe3
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe4
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe5
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe6
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe7
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe8
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xe9
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xea
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xeb
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xec
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xed
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xee
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xef
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf0
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf1
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf2
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf3
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf4
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf5
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf6
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf7
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf8
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xf9
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xfa
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xfb
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xfc
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xfd
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xfe
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+
+char 0xff
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
+........
diff --git a/haribote/haribote.sys b/haribote/haribote.sys
new file mode 100644 (file)
index 0000000..6260ff2
Binary files /dev/null and b/haribote/haribote.sys differ
diff --git a/haribote/int.lst b/haribote/int.lst
new file mode 100644 (file)
index 0000000..81e3003
--- /dev/null
@@ -0,0 +1,52 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _io_out8
+     7 00000000                                 [FILE "int.c"]
+     8                                          [SECTION .text]
+     9 00000000                                        GLOBAL  _init_pic
+    10 00000000                                 _init_pic:
+    11 00000000 55                                     PUSH    EBP
+    12 00000001 89 E5                                  MOV     EBP,ESP
+    13 00000003 68 000000FF                            PUSH    255
+    14 00000008 6A 21                                  PUSH    33
+    15 0000000A E8 [00000000]                          CALL    _io_out8
+    16 0000000F 68 000000FF                            PUSH    255
+    17 00000014 68 000000A1                            PUSH    161
+    18 00000019 E8 [00000000]                          CALL    _io_out8
+    19 0000001E 6A 11                                  PUSH    17
+    20 00000020 6A 20                                  PUSH    32
+    21 00000022 E8 [00000000]                          CALL    _io_out8
+    22 00000027 6A 20                                  PUSH    32
+    23 00000029 6A 21                                  PUSH    33
+    24 0000002B E8 [00000000]                          CALL    _io_out8
+    25 00000030 83 C4 20                               ADD     ESP,32
+    26 00000033 6A 04                                  PUSH    4
+    27 00000035 6A 21                                  PUSH    33
+    28 00000037 E8 [00000000]                          CALL    _io_out8
+    29 0000003C 6A 01                                  PUSH    1
+    30 0000003E 6A 21                                  PUSH    33
+    31 00000040 E8 [00000000]                          CALL    _io_out8
+    32 00000045 6A 11                                  PUSH    17
+    33 00000047 68 000000A0                            PUSH    160
+    34 0000004C E8 [00000000]                          CALL    _io_out8
+    35 00000051 6A 28                                  PUSH    40
+    36 00000053 68 000000A1                            PUSH    161
+    37 00000058 E8 [00000000]                          CALL    _io_out8
+    38 0000005D 83 C4 20                               ADD     ESP,32
+    39 00000060 6A 02                                  PUSH    2
+    40 00000062 68 000000A1                            PUSH    161
+    41 00000067 E8 [00000000]                          CALL    _io_out8
+    42 0000006C 6A 01                                  PUSH    1
+    43 0000006E 68 000000A1                            PUSH    161
+    44 00000073 E8 [00000000]                          CALL    _io_out8
+    45 00000078 68 000000FB                            PUSH    251
+    46 0000007D 6A 21                                  PUSH    33
+    47 0000007F E8 [00000000]                          CALL    _io_out8
+    48 00000084 68 000000FF                            PUSH    255
+    49 00000089 68 000000A1                            PUSH    161
+    50 0000008E E8 [00000000]                          CALL    _io_out8
+    51 00000093 C9                                     LEAVE
+    52 00000094 C3                                     RET
diff --git a/haribote/iplhd.asm b/haribote/iplhd.asm
new file mode 100644 (file)
index 0000000..7765bb9
--- /dev/null
@@ -0,0 +1,153 @@
+; haribote-ipl
+; TAB=4
+
+BASEADDR EQU 0x7c00
+DISKREADSTRUCT EQU 0x0800
+SYSADDR EQU 0xc200
+SYSSECTOR EQU 0x0040
+STACK EQU 0x7c00
+HARDDISK_CACHE EQU 0x8000
+
+PATNUM EQU 0
+PAT0_STARTSEC EQU 0x3f
+PAT0_SECNUM EQU 0x200
+
+DRIVENO EQU 0x0820
+
+MBR EQU 0x600
+PATTABLE EQU MBR + 446
+
+       ORG             BASEADDR                        ; このプログラムがどこに読み込まれるのか
+
+       ;FAT32 BPB
+       jmp short entry
+       nop
+               db "MSDOS5.0" ; OEM Name
+               dw 0x0200     ; bytes per sec
+secperclus:
+               db 2          ; sec per clus
+reservedsec:
+               dw 0x40       ; rsvdseccnt
+fatnum:
+               db 2          ; num fat data structures
+               dw 0          ; root ent cnt (in fat32 must be zero)
+               dw 0          ; total sec 16 (in fat32 must be zero)
+media:
+               db 0xf8       ; media (non-removable:0xf8 removable:0xf0)usbメモリに0xf8を使っても問題ない模様
+               dw 0          ; fat sz 16 (in fat32 must be zero)
+               dw 0x003f     ; sec per track
+               dw 0x00ff     ; num heads
+hiddensec:
+               dd PAT0_STARTSEC ; hidden sec
+               dd PAT0_SECNUM ; total sec 32
+
+fatsize32:
+               dd 0x100      ; fat sz 32
+               dw 0          ; ext flags
+               dw 0x0000     ; fs ver (must be 0x0000)
+rootclus:
+               dd 0x02       ; root clus
+               dw 0x01       ; sector num of FSINFO
+               dw 0x06       ; Backup boot sec
+               resb 12       ; reserved
+               db 0x80       ; drive num (used from int 0x13)
+               db 0          ; reserved1
+               db 0x29       ; ext boot sig
+               dd 0xdebeefad ; Volume serial number (usually generated by date and time)
+               db "NO NAME    " ; Volume label
+               db "FAT32   " ; File Sys Type
+entry:
+       xor eax, eax
+       mov ss, ax
+       mov ds, ax
+       mov es, ax
+       mov sp, STACK
+       
+       mov [DRIVENO], dl
+
+       mov ebx, [hiddensec]
+       mov ax, [reservedsec]
+       ;movzx eax, ax ; この時点でeax上位16bitは0のはず
+       add ebx, eax
+       mov al, [fatnum]
+       movzx eax, al
+       mov ecx, [fatsize32]
+       mul ecx
+       add ebx, eax
+
+       ;fatのファイルデータの先頭からルートディレクトリの先頭クラスタへ
+       mov ecx, [rootclus]
+       dec ecx
+       dec ecx
+       mov eax, [secperclus]
+       mul ecx
+       add ebx, eax
+       
+       ;まずはルートディレクトリの構造体からbootmgrのサイズを読む
+       push HARDDISK_CACHE >> 4
+       pop es
+       xor di, di
+       
+       mov cl, [secperclus]
+       movzx cx, cl
+       
+       call readhd
+       
+       mov eax, [es:di + 0x1c] ; bootmgrファイルサイズ
+       add eax, 0x200 - 1
+       mov ecx, 0x200
+       xor edx, edx
+       div ecx
+       mov ecx, eax
+       
+       mov al, [secperclus]
+       movzx eax, al
+       add ebx, eax
+       
+       push SYSADDR >> 4
+       pop es
+       xor di,di
+       
+       call readhd
+
+       
+       jmp 0:SYSADDR
+
+        
+readhd:
+;ebx   : 読み込み開始セクタ
+;es:di : 読み込み先アドレス
+;cx    : 読み込むセクタ数
+       ;読み込みのための構造体を設定
+       mov si, DISKREADSTRUCT
+       mov ax, 0x0010
+       mov [si], ax
+       mov ax, cx ; 読み込むセクタ数
+       mov [si+2], ax
+       mov ax, di
+       mov [si+4], ax
+       mov ax, es
+       mov [si+6], ax
+;      mov ax, SYSSECTOR & 0xFFFF
+;      mov [si+8], ax
+;      mov ax, (SYSSECTOR >> 0x10) & 0xFFFF
+;      mov [si+0x0a], ax
+       mov [si + 8], ebx
+       mov ax, 0
+       mov [si+0x0c], ax
+       mov [si+0x0e], ax
+       
+       ; 拡張int 0x13を用いてHDDからブートセクションを読みこむ
+       mov ah, 0x42
+       mov dl, [DRIVENO]
+       mov al, 0
+
+       int 0x13
+       ret
+
+       
+
+
+       RESB    0x1fe-($ - $$)          ; 0x7dfeまでを0x00で埋める命令
+
+       DB              0x55, 0xaa
diff --git a/haribote/iplhd.bin b/haribote/iplhd.bin
new file mode 100644 (file)
index 0000000..a3cae99
Binary files /dev/null and b/haribote/iplhd.bin differ
diff --git a/haribote/iplhd.lst b/haribote/iplhd.lst
new file mode 100644 (file)
index 0000000..c550bab
--- /dev/null
@@ -0,0 +1,156 @@
+     1                                  ; haribote-ipl
+     2                                  ; TAB=4
+     3                                  
+     4                                  BASEADDR EQU 0x7c00
+     5                                  DISKREADSTRUCT EQU 0x0800
+     6                                  SYSADDR EQU 0xc200
+     7                                  SYSSECTOR EQU 0x0040
+     8                                  STACK EQU 0x7c00
+     9                                  HARDDISK_CACHE EQU 0x8000
+    10                                  
+    11                                  PATNUM EQU 0
+    12                                  PAT0_STARTSEC EQU 0x3f
+    13                                  PAT0_SECNUM EQU 0x200
+    14                                  
+    15                                  DRIVENO EQU 0x0820
+    16                                  
+    17                                  MBR EQU 0x600
+    18                                  PATTABLE EQU MBR + 446
+    19                                  
+    20                                         ORG             BASEADDR                        ; このプログラムがどこに読み込まれるのか
+    21                                  
+    22                                         ;FAT32 BPB
+    23 00000000 EB58                           jmp short entry
+    24 00000002 90                             nop
+    25 00000003 4D53444F53352E30                       db "MSDOS5.0" ; OEM Name
+    26 0000000B 0002                                   dw 0x0200     ; bytes per sec
+    27                                  secperclus:
+    28 0000000D 02                                     db 2          ; sec per clus
+    29                                  reservedsec:
+    30 0000000E 4000                                   dw 0x40       ; rsvdseccnt
+    31                                  fatnum:
+    32 00000010 02                                     db 2          ; num fat data structures
+    33 00000011 0000                                   dw 0          ; root ent cnt (in fat32 must be zero)
+    34 00000013 0000                                   dw 0          ; total sec 16 (in fat32 must be zero)
+    35                                  media:
+    36 00000015 F8                                     db 0xf8       ; media (non-removable:0xf8 removable:0xf0)usbメモリに0xf8を使っても問題ない模様
+    37 00000016 0000                                   dw 0          ; fat sz 16 (in fat32 must be zero)
+    38 00000018 3F00                                   dw 0x003f     ; sec per track
+    39 0000001A FF00                                   dw 0x00ff     ; num heads
+    40                                  hiddensec:
+    41 0000001C 3F000000                               dd PAT0_STARTSEC ; hidden sec
+    42 00000020 00020000                               dd PAT0_SECNUM ; total sec 32
+    43                                  
+    44                                  fatsize32:
+    45 00000024 00010000                               dd 0x100      ; fat sz 32
+    46 00000028 0000                                   dw 0          ; ext flags
+    47 0000002A 0000                                   dw 0x0000     ; fs ver (must be 0x0000)
+    48                                  rootclus:
+    49 0000002C 02000000                               dd 0x02       ; root clus
+    50 00000030 0100                                   dw 0x01       ; sector num of FSINFO
+    51 00000032 0600                                   dw 0x06       ; Backup boot sec
+    52 00000034 <res 0000000C>                         resb 12       ; reserved
+    53          ******************       warning: uninitialized space declared in .text section: zeroing
+    54 00000040 80                                     db 0x80       ; drive num (used from int 0x13)
+    55 00000041 00                                     db 0          ; reserved1
+    56 00000042 29                                     db 0x29       ; ext boot sig
+    57 00000043 ADEFBEDE                               dd 0xdebeefad ; Volume serial number (usually generated by date and time)
+    58 00000047 4E4F204E414D452020-                    db "NO NAME    " ; Volume label
+    59 00000050 2020               
+    60 00000052 4641543332202020                       db "FAT32   " ; File Sys Type
+    61                                  entry:
+    62 0000005A 6631C0                         xor eax, eax
+    63 0000005D 8ED0                           mov ss, ax
+    64 0000005F 8ED8                           mov ds, ax
+    65 00000061 8EC0                           mov es, ax
+    66 00000063 BC007C                         mov sp, STACK
+    67                                         
+    68 00000066 88162008                       mov [DRIVENO], dl
+    69                                  
+    70 0000006A 668B1E[1C00]                   mov ebx, [hiddensec]
+    71 0000006F A1[0E00]                       mov ax, [reservedsec]
+    72                                         ;movzx eax, ax ; この時点でeax上位16bitは0のはず
+    73 00000072 6601C3                         add ebx, eax
+    74 00000075 A0[1000]                       mov al, [fatnum]
+    75 00000078 660FB6C0                       movzx eax, al
+    76 0000007C 668B0E[2400]                   mov ecx, [fatsize32]
+    77 00000081 66F7E1                         mul ecx
+    78 00000084 6601C3                         add ebx, eax
+    79                                  
+    80                                         ;fatのファイルデータの先頭からルートディレクトリの先頭クラスタへ
+    81 00000087 668B0E[2C00]                   mov ecx, [rootclus]
+    82 0000008C 6649                           dec ecx
+    83 0000008E 6649                           dec ecx
+    84 00000090 66A1[0D00]                     mov eax, [secperclus]
+    85 00000094 66F7E1                         mul ecx
+    86 00000097 6601C3                         add ebx, eax
+    87                                         
+    88                                         ;まずはルートディレクトリの構造体からbootmgrのサイズを読む
+    89 0000009A 680008                         push HARDDISK_CACHE >> 4
+    90 0000009D 07                             pop es
+    91 0000009E 31FF                           xor di, di
+    92                                         
+    93 000000A0 8A0E[0D00]                     mov cl, [secperclus]
+    94 000000A4 0FB6C9                         movzx cx, cl
+    95                                         
+    96 000000A7 E83200                         call readhd
+    97                                         
+    98 000000AA 26668B451C                     mov eax, [es:di + 0x1c] ; bootmgrファイルサイズ
+    99 000000AF 6605FF010000                   add eax, 0x200 - 1
+   100 000000B5 66B900020000                   mov ecx, 0x200
+   101 000000BB 6631D2                         xor edx, edx
+   102 000000BE 66F7F1                         div ecx
+   103 000000C1 6689C1                         mov ecx, eax
+   104                                         
+   105 000000C4 A0[0D00]                       mov al, [secperclus]
+   106 000000C7 660FB6C0                       movzx eax, al
+   107 000000CB 6601C3                         add ebx, eax
+   108                                         
+   109 000000CE 68200C                         push SYSADDR >> 4
+   110 000000D1 07                             pop es
+   111 000000D2 31FF                           xor di,di
+   112                                         
+   113 000000D4 E80500                         call readhd
+   114                                  
+   115                                         
+   116 000000D7 EA00C20000                     jmp 0:SYSADDR
+   117                                  
+   118                                          
+   119                                  readhd:
+   120                                  ;ebx   : 読み込み開始セクタ
+   121                                  ;es:di : 読み込み先アドレス
+   122                                  ;cx    : 読み込むセクタ数
+   123                                         ;読み込みのための構造体を設定
+   124 000000DC BE0008                         mov si, DISKREADSTRUCT
+   125 000000DF B81000                         mov ax, 0x0010
+   126 000000E2 8904                           mov [si], ax
+   127 000000E4 89C8                           mov ax, cx ; 読み込むセクタ数
+   128 000000E6 894402                         mov [si+2], ax
+   129 000000E9 89F8                           mov ax, di
+   130 000000EB 894404                         mov [si+4], ax
+   131 000000EE 8CC0                           mov ax, es
+   132 000000F0 894406                         mov [si+6], ax
+   133                                  ;      mov ax, SYSSECTOR & 0xFFFF
+   134                                  ;      mov [si+8], ax
+   135                                  ;      mov ax, (SYSSECTOR >> 0x10) & 0xFFFF
+   136                                  ;      mov [si+0x0a], ax
+   137 000000F3 66895C08                       mov [si + 8], ebx
+   138 000000F7 B80000                         mov ax, 0
+   139 000000FA 89440C                         mov [si+0x0c], ax
+   140 000000FD 89440E                         mov [si+0x0e], ax
+   141                                         
+   142                                         ; 拡張int 0x13を用いてHDDからブートセクションを読みこむ
+   143 00000100 B442                           mov ah, 0x42
+   144 00000102 8A162008                       mov dl, [DRIVENO]
+   145 00000106 B000                           mov al, 0
+   146                                  
+   147 00000108 CD13                           int 0x13
+   148 0000010A C3                             ret
+   149                                  
+   150                                         
+   151                                  
+   152                                  
+   153 0000010B <res 000000F3>                 RESB    0x1fe-($ - $$)          ; 0x7dfeまでを0x00で埋める命令
+   154          ******************       warning: uninitialized space declared in .text section: zeroing
+   155                                  
+   156 000001FE 55AA                           DB              0x55, 0xaa
diff --git a/haribote/keyboard.c b/haribote/keyboard.c
new file mode 100644 (file)
index 0000000..25cfac4
--- /dev/null
@@ -0,0 +1,44 @@
+/* \83L\81[\83{\81[\83h\8aÖ\8cW */
+
+#include "bootpack.h"
+
+struct FIFO32 *keyfifo;
+int keydata0;
+
+void inthandler21(int *esp)
+{
+       int data;
+       io_out8(PIC0_OCW2, 0x61);       /* IRQ-01\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92m */
+       data = io_in8(PORT_KEYDAT);
+       fifo32_put(keyfifo, data + keydata0);
+       return;
+}
+
+#define PORT_KEYSTA                            0x0064
+#define KEYSTA_SEND_NOTREADY   0x02
+#define KEYCMD_WRITE_MODE              0x60
+#define KBC_MODE                               0x47
+
+void wait_KBC_sendready(void)
+{
+       /* \83L\81[\83{\81[\83h\83R\83\93\83g\83\8d\81[\83\89\82ª\83f\81[\83^\91\97\90M\89Â\94\\82É\82È\82é\82Ì\82ð\91Ò\82 */
+       for (;;) {
+               if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) {
+                       break;
+               }
+       }
+       return;
+}
+
+void init_keyboard(struct FIFO32 *fifo, int data0)
+{
+       /* \8f\91\82«\8d\9e\82Ý\90æ\82ÌFIFO\83o\83b\83t\83@\82ð\8bL\89¯ */
+       keyfifo = fifo;
+       keydata0 = data0;
+       /* \83L\81[\83{\81[\83h\83R\83\93\83g\83\8d\81[\83\89\82Ì\8f\89\8aú\89» */
+       wait_KBC_sendready();
+       io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);
+       wait_KBC_sendready();
+       io_out8(PORT_KEYDAT, KBC_MODE);
+       return;
+}
diff --git a/haribote/keyboard.lst b/haribote/keyboard.lst
new file mode 100644 (file)
index 0000000..22eaf07
--- /dev/null
@@ -0,0 +1,66 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _io_out8
+     7 00000000                                        EXTERN  _io_in8
+     8 00000000                                        EXTERN  _fifo32_put
+     9 00000000                                 [FILE "keyboard.c"]
+    10                                          [SECTION .text]
+    11 00000000                                        GLOBAL  _inthandler21
+    12 00000000                                 _inthandler21:
+    13 00000000 55                                     PUSH    EBP
+    14 00000001 89 E5                                  MOV     EBP,ESP
+    15 00000003 6A 61                                  PUSH    97
+    16 00000005 6A 20                                  PUSH    32
+    17 00000007 E8 [00000000]                          CALL    _io_out8
+    18 0000000C 6A 60                                  PUSH    96
+    19 0000000E E8 [00000000]                          CALL    _io_in8
+    20 00000013 03 05 [00000004]                       ADD     EAX,DWORD [_keydata0]
+    21 00000019 50                                     PUSH    EAX
+    22 0000001A FF 35 [00000000]                       PUSH    DWORD [_keyfifo]
+    23 00000020 E8 [00000000]                          CALL    _fifo32_put
+    24 00000025 C9                                     LEAVE
+    25 00000026 C3                                     RET
+    26 00000027                                        GLOBAL  _wait_KBC_sendready
+    27 00000027                                 _wait_KBC_sendready:
+    28 00000027 55                                     PUSH    EBP
+    29 00000028 89 E5                                  MOV     EBP,ESP
+    30 0000002A                                 L3:
+    31 0000002A 6A 64                                  PUSH    100
+    32 0000002C E8 [00000000]                          CALL    _io_in8
+    33 00000031 5A                                     POP     EDX
+    34 00000032 83 E0 02                               AND     EAX,2
+    35 00000035 75 F3                                  JNE     L3
+    36 00000037 C9                                     LEAVE
+    37 00000038 C3                                     RET
+    38 00000039                                        GLOBAL  _init_keyboard
+    39 00000039                                 _init_keyboard:
+    40 00000039 55                                     PUSH    EBP
+    41 0000003A 89 E5                                  MOV     EBP,ESP
+    42 0000003C 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    43 0000003F A3 [00000000]                          MOV     DWORD [_keyfifo],EAX
+    44 00000044 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+    45 00000047 A3 [00000004]                          MOV     DWORD [_keydata0],EAX
+    46 0000004C E8 FFFFFFD6                            CALL    _wait_KBC_sendready
+    47 00000051 6A 60                                  PUSH    96
+    48 00000053 6A 64                                  PUSH    100
+    49 00000055 E8 [00000000]                          CALL    _io_out8
+    50 0000005A E8 FFFFFFC8                            CALL    _wait_KBC_sendready
+    51 0000005F 59                                     POP     ECX
+    52 00000060 58                                     POP     EAX
+    53 00000061 C7 45 0C 00000047                      MOV     DWORD [12+EBP],71
+    54 00000068 C7 45 08 00000060                      MOV     DWORD [8+EBP],96
+    55 0000006F C9                                     LEAVE
+    56 00000070 E9 [00000000]                          JMP     _io_out8
+    57 00000075                                        GLOBAL  _keyfifo
+    58                                          [SECTION .data]
+    59 00000000                                        ALIGNB  4
+    60 00000000                                 _keyfifo:
+    61 00000000 00 00 00 00                            RESB    4
+    62 00000004                                        GLOBAL  _keydata0
+    63                                          [SECTION .data]
+    64 00000004                                        ALIGNB  4
+    65 00000004                                 _keydata0:
+    66 00000004 00 00 00 00                            RESB    4
diff --git a/haribote/mbr.asm b/haribote/mbr.asm
new file mode 100644 (file)
index 0000000..e385954
--- /dev/null
@@ -0,0 +1,111 @@
+; haribote-ipl
+; TAB=4
+
+LOADADDR EQU 0x7c00
+BASEADDR EQU 0x0600
+DISKREADSTRUCT EQU 0x0800
+
+PAT0_STARTSEC EQU 0x3f
+PAT0_SECNUM EQU 0x200
+
+       ORG 0x600                       ; \82±\82Ì\83v\83\8d\83O\83\89\83\80\82ª\82Ç\82±\82É\93Ç\82Ý\8d\9e\82Ü\82ê\82é\82Ì\82©
+
+       ;mbr\82ð0x0600\82É\83R\83s\81[\82µ\82Ä\82»\82Á\82¿\82Å\8eÀ\8ds\82·\82é
+       xor ax, ax
+       mov ds, ax
+       mov si, LOADADDR
+       mov es, ax
+       mov di, BASEADDR
+       mov cx, 0x200 / 2
+       rep movsw
+       jmp 0:entry ; 0x0600\82É\83R\83s\81[\82µ\82½\95û\82Ì\83R\81[\83h\82Ö\88Ú\82é
+entry:
+       ;mov cs, ax
+       mov ss, ax
+       mov ds, ax
+       mov es, ax
+       
+
+       
+       ;\93Ç\82Ý\8d\9e\82Ý\82Ì\82½\82ß\82Ì\8d\\91¢\91Ì\82ð\90Ý\92è
+       mov si, DISKREADSTRUCT
+       mov ax, 0x0010
+       mov [si], ax
+       mov ax, 0x0001
+       mov [si+2], ax
+       mov ax, LOADADDR
+       mov [si+4], ax
+       mov ax, 0
+       mov [si+6], ax
+       mov ax, [pat0 + 8]
+       mov [si+8], ax
+       mov ax, [pat0 + 8 + 2]
+       mov [si+0x0a], ax
+       mov ax, 0
+       mov [si+0x0c], ax
+       mov [si+0x0e], ax
+       
+       ; \8ag\92£int 0x13\82ð\97p\82¢\82ÄHDD\82©\82ç\83u\81[\83g\83Z\83N\83V\83\87\83\93\82ð\93Ç\82Ý\82±\82Þ
+       mov ah, 0x42
+       ;mov dl, todo ; \83h\83\89\83C\83u\94Ô\8d\86\82Ídl\82É\93ü\82Á\82Ä\82¢\82é\81E\81E\81E\81H
+       mov al, 0
+
+       int 0x13
+
+       jmp 0:LOADADDR
+
+
+;      RESB    BASEADDR+0x168000-$             ; 0x7dfe\82Ü\82Å\82ð0x00\82Å\96\84\82ß\82é\96½\97ß
+
+       RESB 0x1BE - ($ - $$)
+       
+; struc pattable
+       ; boot_flag : resb 1
+       ; starting_h : resb 1
+       ; starting_s : resb 1
+       ; starting_c : resb 1
+       ; pattype : resb 1
+       ; ending_h : resb 1
+       ; ending_s : resb 1
+       ; ending_c : resb 1
+       ; begin_lba : resd 1
+       ; sector_num : resd 1
+; endstruc
+       
+pat0:
+       db 0x80 ; boot flag
+       db 1,1,0 ;partition begin CHS
+       db 0x0B ; partition type:FAT32
+       db 0xfe,0xff,0xff; partition end CHS
+       dd 0x0000003f ;partition begin LBA
+       dd 0x00000302 ;partition size LBA(sector num)
+       
+       
+pat1:
+       db 0x00
+       db 0,0,0 ;partition begin CHS
+       db 0x00 ; partition type:FAT32
+       db 0x00,0x00,0x00; partition end CHS
+       dd 0x00000000 ;partition begin LBA
+       dd 0x00000000 ;partition size LBA(sector num)
+       
+       resb 0x200-2-($ - $$)
+       
+       ; db 0x00
+       ; db 1,1,0 ;partition begin CHS
+       ; db 0x0C ; partition type:FAT32
+       ; db 0xfe,0xff,0xff; partition end CHS
+       ; dd 0x0000003f ;partition begin LBA
+       ; dd 0x00000000 ;partition size LBA(sector num)
+       
+       ; db 0x00
+       ; db 1,1,0 ;partition begin CHS
+       ; db 0x0C ; partition type:FAT32
+       ; db 0xfe,0xff,0xff; partition end CHS
+       ; dd 0x0000003f ;partition begin LBA
+       ; dd 0x00000000 ;partition size LBA(sector num)
+       
+
+       db 0x55
+       db 0xAA
+       
\ No newline at end of file
diff --git a/haribote/mbr.bin b/haribote/mbr.bin
new file mode 100644 (file)
index 0000000..c4519fb
Binary files /dev/null and b/haribote/mbr.bin differ
diff --git a/haribote/mbr.lst b/haribote/mbr.lst
new file mode 100644 (file)
index 0000000..8e4bd59
--- /dev/null
@@ -0,0 +1,113 @@
+     1                                  ; haribote-ipl
+     2                                  ; TAB=4
+     3                                  
+     4                                  LOADADDR EQU 0x7c00
+     5                                  BASEADDR EQU 0x0600
+     6                                  DISKREADSTRUCT EQU 0x0800
+     7                                  
+     8                                  PAT0_STARTSEC EQU 0x3f
+     9                                  PAT0_SECNUM EQU 0x200
+    10                                  
+    11                                         ORG 0x600                       ; \82±\82Ì\83v\83\8d\83O\83\89\83\80\82ª\82Ç\82±\82É\93Ç\82Ý\8d\9e\82Ü\82ê\82é\82Ì\82©
+    12                                  
+    13                                         ;mbr\82ð0x0600\82É\83R\83s\81[\82µ\82Ä\82»\82Á\82¿\82Å\8eÀ\8ds\82·\82é
+    14 00000000 31C0                           xor ax, ax
+    15 00000002 8ED8                           mov ds, ax
+    16 00000004 BE007C                         mov si, LOADADDR
+    17 00000007 8EC0                           mov es, ax
+    18 00000009 BF0006                         mov di, BASEADDR
+    19 0000000C B90001                         mov cx, 0x200 / 2
+    20 0000000F F3A5                           rep movsw
+    21 00000011 EA[1600]0000                   jmp 0:entry ; 0x0600\82É\83R\83s\81[\82µ\82½\95û\82Ì\83R\81[\83h\82Ö\88Ú\82é
+    22                                  entry:
+    23                                         ;mov cs, ax
+    24 00000016 8ED0                           mov ss, ax
+    25 00000018 8ED8                           mov ds, ax
+    26 0000001A 8EC0                           mov es, ax
+    27                                         
+    28                                  
+    29                                         
+    30                                         ;\93Ç\82Ý\8d\9e\82Ý\82Ì\82½\82ß\82Ì\8d\\91¢\91Ì\82ð\90Ý\92è
+    31 0000001C BE0008                         mov si, DISKREADSTRUCT
+    32 0000001F B81000                         mov ax, 0x0010
+    33 00000022 8904                           mov [si], ax
+    34 00000024 B80100                         mov ax, 0x0001
+    35 00000027 894402                         mov [si+2], ax
+    36 0000002A B8007C                         mov ax, LOADADDR
+    37 0000002D 894404                         mov [si+4], ax
+    38 00000030 B80000                         mov ax, 0
+    39 00000033 894406                         mov [si+6], ax
+    40 00000036 A1[C601]                       mov ax, [pat0 + 8]
+    41 00000039 894408                         mov [si+8], ax
+    42 0000003C A1[C801]                       mov ax, [pat0 + 8 + 2]
+    43 0000003F 89440A                         mov [si+0x0a], ax
+    44 00000042 B80000                         mov ax, 0
+    45 00000045 89440C                         mov [si+0x0c], ax
+    46 00000048 89440E                         mov [si+0x0e], ax
+    47                                         
+    48                                         ; \8ag\92£int 0x13\82ð\97p\82¢\82ÄHDD\82©\82ç\83u\81[\83g\83Z\83N\83V\83\87\83\93\82ð\93Ç\82Ý\82±\82Þ
+    49 0000004B B442                           mov ah, 0x42
+    50                                         ;mov dl, todo ; \83h\83\89\83C\83u\94Ô\8d\86\82Ídl\82É\93ü\82Á\82Ä\82¢\82é\81E\81E\81E\81H
+    51 0000004D B000                           mov al, 0
+    52                                  
+    53 0000004F CD13                           int 0x13
+    54                                  
+    55 00000051 EA007C0000                     jmp 0:LOADADDR
+    56                                  
+    57                                  
+    58                                  ;      RESB    BASEADDR+0x168000-$             ; 0x7dfe\82Ü\82Å\82ð0x00\82Å\96\84\82ß\82é\96½\97ß
+    59                                  
+    60 00000056 <res 00000168>                 RESB 0x1BE - ($ - $$)
+    61          ******************       warning: uninitialized space declared in .text section: zeroing
+    62                                         
+    63                                  ; struc pattable
+    64                                         ; boot_flag : resb 1
+    65                                         ; starting_h : resb 1
+    66                                         ; starting_s : resb 1
+    67                                         ; starting_c : resb 1
+    68                                         ; pattype : resb 1
+    69                                         ; ending_h : resb 1
+    70                                         ; ending_s : resb 1
+    71                                         ; ending_c : resb 1
+    72                                         ; begin_lba : resd 1
+    73                                         ; sector_num : resd 1
+    74                                  ; endstruc
+    75                                         
+    76                                  pat0:
+    77 000001BE 80                             db 0x80 ; boot flag
+    78 000001BF 010100                         db 1,1,0 ;partition begin CHS
+    79 000001C2 0B                             db 0x0B ; partition type:FAT32
+    80 000001C3 FEFFFF                         db 0xfe,0xff,0xff; partition end CHS
+    81 000001C6 3F000000                       dd 0x0000003f ;partition begin LBA
+    82 000001CA 02030000                       dd 0x00000302 ;partition size LBA(sector num)
+    83                                         
+    84                                         
+    85                                  pat1:
+    86 000001CE 00                             db 0x00
+    87 000001CF 000000                         db 0,0,0 ;partition begin CHS
+    88 000001D2 00                             db 0x00 ; partition type:FAT32
+    89 000001D3 000000                         db 0x00,0x00,0x00; partition end CHS
+    90 000001D6 00000000                       dd 0x00000000 ;partition begin LBA
+    91 000001DA 00000000                       dd 0x00000000 ;partition size LBA(sector num)
+    92                                         
+    93 000001DE <res 00000020>                 resb 0x200-2-($ - $$)
+    94          ******************       warning: uninitialized space declared in .text section: zeroing
+    95                                         
+    96                                         ; db 0x00
+    97                                         ; db 1,1,0 ;partition begin CHS
+    98                                         ; db 0x0C ; partition type:FAT32
+    99                                         ; db 0xfe,0xff,0xff; partition end CHS
+   100                                         ; dd 0x0000003f ;partition begin LBA
+   101                                         ; dd 0x00000000 ;partition size LBA(sector num)
+   102                                         
+   103                                         ; db 0x00
+   104                                         ; db 1,1,0 ;partition begin CHS
+   105                                         ; db 0x0C ; partition type:FAT32
+   106                                         ; db 0xfe,0xff,0xff; partition end CHS
+   107                                         ; dd 0x0000003f ;partition begin LBA
+   108                                         ; dd 0x00000000 ;partition size LBA(sector num)
+   109                                         
+   110                                  
+   111 000001FE 55                             db 0x55
+   112 000001FF AA                             db 0xAA
+   113                                         
diff --git a/haribote/mbr.pl b/haribote/mbr.pl
new file mode 100644 (file)
index 0000000..146793f
--- /dev/null
@@ -0,0 +1 @@
+#$a = (0x168000 - (-s 'iplcd.bin'));for(1..($a/1000000)){print qq(\0)x1000000;}print qq(\0) x ($a % 1000000);
diff --git a/haribote/memory.c b/haribote/memory.c
new file mode 100644 (file)
index 0000000..eca3f1a
--- /dev/null
@@ -0,0 +1,160 @@
+/* \83\81\83\82\83\8a\8aÖ\8cW */
+
+#include "bootpack.h"
+
+#define EFLAGS_AC_BIT          0x00040000
+#define CR0_CACHE_DISABLE      0x60000000
+
+unsigned int memtest(unsigned int start, unsigned int end)
+{
+       char flg486 = 0;
+       unsigned int eflg, cr0, i;
+
+       /* 386\82©\81A486\88È\8d~\82È\82Ì\82©\82Ì\8am\94F */
+       eflg = io_load_eflags();
+       eflg |= EFLAGS_AC_BIT; /* AC-bit = 1 */
+       io_store_eflags(eflg);
+       eflg = io_load_eflags();
+       if ((eflg & EFLAGS_AC_BIT) != 0) { /* 386\82Å\82ÍAC=1\82É\82µ\82Ä\82à\8e©\93®\82Å0\82É\96ß\82Á\82Ä\82µ\82Ü\82¤ */
+               flg486 = 1;
+       }
+       eflg &= ~EFLAGS_AC_BIT; /* AC-bit = 0 */
+       io_store_eflags(eflg);
+
+       if (flg486 != 0) {
+               cr0 = load_cr0();
+               cr0 |= CR0_CACHE_DISABLE; /* \83L\83\83\83b\83V\83\85\8bÖ\8e~ */
+               store_cr0(cr0);
+       }
+
+       i = memtest_sub(start, end);
+
+       if (flg486 != 0) {
+               cr0 = load_cr0();
+               cr0 &= ~CR0_CACHE_DISABLE; /* \83L\83\83\83b\83V\83\85\8b\96\89 */
+               store_cr0(cr0);
+       }
+
+       return i;
+}
+
+void memman_init(struct MEMMAN *man)
+{
+       man->frees = 0;                 /* \82 \82«\8fî\95ñ\82Ì\8cÂ\90\94 */
+       man->maxfrees = 0;              /* \8fó\8bµ\8aÏ\8e@\97p\81Ffrees\82Ì\8dÅ\91å\92l */
+       man->lostsize = 0;              /* \89ð\95ú\82É\8e¸\94s\82µ\82½\8d\87\8cv\83T\83C\83Y */
+       man->losts = 0;                 /* \89ð\95ú\82É\8e¸\94s\82µ\82½\89ñ\90\94 */
+       return;
+}
+
+unsigned int memman_total(struct MEMMAN *man)
+/* \82 \82«\83T\83C\83Y\82Ì\8d\87\8cv\82ð\95ñ\8d\90 */
+{
+       unsigned int i, t = 0;
+       for (i = 0; i < man->frees; i++) {
+               t += man->free[i].size;
+       }
+       return t;
+}
+
+unsigned int memman_alloc(struct MEMMAN *man, unsigned int size)
+/* \8am\95Û */
+{
+       unsigned int i, a;
+       for (i = 0; i < man->frees; i++) {
+               if (man->free[i].size >= size) {
+                       /* \8f\\95ª\82È\8dL\82³\82Ì\82 \82«\82ð\94­\8c© */
+                       a = man->free[i].addr;
+                       man->free[i].addr += size;
+                       man->free[i].size -= size;
+                       if (man->free[i].size == 0) {
+                               /* free[i]\82ª\82È\82­\82È\82Á\82½\82Ì\82Å\91O\82Ö\82Â\82ß\82é */
+                               man->frees--;
+                               for (; i < man->frees; i++) {
+                                       man->free[i] = man->free[i + 1]; /* \8d\\91¢\91Ì\82Ì\91ã\93ü */
+                               }
+                       }
+                       return a;
+               }
+       }
+       return 0; /* \82 \82«\82ª\82È\82¢ */
+}
+
+int memman_free(struct MEMMAN *man, unsigned int addr, unsigned int size)
+/* \89ð\95ú */
+{
+       int i, j;
+       /* \82Ü\82Æ\82ß\82â\82·\82³\82ð\8dl\82¦\82é\82Æ\81Afree[]\82ªaddr\8f\87\82É\95À\82ñ\82Å\82¢\82é\82Ù\82¤\82ª\82¢\82¢ */
+       /* \82¾\82©\82ç\82Ü\82¸\81A\82Ç\82±\82É\93ü\82ê\82é\82×\82«\82©\82ð\8c\88\82ß\82é */
+       for (i = 0; i < man->frees; i++) {
+               if (man->free[i].addr > addr) {
+                       break;
+               }
+       }
+       /* free[i - 1].addr < addr < free[i].addr */
+       if (i > 0) {
+               /* \91O\82ª\82 \82é */
+               if (man->free[i - 1].addr + man->free[i - 1].size == addr) {
+                       /* \91O\82Ì\82 \82«\97Ì\88æ\82É\82Ü\82Æ\82ß\82ç\82ê\82é */
+                       man->free[i - 1].size += size;
+                       if (i < man->frees) {
+                               /* \8cã\82ë\82à\82 \82é */
+                               if (addr + size == man->free[i].addr) {
+                                       /* \82È\82ñ\82Æ\8cã\82ë\82Æ\82à\82Ü\82Æ\82ß\82ç\82ê\82é */
+                                       man->free[i - 1].size += man->free[i].size;
+                                       /* man->free[i]\82Ì\8dí\8f\9c */
+                                       /* free[i]\82ª\82È\82­\82È\82Á\82½\82Ì\82Å\91O\82Ö\82Â\82ß\82é */
+                                       man->frees--;
+                                       for (; i < man->frees; i++) {
+                                               man->free[i] = man->free[i + 1]; /* \8d\\91¢\91Ì\82Ì\91ã\93ü */
+                                       }
+                               }
+                       }
+                       return 0; /* \90¬\8c÷\8fI\97¹ */
+               }
+       }
+       /* \91O\82Æ\82Í\82Ü\82Æ\82ß\82ç\82ê\82È\82©\82Á\82½ */
+       if (i < man->frees) {
+               /* \8cã\82ë\82ª\82 \82é */
+               if (addr + size == man->free[i].addr) {
+                       /* \8cã\82ë\82Æ\82Í\82Ü\82Æ\82ß\82ç\82ê\82é */
+                       man->free[i].addr = addr;
+                       man->free[i].size += size;
+                       return 0; /* \90¬\8c÷\8fI\97¹ */
+               }
+       }
+       /* \91O\82É\82à\8cã\82ë\82É\82à\82Ü\82Æ\82ß\82ç\82ê\82È\82¢ */
+       if (man->frees < MEMMAN_FREES) {
+               /* free[i]\82æ\82è\8cã\82ë\82ð\81A\8cã\82ë\82Ö\82¸\82ç\82µ\82Ä\81A\82·\82«\82Ü\82ð\8dì\82é */
+               for (j = man->frees; j > i; j--) {
+                       man->free[j] = man->free[j - 1];
+               }
+               man->frees++;
+               if (man->maxfrees < man->frees) {
+                       man->maxfrees = man->frees; /* \8dÅ\91å\92l\82ð\8dX\90V */
+               }
+               man->free[i].addr = addr;
+               man->free[i].size = size;
+               return 0; /* \90¬\8c÷\8fI\97¹ */
+       }
+       /* \8cã\82ë\82É\82¸\82ç\82¹\82È\82©\82Á\82½ */
+       man->losts++;
+       man->lostsize += size;
+       return -1; /* \8e¸\94s\8fI\97¹ */
+}
+
+unsigned int memman_alloc_4k(struct MEMMAN *man, unsigned int size)
+{
+       unsigned int a;
+       size = (size + 0xfff) & 0xfffff000;
+       a = memman_alloc(man, size);
+       return a;
+}
+
+int memman_free_4k(struct MEMMAN *man, unsigned int addr, unsigned int size)
+{
+       int i;
+       size = (size + 0xfff) & 0xfffff000;
+       i = memman_free(man, addr, size);
+       return i;
+}
diff --git a/haribote/memory.lst b/haribote/memory.lst
new file mode 100644 (file)
index 0000000..9d9295c
--- /dev/null
@@ -0,0 +1,277 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _io_load_eflags
+     7 00000000                                        EXTERN  _io_store_eflags
+     8 00000000                                        EXTERN  _memtest_sub
+     9 00000000                                        EXTERN  _load_cr0
+    10 00000000                                        EXTERN  _store_cr0
+    11 00000000                                 [FILE "memory.c"]
+    12                                          [SECTION .text]
+    13 00000000                                        GLOBAL  _memtest
+    14 00000000                                 _memtest:
+    15 00000000 55                                     PUSH    EBP
+    16 00000001 89 E5                                  MOV     EBP,ESP
+    17 00000003 56                                     PUSH    ESI
+    18 00000004 53                                     PUSH    EBX
+    19 00000005 31 F6                                  XOR     ESI,ESI
+    20 00000007 E8 [00000000]                          CALL    _io_load_eflags
+    21 0000000C 0D 00040000                            OR      EAX,262144
+    22 00000011 50                                     PUSH    EAX
+    23 00000012 E8 [00000000]                          CALL    _io_store_eflags
+    24 00000017 E8 [00000000]                          CALL    _io_load_eflags
+    25 0000001C 5A                                     POP     EDX
+    26 0000001D A9 00040000                            TEST    EAX,262144
+    27 00000022 74 05                                  JE      L2
+    28 00000024 BE 00000001                            MOV     ESI,1
+    29 00000029                                 L2:
+    30 00000029 25 FFFBFFFF                            AND     EAX,-262145
+    31 0000002E 50                                     PUSH    EAX
+    32 0000002F E8 [00000000]                          CALL    _io_store_eflags
+    33 00000034 58                                     POP     EAX
+    34 00000035 89 F0                                  MOV     EAX,ESI
+    35 00000037 84 C0                                  TEST    AL,AL
+    36 00000039 75 31                                  JNE     L5
+    37 0000003B                                 L3:
+    38 0000003B FF 75 0C                               PUSH    DWORD [12+EBP]
+    39 0000003E FF 75 08                               PUSH    DWORD [8+EBP]
+    40 00000041 E8 [00000000]                          CALL    _memtest_sub
+    41 00000046 5A                                     POP     EDX
+    42 00000047 89 C3                                  MOV     EBX,EAX
+    43 00000049 59                                     POP     ECX
+    44 0000004A 89 F0                                  MOV     EAX,ESI
+    45 0000004C 84 C0                                  TEST    AL,AL
+    46 0000004E 75 09                                  JNE     L6
+    47 00000050                                 L4:
+    48 00000050 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+    49 00000053 89 D8                                  MOV     EAX,EBX
+    50 00000055 5B                                     POP     EBX
+    51 00000056 5E                                     POP     ESI
+    52 00000057 5D                                     POP     EBP
+    53 00000058 C3                                     RET
+    54 00000059                                 L6:
+    55 00000059 E8 [00000000]                          CALL    _load_cr0
+    56 0000005E 25 9FFFFFFF                            AND     EAX,-1610612737
+    57 00000063 50                                     PUSH    EAX
+    58 00000064 E8 [00000000]                          CALL    _store_cr0
+    59 00000069 58                                     POP     EAX
+    60 0000006A EB E4                                  JMP     L4
+    61 0000006C                                 L5:
+    62 0000006C E8 [00000000]                          CALL    _load_cr0
+    63 00000071 0D 60000000                            OR      EAX,1610612736
+    64 00000076 50                                     PUSH    EAX
+    65 00000077 E8 [00000000]                          CALL    _store_cr0
+    66 0000007C 5B                                     POP     EBX
+    67 0000007D EB BC                                  JMP     L3
+    68 0000007F                                        GLOBAL  _memman_init
+    69 0000007F                                 _memman_init:
+    70 0000007F 55                                     PUSH    EBP
+    71 00000080 89 E5                                  MOV     EBP,ESP
+    72 00000082 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    73 00000085 C7 00 00000000                         MOV     DWORD [EAX],0
+    74 0000008B C7 40 04 00000000                      MOV     DWORD [4+EAX],0
+    75 00000092 C7 40 08 00000000                      MOV     DWORD [8+EAX],0
+    76 00000099 C7 40 0C 00000000                      MOV     DWORD [12+EAX],0
+    77 000000A0 5D                                     POP     EBP
+    78 000000A1 C3                                     RET
+    79 000000A2                                        GLOBAL  _memman_total
+    80 000000A2                                 _memman_total:
+    81 000000A2 55                                     PUSH    EBP
+    82 000000A3 31 C0                                  XOR     EAX,EAX
+    83 000000A5 89 E5                                  MOV     EBP,ESP
+    84 000000A7 31 D2                                  XOR     EDX,EDX
+    85 000000A9 53                                     PUSH    EBX
+    86 000000AA 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+    87 000000AD 8B 0B                                  MOV     ECX,DWORD [EBX]
+    88 000000AF 39 C8                                  CMP     EAX,ECX
+    89 000000B1 73 09                                  JAE     L15
+    90 000000B3                                 L13:
+    91 000000B3 03 44 D3 14                            ADD     EAX,DWORD [20+EBX+EDX*8]
+    92 000000B7 42                                     INC     EDX
+    93 000000B8 39 CA                                  CMP     EDX,ECX
+    94 000000BA 72 F7                                  JB      L13
+    95 000000BC                                 L15:
+    96 000000BC 5B                                     POP     EBX
+    97 000000BD 5D                                     POP     EBP
+    98 000000BE C3                                     RET
+    99 000000BF                                        GLOBAL  _memman_alloc
+   100 000000BF                                 _memman_alloc:
+   101 000000BF 55                                     PUSH    EBP
+   102 000000C0 31 C9                                  XOR     ECX,ECX
+   103 000000C2 89 E5                                  MOV     EBP,ESP
+   104 000000C4 57                                     PUSH    EDI
+   105 000000C5 56                                     PUSH    ESI
+   106 000000C6 53                                     PUSH    EBX
+   107 000000C7 8B 75 0C                               MOV     ESI,DWORD [12+EBP]
+   108 000000CA 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   109 000000CD 8B 03                                  MOV     EAX,DWORD [EBX]
+   110 000000CF 39 C1                                  CMP     ECX,EAX
+   111 000000D1 73 0D                                  JAE     L30
+   112 000000D3                                 L28:
+   113 000000D3 8B 54 CB 14                            MOV     EDX,DWORD [20+EBX+ECX*8]
+   114 000000D7 39 F2                                  CMP     EDX,ESI
+   115 000000D9 73 0C                                  JAE     L32
+   116 000000DB 41                                     INC     ECX
+   117 000000DC 39 C1                                  CMP     ECX,EAX
+   118 000000DE 72 F3                                  JB      L28
+   119 000000E0                                 L30:
+   120 000000E0 31 C0                                  XOR     EAX,EAX
+   121 000000E2                                 L16:
+   122 000000E2 5B                                     POP     EBX
+   123 000000E3 5E                                     POP     ESI
+   124 000000E4 5F                                     POP     EDI
+   125 000000E5 5D                                     POP     EBP
+   126 000000E6 C3                                     RET
+   127 000000E7                                 L32:
+   128 000000E7 8B 7C CB 10                            MOV     EDI,DWORD [16+EBX+ECX*8]
+   129 000000EB 8D 04 3E                               LEA     EAX,DWORD [ESI+EDI*1]
+   130 000000EE 89 44 CB 10                            MOV     DWORD [16+EBX+ECX*8],EAX
+   131 000000F2 89 D0                                  MOV     EAX,EDX
+   132 000000F4 29 F0                                  SUB     EAX,ESI
+   133 000000F6 89 44 CB 14                            MOV     DWORD [20+EBX+ECX*8],EAX
+   134 000000FA 85 C0                                  TEST    EAX,EAX
+   135 000000FC 75 20                                  JNE     L22
+   136 000000FE 8B 03                                  MOV     EAX,DWORD [EBX]
+   137 00000100 48                                     DEC     EAX
+   138 00000101 89 03                                  MOV     DWORD [EBX],EAX
+   139 00000103 39 C1                                  CMP     ECX,EAX
+   140 00000105 73 17                                  JAE     L22
+   141 00000107 89 C6                                  MOV     ESI,EAX
+   142 00000109                                 L27:
+   143 00000109 8B 44 CB 18                            MOV     EAX,DWORD [24+EBX+ECX*8]
+   144 0000010D 8B 54 CB 1C                            MOV     EDX,DWORD [28+EBX+ECX*8]
+   145 00000111 89 44 CB 10                            MOV     DWORD [16+EBX+ECX*8],EAX
+   146 00000115 89 54 CB 14                            MOV     DWORD [20+EBX+ECX*8],EDX
+   147 00000119 41                                     INC     ECX
+   148 0000011A 39 F1                                  CMP     ECX,ESI
+   149 0000011C 72 EB                                  JB      L27
+   150 0000011E                                 L22:
+   151 0000011E 89 F8                                  MOV     EAX,EDI
+   152 00000120 EB C0                                  JMP     L16
+   153 00000122                                        GLOBAL  _memman_free
+   154 00000122                                 _memman_free:
+   155 00000122 55                                     PUSH    EBP
+   156 00000123 89 E5                                  MOV     EBP,ESP
+   157 00000125 57                                     PUSH    EDI
+   158 00000126 56                                     PUSH    ESI
+   159 00000127 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   160 0000012A 53                                     PUSH    EBX
+   161 0000012B 31 DB                                  XOR     EBX,EBX
+   162 0000012D 8B 3E                                  MOV     EDI,DWORD [ESI]
+   163 0000012F 39 FB                                  CMP     EBX,EDI
+   164 00000131 7D 0E                                  JGE     L35
+   165 00000133                                 L39:
+   166 00000133 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   167 00000136 39 44 DE 10                            CMP     DWORD [16+ESI+EBX*8],EAX
+   168 0000013A 77 05                                  JA      L35
+   169 0000013C 43                                     INC     EBX
+   170 0000013D 39 FB                                  CMP     EBX,EDI
+   171 0000013F 7C F2                                  JL      L39
+   172 00000141                                 L35:
+   173 00000141 85 DB                                  TEST    EBX,EBX
+   174 00000143 7E 0F                                  JLE     L40
+   175 00000145 8B 54 DE 0C                            MOV     EDX,DWORD [12+ESI+EBX*8]
+   176 00000149 8B 44 DE 08                            MOV     EAX,DWORD [8+ESI+EBX*8]
+   177 0000014D 01 D0                                  ADD     EAX,EDX
+   178 0000014F 3B 45 0C                               CMP     EAX,DWORD [12+EBP]
+   179 00000152 74 73                                  JE      L63
+   180 00000154                                 L40:
+   181 00000154 39 FB                                  CMP     EBX,EDI
+   182 00000156 7D 0C                                  JGE     L49
+   183 00000158 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   184 0000015B 03 45 10                               ADD     EAX,DWORD [16+EBP]
+   185 0000015E 3B 44 DE 10                            CMP     EAX,DWORD [16+ESI+EBX*8]
+   186 00000162 74 53                                  JE      L64
+   187 00000164                                 L49:
+   188 00000164 81 FF 00000FF9                         CMP     EDI,4089
+   189 0000016A 7F 3D                                  JG      L51
+   190 0000016C 89 F9                                  MOV     ECX,EDI
+   191 0000016E 39 DF                                  CMP     EDI,EBX
+   192 00000170 7E 15                                  JLE     L61
+   193 00000172                                 L56:
+   194 00000172 8B 44 CE 08                            MOV     EAX,DWORD [8+ESI+ECX*8]
+   195 00000176 8B 54 CE 0C                            MOV     EDX,DWORD [12+ESI+ECX*8]
+   196 0000017A 89 44 CE 10                            MOV     DWORD [16+ESI+ECX*8],EAX
+   197 0000017E 89 54 CE 14                            MOV     DWORD [20+ESI+ECX*8],EDX
+   198 00000182 49                                     DEC     ECX
+   199 00000183 39 D9                                  CMP     ECX,EBX
+   200 00000185 7F EB                                  JG      L56
+   201 00000187                                 L61:
+   202 00000187 8D 47 01                               LEA     EAX,DWORD [1+EDI]
+   203 0000018A 89 06                                  MOV     DWORD [ESI],EAX
+   204 0000018C 39 46 04                               CMP     DWORD [4+ESI],EAX
+   205 0000018F 7D 03                                  JGE     L57
+   206 00000191 89 46 04                               MOV     DWORD [4+ESI],EAX
+   207 00000194                                 L57:
+   208 00000194 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   209 00000197 89 44 DE 10                            MOV     DWORD [16+ESI+EBX*8],EAX
+   210 0000019B 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   211 0000019E 89 44 DE 14                            MOV     DWORD [20+ESI+EBX*8],EAX
+   212 000001A2                                 L62:
+   213 000001A2 31 C0                                  XOR     EAX,EAX
+   214 000001A4                                 L33:
+   215 000001A4 5B                                     POP     EBX
+   216 000001A5 5E                                     POP     ESI
+   217 000001A6 5F                                     POP     EDI
+   218 000001A7 5D                                     POP     EBP
+   219 000001A8 C3                                     RET
+   220 000001A9                                 L51:
+   221 000001A9 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   222 000001AC FF 46 0C                               INC     DWORD [12+ESI]
+   223 000001AF 01 46 08                               ADD     DWORD [8+ESI],EAX
+   224 000001B2 83 C8 FF                               OR      EAX,-1
+   225 000001B5 EB ED                                  JMP     L33
+   226 000001B7                                 L64:
+   227 000001B7 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   228 000001BA 89 44 DE 10                            MOV     DWORD [16+ESI+EBX*8],EAX
+   229 000001BE 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   230 000001C1 01 44 DE 14                            ADD     DWORD [20+ESI+EBX*8],EAX
+   231 000001C5 EB DB                                  JMP     L62
+   232 000001C7                                 L63:
+   233 000001C7 03 55 10                               ADD     EDX,DWORD [16+EBP]
+   234 000001CA 89 54 DE 0C                            MOV     DWORD [12+ESI+EBX*8],EDX
+   235 000001CE 3B 1E                                  CMP     EBX,DWORD [ESI]
+   236 000001D0 7D D0                                  JGE     L62
+   237 000001D2 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   238 000001D5 03 45 10                               ADD     EAX,DWORD [16+EBP]
+   239 000001D8 3B 44 DE 10                            CMP     EAX,DWORD [16+ESI+EBX*8]
+   240 000001DC 75 C4                                  JNE     L62
+   241 000001DE 03 54 DE 14                            ADD     EDX,DWORD [20+ESI+EBX*8]
+   242 000001E2 89 54 DE 0C                            MOV     DWORD [12+ESI+EBX*8],EDX
+   243 000001E6 8B 06                                  MOV     EAX,DWORD [ESI]
+   244 000001E8 48                                     DEC     EAX
+   245 000001E9 89 06                                  MOV     DWORD [ESI],EAX
+   246 000001EB 39 C3                                  CMP     EBX,EAX
+   247 000001ED 7D B3                                  JGE     L62
+   248 000001EF 89 C1                                  MOV     ECX,EAX
+   249 000001F1                                 L48:
+   250 000001F1 8B 44 DE 18                            MOV     EAX,DWORD [24+ESI+EBX*8]
+   251 000001F5 8B 54 DE 1C                            MOV     EDX,DWORD [28+ESI+EBX*8]
+   252 000001F9 89 44 DE 10                            MOV     DWORD [16+ESI+EBX*8],EAX
+   253 000001FD 89 54 DE 14                            MOV     DWORD [20+ESI+EBX*8],EDX
+   254 00000201 43                                     INC     EBX
+   255 00000202 39 CB                                  CMP     EBX,ECX
+   256 00000204 7C EB                                  JL      L48
+   257 00000206 EB 9A                                  JMP     L62
+   258 00000208                                        GLOBAL  _memman_alloc_4k
+   259 00000208                                 _memman_alloc_4k:
+   260 00000208 55                                     PUSH    EBP
+   261 00000209 89 E5                                  MOV     EBP,ESP
+   262 0000020B 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   263 0000020E 05 00000FFF                            ADD     EAX,4095
+   264 00000213 25 FFFFF000                            AND     EAX,-4096
+   265 00000218 89 45 0C                               MOV     DWORD [12+EBP],EAX
+   266 0000021B 5D                                     POP     EBP
+   267 0000021C E9 FFFFFE9E                            JMP     _memman_alloc
+   268 00000221                                        GLOBAL  _memman_free_4k
+   269 00000221                                 _memman_free_4k:
+   270 00000221 55                                     PUSH    EBP
+   271 00000222 89 E5                                  MOV     EBP,ESP
+   272 00000224 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   273 00000227 05 00000FFF                            ADD     EAX,4095
+   274 0000022C 25 FFFFF000                            AND     EAX,-4096
+   275 00000231 89 45 10                               MOV     DWORD [16+EBP],EAX
+   276 00000234 5D                                     POP     EBP
+   277 00000235 E9 FFFFFEE8                            JMP     _memman_free
diff --git a/haribote/mouse.c b/haribote/mouse.c
new file mode 100644 (file)
index 0000000..90351b6
--- /dev/null
@@ -0,0 +1,78 @@
+/* \83}\83E\83X\8aÖ\8cW */
+
+#include "bootpack.h"
+
+struct FIFO32 *mousefifo;
+int mousedata0;
+
+void inthandler2c(int *esp)
+/* PS/2\83}\83E\83X\82©\82ç\82Ì\8a\84\82è\8d\9e\82Ý */
+{
+       int data;
+       io_out8(PIC1_OCW2, 0x64);       /* IRQ-12\8eó\95t\8a®\97¹\82ðPIC1\82É\92Ê\92m */
+       io_out8(PIC0_OCW2, 0x62);       /* IRQ-02\8eó\95t\8a®\97¹\82ðPIC0\82É\92Ê\92m */
+       data = io_in8(PORT_KEYDAT);
+       fifo32_put(mousefifo, data + mousedata0);
+       return;
+}
+
+#define KEYCMD_SENDTO_MOUSE            0xd4
+#define MOUSECMD_ENABLE                        0xf4
+
+void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec)
+{
+       /* \8f\91\82«\8d\9e\82Ý\90æ\82ÌFIFO\83o\83b\83t\83@\82ð\8bL\89¯ */
+       mousefifo = fifo;
+       mousedata0 = data0;
+       /* \83}\83E\83X\97L\8cø */
+       wait_KBC_sendready();
+       io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
+       wait_KBC_sendready();
+       io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
+       /* \82¤\82Ü\82­\82¢\82­\82ÆACK(0xfa)\82ª\91\97\90M\82³\82ê\82Ä\82­\82é */
+       mdec->phase = 0; /* \83}\83E\83X\82Ì0xfa\82ð\91Ò\82Á\82Ä\82¢\82é\92i\8aK */
+       return;
+}
+
+int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
+{
+       if (mdec->phase == 0) {
+               /* \83}\83E\83X\82Ì0xfa\82ð\91Ò\82Á\82Ä\82¢\82é\92i\8aK */
+               if (dat == 0xfa) {
+                       mdec->phase = 1;
+               }
+               return 0;
+       }
+       if (mdec->phase == 1) {
+               /* \83}\83E\83X\82Ì1\83o\83C\83g\96Ú\82ð\91Ò\82Á\82Ä\82¢\82é\92i\8aK */
+               if ((dat & 0xc8) == 0x08) {
+                       /* \90³\82µ\82¢1\83o\83C\83g\96Ú\82¾\82Á\82½ */
+                       mdec->buf[0] = dat;
+                       mdec->phase = 2;
+               }
+               return 0;
+       }
+       if (mdec->phase == 2) {
+               /* \83}\83E\83X\82Ì2\83o\83C\83g\96Ú\82ð\91Ò\82Á\82Ä\82¢\82é\92i\8aK */
+               mdec->buf[1] = dat;
+               mdec->phase = 3;
+               return 0;
+       }
+       if (mdec->phase == 3) {
+               /* \83}\83E\83X\82Ì3\83o\83C\83g\96Ú\82ð\91Ò\82Á\82Ä\82¢\82é\92i\8aK */
+               mdec->buf[2] = dat;
+               mdec->phase = 1;
+               mdec->btn = mdec->buf[0] & 0x07;
+               mdec->x = mdec->buf[1];
+               mdec->y = mdec->buf[2];
+               if ((mdec->buf[0] & 0x10) != 0) {
+                       mdec->x |= 0xffffff00;
+               }
+               if ((mdec->buf[0] & 0x20) != 0) {
+                       mdec->y |= 0xffffff00;
+               }
+               mdec->y = - mdec->y; /* \83}\83E\83X\82Å\82Íy\95û\8cü\82Ì\95\84\8d\86\82ª\89æ\96Ê\82Æ\94½\91Π*/
+               return 1;
+       }
+       return -1; /* \82±\82±\82É\97\88\82é\82±\82Æ\82Í\82È\82¢\82Í\82¸ */
+}
diff --git a/haribote/mouse.gas b/haribote/mouse.gas
new file mode 100644 (file)
index 0000000..ab8ae3a
--- /dev/null
@@ -0,0 +1,131 @@
+       .file   "mouse.c"
+       .text
+       .balign 2
+.globl _inthandler2c
+       .def    _inthandler2c;  .scl    2;      .type   32;     .endef
+_inthandler2c:
+       pushl   %ebp
+       movl    %esp, %ebp
+       pushl   $100
+       pushl   $160
+       call    _io_out8
+       pushl   $98
+       pushl   $32
+       call    _io_out8
+       pushl   $96
+       call    _io_in8
+       addl    _mousedata0, %eax
+       pushl   %eax
+       pushl   _mousefifo
+       call    _fifo32_put
+       leave
+       ret
+       .balign 2
+.globl _enable_mouse
+       .def    _enable_mouse;  .scl    2;      .type   32;     .endef
+_enable_mouse:
+       pushl   %ebp
+       movl    %esp, %ebp
+       movl    8(%ebp), %eax
+       movl    %eax, _mousefifo
+       movl    12(%ebp), %eax
+       movl    %eax, _mousedata0
+       call    _wait_KBC_sendready
+       pushl   $212
+       pushl   $100
+       call    _io_out8
+       call    _wait_KBC_sendready
+       pushl   $244
+       pushl   $96
+       call    _io_out8
+       movl    16(%ebp), %eax
+       movb    $0, 3(%eax)
+       leave
+       ret
+       .balign 2
+.globl _mouse_decode
+       .def    _mouse_decode;  .scl    2;      .type   32;     .endef
+_mouse_decode:
+       pushl   %ebp
+       movl    %esp, %ebp
+       pushl   %esi
+       pushl   %ebx
+       movl    8(%ebp), %edx
+       movl    12(%ebp), %ecx
+       movl    %ecx, %esi
+       movb    3(%edx), %al
+       testb   %al, %al
+       jne     L4
+       cmpb    $-6, %cl
+       je      L13
+L12:
+       xorl    %eax, %eax
+L3:
+       popl    %ebx
+       popl    %esi
+       popl    %ebp
+       ret
+L13:
+       movb    $1, 3(%edx)
+       jmp     L12
+L4:
+       cmpb    $1, %al
+       je      L14
+       cmpb    $2, %al
+       je      L15
+       cmpb    $3, %al
+       je      L16
+       orl     $-1, %eax
+       jmp     L3
+L16:
+       movb    (%edx), %bl
+       andl    $255, %esi
+       movl    %ebx, %eax
+       movb    %cl, 2(%edx)
+       andl    $7, %eax
+       movl    %esi, 8(%edx)
+       movl    %eax, 12(%edx)
+       movb    %bl, %al
+       movzbl  1(%edx), %ecx
+       andl    $16, %eax
+       movl    %ecx, 4(%edx)
+       movb    $1, 3(%edx)
+       testb   %al, %al
+       je      L10
+       orl     $-256, %ecx
+       movl    %ecx, 4(%edx)
+L10:
+       andl    $32, %ebx
+       testb   %bl, %bl
+       je      L11
+       orl     $-256, 8(%edx)
+L11:
+       negl    8(%edx)
+       movl    $1, %eax
+       jmp     L3
+L15:
+       movb    %cl, 1(%edx)
+       movb    $3, 3(%edx)
+       jmp     L12
+L14:
+       andl    $-56, %esi
+       movl    %esi, %eax
+       cmpb    $8, %al
+       jne     L12
+       movb    %cl, (%edx)
+       movb    $2, 3(%edx)
+       jmp     L12
+.globl _mousefifo
+       .data
+       .balign 4
+_mousefifo:
+       .space 4
+.globl _mousedata0
+       .data
+       .balign 4
+_mousedata0:
+       .space 4
+       .def    _wait_KBC_sendready;    .scl    2;      .type   32;     .endef
+       .def    _fifo32_put;    .scl    2;      .type   32;     .endef
+       .def    _io_in8;        .scl    2;      .type   32;     .endef
+       .def    _io_out8;       .scl    2;      .type   32;     .endef
diff --git a/haribote/mouse.lst b/haribote/mouse.lst
new file mode 100644 (file)
index 0000000..8a94ffa
--- /dev/null
@@ -0,0 +1,130 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _io_out8
+     7 00000000                                        EXTERN  _io_in8
+     8 00000000                                        EXTERN  _fifo32_put
+     9 00000000                                        EXTERN  _wait_KBC_sendready
+    10 00000000                                 [FILE "mouse.c"]
+    11                                          [SECTION .text]
+    12 00000000                                        GLOBAL  _inthandler2c
+    13 00000000                                 _inthandler2c:
+    14 00000000 55                                     PUSH    EBP
+    15 00000001 89 E5                                  MOV     EBP,ESP
+    16 00000003 6A 64                                  PUSH    100
+    17 00000005 68 000000A0                            PUSH    160
+    18 0000000A E8 [00000000]                          CALL    _io_out8
+    19 0000000F 6A 62                                  PUSH    98
+    20 00000011 6A 20                                  PUSH    32
+    21 00000013 E8 [00000000]                          CALL    _io_out8
+    22 00000018 6A 60                                  PUSH    96
+    23 0000001A E8 [00000000]                          CALL    _io_in8
+    24 0000001F 03 05 [00000004]                       ADD     EAX,DWORD [_mousedata0]
+    25 00000025 50                                     PUSH    EAX
+    26 00000026 FF 35 [00000000]                       PUSH    DWORD [_mousefifo]
+    27 0000002C E8 [00000000]                          CALL    _fifo32_put
+    28 00000031 C9                                     LEAVE
+    29 00000032 C3                                     RET
+    30 00000033                                        GLOBAL  _enable_mouse
+    31 00000033                                 _enable_mouse:
+    32 00000033 55                                     PUSH    EBP
+    33 00000034 89 E5                                  MOV     EBP,ESP
+    34 00000036 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    35 00000039 A3 [00000000]                          MOV     DWORD [_mousefifo],EAX
+    36 0000003E 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+    37 00000041 A3 [00000004]                          MOV     DWORD [_mousedata0],EAX
+    38 00000046 E8 [00000000]                          CALL    _wait_KBC_sendready
+    39 0000004B 68 000000D4                            PUSH    212
+    40 00000050 6A 64                                  PUSH    100
+    41 00000052 E8 [00000000]                          CALL    _io_out8
+    42 00000057 E8 [00000000]                          CALL    _wait_KBC_sendready
+    43 0000005C 68 000000F4                            PUSH    244
+    44 00000061 6A 60                                  PUSH    96
+    45 00000063 E8 [00000000]                          CALL    _io_out8
+    46 00000068 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+    47 0000006B C6 40 03 00                            MOV     BYTE [3+EAX],0
+    48 0000006F C9                                     LEAVE
+    49 00000070 C3                                     RET
+    50 00000071                                        GLOBAL  _mouse_decode
+    51 00000071                                 _mouse_decode:
+    52 00000071 55                                     PUSH    EBP
+    53 00000072 89 E5                                  MOV     EBP,ESP
+    54 00000074 56                                     PUSH    ESI
+    55 00000075 53                                     PUSH    EBX
+    56 00000076 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+    57 00000079 8B 4D 0C                               MOV     ECX,DWORD [12+EBP]
+    58 0000007C 89 CE                                  MOV     ESI,ECX
+    59 0000007E 8A 42 03                               MOV     AL,BYTE [3+EDX]
+    60 00000081 84 C0                                  TEST    AL,AL
+    61 00000083 75 11                                  JNE     L4
+    62 00000085 80 F9 FA                               CMP     CL,-6
+    63 00000088 74 06                                  JE      L13
+    64 0000008A                                 L12:
+    65 0000008A 31 C0                                  XOR     EAX,EAX
+    66 0000008C                                 L3:
+    67 0000008C 5B                                     POP     EBX
+    68 0000008D 5E                                     POP     ESI
+    69 0000008E 5D                                     POP     EBP
+    70 0000008F C3                                     RET
+    71 00000090                                 L13:
+    72 00000090 C6 42 03 01                            MOV     BYTE [3+EDX],1
+    73 00000094 EB F4                                  JMP     L12
+    74 00000096                                 L4:
+    75 00000096 3C 01                                  CMP     AL,1
+    76 00000098 74 61                                  JE      L14
+    77 0000009A 3C 02                                  CMP     AL,2
+    78 0000009C 74 54                                  JE      L15
+    79 0000009E 3C 03                                  CMP     AL,3
+    80 000000A0 74 05                                  JE      L16
+    81 000000A2 83 C8 FF                               OR      EAX,-1
+    82 000000A5 EB E5                                  JMP     L3
+    83 000000A7                                 L16:
+    84 000000A7 8A 1A                                  MOV     BL,BYTE [EDX]
+    85 000000A9 81 E6 000000FF                         AND     ESI,255
+    86 000000AF 89 D8                                  MOV     EAX,EBX
+    87 000000B1 88 4A 02                               MOV     BYTE [2+EDX],CL
+    88 000000B4 83 E0 07                               AND     EAX,7
+    89 000000B7 89 72 08                               MOV     DWORD [8+EDX],ESI
+    90 000000BA 89 42 0C                               MOV     DWORD [12+EDX],EAX
+    91 000000BD 88 D8                                  MOV     AL,BL
+    92 000000BF 0F B6 4A 01                            MOVZX   ECX,BYTE [1+EDX]
+    93 000000C3 83 E0 10                               AND     EAX,16
+    94 000000C6 89 4A 04                               MOV     DWORD [4+EDX],ECX
+    95 000000C9 C6 42 03 01                            MOV     BYTE [3+EDX],1
+    96 000000CD 84 C0                                  TEST    AL,AL
+    97 000000CF 74 09                                  JE      L10
+    98 000000D1 81 C9 FFFFFF00                         OR      ECX,-256
+    99 000000D7 89 4A 04                               MOV     DWORD [4+EDX],ECX
+   100 000000DA                                 L10:
+   101 000000DA 83 E3 20                               AND     EBX,32
+   102 000000DD 84 DB                                  TEST    BL,BL
+   103 000000DF 74 07                                  JE      L11
+   104 000000E1 81 4A 08 FFFFFF00                      OR      DWORD [8+EDX],-256
+   105 000000E8                                 L11:
+   106 000000E8 F7 5A 08                               NEG     DWORD [8+EDX]
+   107 000000EB B8 00000001                            MOV     EAX,1
+   108 000000F0 EB 9A                                  JMP     L3
+   109 000000F2                                 L15:
+   110 000000F2 88 4A 01                               MOV     BYTE [1+EDX],CL
+   111 000000F5 C6 42 03 03                            MOV     BYTE [3+EDX],3
+   112 000000F9 EB 8F                                  JMP     L12
+   113 000000FB                                 L14:
+   114 000000FB 83 E6 C8                               AND     ESI,-56
+   115 000000FE 89 F0                                  MOV     EAX,ESI
+   116 00000100 3C 08                                  CMP     AL,8
+   117 00000102 75 86                                  JNE     L12
+   118 00000104 88 0A                                  MOV     BYTE [EDX],CL
+   119 00000106 C6 42 03 02                            MOV     BYTE [3+EDX],2
+   120 0000010A E9 FFFFFF7B                            JMP     L12
+   121 0000010F                                        GLOBAL  _mousefifo
+   122                                          [SECTION .data]
+   123 00000000                                        ALIGNB  4
+   124 00000000                                 _mousefifo:
+   125 00000000 00 00 00 00                            RESB    4
+   126 00000004                                        GLOBAL  _mousedata0
+   127                                          [SECTION .data]
+   128 00000004                                        ALIGNB  4
+   129 00000004                                 _mousedata0:
+   130 00000004 00 00 00 00                            RESB    4
diff --git a/haribote/mtask.c b/haribote/mtask.c
new file mode 100644 (file)
index 0000000..b338483
--- /dev/null
@@ -0,0 +1,203 @@
+/* \83}\83\8b\83`\83^\83X\83N\8aÖ\8cW */
+
+#include "bootpack.h"
+
+struct TASKCTL *taskctl;
+struct TIMER *task_timer;
+
+struct TASK *task_now(void)
+{
+       struct TASKLEVEL *tl = &taskctl->level[taskctl->now_lv];
+       return tl->tasks[tl->now];
+}
+
+void task_add(struct TASK *task)
+{
+       struct TASKLEVEL *tl = &taskctl->level[task->level];
+       tl->tasks[tl->running] = task;
+       tl->running++;
+       task->flags = 2; /* \93®\8dì\92\86 */
+       return;
+}
+
+void task_remove(struct TASK *task)
+{
+       int i;
+       struct TASKLEVEL *tl = &taskctl->level[task->level];
+
+       /* task\82ª\82Ç\82±\82É\82¢\82é\82©\82ð\92T\82· */
+       for (i = 0; i < tl->running; i++) {
+               if (tl->tasks[i] == task) {
+                       /* \82±\82±\82É\82¢\82½ */
+                       break;
+               }
+       }
+
+       tl->running--;
+       if (i < tl->now) {
+               tl->now--; /* \82¸\82ê\82é\82Ì\82Å\81A\82±\82ê\82à\82 \82í\82¹\82Ä\82¨\82­ */
+       }
+       if (tl->now >= tl->running) {
+               /* now\82ª\82¨\82©\82µ\82È\92l\82É\82È\82Á\82Ä\82¢\82½\82ç\81A\8fC\90³\82·\82é */
+               tl->now = 0;
+       }
+       task->flags = 1; /* \83X\83\8a\81[\83v\92\86 */
+
+       /* \82¸\82ç\82µ */
+       for (; i < tl->running; i++) {
+               tl->tasks[i] = tl->tasks[i + 1];
+       }
+
+       return;
+}
+
+void task_switchsub(void)
+{
+       int i;
+       /* \88ê\94Ô\8fã\82Ì\83\8c\83x\83\8b\82ð\92T\82· */
+       for (i = 0; i < MAX_TASKLEVELS; i++) {
+               if (taskctl->level[i].running > 0) {
+                       break; /* \8c©\82Â\82©\82Á\82½ */
+               }
+       }
+       taskctl->now_lv = i;
+       taskctl->lv_change = 0;
+       return;
+}
+
+void task_idle(void)
+{
+       for (;;) {
+               io_hlt();
+       }
+}
+
+struct TASK *task_init(struct MEMMAN *memman)
+{
+       int i;
+       struct TASK *task, *idle;
+       struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
+
+       taskctl = (struct TASKCTL *) memman_alloc_4k(memman, sizeof (struct TASKCTL));
+       for (i = 0; i < MAX_TASKS; i++) {
+               taskctl->tasks0[i].flags = 0;
+               taskctl->tasks0[i].sel = (TASK_GDT0 + i) * 8;
+               taskctl->tasks0[i].tss.ldtr = (TASK_GDT0 + MAX_TASKS + i) * 8;
+               set_segmdesc(gdt + TASK_GDT0 + i, 103, (int) &taskctl->tasks0[i].tss, AR_TSS32);
+               set_segmdesc(gdt + TASK_GDT0 + MAX_TASKS + i, 15, (int) taskctl->tasks0[i].ldt, AR_LDT);
+       }
+       for (i = 0; i < MAX_TASKLEVELS; i++) {
+               taskctl->level[i].running = 0;
+               taskctl->level[i].now = 0;
+       }
+
+       task = task_alloc();
+       task->flags = 2;        /* \93®\8dì\92\86\83}\81[\83N */
+       task->priority = 2; /* 0.02\95b */
+       task->level = 0;        /* \8dÅ\8d\82\83\8c\83x\83\8b */
+       task_add(task);
+       task_switchsub();       /* \83\8c\83x\83\8b\90Ý\92è */
+       load_tr(task->sel);
+       task_timer = timer_alloc();
+       timer_settime(task_timer, task->priority);
+
+       idle = task_alloc();
+       idle->tss.esp = memman_alloc_4k(memman, 64 * 1024) + 64 * 1024;
+       idle->tss.eip = (int) &task_idle;
+       idle->tss.es = 1 * 8;
+       idle->tss.cs = 2 * 8;
+       idle->tss.ss = 1 * 8;
+       idle->tss.ds = 1 * 8;
+       idle->tss.fs = 1 * 8;
+       idle->tss.gs = 1 * 8;
+       task_run(idle, MAX_TASKLEVELS - 1, 1);
+
+       return task;
+}
+
+struct TASK *task_alloc(void)
+{
+       int i;
+       struct TASK *task;
+       for (i = 0; i < MAX_TASKS; i++) {
+               if (taskctl->tasks0[i].flags == 0) {
+                       task = &taskctl->tasks0[i];
+                       task->flags = 1; /* \8eg\97p\92\86\83}\81[\83N */
+                       task->tss.eflags = 0x00000202; /* IF = 1; */
+                       task->tss.eax = 0; /* \82Æ\82è\82 \82¦\82¸0\82É\82µ\82Ä\82¨\82­\82±\82Æ\82É\82·\82é */
+                       task->tss.ecx = 0;
+                       task->tss.edx = 0;
+                       task->tss.ebx = 0;
+                       task->tss.ebp = 0;
+                       task->tss.esi = 0;
+                       task->tss.edi = 0;
+                       task->tss.es = 0;
+                       task->tss.ds = 0;
+                       task->tss.fs = 0;
+                       task->tss.gs = 0;
+                       task->tss.iomap = 0x40000000;
+                       task->tss.ss0 = 0;
+                       return task;
+               }
+       }
+       return 0; /* \82à\82¤\91S\95\94\8eg\97p\92\86 */
+}
+
+void task_run(struct TASK *task, int level, int priority)
+{
+       if (level < 0) {
+               level = task->level; /* \83\8c\83x\83\8b\82ð\95Ï\8dX\82µ\82È\82¢ */
+       }
+       if (priority > 0) {
+               task->priority = priority;
+       }
+
+       if (task->flags == 2 && task->level != level) { /* \93®\8dì\92\86\82Ì\83\8c\83x\83\8b\82Ì\95Ï\8dX */
+               task_remove(task); /* \82±\82ê\82ð\8eÀ\8ds\82·\82é\82Æflags\82Í1\82É\82È\82é\82Ì\82Å\89º\82Ìif\82à\8eÀ\8ds\82³\82ê\82é */
+       }
+       if (task->flags != 2) {
+               /* \83X\83\8a\81[\83v\82©\82ç\8bN\82±\82³\82ê\82é\8fê\8d\87 */
+               task->level = level;
+               task_add(task);
+       }
+
+       taskctl->lv_change = 1; /* \8e\9f\89ñ\83^\83X\83N\83X\83C\83b\83`\82Ì\82Æ\82«\82É\83\8c\83x\83\8b\82ð\8c©\92¼\82· */
+       return;
+}
+
+void task_sleep(struct TASK *task)
+{
+       struct TASK *now_task;
+       if (task->flags == 2) {
+               /* \93®\8dì\92\86\82¾\82Á\82½\82ç */
+               now_task = task_now();
+               task_remove(task); /* \82±\82ê\82ð\8eÀ\8ds\82·\82é\82Æflags\82Í1\82É\82È\82é */
+               if (task == now_task) {
+                       /* \8e©\95ª\8e©\90g\82Ì\83X\83\8a\81[\83v\82¾\82Á\82½\82Ì\82Å\81A\83^\83X\83N\83X\83C\83b\83`\82ª\95K\97v */
+                       task_switchsub();
+                       now_task = task_now(); /* \90Ý\92è\8cã\82Å\82Ì\81A\81u\8c»\8dÝ\82Ì\83^\83X\83N\81v\82ð\8b³\82¦\82Ä\82à\82ç\82¤ */
+                       farjmp(0, now_task->sel);
+               }
+       }
+       return;
+}
+
+void task_switch(void)
+{
+       struct TASKLEVEL *tl = &taskctl->level[taskctl->now_lv];
+       struct TASK *new_task, *now_task = tl->tasks[tl->now];
+       tl->now++;
+       if (tl->now == tl->running) {
+               tl->now = 0;
+       }
+       if (taskctl->lv_change != 0) {
+               task_switchsub();
+               tl = &taskctl->level[taskctl->now_lv];
+       }
+       new_task = tl->tasks[tl->now];
+       timer_settime(task_timer, new_task->priority);
+       if (new_task != now_task) {
+               farjmp(0, new_task->sel);
+       }
+       return;
+}
diff --git a/haribote/mtask.lst b/haribote/mtask.lst
new file mode 100644 (file)
index 0000000..6df5b1e
--- /dev/null
@@ -0,0 +1,380 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _io_hlt
+     7 00000000                                        EXTERN  _memman_alloc_4k
+     8 00000000                                        EXTERN  _set_segmdesc
+     9 00000000                                        EXTERN  _load_tr
+    10 00000000                                        EXTERN  _timer_alloc
+    11 00000000                                        EXTERN  _timer_settime
+    12 00000000                                        EXTERN  _farjmp
+    13 00000000                                 [FILE "mtask.c"]
+    14                                          [SECTION .text]
+    15 00000000                                        GLOBAL  _task_now
+    16 00000000                                 _task_now:
+    17 00000000 A1 [00000000]                          MOV     EAX,DWORD [_taskctl]
+    18 00000005 55                                     PUSH    EBP
+    19 00000006 89 E5                                  MOV     EBP,ESP
+    20 00000008 5D                                     POP     EBP
+    21 00000009 8B 10                                  MOV     EDX,DWORD [EAX]
+    22 0000000B 69 D2 00000198                         IMUL    EDX,EDX,408
+    23 00000011 8D 44 02 08                            LEA     EAX,DWORD [8+EDX+EAX*1]
+    24 00000015 8B 50 04                               MOV     EDX,DWORD [4+EAX]
+    25 00000018 8B 44 90 08                            MOV     EAX,DWORD [8+EAX+EDX*4]
+    26 0000001C C3                                     RET
+    27 0000001D                                        GLOBAL  _task_add
+    28 0000001D                                 _task_add:
+    29 0000001D 55                                     PUSH    EBP
+    30 0000001E 89 E5                                  MOV     EBP,ESP
+    31 00000020 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+    32 00000023 8B 51 08                               MOV     EDX,DWORD [8+ECX]
+    33 00000026 69 D2 00000198                         IMUL    EDX,EDX,408
+    34 0000002C 03 15 [00000000]                       ADD     EDX,DWORD [_taskctl]
+    35 00000032 8B 42 08                               MOV     EAX,DWORD [8+EDX]
+    36 00000035 89 4C 82 10                            MOV     DWORD [16+EDX+EAX*4],ECX
+    37 00000039 40                                     INC     EAX
+    38 0000003A 89 42 08                               MOV     DWORD [8+EDX],EAX
+    39 0000003D C7 41 04 00000002                      MOV     DWORD [4+ECX],2
+    40 00000044 5D                                     POP     EBP
+    41 00000045 C3                                     RET
+    42 00000046                                        GLOBAL  _task_remove
+    43 00000046                                 _task_remove:
+    44 00000046 55                                     PUSH    EBP
+    45 00000047 31 C9                                  XOR     ECX,ECX
+    46 00000049 89 E5                                  MOV     EBP,ESP
+    47 0000004B 53                                     PUSH    EBX
+    48 0000004C 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+    49 0000004F 8B 43 08                               MOV     EAX,DWORD [8+EBX]
+    50 00000052 69 C0 00000198                         IMUL    EAX,EAX,408
+    51 00000058 03 05 [00000000]                       ADD     EAX,DWORD [_taskctl]
+    52 0000005E 8D 50 08                               LEA     EDX,DWORD [8+EAX]
+    53 00000061 3B 48 08                               CMP     ECX,DWORD [8+EAX]
+    54 00000064 7D 0B                                  JGE     L5
+    55 00000066                                 L9:
+    56 00000066 39 5C 8A 08                            CMP     DWORD [8+EDX+ECX*4],EBX
+    57 0000006A 74 05                                  JE      L5
+    58 0000006C 41                                     INC     ECX
+    59 0000006D 3B 0A                                  CMP     ECX,DWORD [EDX]
+    60 0000006F 7C F5                                  JL      L9
+    61 00000071                                 L5:
+    62 00000071 8B 42 04                               MOV     EAX,DWORD [4+EDX]
+    63 00000074 FF 0A                                  DEC     DWORD [EDX]
+    64 00000076 39 C1                                  CMP     ECX,EAX
+    65 00000078 7D 04                                  JGE     L10
+    66 0000007A 48                                     DEC     EAX
+    67 0000007B 89 42 04                               MOV     DWORD [4+EDX],EAX
+    68 0000007E                                 L10:
+    69 0000007E 8B 02                                  MOV     EAX,DWORD [EDX]
+    70 00000080 39 42 04                               CMP     DWORD [4+EDX],EAX
+    71 00000083 7C 07                                  JL      L11
+    72 00000085 C7 42 04 00000000                      MOV     DWORD [4+EDX],0
+    73 0000008C                                 L11:
+    74 0000008C C7 43 04 00000001                      MOV     DWORD [4+EBX],1
+    75 00000093 8B 1A                                  MOV     EBX,DWORD [EDX]
+    76 00000095 39 D9                                  CMP     ECX,EBX
+    77 00000097 7D 0D                                  JGE     L19
+    78 00000099                                 L16:
+    79 00000099 8B 44 8A 0C                            MOV     EAX,DWORD [12+EDX+ECX*4]
+    80 0000009D 89 44 8A 08                            MOV     DWORD [8+EDX+ECX*4],EAX
+    81 000000A1 41                                     INC     ECX
+    82 000000A2 39 D9                                  CMP     ECX,EBX
+    83 000000A4 7C F3                                  JL      L16
+    84 000000A6                                 L19:
+    85 000000A6 5B                                     POP     EBX
+    86 000000A7 5D                                     POP     EBP
+    87 000000A8 C3                                     RET
+    88 000000A9                                        GLOBAL  _task_switchsub
+    89 000000A9                                 _task_switchsub:
+    90 000000A9 55                                     PUSH    EBP
+    91 000000AA 31 C9                                  XOR     ECX,ECX
+    92 000000AC 89 E5                                  MOV     EBP,ESP
+    93 000000AE A1 [00000000]                          MOV     EAX,DWORD [_taskctl]
+    94 000000B3 31 D2                                  XOR     EDX,EDX
+    95 000000B5                                 L26:
+    96 000000B5 83 7C 10 08 00                         CMP     DWORD [8+EAX+EDX*1],0
+    97 000000BA 7F 0C                                  JG      L22
+    98 000000BC 41                                     INC     ECX
+    99 000000BD 81 C2 00000198                         ADD     EDX,408
+   100 000000C3 83 F9 09                               CMP     ECX,9
+   101 000000C6 7E ED                                  JLE     L26
+   102 000000C8                                 L22:
+   103 000000C8 89 08                                  MOV     DWORD [EAX],ECX
+   104 000000CA C6 40 04 00                            MOV     BYTE [4+EAX],0
+   105 000000CE 5D                                     POP     EBP
+   106 000000CF C3                                     RET
+   107 000000D0                                        GLOBAL  _task_idle
+   108 000000D0                                 _task_idle:
+   109 000000D0 55                                     PUSH    EBP
+   110 000000D1 89 E5                                  MOV     EBP,ESP
+   111 000000D3                                 L29:
+   112 000000D3 E8 [00000000]                          CALL    _io_hlt
+   113 000000D8 EB F9                                  JMP     L29
+   114 000000DA                                        GLOBAL  _task_init
+   115 000000DA                                 _task_init:
+   116 000000DA 55                                     PUSH    EBP
+   117 000000DB 89 E5                                  MOV     EBP,ESP
+   118 000000DD 57                                     PUSH    EDI
+   119 000000DE 56                                     PUSH    ESI
+   120 000000DF 31 FF                                  XOR     EDI,EDI
+   121 000000E1 53                                     PUSH    EBX
+   122 000000E2 31 F6                                  XOR     ESI,ESI
+   123 000000E4 68 0002FDF8                            PUSH    196088
+   124 000000E9 BB 000003E7                            MOV     EBX,999
+   125 000000EE FF 75 08                               PUSH    DWORD [8+EBP]
+   126 000000F1 E8 [00000000]                          CALL    _memman_alloc_4k
+   127 000000F6 A3 [00000000]                          MOV     DWORD [_taskctl],EAX
+   128 000000FB 58                                     POP     EAX
+   129 000000FC 5A                                     POP     EDX
+   130 000000FD                                 L37:
+   131 000000FD 89 FA                                  MOV     EDX,EDI
+   132 000000FF 8D 46 18                               LEA     EAX,DWORD [24+ESI]
+   133 00000102 03 15 [00000000]                       ADD     EDX,DWORD [_taskctl]
+   134 00000108 89 82 00000FF8                         MOV     DWORD [4088+EDX],EAX
+   135 0000010E 8D 86 00001F58                         LEA     EAX,DWORD [8024+ESI]
+   136 00000114 89 82 00001084                         MOV     DWORD [4228+EDX],EAX
+   137 0000011A 8D 86 00270018                         LEA     EAX,DWORD [2555928+ESI]
+   138 00000120 C7 82 00000FFC 00000000                MOV     DWORD [4092+EDX],0
+   139 0000012A 68 00000089                            PUSH    137
+   140 0000012F 81 C2 00001024                         ADD     EDX,4132
+   141 00000135 52                                     PUSH    EDX
+   142 00000136 6A 67                                  PUSH    103
+   143 00000138 50                                     PUSH    EAX
+   144 00000139 E8 [00000000]                          CALL    _set_segmdesc
+   145 0000013E A1 [00000000]                          MOV     EAX,DWORD [_taskctl]
+   146 00000143 01 F8                                  ADD     EAX,EDI
+   147 00000145 68 00000082                            PUSH    130
+   148 0000014A 05 0000108C                            ADD     EAX,4236
+   149 0000014F 81 C7 000000C0                         ADD     EDI,192
+   150 00000155 50                                     PUSH    EAX
+   151 00000156 8D 86 00271F58                         LEA     EAX,DWORD [2563928+ESI]
+   152 0000015C 6A 0F                                  PUSH    15
+   153 0000015E 83 C6 08                               ADD     ESI,8
+   154 00000161 50                                     PUSH    EAX
+   155 00000162 E8 [00000000]                          CALL    _set_segmdesc
+   156 00000167 83 C4 20                               ADD     ESP,32
+   157 0000016A 4B                                     DEC     EBX
+   158 0000016B 79 90                                  JNS     L37
+   159 0000016D 8B 0D [00000000]                       MOV     ECX,DWORD [_taskctl]
+   160 00000173 31 D2                                  XOR     EDX,EDX
+   161 00000175 BB 00000009                            MOV     EBX,9
+   162 0000017A                                 L42:
+   163 0000017A 8D 04 11                               LEA     EAX,DWORD [ECX+EDX*1]
+   164 0000017D 81 C2 00000198                         ADD     EDX,408
+   165 00000183 4B                                     DEC     EBX
+   166 00000184 C7 40 08 00000000                      MOV     DWORD [8+EAX],0
+   167 0000018B C7 40 0C 00000000                      MOV     DWORD [12+EAX],0
+   168 00000192 79 E6                                  JNS     L42
+   169 00000194 E8 000000A6                            CALL    _task_alloc
+   170 00000199 89 C6                                  MOV     ESI,EAX
+   171 0000019B C7 40 04 00000002                      MOV     DWORD [4+EAX],2
+   172 000001A2 C7 40 0C 00000002                      MOV     DWORD [12+EAX],2
+   173 000001A9 C7 40 08 00000000                      MOV     DWORD [8+EAX],0
+   174 000001B0 50                                     PUSH    EAX
+   175 000001B1 E8 FFFFFE67                            CALL    _task_add
+   176 000001B6 E8 FFFFFEEE                            CALL    _task_switchsub
+   177 000001BB FF 36                                  PUSH    DWORD [ESI]
+   178 000001BD E8 [00000000]                          CALL    _load_tr
+   179 000001C2 E8 [00000000]                          CALL    _timer_alloc
+   180 000001C7 FF 76 0C                               PUSH    DWORD [12+ESI]
+   181 000001CA 50                                     PUSH    EAX
+   182 000001CB A3 [00000004]                          MOV     DWORD [_task_timer],EAX
+   183 000001D0 E8 [00000000]                          CALL    _timer_settime
+   184 000001D5 E8 00000065                            CALL    _task_alloc
+   185 000001DA 68 00010000                            PUSH    65536
+   186 000001DF FF 75 08                               PUSH    DWORD [8+EBP]
+   187 000001E2 89 C3                                  MOV     EBX,EAX
+   188 000001E4 E8 [00000000]                          CALL    _memman_alloc_4k
+   189 000001E9 05 00010000                            ADD     EAX,65536
+   190 000001EE 89 43 64                               MOV     DWORD [100+EBX],EAX
+   191 000001F1 C7 43 4C [000000D0]                    MOV     DWORD [76+EBX],_task_idle
+   192 000001F8 C7 43 74 00000008                      MOV     DWORD [116+EBX],8
+   193 000001FF C7 43 78 00000010                      MOV     DWORD [120+EBX],16
+   194 00000206 C7 43 7C 00000008                      MOV     DWORD [124+EBX],8
+   195 0000020D C7 83 00000080 00000008                MOV     DWORD [128+EBX],8
+   196 00000217 C7 83 00000084 00000008                MOV     DWORD [132+EBX],8
+   197 00000221 C7 83 00000088 00000008                MOV     DWORD [136+EBX],8
+   198 0000022B 6A 01                                  PUSH    1
+   199 0000022D 6A 09                                  PUSH    9
+   200 0000022F 53                                     PUSH    EBX
+   201 00000230 E8 000000B4                            CALL    _task_run
+   202 00000235 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   203 00000238 5B                                     POP     EBX
+   204 00000239 89 F0                                  MOV     EAX,ESI
+   205 0000023B 5E                                     POP     ESI
+   206 0000023C 5F                                     POP     EDI
+   207 0000023D 5D                                     POP     EBP
+   208 0000023E C3                                     RET
+   209 0000023F                                        GLOBAL  _task_alloc
+   210 0000023F                                 _task_alloc:
+   211 0000023F 55                                     PUSH    EBP
+   212 00000240 31 C9                                  XOR     ECX,ECX
+   213 00000242 89 E5                                  MOV     EBP,ESP
+   214 00000244 31 D2                                  XOR     EDX,EDX
+   215 00000246                                 L53:
+   216 00000246 89 D0                                  MOV     EAX,EDX
+   217 00000248 03 05 [00000000]                       ADD     EAX,DWORD [_taskctl]
+   218 0000024E 83 B8 00000FFC 00                      CMP     DWORD [4092+EAX],0
+   219 00000255 74 13                                  JE      L56
+   220 00000257 41                                     INC     ECX
+   221 00000258 81 C2 000000C0                         ADD     EDX,192
+   222 0000025E 81 F9 000003E7                         CMP     ECX,999
+   223 00000264 7E E0                                  JLE     L53
+   224 00000266 31 C0                                  XOR     EAX,EAX
+   225 00000268                                 L47:
+   226 00000268 5D                                     POP     EBP
+   227 00000269 C3                                     RET
+   228 0000026A                                 L56:
+   229 0000026A 05 00000FF8                            ADD     EAX,4088
+   230 0000026F C7 40 04 00000001                      MOV     DWORD [4+EAX],1
+   231 00000276 C7 40 50 00000202                      MOV     DWORD [80+EAX],514
+   232 0000027D C7 40 54 00000000                      MOV     DWORD [84+EAX],0
+   233 00000284 C7 40 58 00000000                      MOV     DWORD [88+EAX],0
+   234 0000028B C7 40 5C 00000000                      MOV     DWORD [92+EAX],0
+   235 00000292 C7 40 60 00000000                      MOV     DWORD [96+EAX],0
+   236 00000299 C7 40 68 00000000                      MOV     DWORD [104+EAX],0
+   237 000002A0 C7 40 6C 00000000                      MOV     DWORD [108+EAX],0
+   238 000002A7 C7 40 70 00000000                      MOV     DWORD [112+EAX],0
+   239 000002AE C7 40 74 00000000                      MOV     DWORD [116+EAX],0
+   240 000002B5 C7 80 00000080 00000000                MOV     DWORD [128+EAX],0
+   241 000002BF C7 80 00000084 00000000                MOV     DWORD [132+EAX],0
+   242 000002C9 C7 80 00000088 00000000                MOV     DWORD [136+EAX],0
+   243 000002D3 C7 80 00000090 40000000                MOV     DWORD [144+EAX],1073741824
+   244 000002DD C7 40 34 00000000                      MOV     DWORD [52+EAX],0
+   245 000002E4 E9 FFFFFF7F                            JMP     L47
+   246 000002E9                                        GLOBAL  _task_run
+   247 000002E9                                 _task_run:
+   248 000002E9 55                                     PUSH    EBP
+   249 000002EA 89 E5                                  MOV     EBP,ESP
+   250 000002EC 56                                     PUSH    ESI
+   251 000002ED 53                                     PUSH    EBX
+   252 000002EE 8B 75 0C                               MOV     ESI,DWORD [12+EBP]
+   253 000002F1 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   254 000002F4 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   255 000002F7 85 F6                                  TEST    ESI,ESI
+   256 000002F9 78 3B                                  JS      L62
+   257 000002FB                                 L58:
+   258 000002FB 85 C0                                  TEST    EAX,EAX
+   259 000002FD 7E 03                                  JLE     L59
+   260 000002FF 89 43 0C                               MOV     DWORD [12+EBX],EAX
+   261 00000302                                 L59:
+   262 00000302 83 7B 04 02                            CMP     DWORD [4+EBX],2
+   263 00000306 74 20                                  JE      L63
+   264 00000308                                 L60:
+   265 00000308 83 7B 04 02                            CMP     DWORD [4+EBX],2
+   266 0000030C 74 0A                                  JE      L61
+   267 0000030E 89 73 08                               MOV     DWORD [8+EBX],ESI
+   268 00000311 53                                     PUSH    EBX
+   269 00000312 E8 FFFFFD06                            CALL    _task_add
+   270 00000317 59                                     POP     ECX
+   271 00000318                                 L61:
+   272 00000318 A1 [00000000]                          MOV     EAX,DWORD [_taskctl]
+   273 0000031D C6 40 04 01                            MOV     BYTE [4+EAX],1
+   274 00000321 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   275 00000324 5B                                     POP     EBX
+   276 00000325 5E                                     POP     ESI
+   277 00000326 5D                                     POP     EBP
+   278 00000327 C3                                     RET
+   279 00000328                                 L63:
+   280 00000328 39 73 08                               CMP     DWORD [8+EBX],ESI
+   281 0000032B 74 DB                                  JE      L60
+   282 0000032D 53                                     PUSH    EBX
+   283 0000032E E8 FFFFFD13                            CALL    _task_remove
+   284 00000333 58                                     POP     EAX
+   285 00000334 EB D2                                  JMP     L60
+   286 00000336                                 L62:
+   287 00000336 8B 73 08                               MOV     ESI,DWORD [8+EBX]
+   288 00000339 EB C0                                  JMP     L58
+   289 0000033B                                        GLOBAL  _task_sleep
+   290 0000033B                                 _task_sleep:
+   291 0000033B 55                                     PUSH    EBP
+   292 0000033C 89 E5                                  MOV     EBP,ESP
+   293 0000033E 56                                     PUSH    ESI
+   294 0000033F 53                                     PUSH    EBX
+   295 00000340 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   296 00000343 83 7E 04 02                            CMP     DWORD [4+ESI],2
+   297 00000347 74 07                                  JE      L67
+   298 00000349                                 L64:
+   299 00000349 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   300 0000034C 5B                                     POP     EBX
+   301 0000034D 5E                                     POP     ESI
+   302 0000034E 5D                                     POP     EBP
+   303 0000034F C3                                     RET
+   304 00000350                                 L67:
+   305 00000350 E8 FFFFFCAB                            CALL    _task_now
+   306 00000355 56                                     PUSH    ESI
+   307 00000356 89 C3                                  MOV     EBX,EAX
+   308 00000358 E8 FFFFFCE9                            CALL    _task_remove
+   309 0000035D 59                                     POP     ECX
+   310 0000035E 39 DE                                  CMP     ESI,EBX
+   311 00000360 75 E7                                  JNE     L64
+   312 00000362 E8 FFFFFD42                            CALL    _task_switchsub
+   313 00000367 E8 FFFFFC94                            CALL    _task_now
+   314 0000036C FF 30                                  PUSH    DWORD [EAX]
+   315 0000036E 6A 00                                  PUSH    0
+   316 00000370 E8 [00000000]                          CALL    _farjmp
+   317 00000375 58                                     POP     EAX
+   318 00000376 5A                                     POP     EDX
+   319 00000377 EB D0                                  JMP     L64
+   320 00000379                                        GLOBAL  _task_switch
+   321 00000379                                 _task_switch:
+   322 00000379 55                                     PUSH    EBP
+   323 0000037A 89 E5                                  MOV     EBP,ESP
+   324 0000037C 56                                     PUSH    ESI
+   325 0000037D 53                                     PUSH    EBX
+   326 0000037E 8B 1D [00000000]                       MOV     EBX,DWORD [_taskctl]
+   327 00000384 8B 13                                  MOV     EDX,DWORD [EBX]
+   328 00000386 69 D2 00000198                         IMUL    EDX,EDX,408
+   329 0000038C 8D 14 1A                               LEA     EDX,DWORD [EDX+EBX*1]
+   330 0000038F 8D 4A 08                               LEA     ECX,DWORD [8+EDX]
+   331 00000392 8B 41 04                               MOV     EAX,DWORD [4+ECX]
+   332 00000395 8B 74 81 08                            MOV     ESI,DWORD [8+ECX+EAX*4]
+   333 00000399 40                                     INC     EAX
+   334 0000039A 89 41 04                               MOV     DWORD [4+ECX],EAX
+   335 0000039D 3B 42 08                               CMP     EAX,DWORD [8+EDX]
+   336 000003A0 74 4C                                  JE      L72
+   337 000003A2                                 L69:
+   338 000003A2 80 7B 04 00                            CMP     BYTE [4+EBX],0
+   339 000003A6 75 2D                                  JNE     L73
+   340 000003A8                                 L70:
+   341 000003A8 8B 41 04                               MOV     EAX,DWORD [4+ECX]
+   342 000003AB 8B 5C 81 08                            MOV     EBX,DWORD [8+ECX+EAX*4]
+   343 000003AF FF 73 0C                               PUSH    DWORD [12+EBX]
+   344 000003B2 FF 35 [00000004]                       PUSH    DWORD [_task_timer]
+   345 000003B8 E8 [00000000]                          CALL    _timer_settime
+   346 000003BD 39 F3                                  CMP     EBX,ESI
+   347 000003BF 58                                     POP     EAX
+   348 000003C0 5A                                     POP     EDX
+   349 000003C1 74 0B                                  JE      L68
+   350 000003C3 FF 33                                  PUSH    DWORD [EBX]
+   351 000003C5 6A 00                                  PUSH    0
+   352 000003C7 E8 [00000000]                          CALL    _farjmp
+   353 000003CC 5B                                     POP     EBX
+   354 000003CD 5E                                     POP     ESI
+   355 000003CE                                 L68:
+   356 000003CE 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   357 000003D1 5B                                     POP     EBX
+   358 000003D2 5E                                     POP     ESI
+   359 000003D3 5D                                     POP     EBP
+   360 000003D4 C3                                     RET
+   361 000003D5                                 L73:
+   362 000003D5 E8 FFFFFCCF                            CALL    _task_switchsub
+   363 000003DA 8B 15 [00000000]                       MOV     EDX,DWORD [_taskctl]
+   364 000003E0 8B 02                                  MOV     EAX,DWORD [EDX]
+   365 000003E2 69 C0 00000198                         IMUL    EAX,EAX,408
+   366 000003E8 8D 4C 10 08                            LEA     ECX,DWORD [8+EAX+EDX*1]
+   367 000003EC EB BA                                  JMP     L70
+   368 000003EE                                 L72:
+   369 000003EE C7 41 04 00000000                      MOV     DWORD [4+ECX],0
+   370 000003F5 EB AB                                  JMP     L69
+   371 000003F7                                        GLOBAL  _taskctl
+   372                                          [SECTION .data]
+   373 00000000                                        ALIGNB  4
+   374 00000000                                 _taskctl:
+   375 00000000 00 00 00 00                            RESB    4
+   376 00000004                                        GLOBAL  _task_timer
+   377                                          [SECTION .data]
+   378 00000004                                        ALIGNB  4
+   379 00000004                                 _task_timer:
+   380 00000004 00 00 00 00                            RESB    4
diff --git a/haribote/naskfunc.asm b/haribote/naskfunc.asm
new file mode 100644 (file)
index 0000000..2453a1a
--- /dev/null
@@ -0,0 +1,392 @@
+; naskfunc
+; TAB=4
+
+;[FORMAT "WCOFF"]                              ; \83I\83u\83W\83F\83N\83g\83t\83@\83C\83\8b\82ð\8dì\82é\83\82\81[\83h      
+;[INSTRSET "i486p"]                            ; 486\82Ì\96½\97ß\82Ü\82Å\8eg\82¢\82½\82¢\82Æ\82¢\82¤\8bL\8fq
+[BITS 32]                                              ; 32\83r\83b\83g\83\82\81[\83h\97p\82Ì\8b@\8aB\8cê\82ð\8dì\82ç\82¹\82é
+;[FILE "naskfunc.nas"]                 ; \83\\81[\83X\83t\83@\83C\83\8b\96¼\8fî\95ñ
+
+               GLOBAL  _io_hlt, _io_cli, _io_sti, _io_stihlt
+               GLOBAL  _io_in8,  _io_in16,  _io_in32
+               GLOBAL  _io_out8, _io_out16, _io_out32
+               GLOBAL  _io_load_eflags, _io_store_eflags
+               GLOBAL  _load_gdtr, _load_idtr
+               GLOBAL  _load_cr0, _store_cr0
+               GLOBAL  _load_cr3, _store_cr3
+               GLOBAL  _load_tr
+               GLOBAL  _asm_inthandler20, _asm_inthandler21
+               GLOBAL  _asm_inthandler2c, _asm_inthandler0c
+               GLOBAL  _asm_inthandler0d, _asm_end_app
+               GLOBAL _asm_inthandler0e, _asm_inthandler0a, _asm_inthandler0b, _asm_inthandler00
+               GLOBAL  _memtest_sub
+               GLOBAL  _farjmp, _farcall
+               GLOBAL  _asm_hrb_api, _start_app
+               EXTERN  _inthandler20, _inthandler21
+               EXTERN  _inthandler2c, _inthandler0d
+               EXTERN  _inthandler0c, _inthandler0a, _inthandler0b, _inthandler00
+               EXTERN _inthandler0e
+               EXTERN  _hrb_api
+               GLOBAL  __Unwind_Resume, ___gxx_personality_v0
+               GLOBAL  ___chkstk
+
+[SECTION .text]
+
+_io_hlt:       ; void io_hlt(void);
+               HLT
+               RET
+
+_io_cli:       ; void io_cli(void);
+               CLI
+               RET
+
+_io_sti:       ; void io_sti(void);
+               STI
+               RET
+
+_io_stihlt:    ; void io_stihlt(void);
+               STI
+               HLT
+               RET
+
+_io_in8:       ; int io_in8(int port);
+               MOV             EDX,[ESP+4]             ; port
+               MOV             EAX,0
+               IN              AL,DX
+               RET
+
+_io_in16:      ; int io_in16(int port);
+               MOV             EDX,[ESP+4]             ; port
+               MOV             EAX,0
+               IN              AX,DX
+               RET
+
+_io_in32:      ; int io_in32(int port);
+               MOV             EDX,[ESP+4]             ; port
+               IN              EAX,DX
+               RET
+
+_io_out8:      ; void io_out8(int port, int data);
+               MOV             EDX,[ESP+4]             ; port
+               MOV             AL,[ESP+8]              ; data
+               OUT             DX,AL
+               RET
+
+_io_out16:     ; void io_out16(int port, int data);
+               MOV             EDX,[ESP+4]             ; port
+               MOV             EAX,[ESP+8]             ; data
+               OUT             DX,AX
+               RET
+
+_io_out32:     ; void io_out32(int port, int data);
+               MOV             EDX,[ESP+4]             ; port
+               MOV             EAX,[ESP+8]             ; data
+               OUT             DX,EAX
+               RET
+
+_io_load_eflags:       ; int io_load_eflags(void);
+               PUSHFD          ; PUSH EFLAGS \82Æ\82¢\82¤\88Ó\96¡
+               POP             EAX
+               RET
+
+_io_store_eflags:      ; void io_store_eflags(int eflags);
+               MOV             EAX,[ESP+4]
+               PUSH    EAX
+               POPFD           ; POP EFLAGS \82Æ\82¢\82¤\88Ó\96¡
+               RET
+
+_load_gdtr:            ; void load_gdtr(int limit, int addr);
+               MOV             AX,[ESP+4]              ; limit
+               MOV             [ESP+6],AX
+               LGDT    [ESP+6]
+               RET
+
+_load_idtr:            ; void load_idtr(int limit, int addr);
+               MOV             AX,[ESP+4]              ; limit
+               MOV             [ESP+6],AX
+               LIDT    [ESP+6]
+               RET
+
+_load_cr0:             ; int load_cr0(void);
+               MOV             EAX,CR0
+               RET
+
+_store_cr0:            ; void store_cr0(int cr0);
+               MOV             EAX,[ESP+4]
+               MOV             CR0,EAX
+               RET
+
+_load_cr3:             ; int load_cr3(void);
+               MOV             EAX,CR0
+               RET
+
+_store_cr3:            ; void store_cr3(int cr3);
+               MOV             EAX,[ESP+4]
+               MOV             CR0,EAX
+               RET
+
+_load_tr:              ; void load_tr(int tr);
+               LTR             [ESP+4]                 ; tr
+               RET
+
+_asm_inthandler20:
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler20
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               IRETD
+
+_asm_inthandler21:
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler21
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               IRETD
+
+_asm_inthandler2c:
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler2c
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               IRETD
+
+_asm_inthandler00:
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler00
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               IRETD
+
+_asm_inthandler0a:
+               STI
+               mov eax, esp
+               mov ecx, 0x01020304
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               ;MOV            EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler0a
+               CMP             EAX,0
+               JNE             _asm_end_app
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+               IRETD
+
+_asm_inthandler0b:
+               STI
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler0b
+               CMP             EAX,0
+               JNE             _asm_end_app
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+               IRETD
+
+_asm_inthandler0c:
+               STI
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler0c
+               CMP             EAX,0
+               JNE             _asm_end_app
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+               IRETD
+
+_asm_inthandler0d:
+               STI
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler0d
+               CMP             EAX,0                   ; \82±\82±\82¾\82¯\88á\82¤
+               JNE             _asm_end_app    ; \82±\82±\82¾\82¯\88á\82¤
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               ADD             ESP,4                   ; INT 0x0d \82Å\82Í\81A\82±\82ê\82ª\95K\97v
+               IRETD
+
+_asm_inthandler0e:
+               STI
+               PUSH    ES
+               PUSH    DS
+               PUSHAD
+               MOV             EAX,ESP
+               PUSH    EAX
+               MOV             AX,SS
+               MOV             DS,AX
+               MOV             ES,AX
+               CALL    _inthandler0e
+               CMP             EAX,0
+               JNE             _asm_end_app
+               POP             EAX
+               POPAD
+               POP             DS
+               POP             ES
+               ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+               IRETD
+
+_memtest_sub:  ; unsigned int memtest_sub(unsigned int start, unsigned int end)
+               PUSH    EDI                                             ; \81iEBX, ESI, EDI \82à\8eg\82¢\82½\82¢\82Ì\82Å\81j
+               PUSH    ESI
+               PUSH    EBX
+               MOV             ESI,0xaa55aa55                  ; pat0 = 0xaa55aa55;
+               MOV             EDI,0x55aa55aa                  ; pat1 = 0x55aa55aa;
+               MOV             EAX,[ESP+12+4]                  ; i = start;
+mts_loop:
+               MOV             EBX,EAX
+               ADD             EBX,0xffc                               ; p = i + 0xffc;
+               MOV             EDX,[EBX]                               ; old = *p;
+               MOV             [EBX],ESI                               ; *p = pat0;
+               XOR             DWORD [EBX],0xffffffff  ; *p ^= 0xffffffff;
+               CMP             EDI,[EBX]                               ; if (*p != pat1) goto fin;
+               JNE             mts_fin
+               XOR             DWORD [EBX],0xffffffff  ; *p ^= 0xffffffff;
+               CMP             ESI,[EBX]                               ; if (*p != pat0) goto fin;
+               JNE             mts_fin
+               MOV             [EBX],EDX                               ; *p = old;
+               ADD             EAX,0x1000                              ; i += 0x1000;
+               CMP             EAX,[ESP+12+8]                  ; if (i <= end) goto mts_loop;
+               JBE             mts_loop
+               POP             EBX
+               POP             ESI
+               POP             EDI
+               RET
+mts_fin:
+               MOV             [EBX],EDX                               ; *p = old;
+               POP             EBX
+               POP             ESI
+               POP             EDI
+               RET
+
+_farjmp:               ; void farjmp(int eip, int cs);
+               JMP             FAR     [ESP+4]                         ; eip, cs
+               RET
+
+_farcall:              ; void farcall(int eip, int cs);
+               CALL    FAR     [ESP+4]                         ; eip, cs
+               RET
+
+; _asm_hrb_api:
+               ; STI
+               ; PUSH  DS
+               ; PUSH  ES
+               ; PUSHAD                ; \95Û\91\82Ì\82½\82ß\82ÌPUSH
+               ; PUSHAD                ; hrb_api\82É\82í\82½\82·\82½\82ß\82ÌPUSH
+               ; MOV           AX,SS
+               ; MOV           DS,AX           ; OS\97p\82Ì\83Z\83O\83\81\83\93\83g\82ðDS\82ÆES\82É\82à\93ü\82ê\82é
+               ; MOV           ES,AX
+               ; CALL  _hrb_api
+               ; CMP           EAX,0           ; EAX\82ª0\82Å\82È\82¯\82ê\82Î\83A\83v\83\8a\8fI\97¹\8f\88\97\9d
+               ; JNE           _asm_end_app
+               ; ADD           ESP,32
+               ; POPAD
+               ; POP           ES
+               ; POP           DS
+               ; IRETD
+_asm_end_app:
+;      EAX\82Ítss.esp0\82Ì\94Ô\92n
+               MOV             ESP,[EAX]
+               MOV             DWORD [EAX+4],0
+               POPAD
+               RET                                     ; cmd_app\82Ö\8bA\82é
+
+_start_app:            ; void start_app(int eip, int cs, int esp, int ds, int *tss_esp0);
+               PUSHAD          ; 32\83r\83b\83g\83\8c\83W\83X\83^\82ð\91S\95\94\95Û\91\82µ\82Ä\82¨\82­
+               MOV             EAX,[ESP+36]    ; \83A\83v\83\8a\97p\82ÌEIP
+               MOV             ECX,[ESP+40]    ; \83A\83v\83\8a\97p\82ÌCS
+               MOV             EDX,[ESP+44]    ; \83A\83v\83\8a\97p\82ÌESP
+               MOV             EBX,[ESP+48]    ; \83A\83v\83\8a\97p\82ÌDS/SS
+               MOV             EBP,[ESP+52]    ; tss.esp0\82Ì\94Ô\92n
+               MOV             [EBP  ],ESP             ; OS\97p\82ÌESP\82ð\95Û\91
+               MOV             [EBP+4],SS              ; OS\97p\82ÌSS\82ð\95Û\91
+               MOV             ES,BX
+               MOV             DS,BX
+               MOV             FS,BX
+               MOV             GS,BX
+;      \88È\89º\82ÍRETF\82Å\83A\83v\83\8a\82É\8ds\82©\82¹\82é\82½\82ß\82Ì\83X\83^\83b\83N\92²\90®
+               OR              ECX,3                   ; \83A\83v\83\8a\97p\82Ì\83Z\83O\83\81\83\93\83g\94Ô\8d\86\82É3\82ðOR\82·\82é
+               OR              EBX,3                   ; \83A\83v\83\8a\97p\82Ì\83Z\83O\83\81\83\93\83g\94Ô\8d\86\82É3\82ðOR\82·\82é
+               PUSH    EBX                             ; \83A\83v\83\8a\82ÌSS
+               PUSH    EDX                             ; \83A\83v\83\8a\82ÌESP
+               PUSH    ECX                             ; \83A\83v\83\8a\82ÌCS
+               PUSH    EAX                             ; \83A\83v\83\8a\82ÌEIP
+               RETF
+;      \83A\83v\83\8a\82ª\8fI\97¹\82µ\82Ä\82à\82±\82±\82É\82Í\97\88\82È\82¢
+
+;\83R\83\93\83X\83g\83\89\83N\83^\82ð\8cÄ\82Ô\82Æ\82«\82Égcc\82ª\8f\9f\8eè\82É\82±\82ê\82ð\8cÄ\82Ñ\8fo\82·
+__Unwind_Resume:
+       ret
+___gxx_personality_v0:
+       dw 0
+___chkstk:
+       ret
+test:
\ No newline at end of file
diff --git a/haribote/naskfunc.h b/haribote/naskfunc.h
new file mode 100644 (file)
index 0000000..5a5a592
--- /dev/null
@@ -0,0 +1,31 @@
+#pragma once
+
+extern "C"{
+
+void io_hlt(void);
+void io_cli(void);
+void io_sti(void);
+void io_stihlt(void);
+DWORD io_in8(DWORD port);
+void io_out8(DWORD port, DWORD data);
+DWORD io_load_eflags(void);
+void io_store_eflags(DWORD eflags);
+void load_gdtr(DWORD limit, DWORD addr);
+void load_idtr(DWORD limit, DWORD addr);
+DWORD load_cr0(void);
+void store_cr0(DWORD cr0);
+DWORD load_cr3(void);
+void store_cr3(DWORD cr3);
+void load_tr(DWORD tr);
+void asm_inthandler00(void);
+void asm_inthandler0a(void);
+void asm_inthandler0b(void);
+void asm_inthandler0c(void);
+void asm_inthandler0d(void);
+void asm_inthandler20(void);
+void asm_inthandler0e(void);
+void asm_inthandler21(void);
+void asm_inthandler2c(void);
+void farjmp(DWORD eip, DWORD cs);
+
+};
\ No newline at end of file
diff --git a/haribote/naskfunc.lst b/haribote/naskfunc.lst
new file mode 100644 (file)
index 0000000..44d6ab5
--- /dev/null
@@ -0,0 +1,382 @@
+     1                                  ; naskfunc
+     2                                  ; TAB=4
+     3                                  
+     4                                  ;[FORMAT "WCOFF"]                              ; \83I\83u\83W\83F\83N\83g\83t\83@\83C\83\8b\82ð\8dì\82é\83\82\81[\83h      
+     5                                  ;[INSTRSET "i486p"]                            ; 486\82Ì\96½\97ß\82Ü\82Å\8eg\82¢\82½\82¢\82Æ\82¢\82¤\8bL\8fq
+     6                                  [BITS 32]                                              ; 32\83r\83b\83g\83\82\81[\83h\97p\82Ì\8b@\8aB\8cê\82ð\8dì\82ç\82¹\82é
+     7                                  ;[FILE "naskfunc.nas"]                 ; \83\\81[\83X\83t\83@\83C\83\8b\96¼\8fî\95ñ
+     8                                  
+     9                                                 GLOBAL  _io_hlt, _io_cli, _io_sti, _io_stihlt
+    10                                                 GLOBAL  _io_in8,  _io_in16,  _io_in32
+    11                                                 GLOBAL  _io_out8, _io_out16, _io_out32
+    12                                                 GLOBAL  _io_load_eflags, _io_store_eflags
+    13                                                 GLOBAL  _load_gdtr, _load_idtr
+    14                                                 GLOBAL  _load_cr0, _store_cr0
+    15                                                 GLOBAL  _load_tr
+    16                                                 GLOBAL  _asm_inthandler20, _asm_inthandler21
+    17                                                 GLOBAL  _asm_inthandler2c, _asm_inthandler0c
+    18                                                 GLOBAL  _asm_inthandler0d, _asm_end_app
+    19                                                 GLOBAL _asm_inthandler0e, _asm_inthandler0a, _asm_inthandler0b, _asm_inthandler00
+    20                                                 GLOBAL  _memtest_sub
+    21                                                 GLOBAL  _farjmp, _farcall
+    22                                                 GLOBAL  _asm_hrb_api, _start_app
+    23                                                 EXTERN  _inthandler20, _inthandler21
+    24                                                 EXTERN  _inthandler2c, _inthandler0d
+    25                                                 EXTERN  _inthandler0c, _inthandler0a, _inthandler0b, _inthandler00
+    26                                                 EXTERN _inthandler0e
+    27                                                 EXTERN  _hrb_api
+    28                                                 GLOBAL  __Unwind_Resume, ___gxx_personality_v0
+    29                                                 GLOBAL  ___chkstk
+    30                                  
+    31                                  [SECTION .text]
+    32                                  
+    33                                  _io_hlt:       ; void io_hlt(void);
+    34 00000000 F4                                     HLT
+    35 00000001 C3                                     RET
+    36                                  
+    37                                  _io_cli:       ; void io_cli(void);
+    38 00000002 FA                                     CLI
+    39 00000003 C3                                     RET
+    40                                  
+    41                                  _io_sti:       ; void io_sti(void);
+    42 00000004 FB                                     STI
+    43 00000005 C3                                     RET
+    44                                  
+    45                                  _io_stihlt:    ; void io_stihlt(void);
+    46 00000006 FB                                     STI
+    47 00000007 F4                                     HLT
+    48 00000008 C3                                     RET
+    49                                  
+    50                                  _io_in8:       ; int io_in8(int port);
+    51 00000009 8B542404                               MOV             EDX,[ESP+4]             ; port
+    52 0000000D B800000000                             MOV             EAX,0
+    53 00000012 EC                                     IN              AL,DX
+    54 00000013 C3                                     RET
+    55                                  
+    56                                  _io_in16:      ; int io_in16(int port);
+    57 00000014 8B542404                               MOV             EDX,[ESP+4]             ; port
+    58 00000018 B800000000                             MOV             EAX,0
+    59 0000001D 66ED                                   IN              AX,DX
+    60 0000001F C3                                     RET
+    61                                  
+    62                                  _io_in32:      ; int io_in32(int port);
+    63 00000020 8B542404                               MOV             EDX,[ESP+4]             ; port
+    64 00000024 ED                                     IN              EAX,DX
+    65 00000025 C3                                     RET
+    66                                  
+    67                                  _io_out8:      ; void io_out8(int port, int data);
+    68 00000026 8B542404                               MOV             EDX,[ESP+4]             ; port
+    69 0000002A 8A442408                               MOV             AL,[ESP+8]              ; data
+    70 0000002E EE                                     OUT             DX,AL
+    71 0000002F C3                                     RET
+    72                                  
+    73                                  _io_out16:     ; void io_out16(int port, int data);
+    74 00000030 8B542404                               MOV             EDX,[ESP+4]             ; port
+    75 00000034 8B442408                               MOV             EAX,[ESP+8]             ; data
+    76 00000038 66EF                                   OUT             DX,AX
+    77 0000003A C3                                     RET
+    78                                  
+    79                                  _io_out32:     ; void io_out32(int port, int data);
+    80 0000003B 8B542404                               MOV             EDX,[ESP+4]             ; port
+    81 0000003F 8B442408                               MOV             EAX,[ESP+8]             ; data
+    82 00000043 EF                                     OUT             DX,EAX
+    83 00000044 C3                                     RET
+    84                                  
+    85                                  _io_load_eflags:       ; int io_load_eflags(void);
+    86 00000045 9C                                     PUSHFD          ; PUSH EFLAGS \82Æ\82¢\82¤\88Ó\96¡
+    87 00000046 58                                     POP             EAX
+    88 00000047 C3                                     RET
+    89                                  
+    90                                  _io_store_eflags:      ; void io_store_eflags(int eflags);
+    91 00000048 8B442404                               MOV             EAX,[ESP+4]
+    92 0000004C 50                                     PUSH    EAX
+    93 0000004D 9D                                     POPFD           ; POP EFLAGS \82Æ\82¢\82¤\88Ó\96¡
+    94 0000004E C3                                     RET
+    95                                  
+    96                                  _load_gdtr:            ; void load_gdtr(int limit, int addr);
+    97 0000004F 668B442404                             MOV             AX,[ESP+4]              ; limit
+    98 00000054 6689442406                             MOV             [ESP+6],AX
+    99 00000059 0F01542406                             LGDT    [ESP+6]
+   100 0000005E C3                                     RET
+   101                                  
+   102                                  _load_idtr:            ; void load_idtr(int limit, int addr);
+   103 0000005F 668B442404                             MOV             AX,[ESP+4]              ; limit
+   104 00000064 6689442406                             MOV             [ESP+6],AX
+   105 00000069 0F015C2406                             LIDT    [ESP+6]
+   106 0000006E C3                                     RET
+   107                                  
+   108                                  _load_cr0:             ; int load_cr0(void);
+   109 0000006F 0F20C0                                 MOV             EAX,CR0
+   110 00000072 C3                                     RET
+   111                                  
+   112                                  _store_cr0:            ; void store_cr0(int cr0);
+   113 00000073 8B442404                               MOV             EAX,[ESP+4]
+   114 00000077 0F22C0                                 MOV             CR0,EAX
+   115 0000007A C3                                     RET
+   116                                  
+   117                                  _load_tr:              ; void load_tr(int tr);
+   118 0000007B 0F005C2404                             LTR             [ESP+4]                 ; tr
+   119 00000080 C3                                     RET
+   120                                  
+   121                                  _asm_inthandler20:
+   122 00000081 06                                     PUSH    ES
+   123 00000082 1E                                     PUSH    DS
+   124 00000083 60                                     PUSHAD
+   125 00000084 89E0                                   MOV             EAX,ESP
+   126 00000086 50                                     PUSH    EAX
+   127 00000087 668CD0                                 MOV             AX,SS
+   128 0000008A 8ED8                                   MOV             DS,AX
+   129 0000008C 8EC0                                   MOV             ES,AX
+   130 0000008E E8(00000000)                           CALL    _inthandler20
+   131 00000093 58                                     POP             EAX
+   132 00000094 61                                     POPAD
+   133 00000095 1F                                     POP             DS
+   134 00000096 07                                     POP             ES
+   135 00000097 CF                                     IRETD
+   136                                  
+   137                                  _asm_inthandler21:
+   138 00000098 06                                     PUSH    ES
+   139 00000099 1E                                     PUSH    DS
+   140 0000009A 60                                     PUSHAD
+   141 0000009B 89E0                                   MOV             EAX,ESP
+   142 0000009D 50                                     PUSH    EAX
+   143 0000009E 668CD0                                 MOV             AX,SS
+   144 000000A1 8ED8                                   MOV             DS,AX
+   145 000000A3 8EC0                                   MOV             ES,AX
+   146 000000A5 E8(00000000)                           CALL    _inthandler21
+   147 000000AA 58                                     POP             EAX
+   148 000000AB 61                                     POPAD
+   149 000000AC 1F                                     POP             DS
+   150 000000AD 07                                     POP             ES
+   151 000000AE CF                                     IRETD
+   152                                  
+   153                                  _asm_inthandler2c:
+   154 000000AF 06                                     PUSH    ES
+   155 000000B0 1E                                     PUSH    DS
+   156 000000B1 60                                     PUSHAD
+   157 000000B2 89E0                                   MOV             EAX,ESP
+   158 000000B4 50                                     PUSH    EAX
+   159 000000B5 668CD0                                 MOV             AX,SS
+   160 000000B8 8ED8                                   MOV             DS,AX
+   161 000000BA 8EC0                                   MOV             ES,AX
+   162 000000BC E8(00000000)                           CALL    _inthandler2c
+   163 000000C1 58                                     POP             EAX
+   164 000000C2 61                                     POPAD
+   165 000000C3 1F                                     POP             DS
+   166 000000C4 07                                     POP             ES
+   167 000000C5 CF                                     IRETD
+   168                                  
+   169                                  _asm_inthandler00:
+   170 000000C6 06                                     PUSH    ES
+   171 000000C7 1E                                     PUSH    DS
+   172 000000C8 60                                     PUSHAD
+   173 000000C9 89E0                                   MOV             EAX,ESP
+   174 000000CB 50                                     PUSH    EAX
+   175 000000CC 668CD0                                 MOV             AX,SS
+   176 000000CF 8ED8                                   MOV             DS,AX
+   177 000000D1 8EC0                                   MOV             ES,AX
+   178 000000D3 E8(00000000)                           CALL    _inthandler00
+   179 000000D8 58                                     POP             EAX
+   180 000000D9 61                                     POPAD
+   181 000000DA 1F                                     POP             DS
+   182 000000DB 07                                     POP             ES
+   183 000000DC CF                                     IRETD
+   184                                  
+   185                                  _asm_inthandler0a:
+   186 000000DD FB                                     STI
+   187 000000DE 89E0                                   mov eax, esp
+   188 000000E0 B904030201                             mov ecx, 0x01020304
+   189 000000E5 06                                     PUSH    ES
+   190 000000E6 1E                                     PUSH    DS
+   191 000000E7 60                                     PUSHAD
+   192                                                 ;MOV            EAX,ESP
+   193 000000E8 50                                     PUSH    EAX
+   194 000000E9 668CD0                                 MOV             AX,SS
+   195 000000EC 8ED8                                   MOV             DS,AX
+   196 000000EE 8EC0                                   MOV             ES,AX
+   197 000000F0 E8(00000000)                           CALL    _inthandler0a
+   198 000000F5 3D00000000                             CMP             EAX,0
+   199 000000FA 0F85FD000000                           JNE             _asm_end_app
+   200 00000100 58                                     POP             EAX
+   201 00000101 61                                     POPAD
+   202 00000102 1F                                     POP             DS
+   203 00000103 07                                     POP             ES
+   204 00000104 81C404000000                           ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+   205 0000010A CF                                     IRETD
+   206                                  
+   207                                  _asm_inthandler0b:
+   208 0000010B FB                                     STI
+   209 0000010C 06                                     PUSH    ES
+   210 0000010D 1E                                     PUSH    DS
+   211 0000010E 60                                     PUSHAD
+   212 0000010F 89E0                                   MOV             EAX,ESP
+   213 00000111 50                                     PUSH    EAX
+   214 00000112 668CD0                                 MOV             AX,SS
+   215 00000115 8ED8                                   MOV             DS,AX
+   216 00000117 8EC0                                   MOV             ES,AX
+   217 00000119 E8(00000000)                           CALL    _inthandler0b
+   218 0000011E 3D00000000                             CMP             EAX,0
+   219 00000123 0F85D4000000                           JNE             _asm_end_app
+   220 00000129 58                                     POP             EAX
+   221 0000012A 61                                     POPAD
+   222 0000012B 1F                                     POP             DS
+   223 0000012C 07                                     POP             ES
+   224 0000012D 81C404000000                           ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+   225 00000133 CF                                     IRETD
+   226                                  
+   227                                  _asm_inthandler0c:
+   228 00000134 FB                                     STI
+   229 00000135 06                                     PUSH    ES
+   230 00000136 1E                                     PUSH    DS
+   231 00000137 60                                     PUSHAD
+   232 00000138 89E0                                   MOV             EAX,ESP
+   233 0000013A 50                                     PUSH    EAX
+   234 0000013B 668CD0                                 MOV             AX,SS
+   235 0000013E 8ED8                                   MOV             DS,AX
+   236 00000140 8EC0                                   MOV             ES,AX
+   237 00000142 E8(00000000)                           CALL    _inthandler0c
+   238 00000147 3D00000000                             CMP             EAX,0
+   239 0000014C 0F85AB000000                           JNE             _asm_end_app
+   240 00000152 58                                     POP             EAX
+   241 00000153 61                                     POPAD
+   242 00000154 1F                                     POP             DS
+   243 00000155 07                                     POP             ES
+   244 00000156 81C404000000                           ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+   245 0000015C CF                                     IRETD
+   246                                  
+   247                                  _asm_inthandler0d:
+   248 0000015D FB                                     STI
+   249 0000015E 06                                     PUSH    ES
+   250 0000015F 1E                                     PUSH    DS
+   251 00000160 60                                     PUSHAD
+   252 00000161 89E0                                   MOV             EAX,ESP
+   253 00000163 50                                     PUSH    EAX
+   254 00000164 668CD0                                 MOV             AX,SS
+   255 00000167 8ED8                                   MOV             DS,AX
+   256 00000169 8EC0                                   MOV             ES,AX
+   257 0000016B E8(00000000)                           CALL    _inthandler0d
+   258 00000170 3D00000000                             CMP             EAX,0                   ; \82±\82±\82¾\82¯\88á\82¤
+   259 00000175 0F8582000000                           JNE             _asm_end_app    ; \82±\82±\82¾\82¯\88á\82¤
+   260 0000017B 58                                     POP             EAX
+   261 0000017C 61                                     POPAD
+   262 0000017D 1F                                     POP             DS
+   263 0000017E 07                                     POP             ES
+   264 0000017F 81C404000000                           ADD             ESP,4                   ; INT 0x0d \82Å\82Í\81A\82±\82ê\82ª\95K\97v
+   265 00000185 CF                                     IRETD
+   266                                  
+   267                                  _asm_inthandler0e:
+   268 00000186 FB                                     STI
+   269 00000187 06                                     PUSH    ES
+   270 00000188 1E                                     PUSH    DS
+   271 00000189 60                                     PUSHAD
+   272 0000018A 89E0                                   MOV             EAX,ESP
+   273 0000018C 50                                     PUSH    EAX
+   274 0000018D 668CD0                                 MOV             AX,SS
+   275 00000190 8ED8                                   MOV             DS,AX
+   276 00000192 8EC0                                   MOV             ES,AX
+   277 00000194 E8(00000000)                           CALL    _inthandler0e
+   278 00000199 3D00000000                             CMP             EAX,0
+   279 0000019E 755D                                   JNE             _asm_end_app
+   280 000001A0 58                                     POP             EAX
+   281 000001A1 61                                     POPAD
+   282 000001A2 1F                                     POP             DS
+   283 000001A3 07                                     POP             ES
+   284 000001A4 81C404000000                           ADD             ESP,4                   ; INT 0x0c \82Å\82à\81A\82±\82ê\82ª\95K\97v
+   285 000001AA CF                                     IRETD
+   286                                  
+   287                                  _memtest_sub:  ; unsigned int memtest_sub(unsigned int start, unsigned int end)
+   288 000001AB 57                                     PUSH    EDI                                             ; \81iEBX, ESI, EDI \82à\8eg\82¢\82½\82¢\82Ì\82Å\81j
+   289 000001AC 56                                     PUSH    ESI
+   290 000001AD 53                                     PUSH    EBX
+   291 000001AE BE55AA55AA                             MOV             ESI,0xaa55aa55                  ; pat0 = 0xaa55aa55;
+   292 000001B3 BFAA55AA55                             MOV             EDI,0x55aa55aa                  ; pat1 = 0x55aa55aa;
+   293 000001B8 8B442410                               MOV             EAX,[ESP+12+4]                  ; i = start;
+   294                                  mts_loop:
+   295 000001BC 89C3                                   MOV             EBX,EAX
+   296 000001BE 81C3FC0F0000                           ADD             EBX,0xffc                               ; p = i + 0xffc;
+   297 000001C4 8B13                                   MOV             EDX,[EBX]                               ; old = *p;
+   298 000001C6 8933                                   MOV             [EBX],ESI                               ; *p = pat0;
+   299 000001C8 8133FFFFFFFF                           XOR             DWORD [EBX],0xffffffff  ; *p ^= 0xffffffff;
+   300 000001CE 3B3B                                   CMP             EDI,[EBX]                               ; if (*p != pat1) goto fin;
+   301 000001D0 751B                                   JNE             mts_fin
+   302 000001D2 8133FFFFFFFF                           XOR             DWORD [EBX],0xffffffff  ; *p ^= 0xffffffff;
+   303 000001D8 3B33                                   CMP             ESI,[EBX]                               ; if (*p != pat0) goto fin;
+   304 000001DA 7511                                   JNE             mts_fin
+   305 000001DC 8913                                   MOV             [EBX],EDX                               ; *p = old;
+   306 000001DE 0500100000                             ADD             EAX,0x1000                              ; i += 0x1000;
+   307 000001E3 3B442414                               CMP             EAX,[ESP+12+8]                  ; if (i <= end) goto mts_loop;
+   308 000001E7 76D3                                   JBE             mts_loop
+   309 000001E9 5B                                     POP             EBX
+   310 000001EA 5E                                     POP             ESI
+   311 000001EB 5F                                     POP             EDI
+   312 000001EC C3                                     RET
+   313                                  mts_fin:
+   314 000001ED 8913                                   MOV             [EBX],EDX                               ; *p = old;
+   315 000001EF 5B                                     POP             EBX
+   316 000001F0 5E                                     POP             ESI
+   317 000001F1 5F                                     POP             EDI
+   318 000001F2 C3                                     RET
+   319                                  
+   320                                  _farjmp:               ; void farjmp(int eip, int cs);
+   321 000001F3 FF6C2404                               JMP             FAR     [ESP+4]                         ; eip, cs
+   322 000001F7 C3                                     RET
+   323                                  
+   324                                  _farcall:              ; void farcall(int eip, int cs);
+   325 000001F8 FF5C2404                               CALL    FAR     [ESP+4]                         ; eip, cs
+   326 000001FC C3                                     RET
+   327                                  
+   328                                  ; _asm_hrb_api:
+   329                                                 ; STI
+   330                                                 ; PUSH  DS
+   331                                                 ; PUSH  ES
+   332                                                 ; PUSHAD                ; \95Û\91\82Ì\82½\82ß\82ÌPUSH
+   333                                                 ; PUSHAD                ; hrb_api\82É\82í\82½\82·\82½\82ß\82ÌPUSH
+   334                                                 ; MOV           AX,SS
+   335                                                 ; MOV           DS,AX           ; OS\97p\82Ì\83Z\83O\83\81\83\93\83g\82ðDS\82ÆES\82É\82à\93ü\82ê\82é
+   336                                                 ; MOV           ES,AX
+   337                                                 ; CALL  _hrb_api
+   338                                                 ; CMP           EAX,0           ; EAX\82ª0\82Å\82È\82¯\82ê\82Î\83A\83v\83\8a\8fI\97¹\8f\88\97\9d
+   339                                                 ; JNE           _asm_end_app
+   340                                                 ; ADD           ESP,32
+   341                                                 ; POPAD
+   342                                                 ; POP           ES
+   343                                                 ; POP           DS
+   344                                                 ; IRETD
+   345                                  _asm_end_app:
+   346                                  ;      EAX\82Ítss.esp0\82Ì\94Ô\92n
+   347 000001FD 8B20                                   MOV             ESP,[EAX]
+   348 000001FF C7400400000000                         MOV             DWORD [EAX+4],0
+   349 00000206 61                                     POPAD
+   350 00000207 C3                                     RET                                     ; cmd_app\82Ö\8bA\82é
+   351                                  
+   352                                  _start_app:            ; void start_app(int eip, int cs, int esp, int ds, int *tss_esp0);
+   353 00000208 60                                     PUSHAD          ; 32\83r\83b\83g\83\8c\83W\83X\83^\82ð\91S\95\94\95Û\91\82µ\82Ä\82¨\82­
+   354 00000209 8B442424                               MOV             EAX,[ESP+36]    ; \83A\83v\83\8a\97p\82ÌEIP
+   355 0000020D 8B4C2428                               MOV             ECX,[ESP+40]    ; \83A\83v\83\8a\97p\82ÌCS
+   356 00000211 8B54242C                               MOV             EDX,[ESP+44]    ; \83A\83v\83\8a\97p\82ÌESP
+   357 00000215 8B5C2430                               MOV             EBX,[ESP+48]    ; \83A\83v\83\8a\97p\82ÌDS/SS
+   358 00000219 8B6C2434                               MOV             EBP,[ESP+52]    ; tss.esp0\82Ì\94Ô\92n
+   359 0000021D 896500                                 MOV             [EBP  ],ESP             ; OS\97p\82ÌESP\82ð\95Û\91
+   360 00000220 8C5504                                 MOV             [EBP+4],SS              ; OS\97p\82ÌSS\82ð\95Û\91
+   361 00000223 8EC3                                   MOV             ES,BX
+   362 00000225 8EDB                                   MOV             DS,BX
+   363 00000227 8EE3                                   MOV             FS,BX
+   364 00000229 8EEB                                   MOV             GS,BX
+   365                                  ;      \88È\89º\82ÍRETF\82Å\83A\83v\83\8a\82É\8ds\82©\82¹\82é\82½\82ß\82Ì\83X\83^\83b\83N\92²\90®
+   366 0000022B 81C903000000                           OR              ECX,3                   ; \83A\83v\83\8a\97p\82Ì\83Z\83O\83\81\83\93\83g\94Ô\8d\86\82É3\82ðOR\82·\82é
+   367 00000231 81CB03000000                           OR              EBX,3                   ; \83A\83v\83\8a\97p\82Ì\83Z\83O\83\81\83\93\83g\94Ô\8d\86\82É3\82ðOR\82·\82é
+   368 00000237 53                                     PUSH    EBX                             ; \83A\83v\83\8a\82ÌSS
+   369 00000238 52                                     PUSH    EDX                             ; \83A\83v\83\8a\82ÌESP
+   370 00000239 51                                     PUSH    ECX                             ; \83A\83v\83\8a\82ÌCS
+   371 0000023A 50                                     PUSH    EAX                             ; \83A\83v\83\8a\82ÌEIP
+   372 0000023B CB                                     RETF
+   373                                  ;      \83A\83v\83\8a\82ª\8fI\97¹\82µ\82Ä\82à\82±\82±\82É\82Í\97\88\82È\82¢
+   374                                  
+   375                                  ;\83R\83\93\83X\83g\83\89\83N\83^\82ð\8cÄ\82Ô\82Æ\82«\82Égcc\82ª\8f\9f\8eè\82É\82±\82ê\82ð\8cÄ\82Ñ\8fo\82·
+   376                                  __Unwind_Resume:
+   377 0000023C C3                             ret
+   378                                  ___gxx_personality_v0:
+   379 0000023D 0000                           dw 0
+   380                                  ___chkstk:
+   381 0000023F C3                             ret
+   382                                  test:
diff --git a/haribote/new3.txt b/haribote/new3.txt
new file mode 100644 (file)
index 0000000..d9649de
--- /dev/null
@@ -0,0 +1,25 @@
+123379200-1847296
+121531904
+
+perl -e "$k=(-s 'iplcd.bin');$a=0x168000-$k;for(1..($a/1000000)){print qq(\0)x1000000;}print qq(\0)x ($a % 1000000)" >> iplcd.bin
+
+gcc -nostdlib -static -L../../lib -Ttext=0x7c00 ipl09.obj -W,"T binary.lds" -o ipl09.bin
+
+ld -nostdlib -static -L../../lib -Ttext=0x7c00 ipl09.obj -T binary.lds -o ipl09.bin
+
+ld -nostdlib -static -L../../lib -Ttext=0x7c00 ipl09.obj -o ipl09.bin
+
+..\..\z_tools\nask.exe ipl09.nas ipl09.obj ipl09.lst
+
+ld -r -Ttext 0x0 -e _start -s -o bootsect.out bootsect.o
+
+(we use a relocatable '-r' link because a final link would add the
+__CTOR_LIST__ and __DTOR_LIST__ data in the text section; a relocatable link
+will resolve any stray relocs for us without adding those tables), followed by
+an objcopy like so:
+
+objcopy -O binary -j .text bootsect.out bootsect
+
+objcopy -O binary -j .text ipl09.bin ipl09.sec
+
+.\mkisofs -no-emul-boot -b iplcd.bin -o ../cd.iso  ../cd
diff --git a/haribote/pic.cpp b/haribote/pic.cpp
new file mode 100644 (file)
index 0000000..895cce5
--- /dev/null
@@ -0,0 +1,28 @@
+/* \8a\84\82è\8d\9e\82Ý\8aÖ\8cW */
+
+#include "bootpack.h"
+#include "pic.h"
+#include "naskfunc.h"
+#include <stdio.h>
+
+void init_pic(void)
+/* PIC\82Ì\8f\89\8aú\89» */
+{
+       io_out8(PIC0_IMR,  0xff  ); /* \91S\82Ä\82Ì\8a\84\82è\8d\9e\82Ý\82ð\8eó\82¯\95t\82¯\82È\82¢ */
+       io_out8(PIC1_IMR,  0xff  ); /* \91S\82Ä\82Ì\8a\84\82è\8d\9e\82Ý\82ð\8eó\82¯\95t\82¯\82È\82¢ */
+
+       io_out8(PIC0_ICW1, 0x11  ); /* \83G\83b\83W\83g\83\8a\83K\83\82\81[\83h */
+       io_out8(PIC0_ICW2, 0x20  ); /* IRQ0-7\82Í\81AINT20-27\82Å\8eó\82¯\82é */
+       io_out8(PIC0_ICW3, 1 << 2); /* PIC1\82ÍIRQ2\82É\82Ä\90Ú\91± */
+       io_out8(PIC0_ICW4, 0x01  ); /* \83m\83\93\83o\83b\83t\83@\83\82\81[\83h */
+
+       io_out8(PIC1_ICW1, 0x11  ); /* \83G\83b\83W\83g\83\8a\83K\83\82\81[\83h */
+       io_out8(PIC1_ICW2, 0x28  ); /* IRQ8-15\82Í\81AINT28-2f\82Å\8eó\82¯\82é */
+       io_out8(PIC1_ICW3, 2     ); /* PIC1\82ÍIRQ2\82É\82Ä\90Ú\91± */
+       io_out8(PIC1_ICW4, 0x01  ); /* \83m\83\93\83o\83b\83t\83@\83\82\81[\83h */
+
+       io_out8(PIC0_IMR,  0xfb  ); /* 11111011 PIC1\88È\8aO\82Í\91S\82Ä\8bÖ\8e~ */
+       io_out8(PIC1_IMR,  0xff  ); /* 11111111 \91S\82Ä\82Ì\8a\84\82è\8d\9e\82Ý\82ð\8eó\82¯\95t\82¯\82È\82¢ */
+
+       return;
+}
diff --git a/haribote/pic.h b/haribote/pic.h
new file mode 100644 (file)
index 0000000..a8a6695
--- /dev/null
@@ -0,0 +1,15 @@
+#pragma once
+
+void init_pic(void);
+#define PIC0_ICW1              0x0020
+#define PIC0_OCW2              0x0020
+#define PIC0_IMR               0x0021
+#define PIC0_ICW2              0x0021
+#define PIC0_ICW3              0x0021
+#define PIC0_ICW4              0x0021
+#define PIC1_ICW1              0x00a0
+#define PIC1_OCW2              0x00a0
+#define PIC1_IMR               0x00a1
+#define PIC1_ICW2              0x00a1
+#define PIC1_ICW3              0x00a1
+#define PIC1_ICW4              0x00a1
diff --git a/haribote/screen.cpp b/haribote/screen.cpp
new file mode 100644 (file)
index 0000000..d2dc24e
--- /dev/null
@@ -0,0 +1,75 @@
+#include "screen.h"
+#include "hankaku.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+BYTE Screen::buf[sizeof(Screen)];
+
+Screen::Screen(BOOTINFO *binfo):binfo(binfo), pt(binfo){
+       //printf("a");
+}
+
+void Screen::Init(BOOTINFO *binfo){
+       new ((void *)buf) Screen(binfo);
+}
+
+void Screen::printf(const char *format, ...){
+       va_list ap;
+
+       va_start(ap, format);
+       vprintf(format, ap);
+       va_end(ap);
+}
+
+void Screen::vprintf(const char *format, va_list ap){
+       char s[2048];
+       vsprintf(s, format, ap);
+       puts(s);
+}
+
+void Screen::puts(const char *s){
+       for(; *s; s++){
+               if(*s == '\n'){
+                       if(pt.NewLine()){
+                               Scroll();
+                       }
+               }else{
+                       for(int i = 0; i < fonth; i++){
+                               BYTE b = hankakufont[*s][i];
+                               for(int j = 0; j < fontw; j++){
+                                       if((b >> (7 - j)) & 1){
+                                               SetPixel(pt.getx() + j, pt.gety() + i, RGB(0xff,0xff,0xff));
+                                       }
+                               }
+                       }
+                       if(pt.NextChar()){
+                               Scroll();
+                       }
+               }
+       }
+}
+
+void Screen::SetPixel(int x, int y, const Screen::RGB &rgb){
+       if(binfo->vmode == 8){
+               binfo->vram[y * binfo->screenx + x] = rgb.col8();
+       }else{
+               BYTE *p = &binfo->vram[(y * binfo->screenx + x) * 3];
+               p[0] = rgb.b;
+               p[1] = rgb.g;
+               p[2] = rgb.r;
+       }
+}
+
+void Screen::Scroll(){
+       unsigned int lines = binfo->screeny / fonth;
+       unsigned int stride = binfo->screenx * binfo->vmode / 8;
+       unsigned int cstride = stride * fonth;
+
+       //1\81`(lines - 1)\8ds\96Ú\82ð1\8ds\8fã\82Ö\82¸\82ç\82·
+       memmove(binfo->vram
+               , binfo->vram + cstride
+               , cstride * (lines - 1));
+       
+       memset(binfo->vram + (lines - 1) * cstride, 0, cstride);
+}
diff --git a/haribote/screen.h b/haribote/screen.h
new file mode 100644 (file)
index 0000000..52101e3
--- /dev/null
@@ -0,0 +1,74 @@
+#pragma once
+#include <new>
+#include "ata/ataio.h"
+#include "bootpack.h"
+#include <stdarg.h>
+
+class Screen{
+public:
+       static void Init(BOOTINFO *binfo);
+       static Screen &Inst(){
+               return *(Screen *)buf;
+       }
+
+       
+       static const int fontw = 8, fonth = 16;
+       
+       void printf(const char *format, ...);
+       void vprintf(const char *format, va_list ap);
+       void puts(const char *s);
+       
+       struct RGB;
+       void SetPixel(int x, int y, const RGB &rgb);
+       
+       void Scroll();
+       
+       class Pointer{
+               int px, py;
+               const int w, h;
+       public:
+               Pointer(BOOTINFO *binfo):px(0),py(0),w(binfo->screenx),h(binfo->screeny){
+               }
+               int getx(){return px;}
+               int gety(){return py;}
+               int NextChar(){
+                       int oldpy = py;
+                       px += Screen::fontw;
+                       if(px + Screen::fontw > w){
+                               px = 0;
+                               py += Screen::fonth;
+                               if(py + Screen::fonth > h){
+                                       px = 0;
+                                       py = oldpy;
+                                       return 1;
+                               }
+                       }
+                       return 0;
+               }
+               int NewLine(){
+                       px = 0;
+                       py += Screen::fonth;
+                       if(py + Screen::fonth > h){
+                               px = 0;
+                               py -= Screen::fonth;
+                               return 1;
+                       }
+                       return 0;
+               }
+       }pt;
+       
+       struct RGB{
+               BYTE r,g,b;
+               RGB(BYTE r, BYTE g, BYTE b):r(r),g(g),b(b){}
+               BYTE col8()const{
+                       return (r & 0xE0) | ((g >> 3) & 0x1C) | ((b >> 6) & 0x03);
+               }
+       };
+private:
+       static BYTE buf[];
+       static void* operator new(size_t size, void* pbuf){ return pbuf; }
+       Screen(BOOTINFO *binfo);
+
+       BOOTINFO *binfo;
+       char aa[5000];
+       };
\ No newline at end of file
diff --git a/haribote/screen.s b/haribote/screen.s
new file mode 100644 (file)
index 0000000..b6e3eaf
--- /dev/null
@@ -0,0 +1,7575 @@
+       .file   "screen.cpp"
+       .intel_syntax noprefix
+       .section        .debug_abbrev,"dr"
+Ldebug_abbrev0:
+       .section        .debug_info,"dr"
+Ldebug_info0:
+       .section        .debug_line,"dr"
+Ldebug_line0:
+       .text
+Ltext0:
+       .section        .text$_ZN6Screen4InstEv,"x"
+       .linkonce discard
+.globl __ZN6Screen4InstEv
+       .def    __ZN6Screen4InstEv;     .scl    2;      .type   32;     .endef
+__ZN6Screen4InstEv:
+LFB13:
+       .file 1 "screen.h"
+       .loc 1 8 0
+       push    ebp
+LCFI0:
+       mov     ebp, esp
+LCFI1:
+       .loc 1 9 0
+       mov     eax, OFFSET FLAT:__ZN6Screen3bufE
+       .loc 1 10 0
+       leave
+LCFI2:
+       ret
+LFE13:
+       .section        .text$_ZN6Screen7PointerC1EP8BOOTINFO,"x"
+       .linkonce discard
+       .align 2
+.globl __ZN6Screen7PointerC1EP8BOOTINFO
+       .def    __ZN6Screen7PointerC1EP8BOOTINFO;       .scl    2;      .type   32;     .endef
+__ZN6Screen7PointerC1EP8BOOTINFO:
+LFB16:
+       .loc 1 27 0
+       push    ebp
+LCFI3:
+       mov     ebp, esp
+LCFI4:
+LBB2:
+       .loc 1 27 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax], 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax+4], 0
+       mov     eax, DWORD PTR [ebp+12]
+       mov     ax, WORD PTR [eax+4]
+       movzx   edx, ax
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax+8], edx
+       mov     eax, DWORD PTR [ebp+12]
+       mov     ax, WORD PTR [eax+6]
+       movzx   edx, ax
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax+12], edx
+LBE2:
+       .loc 1 28 0
+       leave
+LCFI5:
+       ret
+LFE16:
+       .section        .text$_ZN6Screen7Pointer4getxEv,"x"
+       .linkonce discard
+       .align 2
+.globl __ZN6Screen7Pointer4getxEv
+       .def    __ZN6Screen7Pointer4getxEv;     .scl    2;      .type   32;     .endef
+__ZN6Screen7Pointer4getxEv:
+LFB17:
+       .loc 1 29 0
+       push    ebp
+LCFI6:
+       mov     ebp, esp
+LCFI7:
+       .loc 1 29 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax]
+       leave
+LCFI8:
+       ret
+LFE17:
+       .section        .text$_ZN6Screen7Pointer4getyEv,"x"
+       .linkonce discard
+       .align 2
+.globl __ZN6Screen7Pointer4getyEv
+       .def    __ZN6Screen7Pointer4getyEv;     .scl    2;      .type   32;     .endef
+__ZN6Screen7Pointer4getyEv:
+LFB18:
+       .loc 1 30 0
+       push    ebp
+LCFI9:
+       mov     ebp, esp
+LCFI10:
+       .loc 1 30 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       leave
+LCFI11:
+       ret
+LFE18:
+       .section        .text$_ZN6Screen7Pointer8NextCharEv,"x"
+       .linkonce discard
+       .align 2
+.globl __ZN6Screen7Pointer8NextCharEv
+       .def    __ZN6Screen7Pointer8NextCharEv; .scl    2;      .type   32;     .endef
+__ZN6Screen7Pointer8NextCharEv:
+LFB19:
+       .loc 1 31 0
+       push    ebp
+LCFI12:
+       mov     ebp, esp
+LCFI13:
+       sub     esp, 16
+LCFI14:
+LBB3:
+       .loc 1 32 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       mov     DWORD PTR [ebp-4], eax
+       .loc 1 33 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax]
+       lea     edx, [eax+8]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax], edx
+       .loc 1 34 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax]
+       lea     edx, [eax+8]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+8]
+       cmp     edx, eax
+       jle     L6
+       .loc 1 35 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax], 0
+       .loc 1 36 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       lea     edx, [eax+16]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax+4], edx
+       .loc 1 37 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       lea     edx, [eax+16]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+12]
+       cmp     edx, eax
+       jle     L6
+       .loc 1 38 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax], 0
+       .loc 1 39 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     edx, DWORD PTR [ebp-4]
+       mov     DWORD PTR [eax+4], edx
+       .loc 1 40 0
+       mov     eax, 1
+       jmp     L8
+L6:
+       .loc 1 43 0
+       mov     eax, 0
+L8:
+LBE3:
+       .loc 1 44 0
+       leave
+LCFI15:
+       ret
+LFE19:
+       .section        .text$_ZN6Screen7Pointer7NewLineEv,"x"
+       .linkonce discard
+       .align 2
+.globl __ZN6Screen7Pointer7NewLineEv
+       .def    __ZN6Screen7Pointer7NewLineEv;  .scl    2;      .type   32;     .endef
+__ZN6Screen7Pointer7NewLineEv:
+LFB20:
+       .loc 1 45 0
+       push    ebp
+LCFI16:
+       mov     ebp, esp
+LCFI17:
+       .loc 1 46 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax], 0
+       .loc 1 47 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       lea     edx, [eax+16]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax+4], edx
+       .loc 1 48 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       lea     edx, [eax+16]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+12]
+       cmp     edx, eax
+       jle     L10
+       .loc 1 49 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax], 0
+       .loc 1 50 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+4]
+       lea     edx, [eax-16]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [eax+4], edx
+       .loc 1 51 0
+       mov     eax, 1
+       jmp     L11
+L10:
+       .loc 1 53 0
+       mov     eax, 0
+L11:
+       .loc 1 54 0
+       leave
+LCFI18:
+       ret
+LFE20:
+       .section        .text$_ZN6Screen3RGBC1Ehhh,"x"
+       .linkonce discard
+       .align 2
+.globl __ZN6Screen3RGBC1Ehhh
+       .def    __ZN6Screen3RGBC1Ehhh;  .scl    2;      .type   32;     .endef
+__ZN6Screen3RGBC1Ehhh:
+LFB23:
+       .loc 1 59 0
+       push    ebp
+LCFI19:
+       mov     ebp, esp
+LCFI20:
+       sub     esp, 12
+LCFI21:
+       mov     ecx, DWORD PTR [ebp+12]
+       mov     edx, DWORD PTR [ebp+16]
+       mov     eax, DWORD PTR [ebp+20]
+       mov     BYTE PTR [ebp-4], cl
+       mov     BYTE PTR [ebp-8], dl
+       mov     BYTE PTR [ebp-12], al
+LBB4:
+       .loc 1 59 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     dl, BYTE PTR [ebp-4]
+       mov     BYTE PTR [eax], dl
+       mov     eax, DWORD PTR [ebp+8]
+       mov     dl, BYTE PTR [ebp-8]
+       mov     BYTE PTR [eax+1], dl
+       mov     eax, DWORD PTR [ebp+8]
+       mov     dl, BYTE PTR [ebp-12]
+       mov     BYTE PTR [eax+2], dl
+LBE4:
+       leave
+LCFI22:
+       ret
+LFE23:
+       .section        .text$_ZNK6Screen3RGB4col8Ev,"x"
+       .linkonce discard
+       .align 2
+.globl __ZNK6Screen3RGB4col8Ev
+       .def    __ZNK6Screen3RGB4col8Ev;        .scl    2;      .type   32;     .endef
+__ZNK6Screen3RGB4col8Ev:
+LFB24:
+       .loc 1 60 0
+       push    ebp
+LCFI23:
+       mov     ebp, esp
+LCFI24:
+       .loc 1 61 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     al, BYTE PTR [eax]
+       mov     dl, al
+       and     edx, -32
+       mov     eax, DWORD PTR [ebp+8]
+       mov     al, BYTE PTR [eax+1]
+       movzx   eax, al
+       sar     eax, 3
+       and     eax, 28
+       or      edx, eax
+       mov     eax, DWORD PTR [ebp+8]
+       mov     al, BYTE PTR [eax+2]
+       shr     al, 6
+       or      eax, edx
+       .loc 1 62 0
+       leave
+LCFI25:
+       ret
+LFE24:
+       .section        .text$_ZN6ScreennwEjPv,"x"
+       .linkonce discard
+.globl __ZN6ScreennwEjPv
+       .def    __ZN6ScreennwEjPv;      .scl    2;      .type   32;     .endef
+__ZN6ScreennwEjPv:
+LFB25:
+       .loc 1 66 0
+       push    ebp
+LCFI26:
+       mov     ebp, esp
+LCFI27:
+       .loc 1 66 0
+       mov     eax, DWORD PTR [ebp+12]
+       leave
+LCFI28:
+       ret
+LFE25:
+.globl _hankakufont
+       .data
+       .align 32
+_hankakufont:
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -86
+       .byte   -86
+       .byte   -126
+       .byte   -126
+       .byte   -86
+       .byte   -110
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   124
+       .byte   -2
+       .byte   -42
+       .byte   -42
+       .byte   -2
+       .byte   -2
+       .byte   -42
+       .byte   -18
+       .byte   124
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   108
+       .byte   -2
+       .byte   -2
+       .byte   -2
+       .byte   124
+       .byte   56
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   56
+       .byte   124
+       .byte   -2
+       .byte   124
+       .byte   56
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   56
+       .byte   84
+       .byte   -2
+       .byte   84
+       .byte   16
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   56
+       .byte   124
+       .byte   -2
+       .byte   -42
+       .byte   16
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   60
+       .byte   60
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -25
+       .byte   -61
+       .byte   -61
+       .byte   -25
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   60
+       .byte   102
+       .byte   66
+       .byte   66
+       .byte   102
+       .byte   60
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -61
+       .byte   -103
+       .byte   -67
+       .byte   -67
+       .byte   -103
+       .byte   -61
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   0
+       .byte   16
+       .byte   56
+       .byte   84
+       .byte   -110
+       .byte   16
+       .byte   16
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   16
+       .byte   16
+       .byte   -2
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   14
+       .byte   11
+       .byte   11
+       .byte   10
+       .byte   8
+       .byte   8
+       .byte   24
+       .byte   120
+       .byte   -8
+       .byte   112
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   31
+       .byte   31
+       .byte   17
+       .byte   17
+       .byte   17
+       .byte   17
+       .byte   17
+       .byte   17
+       .byte   119
+       .byte   -1
+       .byte   102
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   84
+       .byte   56
+       .byte   40
+       .byte   56
+       .byte   84
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -128
+       .byte   -64
+       .byte   -32
+       .byte   -16
+       .byte   -8
+       .byte   -4
+       .byte   -2
+       .byte   -4
+       .byte   -8
+       .byte   -16
+       .byte   -32
+       .byte   -64
+       .byte   -128
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   2
+       .byte   6
+       .byte   14
+       .byte   30
+       .byte   62
+       .byte   126
+       .byte   -2
+       .byte   126
+       .byte   62
+       .byte   30
+       .byte   14
+       .byte   6
+       .byte   2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   56
+       .byte   84
+       .byte   -110
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -110
+       .byte   84
+       .byte   56
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   0
+       .byte   0
+       .byte   68
+       .byte   68
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   62
+       .byte   74
+       .byte   -118
+       .byte   -118
+       .byte   -118
+       .byte   -118
+       .byte   74
+       .byte   58
+       .byte   10
+       .byte   10
+       .byte   10
+       .byte   10
+       .byte   10
+       .byte   0
+       .byte   0
+       .byte   124
+       .byte   -126
+       .byte   64
+       .byte   32
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   8
+       .byte   4
+       .byte   -126
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   -2
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   56
+       .byte   84
+       .byte   -110
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -110
+       .byte   84
+       .byte   56
+       .byte   16
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   56
+       .byte   84
+       .byte   -110
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -110
+       .byte   84
+       .byte   56
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   -2
+       .byte   4
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   32
+       .byte   64
+       .byte   -2
+       .byte   64
+       .byte   32
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -128
+       .byte   -128
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   40
+       .byte   68
+       .byte   -2
+       .byte   68
+       .byte   40
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   56
+       .byte   56
+       .byte   124
+       .byte   124
+       .byte   -2
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   -2
+       .byte   124
+       .byte   124
+       .byte   56
+       .byte   56
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   -2
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   -2
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   58
+       .byte   86
+       .byte   -110
+       .byte   -110
+       .byte   -112
+       .byte   80
+       .byte   56
+       .byte   20
+       .byte   18
+       .byte   -110
+       .byte   -110
+       .byte   -44
+       .byte   -72
+       .byte   16
+       .byte   16
+       .byte   98
+       .byte   -110
+       .byte   -108
+       .byte   -108
+       .byte   104
+       .byte   8
+       .byte   16
+       .byte   16
+       .byte   32
+       .byte   44
+       .byte   82
+       .byte   82
+       .byte   -110
+       .byte   -116
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   112
+       .byte   -120
+       .byte   -120
+       .byte   -120
+       .byte   -112
+       .byte   96
+       .byte   71
+       .byte   -94
+       .byte   -110
+       .byte   -118
+       .byte   -124
+       .byte   70
+       .byte   57
+       .byte   0
+       .byte   0
+       .byte   4
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   2
+       .byte   4
+       .byte   8
+       .byte   8
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   8
+       .byte   8
+       .byte   4
+       .byte   2
+       .byte   0
+       .byte   -128
+       .byte   64
+       .byte   32
+       .byte   32
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   32
+       .byte   32
+       .byte   64
+       .byte   -128
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   -110
+       .byte   84
+       .byte   56
+       .byte   84
+       .byte   -110
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -2
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   8
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   2
+       .byte   2
+       .byte   4
+       .byte   4
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   16
+       .byte   16
+       .byte   32
+       .byte   32
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   -128
+       .byte   -128
+       .byte   0
+       .byte   24
+       .byte   36
+       .byte   36
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   36
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   8
+       .byte   24
+       .byte   40
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   36
+       .byte   66
+       .byte   66
+       .byte   2
+       .byte   4
+       .byte   8
+       .byte   16
+       .byte   32
+       .byte   32
+       .byte   64
+       .byte   64
+       .byte   126
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   36
+       .byte   66
+       .byte   2
+       .byte   2
+       .byte   4
+       .byte   24
+       .byte   4
+       .byte   2
+       .byte   2
+       .byte   66
+       .byte   36
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   12
+       .byte   12
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   36
+       .byte   36
+       .byte   68
+       .byte   126
+       .byte   4
+       .byte   4
+       .byte   30
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   124
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   88
+       .byte   100
+       .byte   2
+       .byte   2
+       .byte   2
+       .byte   2
+       .byte   66
+       .byte   36
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   36
+       .byte   66
+       .byte   64
+       .byte   88
+       .byte   100
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   126
+       .byte   66
+       .byte   66
+       .byte   4
+       .byte   4
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   36
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   24
+       .byte   36
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   36
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   38
+       .byte   26
+       .byte   2
+       .byte   66
+       .byte   36
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   8
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   2
+       .byte   4
+       .byte   8
+       .byte   16
+       .byte   32
+       .byte   64
+       .byte   -128
+       .byte   -128
+       .byte   64
+       .byte   32
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -128
+       .byte   64
+       .byte   32
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   2
+       .byte   2
+       .byte   4
+       .byte   8
+       .byte   16
+       .byte   32
+       .byte   64
+       .byte   -128
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   4
+       .byte   8
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -102
+       .byte   -86
+       .byte   -86
+       .byte   -86
+       .byte   -86
+       .byte   -86
+       .byte   -100
+       .byte   -128
+       .byte   70
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   24
+       .byte   24
+       .byte   24
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   126
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   -25
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -16
+       .byte   72
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   72
+       .byte   120
+       .byte   68
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   68
+       .byte   -8
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   58
+       .byte   70
+       .byte   66
+       .byte   -126
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -126
+       .byte   66
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -8
+       .byte   68
+       .byte   68
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   68
+       .byte   68
+       .byte   -8
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   66
+       .byte   66
+       .byte   64
+       .byte   64
+       .byte   68
+       .byte   124
+       .byte   68
+       .byte   64
+       .byte   64
+       .byte   66
+       .byte   66
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   66
+       .byte   66
+       .byte   64
+       .byte   64
+       .byte   68
+       .byte   124
+       .byte   68
+       .byte   68
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   -16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   58
+       .byte   70
+       .byte   66
+       .byte   -126
+       .byte   -128
+       .byte   -128
+       .byte   -98
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   66
+       .byte   70
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   126
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   -25
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   124
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   31
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   -124
+       .byte   72
+       .byte   48
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   68
+       .byte   72
+       .byte   80
+       .byte   80
+       .byte   96
+       .byte   80
+       .byte   80
+       .byte   72
+       .byte   68
+       .byte   66
+       .byte   -25
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -16
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   66
+       .byte   66
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -61
+       .byte   66
+       .byte   102
+       .byte   102
+       .byte   102
+       .byte   90
+       .byte   90
+       .byte   90
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   -25
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -57
+       .byte   66
+       .byte   98
+       .byte   98
+       .byte   82
+       .byte   82
+       .byte   82
+       .byte   74
+       .byte   74
+       .byte   74
+       .byte   70
+       .byte   70
+       .byte   -30
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -8
+       .byte   68
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   68
+       .byte   120
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   -16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -110
+       .byte   -118
+       .byte   68
+       .byte   58
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -4
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   124
+       .byte   68
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   -25
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   58
+       .byte   70
+       .byte   -126
+       .byte   -126
+       .byte   -128
+       .byte   64
+       .byte   56
+       .byte   4
+       .byte   2
+       .byte   -126
+       .byte   -126
+       .byte   -60
+       .byte   -72
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   -110
+       .byte   -110
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   60
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   24
+       .byte   24
+       .byte   24
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   90
+       .byte   90
+       .byte   90
+       .byte   90
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   24
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   66
+       .byte   66
+       .byte   -25
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -18
+       .byte   68
+       .byte   68
+       .byte   68
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   -124
+       .byte   -124
+       .byte   8
+       .byte   8
+       .byte   16
+       .byte   16
+       .byte   32
+       .byte   32
+       .byte   64
+       .byte   66
+       .byte   -126
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   62
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   62
+       .byte   0
+       .byte   -128
+       .byte   -128
+       .byte   64
+       .byte   64
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   16
+       .byte   16
+       .byte   8
+       .byte   8
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   2
+       .byte   2
+       .byte   0
+       .byte   124
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   40
+       .byte   68
+       .byte   -126
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   112
+       .byte   8
+       .byte   4
+       .byte   60
+       .byte   68
+       .byte   -124
+       .byte   -124
+       .byte   -116
+       .byte   118
+       .byte   0
+       .byte   0
+       .byte   -64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   88
+       .byte   100
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   100
+       .byte   88
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   48
+       .byte   76
+       .byte   -124
+       .byte   -124
+       .byte   -128
+       .byte   -128
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   52
+       .byte   76
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   76
+       .byte   54
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -4
+       .byte   -128
+       .byte   -126
+       .byte   66
+       .byte   60
+       .byte   0
+       .byte   0
+       .byte   14
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   124
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   54
+       .byte   76
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   76
+       .byte   52
+       .byte   4
+       .byte   4
+       .byte   120
+       .byte   -64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   88
+       .byte   100
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   -29
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   48
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   4
+       .byte   4
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   4
+       .byte   8
+       .byte   8
+       .byte   48
+       .byte   -64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   78
+       .byte   68
+       .byte   72
+       .byte   80
+       .byte   96
+       .byte   80
+       .byte   72
+       .byte   68
+       .byte   -26
+       .byte   0
+       .byte   0
+       .byte   48
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -10
+       .byte   73
+       .byte   73
+       .byte   73
+       .byte   73
+       .byte   73
+       .byte   73
+       .byte   73
+       .byte   -37
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -40
+       .byte   100
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   -29
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -40
+       .byte   100
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   100
+       .byte   88
+       .byte   64
+       .byte   -32
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   52
+       .byte   76
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   76
+       .byte   52
+       .byte   4
+       .byte   14
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -36
+       .byte   98
+       .byte   66
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   64
+       .byte   -32
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   122
+       .byte   -122
+       .byte   -126
+       .byte   -64
+       .byte   56
+       .byte   6
+       .byte   -126
+       .byte   -62
+       .byte   -68
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   124
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   14
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -58
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   70
+       .byte   59
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   24
+       .byte   24
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   90
+       .byte   90
+       .byte   90
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -58
+       .byte   68
+       .byte   40
+       .byte   40
+       .byte   16
+       .byte   40
+       .byte   40
+       .byte   68
+       .byte   -58
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -25
+       .byte   66
+       .byte   66
+       .byte   36
+       .byte   36
+       .byte   36
+       .byte   24
+       .byte   24
+       .byte   16
+       .byte   16
+       .byte   96
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   -126
+       .byte   -124
+       .byte   8
+       .byte   16
+       .byte   32
+       .byte   66
+       .byte   -126
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   6
+       .byte   8
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   96
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   8
+       .byte   6
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   96
+       .byte   16
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   6
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   8
+       .byte   16
+       .byte   96
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   114
+       .byte   -116
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   40
+       .byte   68
+       .byte   -126
+       .byte   -2
+       .byte   -126
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   16
+       .byte   32
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   66
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -2
+       .byte   -128
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   40
+       .byte   68
+       .byte   0
+       .byte   120
+       .byte   4
+       .byte   4
+       .byte   60
+       .byte   68
+       .byte   -124
+       .byte   -124
+       .byte   68
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   120
+       .byte   4
+       .byte   4
+       .byte   60
+       .byte   68
+       .byte   -124
+       .byte   -124
+       .byte   68
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   0
+       .byte   0
+       .byte   120
+       .byte   4
+       .byte   4
+       .byte   60
+       .byte   68
+       .byte   -124
+       .byte   -124
+       .byte   68
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   24
+       .byte   36
+       .byte   24
+       .byte   0
+       .byte   120
+       .byte   4
+       .byte   4
+       .byte   60
+       .byte   68
+       .byte   -124
+       .byte   -124
+       .byte   68
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   60
+       .byte   66
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   66
+       .byte   60
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   16
+       .byte   40
+       .byte   68
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -2
+       .byte   -128
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -2
+       .byte   -128
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -2
+       .byte   -128
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   40
+       .byte   68
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -2
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -2
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   8
+       .byte   16
+       .byte   -2
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -8
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   96
+       .byte   28
+       .byte   18
+       .byte   114
+       .byte   -98
+       .byte   -112
+       .byte   -112
+       .byte   -110
+       .byte   108
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   16
+       .byte   32
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   -2
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   40
+       .byte   68
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   40
+       .byte   68
+       .byte   0
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   66
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   8
+       .byte   4
+       .byte   0
+       .byte   0
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   66
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   68
+       .byte   40
+       .byte   40
+       .byte   16
+       .byte   16
+       .byte   32
+       .byte   32
+       .byte   64
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   36
+       .byte   36
+       .byte   0
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   60
+       .byte   106
+       .byte   -88
+       .byte   -88
+       .byte   -88
+       .byte   -88
+       .byte   -88
+       .byte   106
+       .byte   60
+       .byte   40
+       .byte   40
+       .byte   40
+       .byte   0
+       .byte   12
+       .byte   18
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   -4
+       .byte   32
+       .byte   32
+       .byte   32
+       .byte   96
+       .byte   -96
+       .byte   -78
+       .byte   76
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   40
+       .byte   16
+       .byte   -2
+       .byte   16
+       .byte   16
+       .byte   -2
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -32
+       .byte   -112
+       .byte   -120
+       .byte   -120
+       .byte   -120
+       .byte   -108
+       .byte   -28
+       .byte   -97
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   -124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   18
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -2
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -112
+       .byte   96
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   120
+       .byte   4
+       .byte   4
+       .byte   60
+       .byte   68
+       .byte   -124
+       .byte   -124
+       .byte   68
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   12
+       .byte   8
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   66
+       .byte   62
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   18
+       .byte   42
+       .byte   36
+       .byte   0
+       .byte   -8
+       .byte   -124
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   0
+       .byte   0
+       .byte   18
+       .byte   42
+       .byte   36
+       .byte   0
+       .byte   -126
+       .byte   -62
+       .byte   -62
+       .byte   -94
+       .byte   -110
+       .byte   -110
+       .byte   -118
+       .byte   -122
+       .byte   -122
+       .byte   -126
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   120
+       .byte   4
+       .byte   4
+       .byte   60
+       .byte   68
+       .byte   -124
+       .byte   -124
+       .byte   68
+       .byte   62
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   56
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   32
+       .byte   68
+       .byte   -126
+       .byte   -126
+       .byte   -126
+       .byte   68
+       .byte   56
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   -128
+       .byte   -128
+       .byte   -128
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -2
+       .byte   2
+       .byte   2
+       .byte   2
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   48
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   120
+       .byte   4
+       .byte   56
+       .byte   64
+       .byte   124
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   48
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   -2
+       .byte   0
+       .byte   24
+       .byte   40
+       .byte   72
+       .byte   124
+       .byte   8
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   18
+       .byte   36
+       .byte   72
+       .byte   -112
+       .byte   -112
+       .byte   72
+       .byte   36
+       .byte   18
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -112
+       .byte   72
+       .byte   36
+       .byte   18
+       .byte   18
+       .byte   36
+       .byte   72
+       .byte   -112
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   17
+       .byte   68
+       .byte   17
+       .byte   68
+       .byte   17
+       .byte   68
+       .byte   17
+       .byte   68
+       .byte   17
+       .byte   68
+       .byte   17
+       .byte   68
+       .byte   17
+       .byte   68
+       .byte   17
+       .byte   68
+       .byte   85
+       .byte   -86
+       .byte   85
+       .byte   -86
+       .byte   85
+       .byte   -86
+       .byte   85
+       .byte   -86
+       .byte   85
+       .byte   -86
+       .byte   85
+       .byte   -86
+       .byte   85
+       .byte   -86
+       .byte   85
+       .byte   -86
+       .byte   119
+       .byte   -35
+       .byte   119
+       .byte   -35
+       .byte   119
+       .byte   -35
+       .byte   119
+       .byte   -35
+       .byte   119
+       .byte   -35
+       .byte   119
+       .byte   -35
+       .byte   119
+       .byte   -35
+       .byte   119
+       .byte   -35
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -16
+       .byte   16
+       .byte   -16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -12
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -4
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -16
+       .byte   16
+       .byte   -16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -12
+       .byte   4
+       .byte   -12
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -4
+       .byte   4
+       .byte   -12
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -12
+       .byte   4
+       .byte   -4
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -4
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -16
+       .byte   16
+       .byte   -16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   31
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   31
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -1
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   31
+       .byte   16
+       .byte   31
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   23
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   23
+       .byte   16
+       .byte   31
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   31
+       .byte   16
+       .byte   23
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -9
+       .byte   0
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   0
+       .byte   -9
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   23
+       .byte   16
+       .byte   23
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   0
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -9
+       .byte   0
+       .byte   -9
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -1
+       .byte   0
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   0
+       .byte   -1
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   31
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   31
+       .byte   16
+       .byte   31
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   31
+       .byte   16
+       .byte   31
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   31
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   -9
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   20
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -1
+       .byte   16
+       .byte   -1
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -16
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   31
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   16
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   -16
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   15
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   -1
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+.globl __ZN6Screen3bufE
+       .bss
+__ZN6Screen3bufE:
+       .space 20
+       .text
+.globl _debugprint
+       .def    _debugprint;    .scl    2;      .type   32;     .endef
+_debugprint:
+LFB26:
+       .file 2 "screen.cpp"
+       .loc 2 9 0
+       push    ebp
+LCFI29:
+       mov     ebp, esp
+LCFI30:
+       sub     esp, 2088
+LCFI31:
+LBB5:
+       .loc 2 14 0
+       lea     eax, [ebp+12]
+       mov     DWORD PTR [ebp-16], eax
+       .loc 2 15 0
+       mov     eax, DWORD PTR [ebp-16]
+       mov     DWORD PTR [esp+8], eax
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp+4], eax
+       lea     eax, [ebp-2064]
+       mov     DWORD PTR [esp], eax
+       call    _vsprintf
+       mov     DWORD PTR [ebp-12], eax
+       .loc 2 18 0
+       call    __ZN6Screen4InstEv
+       lea     edx, [ebp-2064]
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+LBE5:
+       .loc 2 19 0
+       leave
+LCFI32:
+       ret
+LFE26:
+       .align 2
+.globl __ZN6ScreenC2EP8BOOTINFO
+       .def    __ZN6ScreenC2EP8BOOTINFO;       .scl    2;      .type   32;     .endef
+__ZN6ScreenC2EP8BOOTINFO:
+LFB28:
+       .loc 2 21 0
+       push    ebp
+LCFI33:
+       mov     ebp, esp
+LCFI34:
+       sub     esp, 8
+LCFI35:
+LBB6:
+       .loc 2 21 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     edx, DWORD PTR [ebp+12]
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen7PointerC1EP8BOOTINFO
+       mov     eax, DWORD PTR [ebp+8]
+       mov     edx, DWORD PTR [ebp+12]
+       mov     DWORD PTR [eax+16], edx
+LBE6:
+       .loc 2 22 0
+       leave
+LCFI36:
+       ret
+LFE28:
+.globl __ZN6ScreenC1EP8BOOTINFO
+       .def    __ZN6ScreenC1EP8BOOTINFO;       .scl    2;      .type   32;     .endef
+       .set    __ZN6ScreenC1EP8BOOTINFO,__ZN6ScreenC2EP8BOOTINFO
+       .align 2
+.globl __ZN6Screen4InitEP8BOOTINFO
+       .def    __ZN6Screen4InitEP8BOOTINFO;    .scl    2;      .type   32;     .endef
+__ZN6Screen4InitEP8BOOTINFO:
+LFB30:
+       .loc 2 24 0
+       push    ebp
+LCFI37:
+       mov     ebp, esp
+LCFI38:
+       sub     esp, 8
+LCFI39:
+       .loc 2 25 0
+       mov     eax, OFFSET FLAT:__ZN6Screen3bufE
+       mov     DWORD PTR [esp+4], eax
+       mov     DWORD PTR [esp], 20
+       call    __ZN6ScreennwEjPv
+       mov     edx, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+       call    __ZN6ScreenC1EP8BOOTINFO
+       .loc 2 26 0
+       leave
+LCFI40:
+       ret
+LFE30:
+       .align 2
+.globl __ZN6Screen6printfEPKcz
+       .def    __ZN6Screen6printfEPKcz;        .scl    2;      .type   32;     .endef
+__ZN6Screen6printfEPKcz:
+LFB31:
+       .loc 2 28 0
+       push    ebp
+LCFI41:
+       mov     ebp, esp
+LCFI42:
+       sub     esp, 2088
+LCFI43:
+LBB7:
+       .loc 2 33 0
+       lea     eax, [ebp+16]
+       mov     DWORD PTR [ebp-16], eax
+       .loc 2 34 0
+       mov     eax, DWORD PTR [ebp-16]
+       mov     DWORD PTR [esp+8], eax
+       mov     eax, DWORD PTR [ebp+12]
+       mov     DWORD PTR [esp+4], eax
+       lea     eax, [ebp-2064]
+       mov     DWORD PTR [esp], eax
+       call    _vsprintf
+       mov     DWORD PTR [ebp-12], eax
+       .loc 2 37 0
+       lea     eax, [ebp-2064]
+       mov     DWORD PTR [esp+4], eax
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen4putsEPKc
+LBE7:
+       .loc 2 38 0
+       leave
+LCFI44:
+       ret
+LFE31:
+       .align 2
+.globl __ZN6Screen4putsEPKc
+       .def    __ZN6Screen4putsEPKc;   .scl    2;      .type   32;     .endef
+__ZN6Screen4putsEPKc:
+LFB32:
+       .loc 2 40 0
+       push    ebp
+LCFI45:
+       mov     ebp, esp
+LCFI46:
+       push    ebx
+LCFI47:
+       sub     esp, 36
+LCFI48:
+LBB8:
+LBB9:
+       .loc 2 41 0
+       jmp     L20
+L29:
+LBB10:
+LBB11:
+       .loc 2 42 0
+       mov     eax, DWORD PTR [ebp+12]
+       mov     al, BYTE PTR [eax]
+       cmp     al, 10
+       jne     L21
+       .loc 2 43 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen7Pointer7NewLineEv
+       test    eax, eax
+       setne   al
+       test    al, al
+       je      L30
+       .loc 2 44 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6ScrollEv
+       jmp     L23
+L21:
+LBB12:
+LBB13:
+       .loc 2 47 0
+       mov     DWORD PTR [ebp-12], 0
+       jmp     L24
+L28:
+LBB14:
+       .loc 2 48 0
+       mov     eax, DWORD PTR [ebp+12]
+       mov     al, BYTE PTR [eax]
+       movsx   eax, al
+       sal     eax, 4
+       add     eax, DWORD PTR [ebp-12]
+       add     eax, OFFSET FLAT:_hankakufont
+       mov     al, BYTE PTR [eax]
+       mov     BYTE PTR [ebp-17], al
+LBB15:
+       .loc 2 49 0
+       mov     DWORD PTR [ebp-16], 0
+       jmp     L25
+L27:
+       .loc 2 50 0
+       movzx   edx, BYTE PTR [ebp-17]
+       mov     eax, 7
+       sub     eax, DWORD PTR [ebp-16]
+       mov     ebx, edx
+       mov     cl, al
+       sar     ebx, cl
+       mov     eax, ebx
+       and     eax, 1
+       test    al, al
+       je      L26
+       .loc 2 51 0
+       mov     DWORD PTR [esp+12], 255
+       mov     DWORD PTR [esp+8], 255
+       mov     DWORD PTR [esp+4], 255
+       lea     eax, [ebp-20]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen3RGBC1Ehhh
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen7Pointer4getyEv
+       mov     ebx, eax
+       add     ebx, DWORD PTR [ebp-12]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen7Pointer4getxEv
+       add     eax, DWORD PTR [ebp-16]
+       lea     edx, [ebp-20]
+       mov     DWORD PTR [esp+12], edx
+       mov     DWORD PTR [esp+8], ebx
+       mov     DWORD PTR [esp+4], eax
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen8SetPixelEiiRKNS_3RGBE
+L26:
+       .loc 2 49 0
+       inc     DWORD PTR [ebp-16]
+L25:
+       .loc 2 49 0 is_stmt 0 discriminator 1
+       cmp     DWORD PTR [ebp-16], 7
+       setle   al
+       test    al, al
+       jne     L27
+LBE15:
+LBE14:
+       .loc 2 47 0 is_stmt 1
+       inc     DWORD PTR [ebp-12]
+L24:
+       .loc 2 47 0 is_stmt 0 discriminator 1
+       cmp     DWORD PTR [ebp-12], 15
+       setle   al
+       test    al, al
+       jne     L28
+LBE13:
+       .loc 2 55 0 is_stmt 1
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen7Pointer8NextCharEv
+       test    eax, eax
+       setne   al
+       test    al, al
+       je      L23
+       .loc 2 56 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     DWORD PTR [esp], eax
+       call    __ZN6Screen6ScrollEv
+       jmp     L23
+L30:
+LBE12:
+       .loc 2 44 0
+       nop
+L23:
+LBE11:
+LBE10:
+       .loc 2 41 0
+       inc     DWORD PTR [ebp+12]
+L20:
+       .loc 2 41 0 is_stmt 0 discriminator 1
+       mov     eax, DWORD PTR [ebp+12]
+       mov     al, BYTE PTR [eax]
+       test    al, al
+       setne   al
+       test    al, al
+       jne     L29
+LBE9:
+LBE8:
+       .loc 2 60 0 is_stmt 1
+       add     esp, 36
+       pop     ebx
+LCFI49:
+       leave
+LCFI50:
+       ret
+LFE32:
+       .align 2
+.globl __ZN6Screen8SetPixelEiiRKNS_3RGBE
+       .def    __ZN6Screen8SetPixelEiiRKNS_3RGBE;      .scl    2;      .type   32;     .endef
+__ZN6Screen8SetPixelEiiRKNS_3RGBE:
+LFB33:
+       .loc 2 62 0
+       push    ebp
+LCFI51:
+       mov     ebp, esp
+LCFI52:
+       push    ebx
+LCFI53:
+       sub     esp, 20
+LCFI54:
+LBB16:
+LBB17:
+       .loc 2 63 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     al, BYTE PTR [eax+2]
+       cmp     al, 8
+       jne     L32
+       .loc 2 64 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     edx, DWORD PTR [eax+8]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     ax, WORD PTR [eax+4]
+       movzx   eax, ax
+       imul    eax, DWORD PTR [ebp+16]
+       add     eax, DWORD PTR [ebp+12]
+       lea     ebx, [edx+eax]
+       mov     eax, DWORD PTR [ebp+20]
+       mov     DWORD PTR [esp], eax
+       call    __ZNK6Screen3RGB4col8Ev
+       mov     BYTE PTR [ebx], al
+       jmp     L31
+L32:
+LBB18:
+       .loc 2 66 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     ecx, DWORD PTR [eax+8]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     ax, WORD PTR [eax+4]
+       movzx   eax, ax
+       imul    eax, DWORD PTR [ebp+16]
+       mov     edx, eax
+       add     edx, DWORD PTR [ebp+12]
+       mov     eax, edx
+       sal     eax
+       add     eax, edx
+       lea     eax, [ecx+eax]
+       mov     DWORD PTR [ebp-8], eax
+       .loc 2 67 0
+       mov     eax, DWORD PTR [ebp+20]
+       mov     dl, BYTE PTR [eax+2]
+       mov     eax, DWORD PTR [ebp-8]
+       mov     BYTE PTR [eax], dl
+       .loc 2 68 0
+       mov     eax, DWORD PTR [ebp-8]
+       lea     edx, [eax+1]
+       mov     eax, DWORD PTR [ebp+20]
+       mov     al, BYTE PTR [eax+1]
+       mov     BYTE PTR [edx], al
+       .loc 2 69 0
+       mov     eax, DWORD PTR [ebp-8]
+       lea     edx, [eax+2]
+       mov     eax, DWORD PTR [ebp+20]
+       mov     al, BYTE PTR [eax]
+       mov     BYTE PTR [edx], al
+L31:
+LBE18:
+LBE17:
+LBE16:
+       .loc 2 71 0
+       add     esp, 20
+       pop     ebx
+LCFI55:
+       leave
+LCFI56:
+       ret
+LFE33:
+       .align 2
+.globl __ZN6Screen6ScrollEv
+       .def    __ZN6Screen6ScrollEv;   .scl    2;      .type   32;     .endef
+__ZN6Screen6ScrollEv:
+LFB34:
+       .loc 2 73 0
+       push    ebp
+LCFI57:
+       mov     ebp, esp
+LCFI58:
+       sub     esp, 40
+LCFI59:
+LBB19:
+       .loc 2 74 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     ax, WORD PTR [eax+6]
+       shr     ax, 4
+       movzx   eax, ax
+       mov     DWORD PTR [ebp-12], eax
+       .loc 2 75 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     ax, WORD PTR [eax+4]
+       movzx   edx, ax
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     al, BYTE PTR [eax+2]
+       movzx   eax, al
+       imul    eax, edx
+       test    eax, eax
+       jns     L35
+       add     eax, 7
+L35:
+       sar     eax, 3
+       mov     DWORD PTR [ebp-16], eax
+       .loc 2 76 0
+       mov     eax, DWORD PTR [ebp-16]
+       sal     eax, 4
+       mov     DWORD PTR [ebp-20], eax
+       .loc 2 81 0
+       mov     eax, DWORD PTR [ebp-12]
+       dec     eax
+       mov     ecx, eax
+       imul    ecx, DWORD PTR [ebp-20]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     eax, DWORD PTR [eax+8]
+       mov     edx, eax
+       add     edx, DWORD PTR [ebp-20]
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     eax, DWORD PTR [eax+8]
+       mov     DWORD PTR [esp+8], ecx
+       mov     DWORD PTR [esp+4], edx
+       mov     DWORD PTR [esp], eax
+       call    _memmove
+       .loc 2 83 0
+       mov     eax, DWORD PTR [ebp+8]
+       mov     eax, DWORD PTR [eax+16]
+       mov     edx, DWORD PTR [eax+8]
+       mov     eax, DWORD PTR [ebp-12]
+       dec     eax
+       imul    eax, DWORD PTR [ebp-20]
+       add     edx, eax
+       mov     eax, DWORD PTR [ebp-20]
+       mov     DWORD PTR [esp+8], eax
+       mov     DWORD PTR [esp+4], 0
+       mov     DWORD PTR [esp], edx
+       call    _memset
+LBE19:
+       .loc 2 84 0
+       leave
+LCFI60:
+       ret
+LFE34:
+       .section        .debug_frame,"dr"
+Lframe0:
+       .long   LECIE0-LSCIE0
+LSCIE0:
+       .long   0xffffffff
+       .byte   0x1
+       .ascii "\0"
+       .uleb128 0x1
+       .sleb128 -4
+       .byte   0x8
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .byte   0x88
+       .uleb128 0x1
+       .align 4
+LECIE0:
+LSFDE0:
+       .long   LEFDE0-LASFDE0
+LASFDE0:
+       .secrel32       Lframe0
+       .long   LFB13
+       .long   LFE13-LFB13
+       .byte   0x4
+       .long   LCFI0-LFB13
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI1-LCFI0
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI2-LCFI1
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE0:
+LSFDE2:
+       .long   LEFDE2-LASFDE2
+LASFDE2:
+       .secrel32       Lframe0
+       .long   LFB16
+       .long   LFE16-LFB16
+       .byte   0x4
+       .long   LCFI3-LFB16
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI4-LCFI3
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI5-LCFI4
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE2:
+LSFDE4:
+       .long   LEFDE4-LASFDE4
+LASFDE4:
+       .secrel32       Lframe0
+       .long   LFB17
+       .long   LFE17-LFB17
+       .byte   0x4
+       .long   LCFI6-LFB17
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI7-LCFI6
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI8-LCFI7
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE4:
+LSFDE6:
+       .long   LEFDE6-LASFDE6
+LASFDE6:
+       .secrel32       Lframe0
+       .long   LFB18
+       .long   LFE18-LFB18
+       .byte   0x4
+       .long   LCFI9-LFB18
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI10-LCFI9
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI11-LCFI10
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE6:
+LSFDE8:
+       .long   LEFDE8-LASFDE8
+LASFDE8:
+       .secrel32       Lframe0
+       .long   LFB19
+       .long   LFE19-LFB19
+       .byte   0x4
+       .long   LCFI12-LFB19
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI13-LCFI12
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI15-LCFI13
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE8:
+LSFDE10:
+       .long   LEFDE10-LASFDE10
+LASFDE10:
+       .secrel32       Lframe0
+       .long   LFB20
+       .long   LFE20-LFB20
+       .byte   0x4
+       .long   LCFI16-LFB20
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI17-LCFI16
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI18-LCFI17
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE10:
+LSFDE12:
+       .long   LEFDE12-LASFDE12
+LASFDE12:
+       .secrel32       Lframe0
+       .long   LFB23
+       .long   LFE23-LFB23
+       .byte   0x4
+       .long   LCFI19-LFB23
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI20-LCFI19
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI22-LCFI20
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE12:
+LSFDE14:
+       .long   LEFDE14-LASFDE14
+LASFDE14:
+       .secrel32       Lframe0
+       .long   LFB24
+       .long   LFE24-LFB24
+       .byte   0x4
+       .long   LCFI23-LFB24
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI24-LCFI23
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI25-LCFI24
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE14:
+LSFDE16:
+       .long   LEFDE16-LASFDE16
+LASFDE16:
+       .secrel32       Lframe0
+       .long   LFB25
+       .long   LFE25-LFB25
+       .byte   0x4
+       .long   LCFI26-LFB25
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI27-LCFI26
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI28-LCFI27
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE16:
+LSFDE18:
+       .long   LEFDE18-LASFDE18
+LASFDE18:
+       .secrel32       Lframe0
+       .long   LFB26
+       .long   LFE26-LFB26
+       .byte   0x4
+       .long   LCFI29-LFB26
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI30-LCFI29
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI32-LCFI30
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE18:
+LSFDE20:
+       .long   LEFDE20-LASFDE20
+LASFDE20:
+       .secrel32       Lframe0
+       .long   LFB28
+       .long   LFE28-LFB28
+       .byte   0x4
+       .long   LCFI33-LFB28
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI34-LCFI33
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI36-LCFI34
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE20:
+LSFDE22:
+       .long   LEFDE22-LASFDE22
+LASFDE22:
+       .secrel32       Lframe0
+       .long   LFB30
+       .long   LFE30-LFB30
+       .byte   0x4
+       .long   LCFI37-LFB30
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI38-LCFI37
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI40-LCFI38
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE22:
+LSFDE24:
+       .long   LEFDE24-LASFDE24
+LASFDE24:
+       .secrel32       Lframe0
+       .long   LFB31
+       .long   LFE31-LFB31
+       .byte   0x4
+       .long   LCFI41-LFB31
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI42-LCFI41
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI44-LCFI42
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE24:
+LSFDE26:
+       .long   LEFDE26-LASFDE26
+LASFDE26:
+       .secrel32       Lframe0
+       .long   LFB32
+       .long   LFE32-LFB32
+       .byte   0x4
+       .long   LCFI45-LFB32
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI46-LCFI45
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI48-LCFI46
+       .byte   0x83
+       .uleb128 0x3
+       .byte   0x4
+       .long   LCFI49-LCFI48
+       .byte   0xc3
+       .byte   0x4
+       .long   LCFI50-LCFI49
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE26:
+LSFDE28:
+       .long   LEFDE28-LASFDE28
+LASFDE28:
+       .secrel32       Lframe0
+       .long   LFB33
+       .long   LFE33-LFB33
+       .byte   0x4
+       .long   LCFI51-LFB33
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI52-LCFI51
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI54-LCFI52
+       .byte   0x83
+       .uleb128 0x3
+       .byte   0x4
+       .long   LCFI55-LCFI54
+       .byte   0xc3
+       .byte   0x4
+       .long   LCFI56-LCFI55
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE28:
+LSFDE30:
+       .long   LEFDE30-LASFDE30
+LASFDE30:
+       .secrel32       Lframe0
+       .long   LFB34
+       .long   LFE34-LFB34
+       .byte   0x4
+       .long   LCFI57-LFB34
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI58-LCFI57
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI60-LCFI58
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE30:
+       .section        .eh_frame,"w"
+Lframe1:
+       .long   LECIE1-LSCIE1
+LSCIE1:
+       .long   0x0
+       .byte   0x1
+       .ascii "\0"
+       .uleb128 0x1
+       .sleb128 -4
+       .byte   0x8
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .byte   0x88
+       .uleb128 0x1
+       .align 4
+LECIE1:
+LSFDE33:
+       .long   LEFDE33-LASFDE33
+LASFDE33:
+       .long   LASFDE33-Lframe1
+       .long   LFB26
+       .long   LFE26-LFB26
+       .byte   0x4
+       .long   LCFI29-LFB26
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI30-LCFI29
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI32-LCFI30
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE33:
+LSFDE35:
+       .long   LEFDE35-LASFDE35
+LASFDE35:
+       .long   LASFDE35-Lframe1
+       .long   LFB31
+       .long   LFE31-LFB31
+       .byte   0x4
+       .long   LCFI41-LFB31
+       .byte   0xe
+       .uleb128 0x8
+       .byte   0x85
+       .uleb128 0x2
+       .byte   0x4
+       .long   LCFI42-LCFI41
+       .byte   0xd
+       .uleb128 0x5
+       .byte   0x4
+       .long   LCFI44-LCFI42
+       .byte   0xc5
+       .byte   0xc
+       .uleb128 0x4
+       .uleb128 0x4
+       .align 4
+LEFDE35:
+       .text
+Letext0:
+       .section        .debug_loc,"dr"
+Ldebug_loc0:
+LLST0:
+       .long   LFB13
+       .long   LCFI0
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI0
+       .long   LCFI1
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI1
+       .long   LCFI2
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI2
+       .long   LFE13
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST1:
+       .long   LFB16
+       .long   LCFI3
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI3
+       .long   LCFI4
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI4
+       .long   LCFI5
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI5
+       .long   LFE16
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST2:
+       .long   LFB17
+       .long   LCFI6
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI6
+       .long   LCFI7
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI7
+       .long   LCFI8
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI8
+       .long   LFE17
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST3:
+       .long   LFB18
+       .long   LCFI9
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI9
+       .long   LCFI10
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI10
+       .long   LCFI11
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI11
+       .long   LFE18
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST4:
+       .long   LFB19
+       .long   LCFI12
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI12
+       .long   LCFI13
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI13
+       .long   LCFI15
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI15
+       .long   LFE19
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST5:
+       .long   LFB20
+       .long   LCFI16
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI16
+       .long   LCFI17
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI17
+       .long   LCFI18
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI18
+       .long   LFE20
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST6:
+       .long   LFB23
+       .long   LCFI19
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI19
+       .long   LCFI20
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI20
+       .long   LCFI22
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI22
+       .long   LFE23
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST7:
+       .long   LFB24
+       .long   LCFI23
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI23
+       .long   LCFI24
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI24
+       .long   LCFI25
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI25
+       .long   LFE24
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST8:
+       .long   LFB25
+       .long   LCFI26
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI26
+       .long   LCFI27
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI27
+       .long   LCFI28
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI28
+       .long   LFE25
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST9:
+       .long   LFB26
+       .long   LCFI29
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI29
+       .long   LCFI30
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI30
+       .long   LCFI32
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI32
+       .long   LFE26
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST10:
+       .long   LFB28
+       .long   LCFI33
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI33
+       .long   LCFI34
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI34
+       .long   LCFI36
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI36
+       .long   LFE28
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST11:
+       .long   LFB30
+       .long   LCFI37
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI37
+       .long   LCFI38
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI38
+       .long   LCFI40
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI40
+       .long   LFE30
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST12:
+       .long   LFB31
+       .long   LCFI41
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI41
+       .long   LCFI42
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI42
+       .long   LCFI44
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI44
+       .long   LFE31
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST13:
+       .long   LFB32
+       .long   LCFI45
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI45
+       .long   LCFI46
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI46
+       .long   LCFI50
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI50
+       .long   LFE32
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST14:
+       .long   LFB33
+       .long   LCFI51
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI51
+       .long   LCFI52
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI52
+       .long   LCFI56
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI56
+       .long   LFE33
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+LLST15:
+       .long   LFB34
+       .long   LCFI57
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   LCFI57
+       .long   LCFI58
+       .word   0x2
+       .byte   0x74
+       .sleb128 8
+       .long   LCFI58
+       .long   LCFI60
+       .word   0x2
+       .byte   0x75
+       .sleb128 8
+       .long   LCFI60
+       .long   LFE34
+       .word   0x2
+       .byte   0x74
+       .sleb128 4
+       .long   0x0
+       .long   0x0
+       .file 3 "g:/mingw/bin/../lib/gcc/mingw32/4.5.0/include/c++/cstddef"
+       .file 4 "g:/mingw/bin/../lib/gcc/mingw32/4.5.0/include/stddef.h"
+       .file 5 "typedefs.h"
+       .file 6 "bootpack.h"
+       .file 7 "<built-in>"
+       .file 8 "hankaku.h"
+       .section        .debug_info,"dr"
+       .long   0xa30
+       .word   0x2
+       .secrel32       Ldebug_abbrev0
+       .byte   0x4
+       .uleb128 0x1
+       .ascii "GNU C++ 4.5.0\0"
+       .byte   0x4
+       .ascii "screen.cpp\0"
+       .ascii "G:\\c\\os\\harib27f\\haribote\0"
+       .long   0x0
+       .long   0x0
+       .secrel32       Ldebug_ranges0+0x0
+       .secrel32       Ldebug_line0
+       .uleb128 0x2
+       .byte   0x4
+       .byte   0x5
+       .ascii "int\0"
+       .uleb128 0x3
+       .ascii "size_t\0"
+       .byte   0x4
+       .byte   0xd3
+       .long   0x65
+       .uleb128 0x2
+       .byte   0x4
+       .byte   0x7
+       .ascii "unsigned int\0"
+       .uleb128 0x4
+       .ascii "std\0"
+       .byte   0x7
+       .byte   0x0
+       .long   0x8f
+       .uleb128 0x5
+       .byte   0x3
+       .byte   0x33
+       .long   0x8f
+       .uleb128 0x5
+       .byte   0x3
+       .byte   0x34
+       .long   0x92
+       .byte   0x0
+       .uleb128 0x6
+       .byte   0x4
+       .byte   0x5
+       .uleb128 0x6
+       .byte   0x4
+       .byte   0x7
+       .uleb128 0x3
+       .ascii "BYTE\0"
+       .byte   0x5
+       .byte   0x3
+       .long   0xa1
+       .uleb128 0x2
+       .byte   0x1
+       .byte   0x8
+       .ascii "unsigned char\0"
+       .uleb128 0x3
+       .ascii "WORD\0"
+       .byte   0x5
+       .byte   0x4
+       .long   0xbe
+       .uleb128 0x2
+       .byte   0x2
+       .byte   0x7
+       .ascii "short unsigned int\0"
+       .uleb128 0x2
+       .byte   0x8
+       .byte   0x7
+       .ascii "long long unsigned int\0"
+       .uleb128 0x7
+       .ascii "BOOTINFO\0"
+       .byte   0xc
+       .byte   0x6
+       .byte   0x4
+       .long   0x178
+       .uleb128 0x8
+       .ascii "bootdrive\0"
+       .byte   0x6
+       .byte   0x5
+       .long   0x95
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x0
+       .uleb128 0x8
+       .ascii "leds\0"
+       .byte   0x6
+       .byte   0x6
+       .long   0x95
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x1
+       .uleb128 0x8
+       .ascii "vmode\0"
+       .byte   0x6
+       .byte   0x7
+       .long   0x95
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x2
+       .uleb128 0x8
+       .ascii "reserve\0"
+       .byte   0x6
+       .byte   0x8
+       .long   0x95
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x3
+       .uleb128 0x8
+       .ascii "screenx\0"
+       .byte   0x6
+       .byte   0x9
+       .long   0xb2
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x4
+       .uleb128 0x8
+       .ascii "screeny\0"
+       .byte   0x6
+       .byte   0x9
+       .long   0xb2
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x6
+       .uleb128 0x8
+       .ascii "vram\0"
+       .byte   0x6
+       .byte   0xa
+       .long   0x178
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x8
+       .byte   0x0
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x95
+       .uleb128 0xa
+       .ascii "Screen\0"
+       .byte   0x14
+       .byte   0x1
+       .byte   0x5
+       .long   0x53b
+       .uleb128 0xa
+       .ascii "Pointer\0"
+       .byte   0x10
+       .byte   0x1
+       .byte   0x17
+       .long   0x2c7
+       .uleb128 0xb
+       .ascii "px\0"
+       .byte   0x1
+       .byte   0x18
+       .long   0x50
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x0
+       .byte   0x3
+       .uleb128 0xb
+       .ascii "py\0"
+       .byte   0x1
+       .byte   0x18
+       .long   0x50
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x4
+       .byte   0x3
+       .uleb128 0xb
+       .ascii "w\0"
+       .byte   0x1
+       .byte   0x19
+       .long   0x53b
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x8
+       .byte   0x3
+       .uleb128 0xb
+       .ascii "h\0"
+       .byte   0x1
+       .byte   0x19
+       .long   0x53b
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0xc
+       .byte   0x3
+       .uleb128 0xc
+       .byte   0x1
+       .ascii "Pointer\0"
+       .byte   0x1
+       .byte   0x1b
+       .byte   0x1
+       .long   0x1f0
+       .uleb128 0xd
+       .long   0x540
+       .byte   0x1
+       .uleb128 0xe
+       .long   0x546
+       .byte   0x0
+       .uleb128 0xf
+       .byte   0x1
+       .ascii "getx\0"
+       .byte   0x1
+       .byte   0x1d
+       .ascii "_ZN6Screen7Pointer4getxEv\0"
+       .long   0x50
+       .byte   0x1
+       .long   0x223
+       .uleb128 0xd
+       .long   0x540
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0xf
+       .byte   0x1
+       .ascii "gety\0"
+       .byte   0x1
+       .byte   0x1e
+       .ascii "_ZN6Screen7Pointer4getyEv\0"
+       .long   0x50
+       .byte   0x1
+       .long   0x256
+       .uleb128 0xd
+       .long   0x540
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0xf
+       .byte   0x1
+       .ascii "NextChar\0"
+       .byte   0x1
+       .byte   0x1f
+       .ascii "_ZN6Screen7Pointer8NextCharEv\0"
+       .long   0x50
+       .byte   0x1
+       .long   0x291
+       .uleb128 0xd
+       .long   0x540
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x10
+       .byte   0x1
+       .ascii "NewLine\0"
+       .byte   0x1
+       .byte   0x2d
+       .ascii "_ZN6Screen7Pointer7NewLineEv\0"
+       .long   0x50
+       .byte   0x1
+       .uleb128 0xd
+       .long   0x540
+       .byte   0x1
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x7
+       .ascii "RGB\0"
+       .byte   0x3
+       .byte   0x1
+       .byte   0x39
+       .long   0x347
+       .uleb128 0x8
+       .ascii "r\0"
+       .byte   0x1
+       .byte   0x3a
+       .long   0x95
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x0
+       .uleb128 0x8
+       .ascii "g\0"
+       .byte   0x1
+       .byte   0x3a
+       .long   0x95
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x1
+       .uleb128 0x8
+       .ascii "b\0"
+       .byte   0x1
+       .byte   0x3a
+       .long   0x95
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x2
+       .uleb128 0xc
+       .byte   0x1
+       .ascii "RGB\0"
+       .byte   0x1
+       .byte   0x3b
+       .byte   0x1
+       .long   0x31a
+       .uleb128 0xd
+       .long   0x54c
+       .byte   0x1
+       .uleb128 0xe
+       .long   0x95
+       .uleb128 0xe
+       .long   0x95
+       .uleb128 0xe
+       .long   0x95
+       .byte   0x0
+       .uleb128 0x10
+       .byte   0x1
+       .ascii "col8\0"
+       .byte   0x1
+       .byte   0x3c
+       .ascii "_ZNK6Screen3RGB4col8Ev\0"
+       .long   0x95
+       .byte   0x1
+       .uleb128 0xd
+       .long   0x552
+       .byte   0x1
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x11
+       .ascii "fontw\0"
+       .byte   0x1
+       .byte   0xd
+       .ascii "_ZN6Screen5fontwE\0"
+       .long   0x53b
+       .byte   0x1
+       .byte   0x1
+       .byte   0x8
+       .uleb128 0x11
+       .ascii "fonth\0"
+       .byte   0x1
+       .byte   0xd
+       .ascii "_ZN6Screen5fonthE\0"
+       .long   0x53b
+       .byte   0x1
+       .byte   0x1
+       .byte   0x10
+       .uleb128 0x8
+       .ascii "pt\0"
+       .byte   0x1
+       .byte   0x37
+       .long   0x18d
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x0
+       .uleb128 0x12
+       .ascii "buf\0"
+       .byte   0x1
+       .byte   0x41
+       .ascii "_ZN6Screen3bufE\0"
+       .long   0x55d
+       .byte   0x1
+       .byte   0x3
+       .byte   0x1
+       .uleb128 0x13
+       .secrel32       LASF0
+       .byte   0x1
+       .byte   0x45
+       .long   0x546
+       .byte   0x2
+       .byte   0x23
+       .uleb128 0x10
+       .byte   0x3
+       .uleb128 0x14
+       .byte   0x1
+       .ascii "Init\0"
+       .byte   0x1
+       .byte   0x7
+       .ascii "_ZN6Screen4InitEP8BOOTINFO\0"
+       .byte   0x1
+       .long   0x3f4
+       .uleb128 0xe
+       .long   0x546
+       .byte   0x0
+       .uleb128 0x15
+       .byte   0x1
+       .ascii "Inst\0"
+       .byte   0x1
+       .byte   0x8
+       .ascii "_ZN6Screen4InstEv\0"
+       .long   0x568
+       .byte   0x1
+       .uleb128 0x14
+       .byte   0x1
+       .ascii "printf\0"
+       .byte   0x1
+       .byte   0xf
+       .ascii "_ZN6Screen6printfEPKcz\0"
+       .byte   0x1
+       .long   0x448
+       .uleb128 0xd
+       .long   0x56a
+       .byte   0x1
+       .uleb128 0xe
+       .long   0x570
+       .uleb128 0x16
+       .byte   0x0
+       .uleb128 0x14
+       .byte   0x1
+       .ascii "puts\0"
+       .byte   0x1
+       .byte   0x10
+       .ascii "_ZN6Screen4putsEPKc\0"
+       .byte   0x1
+       .long   0x476
+       .uleb128 0xd
+       .long   0x56a
+       .byte   0x1
+       .uleb128 0xe
+       .long   0x570
+       .byte   0x0
+       .uleb128 0x14
+       .byte   0x1
+       .ascii "SetPixel\0"
+       .byte   0x1
+       .byte   0x13
+       .ascii "_ZN6Screen8SetPixelEiiRKNS_3RGBE\0"
+       .byte   0x1
+       .long   0x4bf
+       .uleb128 0xd
+       .long   0x56a
+       .byte   0x1
+       .uleb128 0xe
+       .long   0x50
+       .uleb128 0xe
+       .long   0x50
+       .uleb128 0xe
+       .long   0x583
+       .byte   0x0
+       .uleb128 0x14
+       .byte   0x1
+       .ascii "Scroll\0"
+       .byte   0x1
+       .byte   0x15
+       .ascii "_ZN6Screen6ScrollEv\0"
+       .byte   0x1
+       .long   0x4ea
+       .uleb128 0xd
+       .long   0x56a
+       .byte   0x1
+       .byte   0x0
+       .uleb128 0x17
+       .byte   0x1
+       .ascii "operator new\0"
+       .byte   0x1
+       .byte   0x42
+       .ascii "_ZN6ScreennwEjPv\0"
+       .long   0x589
+       .byte   0x3
+       .byte   0x1
+       .long   0x521
+       .uleb128 0xe
+       .long   0x57
+       .uleb128 0xe
+       .long   0x589
+       .byte   0x0
+       .uleb128 0x18
+       .byte   0x1
+       .ascii "Screen\0"
+       .byte   0x1
+       .byte   0x43
+       .byte   0x3
+       .byte   0x1
+       .uleb128 0xd
+       .long   0x56a
+       .byte   0x1
+       .uleb128 0xe
+       .long   0x546
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x19
+       .long   0x50
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x18d
+       .uleb128 0x9
+       .byte   0x4
+       .long   0xee
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x2c7
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x558
+       .uleb128 0x19
+       .long   0x2c7
+       .uleb128 0x1a
+       .long   0xa1
+       .long   0x568
+       .uleb128 0x1b
+       .byte   0x0
+       .uleb128 0x1c
+       .byte   0x4
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x17e
+       .uleb128 0x9
+       .byte   0x4
+       .long   0x576
+       .uleb128 0x19
+       .long   0x57b
+       .uleb128 0x2
+       .byte   0x1
+       .byte   0x6
+       .ascii "char\0"
+       .uleb128 0x1d
+       .byte   0x4
+       .long   0x558
+       .uleb128 0x1e
+       .byte   0x4
+       .uleb128 0x1f
+       .long   0x3f4
+       .long   LFB13
+       .long   LFE13
+       .secrel32       LLST0
+       .uleb128 0x20
+       .long   0x1d3
+       .byte   0x2
+       .long   0x5bc
+       .uleb128 0x21
+       .secrel32       LASF1
+       .long   0x5bc
+       .byte   0x1
+       .uleb128 0x22
+       .secrel32       LASF0
+       .byte   0x1
+       .byte   0x1b
+       .long   0x546
+       .byte   0x0
+       .uleb128 0x19
+       .long   0x540
+       .uleb128 0x23
+       .long   0x59c
+       .long   LFB16
+       .long   LFE16
+       .secrel32       LLST1
+       .long   0x5e7
+       .uleb128 0x24
+       .long   0x5a6
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x24
+       .long   0x5b0
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .byte   0x0
+       .uleb128 0x25
+       .long   0x1f0
+       .long   LFB17
+       .long   LFE17
+       .secrel32       LLST2
+       .long   0x60a
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x5bc
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x25
+       .long   0x223
+       .long   LFB18
+       .long   LFE18
+       .secrel32       LLST3
+       .long   0x62d
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x5bc
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x25
+       .long   0x256
+       .long   LFB19
+       .long   LFE19
+       .secrel32       LLST4
+       .long   0x66a
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x5bc
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x27
+       .long   LBB3
+       .long   LBE3
+       .uleb128 0x28
+       .ascii "oldpy\0"
+       .byte   0x1
+       .byte   0x20
+       .long   0x50
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -12
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x25
+       .long   0x291
+       .long   LFB20
+       .long   LFE20
+       .secrel32       LLST5
+       .long   0x68d
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x5bc
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x20
+       .long   0x2f7
+       .byte   0x2
+       .long   0x6bd
+       .uleb128 0x21
+       .secrel32       LASF1
+       .long   0x6bd
+       .byte   0x1
+       .uleb128 0x29
+       .ascii "r\0"
+       .byte   0x1
+       .byte   0x3b
+       .long   0x95
+       .uleb128 0x29
+       .ascii "g\0"
+       .byte   0x1
+       .byte   0x3b
+       .long   0x95
+       .uleb128 0x29
+       .ascii "b\0"
+       .byte   0x1
+       .byte   0x3b
+       .long   0x95
+       .byte   0x0
+       .uleb128 0x19
+       .long   0x54c
+       .uleb128 0x23
+       .long   0x68d
+       .long   LFB23
+       .long   LFE23
+       .secrel32       LLST6
+       .long   0x6f8
+       .uleb128 0x24
+       .long   0x697
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x24
+       .long   0x6a1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -12
+       .uleb128 0x24
+       .long   0x6aa
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -16
+       .uleb128 0x24
+       .long   0x6b3
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -20
+       .byte   0x0
+       .uleb128 0x25
+       .long   0x31a
+       .long   LFB24
+       .long   LFE24
+       .secrel32       LLST7
+       .long   0x71b
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x71b
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x19
+       .long   0x552
+       .uleb128 0x25
+       .long   0x4ea
+       .long   LFB25
+       .long   LFE25
+       .secrel32       LLST8
+       .long   0x753
+       .uleb128 0x2a
+       .ascii "size\0"
+       .byte   0x1
+       .byte   0x42
+       .long   0x57
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x2a
+       .ascii "buf\0"
+       .byte   0x1
+       .byte   0x42
+       .long   0x589
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .byte   0x0
+       .uleb128 0x2b
+       .byte   0x1
+       .ascii "debugprint\0"
+       .byte   0x2
+       .byte   0x9
+       .long   LFB26
+       .long   LFE26
+       .secrel32       LLST9
+       .long   0x7b5
+       .uleb128 0x2a
+       .ascii "format\0"
+       .byte   0x2
+       .byte   0x9
+       .long   0x570
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x16
+       .uleb128 0x27
+       .long   LBB5
+       .long   LBE5
+       .uleb128 0x28
+       .ascii "i\0"
+       .byte   0x2
+       .byte   0xa
+       .long   0x50
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -20
+       .uleb128 0x28
+       .ascii "s\0"
+       .byte   0x2
+       .byte   0xb
+       .long   0x7b5
+       .byte   0x3
+       .byte   0x91
+       .sleb128 -2072
+       .uleb128 0x28
+       .ascii "ap\0"
+       .byte   0x2
+       .byte   0xc
+       .long   0x7c9
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -24
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1a
+       .long   0x57b
+       .long   0x7c6
+       .uleb128 0x2c
+       .long   0x7c6
+       .word   0x7ff
+       .byte   0x0
+       .uleb128 0x6
+       .byte   0x4
+       .byte   0x7
+       .uleb128 0x2d
+       .byte   0x4
+       .ascii "__builtin_va_list\0"
+       .long   0x57b
+       .uleb128 0x2e
+       .long   0x521
+       .byte   0x2
+       .byte   0x15
+       .byte   0x0
+       .long   0x803
+       .uleb128 0x21
+       .secrel32       LASF1
+       .long   0x803
+       .byte   0x1
+       .uleb128 0x22
+       .secrel32       LASF0
+       .byte   0x2
+       .byte   0x15
+       .long   0x546
+       .byte   0x0
+       .uleb128 0x19
+       .long   0x56a
+       .uleb128 0x23
+       .long   0x7e1
+       .long   LFB28
+       .long   LFE28
+       .secrel32       LLST10
+       .long   0x82e
+       .uleb128 0x24
+       .long   0x7ed
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x24
+       .long   0x7f7
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .byte   0x0
+       .uleb128 0x2f
+       .long   0x3c5
+       .byte   0x2
+       .byte   0x18
+       .long   LFB30
+       .long   LFE30
+       .secrel32       LLST11
+       .long   0x854
+       .uleb128 0x30
+       .secrel32       LASF0
+       .byte   0x2
+       .byte   0x18
+       .long   0x546
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .byte   0x0
+       .uleb128 0x2f
+       .long   0x414
+       .byte   0x2
+       .byte   0x1c
+       .long   LFB31
+       .long   LFE31
+       .secrel32       LLST12
+       .long   0x8bb
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x803
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x2a
+       .ascii "format\0"
+       .byte   0x2
+       .byte   0x1c
+       .long   0x570
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .uleb128 0x16
+       .uleb128 0x27
+       .long   LBB7
+       .long   LBE7
+       .uleb128 0x28
+       .ascii "i\0"
+       .byte   0x2
+       .byte   0x1d
+       .long   0x50
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -20
+       .uleb128 0x28
+       .ascii "s\0"
+       .byte   0x2
+       .byte   0x1e
+       .long   0x7b5
+       .byte   0x3
+       .byte   0x91
+       .sleb128 -2072
+       .uleb128 0x28
+       .ascii "ap\0"
+       .byte   0x2
+       .byte   0x1f
+       .long   0x7c9
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -24
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2f
+       .long   0x448
+       .byte   0x2
+       .byte   0x28
+       .long   LFB32
+       .long   LFE32
+       .secrel32       LLST13
+       .long   0x92e
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x803
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x2a
+       .ascii "s\0"
+       .byte   0x2
+       .byte   0x28
+       .long   0x570
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .uleb128 0x27
+       .long   LBB13
+       .long   LBE13
+       .uleb128 0x28
+       .ascii "i\0"
+       .byte   0x2
+       .byte   0x2f
+       .long   0x50
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -20
+       .uleb128 0x27
+       .long   LBB14
+       .long   LBE14
+       .uleb128 0x28
+       .ascii "b\0"
+       .byte   0x2
+       .byte   0x30
+       .long   0x95
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -25
+       .uleb128 0x27
+       .long   LBB15
+       .long   LBE15
+       .uleb128 0x28
+       .ascii "j\0"
+       .byte   0x2
+       .byte   0x31
+       .long   0x50
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -24
+       .byte   0x0
+       .byte   0x0
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2f
+       .long   0x476
+       .byte   0x2
+       .byte   0x3e
+       .long   LFB33
+       .long   LFE33
+       .secrel32       LLST14
+       .long   0x98f
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x803
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x2a
+       .ascii "x\0"
+       .byte   0x2
+       .byte   0x3e
+       .long   0x50
+       .byte   0x2
+       .byte   0x91
+       .sleb128 4
+       .uleb128 0x2a
+       .ascii "y\0"
+       .byte   0x2
+       .byte   0x3e
+       .long   0x50
+       .byte   0x2
+       .byte   0x91
+       .sleb128 8
+       .uleb128 0x2a
+       .ascii "rgb\0"
+       .byte   0x2
+       .byte   0x3e
+       .long   0x98f
+       .byte   0x2
+       .byte   0x91
+       .sleb128 12
+       .uleb128 0x27
+       .long   LBB18
+       .long   LBE18
+       .uleb128 0x28
+       .ascii "p\0"
+       .byte   0x2
+       .byte   0x42
+       .long   0x178
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -16
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x19
+       .long   0x583
+       .uleb128 0x2f
+       .long   0x4bf
+       .byte   0x2
+       .byte   0x49
+       .long   LFB34
+       .long   LFE34
+       .secrel32       LLST15
+       .long   0x9f6
+       .uleb128 0x26
+       .secrel32       LASF1
+       .long   0x803
+       .byte   0x1
+       .byte   0x2
+       .byte   0x91
+       .sleb128 0
+       .uleb128 0x27
+       .long   LBB19
+       .long   LBE19
+       .uleb128 0x28
+       .ascii "lines\0"
+       .byte   0x2
+       .byte   0x4a
+       .long   0x65
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -20
+       .uleb128 0x28
+       .ascii "stride\0"
+       .byte   0x2
+       .byte   0x4b
+       .long   0x65
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -24
+       .uleb128 0x28
+       .ascii "cstride\0"
+       .byte   0x2
+       .byte   0x4c
+       .long   0x65
+       .byte   0x2
+       .byte   0x91
+       .sleb128 -28
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1a
+       .long   0x57b
+       .long   0xa0c
+       .uleb128 0x31
+       .long   0x7c6
+       .byte   0xff
+       .uleb128 0x31
+       .long   0x7c6
+       .byte   0xf
+       .byte   0x0
+       .uleb128 0x32
+       .ascii "hankakufont\0"
+       .byte   0x8
+       .byte   0x1
+       .long   0x9f6
+       .byte   0x1
+       .byte   0x5
+       .byte   0x3
+       .long   _hankakufont
+       .uleb128 0x33
+       .long   0x398
+       .byte   0x2
+       .byte   0x7
+       .byte   0x5
+       .byte   0x3
+       .long   __ZN6Screen3bufE
+       .byte   0x0
+       .section        .debug_abbrev,"dr"
+       .uleb128 0x1
+       .uleb128 0x11
+       .byte   0x1
+       .uleb128 0x25
+       .uleb128 0x8
+       .uleb128 0x13
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x1b
+       .uleb128 0x8
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x52
+       .uleb128 0x1
+       .uleb128 0x55
+       .uleb128 0x6
+       .uleb128 0x10
+       .uleb128 0x6
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2
+       .uleb128 0x24
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3e
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0x8
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x16
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x4
+       .uleb128 0x39
+       .byte   0x1
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x5
+       .uleb128 0x8
+       .byte   0x0
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x18
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x6
+       .uleb128 0x24
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3e
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x7
+       .uleb128 0x13
+       .byte   0x1
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x8
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x38
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x9
+       .uleb128 0xf
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xa
+       .uleb128 0x2
+       .byte   0x1
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x38
+       .uleb128 0xa
+       .uleb128 0x32
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xc
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xd
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xe
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0xf
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x10
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x11
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1c
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x12
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x13
+       .uleb128 0xd
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x38
+       .uleb128 0xa
+       .uleb128 0x32
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x14
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x15
+       .uleb128 0x2e
+       .byte   0x0
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x16
+       .uleb128 0x18
+       .byte   0x0
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x17
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2007
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x18
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x32
+       .uleb128 0xb
+       .uleb128 0x3c
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x19
+       .uleb128 0x26
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1a
+       .uleb128 0x1
+       .byte   0x1
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1b
+       .uleb128 0x21
+       .byte   0x0
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1c
+       .uleb128 0x10
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1d
+       .uleb128 0x10
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1e
+       .uleb128 0xf
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x1f
+       .uleb128 0x2e
+       .byte   0x0
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x20
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x20
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x21
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0xc
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x22
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x23
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x31
+       .uleb128 0x13
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x24
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x31
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x25
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x26
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0xc
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x27
+       .uleb128 0xb
+       .byte   0x1
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x28
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x29
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2a
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2b
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2c
+       .uleb128 0x21
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2f
+       .uleb128 0x5
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2d
+       .uleb128 0xf
+       .byte   0x0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2e
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x20
+       .uleb128 0xb
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x2f
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x1
+       .uleb128 0x40
+       .uleb128 0x6
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x30
+       .uleb128 0x5
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x31
+       .uleb128 0x21
+       .byte   0x0
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2f
+       .uleb128 0xb
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x32
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3f
+       .uleb128 0xc
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .uleb128 0x33
+       .uleb128 0x34
+       .byte   0x0
+       .uleb128 0x47
+       .uleb128 0x13
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x2
+       .uleb128 0xa
+       .byte   0x0
+       .byte   0x0
+       .byte   0x0
+       .section        .debug_pubnames,"dr"
+       .long   0x18e
+       .word   0x2
+       .secrel32       Ldebug_info0
+       .long   0xa34
+       .long   0x58b
+       .ascii "Screen::Inst\0"
+       .long   0x5c1
+       .ascii "Screen::Pointer::Pointer\0"
+       .long   0x5e7
+       .ascii "Screen::Pointer::getx\0"
+       .long   0x60a
+       .ascii "Screen::Pointer::gety\0"
+       .long   0x62d
+       .ascii "Screen::Pointer::NextChar\0"
+       .long   0x66a
+       .ascii "Screen::Pointer::NewLine\0"
+       .long   0x6c2
+       .ascii "Screen::RGB::RGB\0"
+       .long   0x6f8
+       .ascii "Screen::RGB::col8\0"
+       .long   0x720
+       .ascii "Screen::operator new\0"
+       .long   0x753
+       .ascii "debugprint\0"
+       .long   0x808
+       .ascii "Screen::Screen\0"
+       .long   0x82e
+       .ascii "Screen::Init\0"
+       .long   0x854
+       .ascii "Screen::printf\0"
+       .long   0x8bb
+       .ascii "Screen::puts\0"
+       .long   0x92e
+       .ascii "Screen::SetPixel\0"
+       .long   0x994
+       .ascii "Screen::Scroll\0"
+       .long   0xa0c
+       .ascii "hankakufont\0"
+       .long   0xa26
+       .ascii "Screen::buf\0"
+       .long   0x0
+       .section        .debug_pubtypes,"dr"
+       .long   0x43
+       .word   0x2
+       .secrel32       Ldebug_info0
+       .long   0xa34
+       .long   0x57
+       .ascii "size_t\0"
+       .long   0x95
+       .ascii "BYTE\0"
+       .long   0xb2
+       .ascii "WORD\0"
+       .long   0xee
+       .ascii "BOOTINFO\0"
+       .long   0x17e
+       .ascii "Screen\0"
+       .long   0x0
+       .section        .debug_aranges,"dr"
+       .long   0x64
+       .word   0x2
+       .secrel32       Ldebug_info0
+       .byte   0x4
+       .byte   0x0
+       .word   0x0
+       .word   0x0
+       .long   Ltext0
+       .long   Letext0-Ltext0
+       .long   LFB13
+       .long   LFE13-LFB13
+       .long   LFB16
+       .long   LFE16-LFB16
+       .long   LFB17
+       .long   LFE17-LFB17
+       .long   LFB18
+       .long   LFE18-LFB18
+       .long   LFB19
+       .long   LFE19-LFB19
+       .long   LFB20
+       .long   LFE20-LFB20
+       .long   LFB23
+       .long   LFE23-LFB23
+       .long   LFB24
+       .long   LFE24-LFB24
+       .long   LFB25
+       .long   LFE25-LFB25
+       .long   0x0
+       .long   0x0
+       .section        .debug_ranges,"dr"
+Ldebug_ranges0:
+       .long   Ltext0
+       .long   Letext0
+       .long   LFB13
+       .long   LFE13
+       .long   LFB16
+       .long   LFE16
+       .long   LFB17
+       .long   LFE17
+       .long   LFB18
+       .long   LFE18
+       .long   LFB19
+       .long   LFE19
+       .long   LFB20
+       .long   LFE20
+       .long   LFB23
+       .long   LFE23
+       .long   LFB24
+       .long   LFE24
+       .long   LFB25
+       .long   LFE25
+       .long   0x0
+       .long   0x0
+       .section        .debug_str,"dr"
+LASF0:
+       .ascii "binfo\0"
+LASF1:
+       .ascii "this\0"
+       .def    _vsprintf;      .scl    2;      .type   32;     .endef
+       .def    _memmove;       .scl    2;      .type   32;     .endef
+       .def    _memset;        .scl    2;      .type   32;     .endef
diff --git a/haribote/sheet.c b/haribote/sheet.c
new file mode 100644 (file)
index 0000000..aea91e2
--- /dev/null
@@ -0,0 +1,291 @@
+/* \83}\83E\83X\82â\83E\83B\83\93\83h\83E\82Ì\8fd\82Ë\8d\87\82í\82¹\8f\88\97\9d */
+
+#include "bootpack.h"
+
+#define SHEET_USE              1
+
+struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize)
+{
+       struct SHTCTL *ctl;
+       int i;
+       ctl = (struct SHTCTL *) memman_alloc_4k(memman, sizeof (struct SHTCTL));
+       if (ctl == 0) {
+               goto err;
+       }
+       ctl->map = (unsigned char *) memman_alloc_4k(memman, xsize * ysize);
+       if (ctl->map == 0) {
+               memman_free_4k(memman, (int) ctl, sizeof (struct SHTCTL));
+               goto err;
+       }
+       ctl->vram = vram;
+       ctl->xsize = xsize;
+       ctl->ysize = ysize;
+       ctl->top = -1; /* \83V\81[\83g\82Í\88ê\96\87\82à\82È\82¢ */
+       for (i = 0; i < MAX_SHEETS; i++) {
+               ctl->sheets0[i].flags = 0; /* \96¢\8eg\97p\83}\81[\83N */
+               ctl->sheets0[i].ctl = ctl; /* \8f\8a\91®\82ð\8bL\98^ */
+       }
+err:
+       return ctl;
+}
+
+struct SHEET *sheet_alloc(struct SHTCTL *ctl)
+{
+       struct SHEET *sht;
+       int i;
+       for (i = 0; i < MAX_SHEETS; i++) {
+               if (ctl->sheets0[i].flags == 0) {
+                       sht = &ctl->sheets0[i];
+                       sht->flags = SHEET_USE; /* \8eg\97p\92\86\83}\81[\83N */
+                       sht->height = -1; /* \94ñ\95\\8e¦\92\86 */
+                       sht->task = 0;  /* \8e©\93®\82Å\95Â\82\82é\8b@\94\\82ð\8eg\82í\82È\82¢ */
+                       return sht;
+               }
+       }
+       return 0;       /* \91S\82Ä\82Ì\83V\81[\83g\82ª\8eg\97p\92\86\82¾\82Á\82½ */
+}
+
+void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv)
+{
+       sht->buf = buf;
+       sht->bxsize = xsize;
+       sht->bysize = ysize;
+       sht->col_inv = col_inv;
+       return;
+}
+
+void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0)
+{
+       int h, bx, by, vx, vy, bx0, by0, bx1, by1, sid4, *p;
+       unsigned char *buf, sid, *map = ctl->map;
+       struct SHEET *sht;
+       if (vx0 < 0) { vx0 = 0; }
+       if (vy0 < 0) { vy0 = 0; }
+       if (vx1 > ctl->xsize) { vx1 = ctl->xsize; }
+       if (vy1 > ctl->ysize) { vy1 = ctl->ysize; }
+       for (h = h0; h <= ctl->top; h++) {
+               sht = ctl->sheets[h];
+               sid = sht - ctl->sheets0; /* \94Ô\92n\82ð\88ø\82«\8eZ\82µ\82Ä\82»\82ê\82ð\89º\82\82«\94Ô\8d\86\82Æ\82µ\82Ä\97\98\97p */
+               buf = sht->buf;
+               bx0 = vx0 - sht->vx0;
+               by0 = vy0 - sht->vy0;
+               bx1 = vx1 - sht->vx0;
+               by1 = vy1 - sht->vy0;
+               if (bx0 < 0) { bx0 = 0; }
+               if (by0 < 0) { by0 = 0; }
+               if (bx1 > sht->bxsize) { bx1 = sht->bxsize; }
+               if (by1 > sht->bysize) { by1 = sht->bysize; }
+               if (sht->col_inv == -1) {
+                       if ((sht->vx0 & 3) == 0 && (bx0 & 3) == 0 && (bx1 & 3) == 0) {
+                               /* \93§\96¾\90F\82È\82µ\90ê\97p\82Ì\8d\82\91¬\94Å\81i4\83o\83C\83g\8c^\81j */
+                               bx1 = (bx1 - bx0) / 4; /* MOV\89ñ\90\94 */
+                               sid4 = sid | sid << 8 | sid << 16 | sid << 24;
+                               for (by = by0; by < by1; by++) {
+                                       vy = sht->vy0 + by;
+                                       vx = sht->vx0 + bx0;
+                                       p = (int *) &map[vy * ctl->xsize + vx];
+                                       for (bx = 0; bx < bx1; bx++) {
+                                               p[bx] = sid4;
+                                       }
+                               }
+                       } else {
+                               /* \93§\96¾\90F\82È\82µ\90ê\97p\82Ì\8d\82\91¬\94Å\81i1\83o\83C\83g\8c^\81j */
+                               for (by = by0; by < by1; by++) {
+                                       vy = sht->vy0 + by;
+                                       for (bx = bx0; bx < bx1; bx++) {
+                                               vx = sht->vx0 + bx;
+                                               map[vy * ctl->xsize + vx] = sid;
+                                       }
+                               }
+                       }
+               } else {
+                       /* \93§\96¾\90F\82 \82è\82Ì\88ê\94Ê\94Å */
+                       for (by = by0; by < by1; by++) {
+                               vy = sht->vy0 + by;
+                               for (bx = bx0; bx < bx1; bx++) {
+                                       vx = sht->vx0 + bx;
+                                       if (buf[by * sht->bxsize + bx] != sht->col_inv) {
+                                               map[vy * ctl->xsize + vx] = sid;
+                                       }
+                               }
+                       }
+               }
+       }
+       return;
+}
+
+void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0, int h1)
+{
+       int h, bx, by, vx, vy, bx0, by0, bx1, by1, bx2, sid4, i, i1, *p, *q, *r;
+       unsigned char *buf, *vram = ctl->vram, *map = ctl->map, sid;
+       struct SHEET *sht;
+       /* refresh\94Í\88Í\82ª\89æ\96Ê\8aO\82É\82Í\82Ý\8fo\82µ\82Ä\82¢\82½\82ç\95â\90³ */
+       if (vx0 < 0) { vx0 = 0; }
+       if (vy0 < 0) { vy0 = 0; }
+       if (vx1 > ctl->xsize) { vx1 = ctl->xsize; }
+       if (vy1 > ctl->ysize) { vy1 = ctl->ysize; }
+       for (h = h0; h <= h1; h++) {
+               sht = ctl->sheets[h];
+               buf = sht->buf;
+               sid = sht - ctl->sheets0;
+               /* vx0\81`vy1\82ð\8eg\82Á\82Ä\81Abx0\81`by1\82ð\8bt\8eZ\82·\82é */
+               bx0 = vx0 - sht->vx0;
+               by0 = vy0 - sht->vy0;
+               bx1 = vx1 - sht->vx0;
+               by1 = vy1 - sht->vy0;
+               if (bx0 < 0) { bx0 = 0; }
+               if (by0 < 0) { by0 = 0; }
+               if (bx1 > sht->bxsize) { bx1 = sht->bxsize; }
+               if (by1 > sht->bysize) { by1 = sht->bysize; }
+               if ((sht->vx0 & 3) == 0) {
+                       /* 4\83o\83C\83g\8c^ */
+                       i  = (bx0 + 3) / 4; /* bx0\82ð4\82Å\8a\84\82Á\82½\82à\82Ì\81i\92[\90\94\90Ø\82è\8fã\82°\81j */
+                       i1 =  bx1      / 4; /* bx1\82ð4\82Å\8a\84\82Á\82½\82à\82Ì\81i\92[\90\94\90Ø\82è\8eÌ\82Ä\81j */
+                       i1 = i1 - i;
+                       sid4 = sid | sid << 8 | sid << 16 | sid << 24;
+                       for (by = by0; by < by1; by++) {
+                               vy = sht->vy0 + by;
+                               for (bx = bx0; bx < bx1 && (bx & 3) != 0; bx++) {       /* \91O\82Ì\92[\90\94\82ð1\83o\83C\83g\82¸\82 */
+                                       vx = sht->vx0 + bx;
+                                       if (map[vy * ctl->xsize + vx] == sid) {
+                                               vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx];
+                                       }
+                               }
+                               vx = sht->vx0 + bx;
+                               p = (int *) &map[vy * ctl->xsize + vx];
+                               q = (int *) &vram[vy * ctl->xsize + vx];
+                               r = (int *) &buf[by * sht->bxsize + bx];
+                               for (i = 0; i < i1; i++) {                                                      /* 4\82Ì\94{\90\94\95\94\95ª */
+                                       if (p[i] == sid4) {
+                                               q[i] = r[i];
+                                       } else {
+                                               bx2 = bx + i * 4;
+                                               vx = sht->vx0 + bx2;
+                                               if (map[vy * ctl->xsize + vx + 0] == sid) {
+                                                       vram[vy * ctl->xsize + vx + 0] = buf[by * sht->bxsize + bx2 + 0];
+                                               }
+                                               if (map[vy * ctl->xsize + vx + 1] == sid) {
+                                                       vram[vy * ctl->xsize + vx + 1] = buf[by * sht->bxsize + bx2 + 1];
+                                               }
+                                               if (map[vy * ctl->xsize + vx + 2] == sid) {
+                                                       vram[vy * ctl->xsize + vx + 2] = buf[by * sht->bxsize + bx2 + 2];
+                                               }
+                                               if (map[vy * ctl->xsize + vx + 3] == sid) {
+                                                       vram[vy * ctl->xsize + vx + 3] = buf[by * sht->bxsize + bx2 + 3];
+                                               }
+                                       }
+                               }
+                               for (bx += i1 * 4; bx < bx1; bx++) {                            /* \8cã\82ë\82Ì\92[\90\94\82ð1\83o\83C\83g\82¸\82 */
+                                       vx = sht->vx0 + bx;
+                                       if (map[vy * ctl->xsize + vx] == sid) {
+                                               vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx];
+                                       }
+                               }
+                       }
+               } else {
+                       /* 1\83o\83C\83g\8c^ */
+                       for (by = by0; by < by1; by++) {
+                               vy = sht->vy0 + by;
+                               for (bx = bx0; bx < bx1; bx++) {
+                                       vx = sht->vx0 + bx;
+                                       if (map[vy * ctl->xsize + vx] == sid) {
+                                               vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx];
+                                       }
+                               }
+                       }
+               }
+       }
+       return;
+}
+
+void sheet_updown(struct SHEET *sht, int height)
+{
+       struct SHTCTL *ctl = sht->ctl;
+       int h, old = sht->height; /* \90Ý\92è\91O\82Ì\8d\82\82³\82ð\8bL\89¯\82·\82é */
+
+       /* \8ew\92è\82ª\92á\82·\82¬\82â\8d\82\82·\82¬\82¾\82Á\82½\82ç\81A\8fC\90³\82·\82é */
+       if (height > ctl->top + 1) {
+               height = ctl->top + 1;
+       }
+       if (height < -1) {
+               height = -1;
+       }
+       sht->height = height; /* \8d\82\82³\82ð\90Ý\92è */
+
+       /* \88È\89º\82Í\8eå\82Ésheets[]\82Ì\95À\82×\91Ö\82¦ */
+       if (old > height) {     /* \88È\91O\82æ\82è\82à\92á\82­\82È\82é */
+               if (height >= 0) {
+                       /* \8aÔ\82Ì\82à\82Ì\82ð\88ø\82«\8fã\82°\82é */
+                       for (h = old; h > height; h--) {
+                               ctl->sheets[h] = ctl->sheets[h - 1];
+                               ctl->sheets[h]->height = h;
+                       }
+                       ctl->sheets[height] = sht;
+                       sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1);
+                       sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1, old);
+               } else {        /* \94ñ\95\\8e¦\89» */
+                       if (ctl->top > old) {
+                               /* \8fã\82É\82È\82Á\82Ä\82¢\82é\82à\82Ì\82ð\82¨\82ë\82· */
+                               for (h = old; h < ctl->top; h++) {
+                                       ctl->sheets[h] = ctl->sheets[h + 1];
+                                       ctl->sheets[h]->height = h;
+                               }
+                       }
+                       ctl->top--; /* \95\\8e¦\92\86\82Ì\89º\82\82«\82ª\88ê\82Â\8c¸\82é\82Ì\82Å\81A\88ê\94Ô\8fã\82Ì\8d\82\82³\82ª\8c¸\82é */
+                       sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0);
+                       sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0, old - 1);
+               }
+       } else if (old < height) {      /* \88È\91O\82æ\82è\82à\8d\82\82­\82È\82é */
+               if (old >= 0) {
+                       /* \8aÔ\82Ì\82à\82Ì\82ð\89\9f\82µ\89º\82°\82é */
+                       for (h = old; h < height; h++) {
+                               ctl->sheets[h] = ctl->sheets[h + 1];
+                               ctl->sheets[h]->height = h;
+                       }
+                       ctl->sheets[height] = sht;
+               } else {        /* \94ñ\95\\8e¦\8fó\91Ô\82©\82ç\95\\8e¦\8fó\91Ô\82Ö */
+                       /* \8fã\82É\82È\82é\82à\82Ì\82ð\8e\9d\82¿\8fã\82°\82é */
+                       for (h = ctl->top; h >= height; h--) {
+                               ctl->sheets[h + 1] = ctl->sheets[h];
+                               ctl->sheets[h + 1]->height = h + 1;
+                       }
+                       ctl->sheets[height] = sht;
+                       ctl->top++; /* \95\\8e¦\92\86\82Ì\89º\82\82«\82ª\88ê\82Â\91\9d\82¦\82é\82Ì\82Å\81A\88ê\94Ô\8fã\82Ì\8d\82\82³\82ª\91\9d\82¦\82é */
+               }
+               sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height);
+               sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height, height);
+       }
+       return;
+}
+
+void sheet_refresh(struct SHEET *sht, int bx0, int by0, int bx1, int by1)
+{
+       if (sht->height >= 0) { /* \82à\82µ\82à\95\\8e¦\92\86\82È\82ç\81A\90V\82µ\82¢\89º\82\82«\82Ì\8fî\95ñ\82É\89\88\82Á\82Ä\89æ\96Ê\82ð\95`\82«\92¼\82· */
+               sheet_refreshsub(sht->ctl, sht->vx0 + bx0, sht->vy0 + by0, sht->vx0 + bx1, sht->vy0 + by1, sht->height, sht->height);
+       }
+       return;
+}
+
+void sheet_slide(struct SHEET *sht, int vx0, int vy0)
+{
+       struct SHTCTL *ctl = sht->ctl;
+       int old_vx0 = sht->vx0, old_vy0 = sht->vy0;
+       sht->vx0 = vx0;
+       sht->vy0 = vy0;
+       if (sht->height >= 0) { /* \82à\82µ\82à\95\\8e¦\92\86\82È\82ç\81A\90V\82µ\82¢\89º\82\82«\82Ì\8fî\95ñ\82É\89\88\82Á\82Ä\89æ\96Ê\82ð\95`\82«\92¼\82· */
+               sheet_refreshmap(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize, 0);
+               sheet_refreshmap(ctl, vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize, sht->height);
+               sheet_refreshsub(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize, 0, sht->height - 1);
+               sheet_refreshsub(ctl, vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize, sht->height, sht->height);
+       }
+       return;
+}
+
+void sheet_free(struct SHEET *sht)
+{
+       if (sht->height >= 0) {
+               sheet_updown(sht, -1); /* \95\\8e¦\92\86\82È\82ç\82Ü\82¸\94ñ\95\\8e¦\82É\82·\82é */
+       }
+       sht->flags = 0; /* \96¢\8eg\97p\83}\81[\83N */
+       return;
+}
diff --git a/haribote/sheet.lst b/haribote/sheet.lst
new file mode 100644 (file)
index 0000000..f0ad532
--- /dev/null
@@ -0,0 +1,964 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _memman_alloc_4k
+     7 00000000                                        EXTERN  _memman_free_4k
+     8 00000000                                 [FILE "sheet.c"]
+     9                                          [SECTION .text]
+    10 00000000                                        GLOBAL  _shtctl_init
+    11 00000000                                 _shtctl_init:
+    12 00000000 55                                     PUSH    EBP
+    13 00000001 89 E5                                  MOV     EBP,ESP
+    14 00000003 57                                     PUSH    EDI
+    15 00000004 56                                     PUSH    ESI
+    16 00000005 53                                     PUSH    EBX
+    17 00000006 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+    18 00000009 68 00002C14                            PUSH    11284
+    19 0000000E 8B 7D 10                               MOV     EDI,DWORD [16+EBP]
+    20 00000011 56                                     PUSH    ESI
+    21 00000012 E8 [00000000]                          CALL    _memman_alloc_4k
+    22 00000017 89 C3                                  MOV     EBX,EAX
+    23 00000019 58                                     POP     EAX
+    24 0000001A 5A                                     POP     EDX
+    25 0000001B 85 DB                                  TEST    EBX,EBX
+    26 0000001D 74 4A                                  JE      L3
+    27 0000001F 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+    28 00000022 0F AF C7                               IMUL    EAX,EDI
+    29 00000025 50                                     PUSH    EAX
+    30 00000026 56                                     PUSH    ESI
+    31 00000027 E8 [00000000]                          CALL    _memman_alloc_4k
+    32 0000002C 85 C0                                  TEST    EAX,EAX
+    33 0000002E 89 43 04                               MOV     DWORD [4+EBX],EAX
+    34 00000031 5A                                     POP     EDX
+    35 00000032 59                                     POP     ECX
+    36 00000033 74 3E                                  JE      L11
+    37 00000035 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+    38 00000038 89 7B 08                               MOV     DWORD [8+EBX],EDI
+    39 0000003B 89 03                                  MOV     DWORD [EBX],EAX
+    40 0000003D 8D 93 000027D8                         LEA     EDX,DWORD [10200+EBX]
+    41 00000043 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+    42 00000046 89 43 0C                               MOV     DWORD [12+EBX],EAX
+    43 00000049 89 D8                                  MOV     EAX,EBX
+    44 0000004B C7 43 10 FFFFFFFF                      MOV     DWORD [16+EBX],-1
+    45 00000052                                 L9:
+    46 00000052 C7 80 00000430 00000000                MOV     DWORD [1072+EAX],0
+    47 0000005C 89 98 00000434                         MOV     DWORD [1076+EAX],EBX
+    48 00000062 83 C0 28                               ADD     EAX,40
+    49 00000065 39 D0                                  CMP     EAX,EDX
+    50 00000067 7E E9                                  JLE     L9
+    51 00000069                                 L3:
+    52 00000069 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+    53 0000006C 89 D8                                  MOV     EAX,EBX
+    54 0000006E 5B                                     POP     EBX
+    55 0000006F 5E                                     POP     ESI
+    56 00000070 5F                                     POP     EDI
+    57 00000071 5D                                     POP     EBP
+    58 00000072 C3                                     RET
+    59 00000073                                 L11:
+    60 00000073 68 00002C14                            PUSH    11284
+    61 00000078 53                                     PUSH    EBX
+    62 00000079 56                                     PUSH    ESI
+    63 0000007A E8 [00000000]                          CALL    _memman_free_4k
+    64 0000007F 83 C4 0C                               ADD     ESP,12
+    65 00000082 EB E5                                  JMP     L3
+    66 00000084                                        GLOBAL  _sheet_alloc
+    67 00000084                                 _sheet_alloc:
+    68 00000084 55                                     PUSH    EBP
+    69 00000085 31 D2                                  XOR     EDX,EDX
+    70 00000087 89 E5                                  MOV     EBP,ESP
+    71 00000089 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    72 0000008C 05 00000414                            ADD     EAX,1044
+    73 00000091                                 L18:
+    74 00000091 83 78 1C 00                            CMP     DWORD [28+EAX],0
+    75 00000095 74 10                                  JE      L21
+    76 00000097 42                                     INC     EDX
+    77 00000098 83 C0 28                               ADD     EAX,40
+    78 0000009B 81 FA 000000FF                         CMP     EDX,255
+    79 000000A1 7E EE                                  JLE     L18
+    80 000000A3 31 C0                                  XOR     EAX,EAX
+    81 000000A5                                 L12:
+    82 000000A5 5D                                     POP     EBP
+    83 000000A6 C3                                     RET
+    84 000000A7                                 L21:
+    85 000000A7 C7 40 1C 00000001                      MOV     DWORD [28+EAX],1
+    86 000000AE C7 40 18 FFFFFFFF                      MOV     DWORD [24+EAX],-1
+    87 000000B5 C7 40 24 00000000                      MOV     DWORD [36+EAX],0
+    88 000000BC EB E7                                  JMP     L12
+    89 000000BE                                        GLOBAL  _sheet_setbuf
+    90 000000BE                                 _sheet_setbuf:
+    91 000000BE 55                                     PUSH    EBP
+    92 000000BF 89 E5                                  MOV     EBP,ESP
+    93 000000C1 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+    94 000000C4 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+    95 000000C7 89 02                                  MOV     DWORD [EDX],EAX
+    96 000000C9 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+    97 000000CC 89 42 04                               MOV     DWORD [4+EDX],EAX
+    98 000000CF 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+    99 000000D2 89 42 08                               MOV     DWORD [8+EDX],EAX
+   100 000000D5 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+   101 000000D8 89 42 14                               MOV     DWORD [20+EDX],EAX
+   102 000000DB 5D                                     POP     EBP
+   103 000000DC C3                                     RET
+   104 000000DD                                        GLOBAL  _sheet_refreshmap
+   105 000000DD                                 _sheet_refreshmap:
+   106 000000DD 55                                     PUSH    EBP
+   107 000000DE 89 E5                                  MOV     EBP,ESP
+   108 000000E0 57                                     PUSH    EDI
+   109 000000E1 56                                     PUSH    ESI
+   110 000000E2 53                                     PUSH    EBX
+   111 000000E3 83 EC 30                               SUB     ESP,48
+   112 000000E6 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   113 000000E9 83 7D 0C 00                            CMP     DWORD [12+EBP],0
+   114 000000ED 8B 40 04                               MOV     EAX,DWORD [4+EAX]
+   115 000000F0 89 45 D4                               MOV     DWORD [-44+EBP],EAX
+   116 000000F3 0F 88 00000203                         JS      L83
+   117 000000F9                                 L24:
+   118 000000F9 83 7D 10 00                            CMP     DWORD [16+EBP],0
+   119 000000FD 0F 88 000001ED                         JS      L84
+   120 00000103                                 L25:
+   121 00000103 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   122 00000106 8B 42 08                               MOV     EAX,DWORD [8+EDX]
+   123 00000109 39 45 14                               CMP     DWORD [20+EBP],EAX
+   124 0000010C 7E 03                                  JLE     L26
+   125 0000010E 89 45 14                               MOV     DWORD [20+EBP],EAX
+   126 00000111                                 L26:
+   127 00000111 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   128 00000114 8B 41 0C                               MOV     EAX,DWORD [12+ECX]
+   129 00000117 39 45 18                               CMP     DWORD [24+EBP],EAX
+   130 0000011A 7E 03                                  JLE     L27
+   131 0000011C 89 45 18                               MOV     DWORD [24+EBP],EAX
+   132 0000011F                                 L27:
+   133 0000011F 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   134 00000122 8B 5D 1C                               MOV     EBX,DWORD [28+EBP]
+   135 00000125 89 5D F0                               MOV     DWORD [-16+EBP],EBX
+   136 00000128 3B 5E 10                               CMP     EBX,DWORD [16+ESI]
+   137 0000012B 0F 8F 000000DA                         JG      L73
+   138 00000131                                 L71:
+   139 00000131 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   140 00000134 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   141 00000137 8B 75 18                               MOV     ESI,DWORD [24+EBP]
+   142 0000013A 8B 5D 14                               MOV     EBX,DWORD [20+EBP]
+   143 0000013D 8B 7C 82 14                            MOV     EDI,DWORD [20+EDX+EAX*4]
+   144 00000141 89 F8                                  MOV     EAX,EDI
+   145 00000143 29 D0                                  SUB     EAX,EDX
+   146 00000145 8B 0F                                  MOV     ECX,DWORD [EDI]
+   147 00000147 2D 00000414                            SUB     EAX,1044
+   148 0000014C 89 4D DC                               MOV     DWORD [-36+EBP],ECX
+   149 0000014F C1 F8 03                               SAR     EAX,3
+   150 00000152 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+   151 00000155 69 C0 CCCCCCCD                         IMUL    EAX,EAX,-858993459
+   152 0000015B 88 45 DB                               MOV     BYTE [-37+EBP],AL
+   153 0000015E 8B 57 0C                               MOV     EDX,DWORD [12+EDI]
+   154 00000161 8B 47 10                               MOV     EAX,DWORD [16+EDI]
+   155 00000164 29 D3                                  SUB     EBX,EDX
+   156 00000166 29 C6                                  SUB     ESI,EAX
+   157 00000168 29 C1                                  SUB     ECX,EAX
+   158 0000016A 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   159 0000016D 89 5D E8                               MOV     DWORD [-24+EBP],EBX
+   160 00000170 29 D0                                  SUB     EAX,EDX
+   161 00000172 89 75 E4                               MOV     DWORD [-28+EBP],ESI
+   162 00000175 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   163 00000178 0F 88 00000166                         JS      L85
+   164 0000017E                                 L32:
+   165 0000017E 85 C9                                  TEST    ECX,ECX
+   166 00000180 0F 88 00000157                         JS      L86
+   167 00000186                                 L33:
+   168 00000186 8B 47 04                               MOV     EAX,DWORD [4+EDI]
+   169 00000189 39 45 E8                               CMP     DWORD [-24+EBP],EAX
+   170 0000018C 7E 03                                  JLE     L34
+   171 0000018E 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   172 00000191                                 L34:
+   173 00000191 8B 47 08                               MOV     EAX,DWORD [8+EDI]
+   174 00000194 39 45 E4                               CMP     DWORD [-28+EBP],EAX
+   175 00000197 7E 03                                  JLE     L35
+   176 00000199 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+   177 0000019C                                 L35:
+   178 0000019C 83 7F 14 FF                            CMP     DWORD [20+EDI],-1
+   179 000001A0 74 71                                  JE      L87
+   180 000001A2 89 CA                                  MOV     EDX,ECX
+   181 000001A4 3B 4D E4                               CMP     ECX,DWORD [-28+EBP]
+   182 000001A7 7D 50                                  JGE     L30
+   183 000001A9                                 L70:
+   184 000001A9 8B 47 10                               MOV     EAX,DWORD [16+EDI]
+   185 000001AC 8B 4D EC                               MOV     ECX,DWORD [-20+EBP]
+   186 000001AF 01 D0                                  ADD     EAX,EDX
+   187 000001B1 3B 4D E8                               CMP     ECX,DWORD [-24+EBP]
+   188 000001B4 89 45 C4                               MOV     DWORD [-60+EBP],EAX
+   189 000001B7 7D 3A                                  JGE     L82
+   190 000001B9                                 L69:
+   191 000001B9 89 D0                                  MOV     EAX,EDX
+   192 000001BB 8B 5F 0C                               MOV     EBX,DWORD [12+EDI]
+   193 000001BE 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   194 000001C2 01 CB                                  ADD     EBX,ECX
+   195 000001C4 8B 75 DC                               MOV     ESI,DWORD [-36+EBP]
+   196 000001C7 01 C8                                  ADD     EAX,ECX
+   197 000001C9 89 5D C8                               MOV     DWORD [-56+EBP],EBX
+   198 000001CC 0F B6 34 30                            MOVZX   ESI,BYTE [EAX+ESI*1]
+   199 000001D0 3B 77 14                               CMP     ESI,DWORD [20+EDI]
+   200 000001D3 74 18                                  JE      L66
+   201 000001D5 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   202 000001D8 8B 5D C4                               MOV     EBX,DWORD [-60+EBP]
+   203 000001DB 8B 75 C8                               MOV     ESI,DWORD [-56+EBP]
+   204 000001DE 0F AF 58 08                            IMUL    EBX,DWORD [8+EAX]
+   205 000001E2 01 DE                                  ADD     ESI,EBX
+   206 000001E4 8A 45 DB                               MOV     AL,BYTE [-37+EBP]
+   207 000001E7 8B 5D D4                               MOV     EBX,DWORD [-44+EBP]
+   208 000001EA 88 04 1E                               MOV     BYTE [ESI+EBX*1],AL
+   209 000001ED                                 L66:
+   210 000001ED 41                                     INC     ECX
+   211 000001EE 3B 4D E8                               CMP     ECX,DWORD [-24+EBP]
+   212 000001F1 7C C6                                  JL      L69
+   213 000001F3                                 L82:
+   214 000001F3 42                                     INC     EDX
+   215 000001F4 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   216 000001F7 7C B0                                  JL      L70
+   217 000001F9                                 L30:
+   218 000001F9 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   219 000001FC FF 45 F0                               INC     DWORD [-16+EBP]
+   220 000001FF 8B 75 F0                               MOV     ESI,DWORD [-16+EBP]
+   221 00000202 3B 70 10                               CMP     ESI,DWORD [16+EAX]
+   222 00000205 0F 8E FFFFFF26                         JLE     L71
+   223 0000020B                                 L73:
+   224 0000020B 83 C4 30                               ADD     ESP,48
+   225 0000020E 5B                                     POP     EBX
+   226 0000020F 5E                                     POP     ESI
+   227 00000210 5F                                     POP     EDI
+   228 00000211 5D                                     POP     EBP
+   229 00000212 C3                                     RET
+   230 00000213                                 L87:
+   231 00000213 83 E2 03                               AND     EDX,3
+   232 00000216 75 7F                                  JNE     L37
+   233 00000218 F7 45 EC 00000003                      TEST    DWORD [-20+EBP],3
+   234 0000021F 75 76                                  JNE     L37
+   235 00000221 F7 45 E8 00000003                      TEST    DWORD [-24+EBP],3
+   236 00000228 75 6D                                  JNE     L37
+   237 0000022A 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   238 0000022D 29 55 E8                               SUB     DWORD [-24+EBP],EDX
+   239 00000230 BA 00000004                            MOV     EDX,4
+   240 00000235 89 D3                                  MOV     EBX,EDX
+   241 00000237 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+   242 0000023A 99                                     CDQ
+   243 0000023B F7 FB                                  IDIV    EBX
+   244 0000023D 89 45 D0                               MOV     DWORD [-48+EBP],EAX
+   245 00000240 89 CA                                  MOV     EDX,ECX
+   246 00000242 0F B6 45 DB                            MOVZX   EAX,BYTE [-37+EBP]
+   247 00000246 89 C6                                  MOV     ESI,EAX
+   248 00000248 C1 E6 08                               SAL     ESI,8
+   249 0000024B 09 C6                                  OR      ESI,EAX
+   250 0000024D C1 E0 10                               SAL     EAX,16
+   251 00000250 09 C6                                  OR      ESI,EAX
+   252 00000252 C1 E0 08                               SAL     EAX,8
+   253 00000255 09 C6                                  OR      ESI,EAX
+   254 00000257 3B 4D E4                               CMP     ECX,DWORD [-28+EBP]
+   255 0000025A 89 75 E0                               MOV     DWORD [-32+EBP],ESI
+   256 0000025D 7D 9A                                  JGE     L30
+   257 0000025F                                 L47:
+   258 0000025F 8B 47 10                               MOV     EAX,DWORD [16+EDI]
+   259 00000262 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   260 00000265 01 D0                                  ADD     EAX,EDX
+   261 00000267 8B 4D EC                               MOV     ECX,DWORD [-20+EBP]
+   262 0000026A 0F AF 43 08                            IMUL    EAX,DWORD [8+EBX]
+   263 0000026E 03 4F 0C                               ADD     ECX,DWORD [12+EDI]
+   264 00000271 89 45 C4                               MOV     DWORD [-60+EBP],EAX
+   265 00000274 01 C8                                  ADD     EAX,ECX
+   266 00000276 31 C9                                  XOR     ECX,ECX
+   267 00000278 03 45 D4                               ADD     EAX,DWORD [-44+EBP]
+   268 0000027B 3B 4D D0                               CMP     ECX,DWORD [-48+EBP]
+   269 0000027E 7D 0C                                  JGE     L76
+   270 00000280                                 L46:
+   271 00000280 8B 75 E0                               MOV     ESI,DWORD [-32+EBP]
+   272 00000283 89 34 88                               MOV     DWORD [EAX+ECX*4],ESI
+   273 00000286 41                                     INC     ECX
+   274 00000287 3B 4D D0                               CMP     ECX,DWORD [-48+EBP]
+   275 0000028A 7C F4                                  JL      L46
+   276 0000028C                                 L76:
+   277 0000028C 42                                     INC     EDX
+   278 0000028D 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   279 00000290 7C CD                                  JL      L47
+   280 00000292 E9 FFFFFF62                            JMP     L30
+   281 00000297                                 L37:
+   282 00000297 89 CA                                  MOV     EDX,ECX
+   283 00000299 3B 4D E4                               CMP     ECX,DWORD [-28+EBP]
+   284 0000029C 0F 8D FFFFFF57                         JGE     L30
+   285 000002A2                                 L58:
+   286 000002A2 8B 47 10                               MOV     EAX,DWORD [16+EDI]
+   287 000002A5 8B 4D EC                               MOV     ECX,DWORD [-20+EBP]
+   288 000002A8 01 D0                                  ADD     EAX,EDX
+   289 000002AA 3B 4D E8                               CMP     ECX,DWORD [-24+EBP]
+   290 000002AD 89 45 C4                               MOV     DWORD [-60+EBP],EAX
+   291 000002B0 7D 20                                  JGE     L79
+   292 000002B2                                 L57:
+   293 000002B2 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   294 000002B5 8B 45 C4                               MOV     EAX,DWORD [-60+EBP]
+   295 000002B8 8B 5F 0C                               MOV     EBX,DWORD [12+EDI]
+   296 000002BB 0F AF 46 08                            IMUL    EAX,DWORD [8+ESI]
+   297 000002BF 01 CB                                  ADD     EBX,ECX
+   298 000002C1 8B 75 D4                               MOV     ESI,DWORD [-44+EBP]
+   299 000002C4 01 C3                                  ADD     EBX,EAX
+   300 000002C6 41                                     INC     ECX
+   301 000002C7 8A 45 DB                               MOV     AL,BYTE [-37+EBP]
+   302 000002CA 88 04 33                               MOV     BYTE [EBX+ESI*1],AL
+   303 000002CD 3B 4D E8                               CMP     ECX,DWORD [-24+EBP]
+   304 000002D0 7C E0                                  JL      L57
+   305 000002D2                                 L79:
+   306 000002D2 42                                     INC     EDX
+   307 000002D3 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   308 000002D6 7C CA                                  JL      L58
+   309 000002D8 E9 FFFFFF1C                            JMP     L30
+   310 000002DD                                 L86:
+   311 000002DD 31 C9                                  XOR     ECX,ECX
+   312 000002DF E9 FFFFFEA2                            JMP     L33
+   313 000002E4                                 L85:
+   314 000002E4 C7 45 EC 00000000                      MOV     DWORD [-20+EBP],0
+   315 000002EB E9 FFFFFE8E                            JMP     L32
+   316 000002F0                                 L84:
+   317 000002F0 C7 45 10 00000000                      MOV     DWORD [16+EBP],0
+   318 000002F7 E9 FFFFFE07                            JMP     L25
+   319 000002FC                                 L83:
+   320 000002FC C7 45 0C 00000000                      MOV     DWORD [12+EBP],0
+   321 00000303 E9 FFFFFDF1                            JMP     L24
+   322 00000308                                        GLOBAL  _sheet_refreshsub
+   323 00000308                                 _sheet_refreshsub:
+   324 00000308 55                                     PUSH    EBP
+   325 00000309 89 E5                                  MOV     EBP,ESP
+   326 0000030B 57                                     PUSH    EDI
+   327 0000030C 56                                     PUSH    ESI
+   328 0000030D 53                                     PUSH    EBX
+   329 0000030E 83 EC 54                               SUB     ESP,84
+   330 00000311 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   331 00000314 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   332 00000317 83 7D 0C 00                            CMP     DWORD [12+EBP],0
+   333 0000031B 8B 00                                  MOV     EAX,DWORD [EAX]
+   334 0000031D 8B 52 04                               MOV     EDX,DWORD [4+EDX]
+   335 00000320 89 45 C4                               MOV     DWORD [-60+EBP],EAX
+   336 00000323 89 55 C0                               MOV     DWORD [-64+EBP],EDX
+   337 00000326 0F 88 000003B2                         JS      L155
+   338 0000032C                                 L89:
+   339 0000032C 83 7D 10 00                            CMP     DWORD [16+EBP],0
+   340 00000330 0F 88 0000039C                         JS      L156
+   341 00000336                                 L90:
+   342 00000336 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   343 00000339 8B 41 08                               MOV     EAX,DWORD [8+ECX]
+   344 0000033C 39 45 14                               CMP     DWORD [20+EBP],EAX
+   345 0000033F 7E 03                                  JLE     L91
+   346 00000341 89 45 14                               MOV     DWORD [20+EBP],EAX
+   347 00000344                                 L91:
+   348 00000344 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   349 00000347 8B 43 0C                               MOV     EAX,DWORD [12+EBX]
+   350 0000034A 39 45 18                               CMP     DWORD [24+EBP],EAX
+   351 0000034D 7E 03                                  JLE     L92
+   352 0000034F 89 45 18                               MOV     DWORD [24+EBP],EAX
+   353 00000352                                 L92:
+   354 00000352 8B 75 1C                               MOV     ESI,DWORD [28+EBP]
+   355 00000355 8B 45 20                               MOV     EAX,DWORD [32+EBP]
+   356 00000358 89 75 F0                               MOV     DWORD [-16+EBP],ESI
+   357 0000035B 39 C6                                  CMP     ESI,EAX
+   358 0000035D 0F 8F 0000023B                         JG      L145
+   359 00000363                                 L143:
+   360 00000363 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   361 00000366 8B 55 F0                               MOV     EDX,DWORD [-16+EBP]
+   362 00000369 8B 75 14                               MOV     ESI,DWORD [20+EBP]
+   363 0000036C 8B 7C 91 14                            MOV     EDI,DWORD [20+ECX+EDX*4]
+   364 00000370 89 F8                                  MOV     EAX,EDI
+   365 00000372 29 C8                                  SUB     EAX,ECX
+   366 00000374 8B 57 0C                               MOV     EDX,DWORD [12+EDI]
+   367 00000377 2D 00000414                            SUB     EAX,1044
+   368 0000037C 29 D6                                  SUB     ESI,EDX
+   369 0000037E C1 F8 03                               SAR     EAX,3
+   370 00000381 8B 1F                                  MOV     EBX,DWORD [EDI]
+   371 00000383 69 C0 CCCCCCCD                         IMUL    EAX,EAX,-858993459
+   372 00000389 89 5D C8                               MOV     DWORD [-56+EBP],EBX
+   373 0000038C 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+   374 0000038F 88 45 BF                               MOV     BYTE [-65+EBP],AL
+   375 00000392 89 75 E4                               MOV     DWORD [-28+EBP],ESI
+   376 00000395 8B 47 10                               MOV     EAX,DWORD [16+EDI]
+   377 00000398 8B 5D 18                               MOV     EBX,DWORD [24+EBP]
+   378 0000039B 8B 75 0C                               MOV     ESI,DWORD [12+EBP]
+   379 0000039E 29 C3                                  SUB     EBX,EAX
+   380 000003A0 29 C1                                  SUB     ECX,EAX
+   381 000003A2 89 5D E0                               MOV     DWORD [-32+EBP],EBX
+   382 000003A5 29 D6                                  SUB     ESI,EDX
+   383 000003A7 89 75 E8                               MOV     DWORD [-24+EBP],ESI
+   384 000003AA 0F 88 00000316                         JS      L157
+   385 000003B0                                 L97:
+   386 000003B0 85 C9                                  TEST    ECX,ECX
+   387 000003B2 0F 88 00000307                         JS      L158
+   388 000003B8                                 L98:
+   389 000003B8 8B 47 04                               MOV     EAX,DWORD [4+EDI]
+   390 000003BB 39 45 E4                               CMP     DWORD [-28+EBP],EAX
+   391 000003BE 7E 03                                  JLE     L99
+   392 000003C0 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+   393 000003C3                                 L99:
+   394 000003C3 8B 47 08                               MOV     EAX,DWORD [8+EDI]
+   395 000003C6 39 45 E0                               CMP     DWORD [-32+EBP],EAX
+   396 000003C9 7E 03                                  JLE     L100
+   397 000003CB 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   398 000003CE                                 L100:
+   399 000003CE 83 E2 03                               AND     EDX,3
+   400 000003D1 0F 85 00000286                         JNE     L101
+   401 000003D7 8B 55 E8                               MOV     EDX,DWORD [-24+EBP]
+   402 000003DA BB 00000004                            MOV     EBX,4
+   403 000003DF 83 C2 03                               ADD     EDX,3
+   404 000003E2 89 D0                                  MOV     EAX,EDX
+   405 000003E4 99                                     CDQ
+   406 000003E5 F7 FB                                  IDIV    EBX
+   407 000003E7 89 45 A4                               MOV     DWORD [-92+EBP],EAX
+   408 000003EA 8B 45 E4                               MOV     EAX,DWORD [-28+EBP]
+   409 000003ED 99                                     CDQ
+   410 000003EE F7 FB                                  IDIV    EBX
+   411 000003F0 8B 55 A4                               MOV     EDX,DWORD [-92+EBP]
+   412 000003F3 29 D0                                  SUB     EAX,EDX
+   413 000003F5 89 45 D8                               MOV     DWORD [-40+EBP],EAX
+   414 000003F8 0F B6 45 BF                            MOVZX   EAX,BYTE [-65+EBP]
+   415 000003FC 89 C3                                  MOV     EBX,EAX
+   416 000003FE C1 E3 08                               SAL     EBX,8
+   417 00000401 09 C3                                  OR      EBX,EAX
+   418 00000403 C1 E0 10                               SAL     EAX,16
+   419 00000406 09 C3                                  OR      EBX,EAX
+   420 00000408 C1 E0 08                               SAL     EAX,8
+   421 0000040B 09 C3                                  OR      EBX,EAX
+   422 0000040D 3B 4D E0                               CMP     ECX,DWORD [-32+EBP]
+   423 00000410 89 5D DC                               MOV     DWORD [-36+EBP],EBX
+   424 00000413 89 CB                                  MOV     EBX,ECX
+   425 00000415 0F 8D 00000174                         JGE     L95
+   426 0000041B                                 L130:
+   427 0000041B 8B 77 10                               MOV     ESI,DWORD [16+EDI]
+   428 0000041E 8B 55 E8                               MOV     EDX,DWORD [-24+EBP]
+   429 00000421 01 DE                                  ADD     ESI,EBX
+   430 00000423 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   431 00000426 89 75 EC                               MOV     DWORD [-20+EBP],ESI
+   432 00000429 7D 3D                                  JGE     L107
+   433 0000042B F7 C2 00000003                         TEST    EDX,3
+   434 00000431 74 35                                  JE      L107
+   435 00000433                                 L112:
+   436 00000433 8B 47 0C                               MOV     EAX,DWORD [12+EDI]
+   437 00000436 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   438 00000439 01 D0                                  ADD     EAX,EDX
+   439 0000043B 89 45 A8                               MOV     DWORD [-88+EBP],EAX
+   440 0000043E 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   441 00000441 0F AF 41 08                            IMUL    EAX,DWORD [8+ECX]
+   442 00000445 8B 75 A8                               MOV     ESI,DWORD [-88+EBP]
+   443 00000448 8D 0C 06                               LEA     ECX,DWORD [ESI+EAX*1]
+   444 0000044B 8B 75 C0                               MOV     ESI,DWORD [-64+EBP]
+   445 0000044E 8A 45 BF                               MOV     AL,BYTE [-65+EBP]
+   446 00000451 38 04 31                               CMP     BYTE [ECX+ESI*1],AL
+   447 00000454 0F 84 000001EA                         JE      L159
+   448 0000045A                                 L108:
+   449 0000045A 42                                     INC     EDX
+   450 0000045B 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   451 0000045E 7D 08                                  JGE     L107
+   452 00000460 F7 C2 00000003                         TEST    EDX,3
+   453 00000466 75 CB                                  JNE     L112
+   454 00000468                                 L107:
+   455 00000468 8B 47 0C                               MOV     EAX,DWORD [12+EDI]
+   456 0000046B 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   457 0000046E 01 D0                                  ADD     EAX,EDX
+   458 00000470 8B 75 C0                               MOV     ESI,DWORD [-64+EBP]
+   459 00000473 89 45 A8                               MOV     DWORD [-88+EBP],EAX
+   460 00000476 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   461 00000479 0F AF 41 08                            IMUL    EAX,DWORD [8+ECX]
+   462 0000047D 03 45 A8                               ADD     EAX,DWORD [-88+EBP]
+   463 00000480 01 C6                                  ADD     ESI,EAX
+   464 00000482 03 45 C4                               ADD     EAX,DWORD [-60+EBP]
+   465 00000485 89 75 D4                               MOV     DWORD [-44+EBP],ESI
+   466 00000488 89 45 D0                               MOV     DWORD [-48+EBP],EAX
+   467 0000048B 89 D8                                  MOV     EAX,EBX
+   468 0000048D 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   469 00000491 01 D0                                  ADD     EAX,EDX
+   470 00000493 03 45 C8                               ADD     EAX,DWORD [-56+EBP]
+   471 00000496 C7 45 A4 00000000                      MOV     DWORD [-92+EBP],0
+   472 0000049D 89 45 CC                               MOV     DWORD [-52+EBP],EAX
+   473 000004A0 8B 45 D8                               MOV     EAX,DWORD [-40+EBP]
+   474 000004A3 39 45 A4                               CMP     DWORD [-92+EBP],EAX
+   475 000004A6 0F 8D 000000AB                         JGE     L149
+   476 000004AC 89 55 AC                               MOV     DWORD [-84+EBP],EDX
+   477 000004AF                                 L123:
+   478 000004AF 8B 4D A4                               MOV     ECX,DWORD [-92+EBP]
+   479 000004B2 8B 75 D4                               MOV     ESI,DWORD [-44+EBP]
+   480 000004B5 8B 45 DC                               MOV     EAX,DWORD [-36+EBP]
+   481 000004B8 39 04 8E                               CMP     DWORD [ESI+ECX*4],EAX
+   482 000004BB 0F 84 00000172                         JE      L160
+   483 000004C1 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   484 000004C4 8B 75 EC                               MOV     ESI,DWORD [-20+EBP]
+   485 000004C7 8B 45 AC                               MOV     EAX,DWORD [-84+EBP]
+   486 000004CA 0F AF 71 08                            IMUL    ESI,DWORD [8+ECX]
+   487 000004CE 03 47 0C                               ADD     EAX,DWORD [12+EDI]
+   488 000004D1 8B 4D C0                               MOV     ECX,DWORD [-64+EBP]
+   489 000004D4 01 C6                                  ADD     ESI,EAX
+   490 000004D6 89 45 A8                               MOV     DWORD [-88+EBP],EAX
+   491 000004D9 89 75 B8                               MOV     DWORD [-72+EBP],ESI
+   492 000004DC 8A 45 BF                               MOV     AL,BYTE [-65+EBP]
+   493 000004DF 38 04 0E                               CMP     BYTE [ESI+ECX*1],AL
+   494 000004E2 0F 84 0000012E                         JE      L161
+   495 000004E8                                 L119:
+   496 000004E8 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   497 000004EB 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   498 000004EE 8B 75 C0                               MOV     ESI,DWORD [-64+EBP]
+   499 000004F1 0F AF 41 08                            IMUL    EAX,DWORD [8+ECX]
+   500 000004F5 03 45 A8                               ADD     EAX,DWORD [-88+EBP]
+   501 000004F8 8A 4D BF                               MOV     CL,BYTE [-65+EBP]
+   502 000004FB 89 45 B4                               MOV     DWORD [-76+EBP],EAX
+   503 000004FE 38 4C 30 01                            CMP     BYTE [1+EAX+ESI*1],CL
+   504 00000502 0F 84 000000EF                         JE      L162
+   505 00000508                                 L120:
+   506 00000508 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   507 0000050B 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   508 0000050E 8A 4D BF                               MOV     CL,BYTE [-65+EBP]
+   509 00000511 0F AF 46 08                            IMUL    EAX,DWORD [8+ESI]
+   510 00000515 03 45 A8                               ADD     EAX,DWORD [-88+EBP]
+   511 00000518 8B 75 C0                               MOV     ESI,DWORD [-64+EBP]
+   512 0000051B 89 45 B0                               MOV     DWORD [-80+EBP],EAX
+   513 0000051E 38 4C 30 02                            CMP     BYTE [2+EAX+ESI*1],CL
+   514 00000522 0F 84 000000B0                         JE      L163
+   515 00000528                                 L121:
+   516 00000528 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   517 0000052B 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   518 0000052E 0F AF 46 08                            IMUL    EAX,DWORD [8+ESI]
+   519 00000532 8B 75 A8                               MOV     ESI,DWORD [-88+EBP]
+   520 00000535 8D 0C 06                               LEA     ECX,DWORD [ESI+EAX*1]
+   521 00000538 8B 75 C0                               MOV     ESI,DWORD [-64+EBP]
+   522 0000053B 8A 45 BF                               MOV     AL,BYTE [-65+EBP]
+   523 0000053E 38 44 31 03                            CMP     BYTE [3+ECX+ESI*1],AL
+   524 00000542 74 78                                  JE      L164
+   525 00000544                                 L115:
+   526 00000544 8B 45 D8                               MOV     EAX,DWORD [-40+EBP]
+   527 00000547 FF 45 A4                               INC     DWORD [-92+EBP]
+   528 0000054A 83 45 AC 04                            ADD     DWORD [-84+EBP],4
+   529 0000054E 39 45 A4                               CMP     DWORD [-92+EBP],EAX
+   530 00000551 0F 8C FFFFFF58                         JL      L123
+   531 00000557                                 L149:
+   532 00000557 8B 4D D8                               MOV     ECX,DWORD [-40+EBP]
+   533 0000055A 8D 14 8A                               LEA     EDX,DWORD [EDX+ECX*4]
+   534 0000055D 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   535 00000560 7D 23                                  JGE     L151
+   536 00000562                                 L129:
+   537 00000562 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+   538 00000565 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   539 00000568 8B 77 0C                               MOV     ESI,DWORD [12+EDI]
+   540 0000056B 0F AF 41 08                            IMUL    EAX,DWORD [8+ECX]
+   541 0000056F 01 D6                                  ADD     ESI,EDX
+   542 00000571 8D 0C 06                               LEA     ECX,DWORD [ESI+EAX*1]
+   543 00000574 8B 75 C0                               MOV     ESI,DWORD [-64+EBP]
+   544 00000577 8A 45 BF                               MOV     AL,BYTE [-65+EBP]
+   545 0000057A 38 04 31                               CMP     BYTE [ECX+ESI*1],AL
+   546 0000057D 74 27                                  JE      L165
+   547 0000057F                                 L126:
+   548 0000057F 42                                     INC     EDX
+   549 00000580 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   550 00000583 7C DD                                  JL      L129
+   551 00000585                                 L151:
+   552 00000585 43                                     INC     EBX
+   553 00000586 3B 5D E0                               CMP     EBX,DWORD [-32+EBP]
+   554 00000589 0F 8C FFFFFE8C                         JL      L130
+   555 0000058F                                 L95:
+   556 0000058F 8B 45 20                               MOV     EAX,DWORD [32+EBP]
+   557 00000592 FF 45 F0                               INC     DWORD [-16+EBP]
+   558 00000595 39 45 F0                               CMP     DWORD [-16+EBP],EAX
+   559 00000598 0F 8E FFFFFDC5                         JLE     L143
+   560 0000059E                                 L145:
+   561 0000059E 83 C4 54                               ADD     ESP,84
+   562 000005A1 5B                                     POP     EBX
+   563 000005A2 5E                                     POP     ESI
+   564 000005A3 5F                                     POP     EDI
+   565 000005A4 5D                                     POP     EBP
+   566 000005A5 C3                                     RET
+   567 000005A6                                 L165:
+   568 000005A6 89 D8                                  MOV     EAX,EBX
+   569 000005A8 8B 75 C8                               MOV     ESI,DWORD [-56+EBP]
+   570 000005AB 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   571 000005AF 01 D0                                  ADD     EAX,EDX
+   572 000005B1 8A 04 30                               MOV     AL,BYTE [EAX+ESI*1]
+   573 000005B4 8B 75 C4                               MOV     ESI,DWORD [-60+EBP]
+   574 000005B7 88 04 31                               MOV     BYTE [ECX+ESI*1],AL
+   575 000005BA EB C3                                  JMP     L126
+   576 000005BC                                 L164:
+   577 000005BC 89 D8                                  MOV     EAX,EBX
+   578 000005BE 8B 75 C8                               MOV     ESI,DWORD [-56+EBP]
+   579 000005C1 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   580 000005C5 03 45 AC                               ADD     EAX,DWORD [-84+EBP]
+   581 000005C8 8A 44 30 03                            MOV     AL,BYTE [3+EAX+ESI*1]
+   582 000005CC 8B 75 C4                               MOV     ESI,DWORD [-60+EBP]
+   583 000005CF 88 44 31 03                            MOV     BYTE [3+ECX+ESI*1],AL
+   584 000005D3 E9 FFFFFF6C                            JMP     L115
+   585 000005D8                                 L163:
+   586 000005D8 89 D8                                  MOV     EAX,EBX
+   587 000005DA 8B 4D C8                               MOV     ECX,DWORD [-56+EBP]
+   588 000005DD 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   589 000005E1 03 45 AC                               ADD     EAX,DWORD [-84+EBP]
+   590 000005E4 8B 75 C4                               MOV     ESI,DWORD [-60+EBP]
+   591 000005E7 8A 44 08 02                            MOV     AL,BYTE [2+EAX+ECX*1]
+   592 000005EB 8B 4D B0                               MOV     ECX,DWORD [-80+EBP]
+   593 000005EE 88 44 31 02                            MOV     BYTE [2+ECX+ESI*1],AL
+   594 000005F2 E9 FFFFFF31                            JMP     L121
+   595 000005F7                                 L162:
+   596 000005F7 89 D8                                  MOV     EAX,EBX
+   597 000005F9 8B 4D C8                               MOV     ECX,DWORD [-56+EBP]
+   598 000005FC 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   599 00000600 03 45 AC                               ADD     EAX,DWORD [-84+EBP]
+   600 00000603 8B 75 C4                               MOV     ESI,DWORD [-60+EBP]
+   601 00000606 8A 44 08 01                            MOV     AL,BYTE [1+EAX+ECX*1]
+   602 0000060A 8B 4D B4                               MOV     ECX,DWORD [-76+EBP]
+   603 0000060D 88 44 31 01                            MOV     BYTE [1+ECX+ESI*1],AL
+   604 00000611 E9 FFFFFEF2                            JMP     L120
+   605 00000616                                 L161:
+   606 00000616 89 D8                                  MOV     EAX,EBX
+   607 00000618 8B 75 C8                               MOV     ESI,DWORD [-56+EBP]
+   608 0000061B 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   609 0000061F 03 45 AC                               ADD     EAX,DWORD [-84+EBP]
+   610 00000622 8B 4D C4                               MOV     ECX,DWORD [-60+EBP]
+   611 00000625 8A 04 30                               MOV     AL,BYTE [EAX+ESI*1]
+   612 00000628 8B 75 B8                               MOV     ESI,DWORD [-72+EBP]
+   613 0000062B 88 04 0E                               MOV     BYTE [ESI+ECX*1],AL
+   614 0000062E E9 FFFFFEB5                            JMP     L119
+   615 00000633                                 L160:
+   616 00000633 8B 75 CC                               MOV     ESI,DWORD [-52+EBP]
+   617 00000636 8B 04 8E                               MOV     EAX,DWORD [ESI+ECX*4]
+   618 00000639 8B 75 D0                               MOV     ESI,DWORD [-48+EBP]
+   619 0000063C 89 04 8E                               MOV     DWORD [ESI+ECX*4],EAX
+   620 0000063F E9 FFFFFF00                            JMP     L115
+   621 00000644                                 L159:
+   622 00000644 89 D8                                  MOV     EAX,EBX
+   623 00000646 8B 75 C8                               MOV     ESI,DWORD [-56+EBP]
+   624 00000649 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   625 0000064D 01 D0                                  ADD     EAX,EDX
+   626 0000064F 8A 04 30                               MOV     AL,BYTE [EAX+ESI*1]
+   627 00000652 8B 75 C4                               MOV     ESI,DWORD [-60+EBP]
+   628 00000655 88 04 31                               MOV     BYTE [ECX+ESI*1],AL
+   629 00000658 E9 FFFFFDFD                            JMP     L108
+   630 0000065D                                 L101:
+   631 0000065D 89 CB                                  MOV     EBX,ECX
+   632 0000065F 3B 4D E0                               CMP     ECX,DWORD [-32+EBP]
+   633 00000662 0F 8D FFFFFF27                         JGE     L95
+   634 00000668                                 L142:
+   635 00000668 8B 47 10                               MOV     EAX,DWORD [16+EDI]
+   636 0000066B 8B 55 E8                               MOV     EDX,DWORD [-24+EBP]
+   637 0000066E 01 D8                                  ADD     EAX,EBX
+   638 00000670 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   639 00000673 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   640 00000676 7D 26                                  JGE     L154
+   641 00000678                                 L141:
+   642 00000678 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   643 0000067B 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   644 0000067E 8B 4F 0C                               MOV     ECX,DWORD [12+EDI]
+   645 00000681 0F AF 46 08                            IMUL    EAX,DWORD [8+ESI]
+   646 00000685 01 D1                                  ADD     ECX,EDX
+   647 00000687 8B 75 C0                               MOV     ESI,DWORD [-64+EBP]
+   648 0000068A 89 4D A8                               MOV     DWORD [-88+EBP],ECX
+   649 0000068D 8D 0C 01                               LEA     ECX,DWORD [ECX+EAX*1]
+   650 00000690 8A 45 BF                               MOV     AL,BYTE [-65+EBP]
+   651 00000693 38 04 31                               CMP     BYTE [ECX+ESI*1],AL
+   652 00000696 74 11                                  JE      L166
+   653 00000698                                 L138:
+   654 00000698 42                                     INC     EDX
+   655 00000699 3B 55 E4                               CMP     EDX,DWORD [-28+EBP]
+   656 0000069C 7C DA                                  JL      L141
+   657 0000069E                                 L154:
+   658 0000069E 43                                     INC     EBX
+   659 0000069F 3B 5D E0                               CMP     EBX,DWORD [-32+EBP]
+   660 000006A2 7C C4                                  JL      L142
+   661 000006A4 E9 FFFFFEE6                            JMP     L95
+   662 000006A9                                 L166:
+   663 000006A9 89 D8                                  MOV     EAX,EBX
+   664 000006AB 8B 75 C8                               MOV     ESI,DWORD [-56+EBP]
+   665 000006AE 0F AF 47 04                            IMUL    EAX,DWORD [4+EDI]
+   666 000006B2 01 D0                                  ADD     EAX,EDX
+   667 000006B4 8A 04 30                               MOV     AL,BYTE [EAX+ESI*1]
+   668 000006B7 8B 75 C4                               MOV     ESI,DWORD [-60+EBP]
+   669 000006BA 88 04 31                               MOV     BYTE [ECX+ESI*1],AL
+   670 000006BD EB D9                                  JMP     L138
+   671 000006BF                                 L158:
+   672 000006BF 31 C9                                  XOR     ECX,ECX
+   673 000006C1 E9 FFFFFCF2                            JMP     L98
+   674 000006C6                                 L157:
+   675 000006C6 C7 45 E8 00000000                      MOV     DWORD [-24+EBP],0
+   676 000006CD E9 FFFFFCDE                            JMP     L97
+   677 000006D2                                 L156:
+   678 000006D2 C7 45 10 00000000                      MOV     DWORD [16+EBP],0
+   679 000006D9 E9 FFFFFC58                            JMP     L90
+   680 000006DE                                 L155:
+   681 000006DE C7 45 0C 00000000                      MOV     DWORD [12+EBP],0
+   682 000006E5 E9 FFFFFC42                            JMP     L89
+   683 000006EA                                        GLOBAL  _sheet_updown
+   684 000006EA                                 _sheet_updown:
+   685 000006EA 55                                     PUSH    EBP
+   686 000006EB 89 E5                                  MOV     EBP,ESP
+   687 000006ED 57                                     PUSH    EDI
+   688 000006EE 56                                     PUSH    ESI
+   689 000006EF 53                                     PUSH    EBX
+   690 000006F0 51                                     PUSH    ECX
+   691 000006F1 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+   692 000006F4 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   693 000006F7 8B 77 20                               MOV     ESI,DWORD [32+EDI]
+   694 000006FA 8B 47 18                               MOV     EAX,DWORD [24+EDI]
+   695 000006FD 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   696 00000700 8B 46 10                               MOV     EAX,DWORD [16+ESI]
+   697 00000703 40                                     INC     EAX
+   698 00000704 39 C3                                  CMP     EBX,EAX
+   699 00000706 7E 02                                  JLE     L168
+   700 00000708 89 C3                                  MOV     EBX,EAX
+   701 0000070A                                 L168:
+   702 0000070A 83 FB FF                               CMP     EBX,-1
+   703 0000070D 7D 03                                  JGE     L169
+   704 0000070F 83 CB FF                               OR      EBX,-1
+   705 00000712                                 L169:
+   706 00000712 89 5F 18                               MOV     DWORD [24+EDI],EBX
+   707 00000715 39 5D F0                               CMP     DWORD [-16+EBP],EBX
+   708 00000718 0F 8E 000000A8                         JLE     L170
+   709 0000071E 85 DB                                  TEST    EBX,EBX
+   710 00000720 78 5C                                  JS      L171
+   711 00000722 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+   712 00000725                                 L176:
+   713 00000725 8B 44 8E 10                            MOV     EAX,DWORD [16+ESI+ECX*4]
+   714 00000729 89 44 8E 14                            MOV     DWORD [20+ESI+ECX*4],EAX
+   715 0000072D 89 48 18                               MOV     DWORD [24+EAX],ECX
+   716 00000730 49                                     DEC     ECX
+   717 00000731 39 D9                                  CMP     ECX,EBX
+   718 00000733 7F F0                                  JG      L176
+   719 00000735 89 7C 9E 14                            MOV     DWORD [20+ESI+EBX*4],EDI
+   720 00000739 43                                     INC     EBX
+   721 0000073A 53                                     PUSH    EBX
+   722 0000073B 8B 4F 10                               MOV     ECX,DWORD [16+EDI]
+   723 0000073E 89 C8                                  MOV     EAX,ECX
+   724 00000740 03 47 08                               ADD     EAX,DWORD [8+EDI]
+   725 00000743 50                                     PUSH    EAX
+   726 00000744 8B 57 0C                               MOV     EDX,DWORD [12+EDI]
+   727 00000747 89 D0                                  MOV     EAX,EDX
+   728 00000749 03 47 04                               ADD     EAX,DWORD [4+EDI]
+   729 0000074C 50                                     PUSH    EAX
+   730 0000074D 51                                     PUSH    ECX
+   731 0000074E 52                                     PUSH    EDX
+   732 0000074F 56                                     PUSH    ESI
+   733 00000750 E8 FFFFF988                            CALL    _sheet_refreshmap
+   734 00000755 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   735 00000758                                 L206:
+   736 00000758 53                                     PUSH    EBX
+   737 00000759                                 L205:
+   738 00000759 8B 4F 10                               MOV     ECX,DWORD [16+EDI]
+   739 0000075C 89 C8                                  MOV     EAX,ECX
+   740 0000075E 03 47 08                               ADD     EAX,DWORD [8+EDI]
+   741 00000761 50                                     PUSH    EAX
+   742 00000762 8B 57 0C                               MOV     EDX,DWORD [12+EDI]
+   743 00000765 89 D0                                  MOV     EAX,EDX
+   744 00000767 03 47 04                               ADD     EAX,DWORD [4+EDI]
+   745 0000076A 50                                     PUSH    EAX
+   746 0000076B 51                                     PUSH    ECX
+   747 0000076C 52                                     PUSH    EDX
+   748 0000076D 56                                     PUSH    ESI
+   749 0000076E E8 FFFFFB95                            CALL    _sheet_refreshsub
+   750 00000773 83 C4 34                               ADD     ESP,52
+   751 00000776                                 L167:
+   752 00000776 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   753 00000779 5B                                     POP     EBX
+   754 0000077A 5E                                     POP     ESI
+   755 0000077B 5F                                     POP     EDI
+   756 0000077C 5D                                     POP     EBP
+   757 0000077D C3                                     RET
+   758 0000077E                                 L171:
+   759 0000077E 8B 46 10                               MOV     EAX,DWORD [16+ESI]
+   760 00000781 3B 45 F0                               CMP     EAX,DWORD [-16+EBP]
+   761 00000784 7E 18                                  JLE     L178
+   762 00000786 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+   763 00000789 39 C1                                  CMP     ECX,EAX
+   764 0000078B 7D 11                                  JGE     L178
+   765 0000078D                                 L183:
+   766 0000078D 8B 44 8E 18                            MOV     EAX,DWORD [24+ESI+ECX*4]
+   767 00000791 89 44 8E 14                            MOV     DWORD [20+ESI+ECX*4],EAX
+   768 00000795 89 48 18                               MOV     DWORD [24+EAX],ECX
+   769 00000798 41                                     INC     ECX
+   770 00000799 3B 4E 10                               CMP     ECX,DWORD [16+ESI]
+   771 0000079C 7C EF                                  JL      L183
+   772 0000079E                                 L178:
+   773 0000079E FF 4E 10                               DEC     DWORD [16+ESI]
+   774 000007A1 6A 00                                  PUSH    0
+   775 000007A3 8B 4F 10                               MOV     ECX,DWORD [16+EDI]
+   776 000007A6 89 C8                                  MOV     EAX,ECX
+   777 000007A8 03 47 08                               ADD     EAX,DWORD [8+EDI]
+   778 000007AB 50                                     PUSH    EAX
+   779 000007AC 8B 57 0C                               MOV     EDX,DWORD [12+EDI]
+   780 000007AF 89 D0                                  MOV     EAX,EDX
+   781 000007B1 03 47 04                               ADD     EAX,DWORD [4+EDI]
+   782 000007B4 50                                     PUSH    EAX
+   783 000007B5 51                                     PUSH    ECX
+   784 000007B6 52                                     PUSH    EDX
+   785 000007B7 56                                     PUSH    ESI
+   786 000007B8 E8 FFFFF920                            CALL    _sheet_refreshmap
+   787 000007BD 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   788 000007C0 48                                     DEC     EAX
+   789 000007C1 50                                     PUSH    EAX
+   790 000007C2 6A 00                                  PUSH    0
+   791 000007C4 EB 93                                  JMP     L205
+   792 000007C6                                 L170:
+   793 000007C6 39 5D F0                               CMP     DWORD [-16+EBP],EBX
+   794 000007C9 7D AB                                  JGE     L167
+   795 000007CB 83 7D F0 00                            CMP     DWORD [-16+EBP],0
+   796 000007CF 78 3C                                  JS      L186
+   797 000007D1 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+   798 000007D4 39 D9                                  CMP     ECX,EBX
+   799 000007D6 7D 10                                  JGE     L202
+   800 000007D8                                 L191:
+   801 000007D8 8B 44 8E 18                            MOV     EAX,DWORD [24+ESI+ECX*4]
+   802 000007DC 89 44 8E 14                            MOV     DWORD [20+ESI+ECX*4],EAX
+   803 000007E0 89 48 18                               MOV     DWORD [24+EAX],ECX
+   804 000007E3 41                                     INC     ECX
+   805 000007E4 39 D9                                  CMP     ECX,EBX
+   806 000007E6 7C F0                                  JL      L191
+   807 000007E8                                 L202:
+   808 000007E8 89 7C 9E 14                            MOV     DWORD [20+ESI+EBX*4],EDI
+   809 000007EC                                 L192:
+   810 000007EC 53                                     PUSH    EBX
+   811 000007ED 8B 4F 10                               MOV     ECX,DWORD [16+EDI]
+   812 000007F0 89 C8                                  MOV     EAX,ECX
+   813 000007F2 03 47 08                               ADD     EAX,DWORD [8+EDI]
+   814 000007F5 50                                     PUSH    EAX
+   815 000007F6 8B 57 0C                               MOV     EDX,DWORD [12+EDI]
+   816 000007F9 89 D0                                  MOV     EAX,EDX
+   817 000007FB 03 47 04                               ADD     EAX,DWORD [4+EDI]
+   818 000007FE 50                                     PUSH    EAX
+   819 000007FF 51                                     PUSH    ECX
+   820 00000800 52                                     PUSH    EDX
+   821 00000801 56                                     PUSH    ESI
+   822 00000802 E8 FFFFF8D6                            CALL    _sheet_refreshmap
+   823 00000807 53                                     PUSH    EBX
+   824 00000808 E9 FFFFFF4B                            JMP     L206
+   825 0000080D                                 L186:
+   826 0000080D 8B 4E 10                               MOV     ECX,DWORD [16+ESI]
+   827 00000810 39 D9                                  CMP     ECX,EBX
+   828 00000812 7C 13                                  JL      L204
+   829 00000814                                 L197:
+   830 00000814 8B 54 8E 14                            MOV     EDX,DWORD [20+ESI+ECX*4]
+   831 00000818 8D 41 01                               LEA     EAX,DWORD [1+ECX]
+   832 0000081B 89 54 8E 18                            MOV     DWORD [24+ESI+ECX*4],EDX
+   833 0000081F 49                                     DEC     ECX
+   834 00000820 89 42 18                               MOV     DWORD [24+EDX],EAX
+   835 00000823 39 D9                                  CMP     ECX,EBX
+   836 00000825 7D ED                                  JGE     L197
+   837 00000827                                 L204:
+   838 00000827 89 7C 9E 14                            MOV     DWORD [20+ESI+EBX*4],EDI
+   839 0000082B FF 46 10                               INC     DWORD [16+ESI]
+   840 0000082E EB BC                                  JMP     L192
+   841 00000830                                        GLOBAL  _sheet_refresh
+   842 00000830                                 _sheet_refresh:
+   843 00000830 55                                     PUSH    EBP
+   844 00000831 89 E5                                  MOV     EBP,ESP
+   845 00000833 53                                     PUSH    EBX
+   846 00000834 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   847 00000837 8B 43 18                               MOV     EAX,DWORD [24+EBX]
+   848 0000083A 85 C0                                  TEST    EAX,EAX
+   849 0000083C 78 27                                  JS      L207
+   850 0000083E 50                                     PUSH    EAX
+   851 0000083F 50                                     PUSH    EAX
+   852 00000840 8B 4B 10                               MOV     ECX,DWORD [16+EBX]
+   853 00000843 89 C8                                  MOV     EAX,ECX
+   854 00000845 03 4D 10                               ADD     ECX,DWORD [16+EBP]
+   855 00000848 03 45 18                               ADD     EAX,DWORD [24+EBP]
+   856 0000084B 50                                     PUSH    EAX
+   857 0000084C 8B 53 0C                               MOV     EDX,DWORD [12+EBX]
+   858 0000084F 89 D0                                  MOV     EAX,EDX
+   859 00000851 03 55 0C                               ADD     EDX,DWORD [12+EBP]
+   860 00000854 03 45 14                               ADD     EAX,DWORD [20+EBP]
+   861 00000857 50                                     PUSH    EAX
+   862 00000858 51                                     PUSH    ECX
+   863 00000859 52                                     PUSH    EDX
+   864 0000085A FF 73 20                               PUSH    DWORD [32+EBX]
+   865 0000085D E8 FFFFFAA6                            CALL    _sheet_refreshsub
+   866 00000862 83 C4 1C                               ADD     ESP,28
+   867 00000865                                 L207:
+   868 00000865 8B 5D FC                               MOV     EBX,DWORD [-4+EBP]
+   869 00000868 C9                                     LEAVE
+   870 00000869 C3                                     RET
+   871 0000086A                                        GLOBAL  _sheet_slide
+   872 0000086A                                 _sheet_slide:
+   873 0000086A 55                                     PUSH    EBP
+   874 0000086B 89 E5                                  MOV     EBP,ESP
+   875 0000086D 57                                     PUSH    EDI
+   876 0000086E 56                                     PUSH    ESI
+   877 0000086F 53                                     PUSH    EBX
+   878 00000870 53                                     PUSH    EBX
+   879 00000871 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   880 00000874 8B 43 20                               MOV     EAX,DWORD [32+EBX]
+   881 00000877 8B 7B 0C                               MOV     EDI,DWORD [12+EBX]
+   882 0000087A 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   883 0000087D 8B 73 10                               MOV     ESI,DWORD [16+EBX]
+   884 00000880 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   885 00000883 89 43 0C                               MOV     DWORD [12+EBX],EAX
+   886 00000886 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   887 00000889 89 43 10                               MOV     DWORD [16+EBX],EAX
+   888 0000088C 83 7B 18 00                            CMP     DWORD [24+EBX],0
+   889 00000890 78 7C                                  JS      L209
+   890 00000892 6A 00                                  PUSH    0
+   891 00000894 89 F0                                  MOV     EAX,ESI
+   892 00000896 03 43 08                               ADD     EAX,DWORD [8+EBX]
+   893 00000899 50                                     PUSH    EAX
+   894 0000089A 89 F8                                  MOV     EAX,EDI
+   895 0000089C 03 43 04                               ADD     EAX,DWORD [4+EBX]
+   896 0000089F 50                                     PUSH    EAX
+   897 000008A0 56                                     PUSH    ESI
+   898 000008A1 57                                     PUSH    EDI
+   899 000008A2 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   900 000008A5 E8 FFFFF833                            CALL    _sheet_refreshmap
+   901 000008AA 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   902 000008AD FF 73 18                               PUSH    DWORD [24+EBX]
+   903 000008B0 03 43 08                               ADD     EAX,DWORD [8+EBX]
+   904 000008B3 50                                     PUSH    EAX
+   905 000008B4 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   906 000008B7 03 43 04                               ADD     EAX,DWORD [4+EBX]
+   907 000008BA 50                                     PUSH    EAX
+   908 000008BB FF 75 10                               PUSH    DWORD [16+EBP]
+   909 000008BE FF 75 0C                               PUSH    DWORD [12+EBP]
+   910 000008C1 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   911 000008C4 E8 FFFFF814                            CALL    _sheet_refreshmap
+   912 000008C9 8B 43 18                               MOV     EAX,DWORD [24+EBX]
+   913 000008CC 83 C4 30                               ADD     ESP,48
+   914 000008CF 48                                     DEC     EAX
+   915 000008D0 50                                     PUSH    EAX
+   916 000008D1 89 F0                                  MOV     EAX,ESI
+   917 000008D3 6A 00                                  PUSH    0
+   918 000008D5 03 43 08                               ADD     EAX,DWORD [8+EBX]
+   919 000008D8 50                                     PUSH    EAX
+   920 000008D9 89 F8                                  MOV     EAX,EDI
+   921 000008DB 03 43 04                               ADD     EAX,DWORD [4+EBX]
+   922 000008DE 50                                     PUSH    EAX
+   923 000008DF 56                                     PUSH    ESI
+   924 000008E0 57                                     PUSH    EDI
+   925 000008E1 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   926 000008E4 E8 FFFFFA1F                            CALL    _sheet_refreshsub
+   927 000008E9 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   928 000008EC FF 73 18                               PUSH    DWORD [24+EBX]
+   929 000008EF FF 73 18                               PUSH    DWORD [24+EBX]
+   930 000008F2 03 43 08                               ADD     EAX,DWORD [8+EBX]
+   931 000008F5 50                                     PUSH    EAX
+   932 000008F6 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   933 000008F9 03 43 04                               ADD     EAX,DWORD [4+EBX]
+   934 000008FC 50                                     PUSH    EAX
+   935 000008FD FF 75 10                               PUSH    DWORD [16+EBP]
+   936 00000900 FF 75 0C                               PUSH    DWORD [12+EBP]
+   937 00000903 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   938 00000906 E8 FFFFF9FD                            CALL    _sheet_refreshsub
+   939 0000090B 83 C4 38                               ADD     ESP,56
+   940 0000090E                                 L209:
+   941 0000090E 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   942 00000911 5B                                     POP     EBX
+   943 00000912 5E                                     POP     ESI
+   944 00000913 5F                                     POP     EDI
+   945 00000914 5D                                     POP     EBP
+   946 00000915 C3                                     RET
+   947 00000916                                        GLOBAL  _sheet_free
+   948 00000916                                 _sheet_free:
+   949 00000916 55                                     PUSH    EBP
+   950 00000917 89 E5                                  MOV     EBP,ESP
+   951 00000919 53                                     PUSH    EBX
+   952 0000091A 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   953 0000091D 83 7B 18 00                            CMP     DWORD [24+EBX],0
+   954 00000921 78 0A                                  JS      L212
+   955 00000923 6A FF                                  PUSH    -1
+   956 00000925 53                                     PUSH    EBX
+   957 00000926 E8 FFFFFDBF                            CALL    _sheet_updown
+   958 0000092B 58                                     POP     EAX
+   959 0000092C 5A                                     POP     EDX
+   960 0000092D                                 L212:
+   961 0000092D C7 43 1C 00000000                      MOV     DWORD [28+EBX],0
+   962 00000934 8B 5D FC                               MOV     EBX,DWORD [-4+EBP]
+   963 00000937 C9                                     LEAVE
+   964 00000938 C3                                     RET
diff --git a/haribote/startup.cpp b/haribote/startup.cpp
new file mode 100644 (file)
index 0000000..9d863b8
--- /dev/null
@@ -0,0 +1 @@
+//\8eQ\8dlURL\r//http://wiki.monaos.org/pukiwiki.php?%B5%C4%CF%C0%2Fstatic%CA%D1%BF%F4%A4%CE%BD%E9%B4%FC%B2%BD\r#include <stdio.h>\r#include "typedefs.h"\r\rtypedef void (*PFV)(void);\r\r#ifdef __cplusplus\rextern "C" {\r#endif\rextern PFV      __CTOR_LIST__[];\rextern PFV     __DTOR_LIST__[];\r#ifdef __cplusplus\r}\r#endif\r\rextern "C" int _main(int,char*[],char*[]);\r\rstatic void __finit(const PFV *list) {\r       DWORD   cnt;\r\r  cnt = (DWORD)list[0];\r  list++;\r        list = (PFV *)((((DWORD)list) + 3) & (~3));             // align bug?\r  if (cnt == -1) {\r               while(*list != NULL) {\r                 (**list++)();\r          }\r      }\r      else {\r         while(cnt) {\r                   cnt--;\r                 (**list++)();\r          }\r      }\r}\r\rextern "C" int user_start(void) {\r int             r;\r\r    //memmng_initialize(0xC0000000, 8 * 1024 * 1024);\r      //__fsio_initialize();\r //makearg();\r   __finit(__CTOR_LIST__);\r        r = _main(0, 0, 0);\r    __finit(__DTOR_LIST__);\r        //free(__argv);\r        //memmng_deinitialize();\r       //syscall_kill();\r      return(r);\r}
\ No newline at end of file
diff --git a/haribote/t.c b/haribote/t.c
new file mode 100644 (file)
index 0000000..ab4e8ec
--- /dev/null
@@ -0,0 +1,4 @@
+int kansuu(){
+       static char s[] = {1,2,3,4,5,0};
+       return 0;
+}
\ No newline at end of file
diff --git a/haribote/t.gas b/haribote/t.gas
new file mode 100644 (file)
index 0000000..9d24228
--- /dev/null
@@ -0,0 +1,19 @@
+       .file   "t.c"
+       .data
+_s.0:
+       .byte   1
+       .byte   2
+       .byte   3
+       .byte   4
+       .byte   5
+       .byte   0
+       .text
+       .balign 2
+.globl _kansuu
+       .def    _kansuu;        .scl    2;      .type   32;     .endef
+_kansuu:
+       pushl   %ebp
+       xorl    %eax, %eax
+       movl    %esp, %ebp
+       popl    %ebp
+       ret
diff --git a/haribote/tek.c b/haribote/tek.c
new file mode 100644 (file)
index 0000000..449df11
--- /dev/null
@@ -0,0 +1,653 @@
+#include "bootpack.h"
+#include <setjmp.h>
+#include <string.h>
+#define NULL           0
+
+typedef unsigned char UCHAR;
+typedef unsigned int UINT32;
+typedef UINT32 tek_TPRB;
+
+static int tek_decode1(int siz, UCHAR *p, UCHAR *q);
+static int tek_decode2(int siz, UCHAR *p, UCHAR *q);
+static int tek_decode5(int siz, UCHAR *p, UCHAR *q);
+
+static unsigned int tek_getnum_s7s(UCHAR **pp)
+/* \82±\82ê\82Í\95K\82¸big-endian */
+/* \89º\91Ê\82ª\82È\82¢\82Ì\82Å\92\86\90g\82ð\82¢\82\82è\82â\82·\82¢ */
+{
+       unsigned int s = 0;
+       UCHAR *p = *pp;
+       do {
+               s = s << 7 | *p++;
+       } while ((s & 1) == 0);
+       s >>= 1;
+       *pp = p;
+       return s;
+}
+
+int tek_getsize(unsigned char *p)
+{
+       static char header[15] = {
+               0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x4f, 0x53, 0x41, 0x53, 0x4b, 0x43, 0x4d, 0x50
+       };
+       int size = -1;
+       if (memcmp(p + 1, header, 15) == 0 && (*p == 0x83 || *p == 0x85 || *p == 0x89)) {
+               p += 16;
+               size = tek_getnum_s7s(&p);
+       }
+       return size;
+}        /* \81i\92\90\81jmemcmp\82Ístrncmp\82Ì\92\87\8aÔ\82Å\81A\95\8e\9a\97ñ\92\86\82É0\82ª\82 \82Á\82Ä\82à\8ew\92è\82³\82ê\82½15\95\8e\9a\82Ü\82Å\94ä\8ar\82·\82é\8aÖ\90\94 */
+
+int tek_decomp(unsigned char *p, char *q, int size)
+{
+       int err = -1;
+       if (*p == 0x83) {
+               err = tek_decode1(size, p, q);
+       } else if (*p == 0x85) {
+               err = tek_decode2(size, p, q);
+       } else if (*p == 0x89) {
+               err = tek_decode5(size, p, q);
+       }
+       if (err != 0) {
+               return -1;      /* \8e¸\94s */
+       }
+       return 0;       /* \90¬\8c÷ */
+}
+
+static int tek_lzrestore_stk1(int srcsiz, UCHAR *src, int outsiz, UCHAR *q)
+{
+       int by, lz, cp, ds;
+       UCHAR *q1 = q + outsiz, *s7ptr = src, *q0 = q;
+       do {
+               if ((by = (lz = *s7ptr++) & 0x0f) == 0)
+                       by = tek_getnum_s7s(&s7ptr);
+               if ((lz >>= 4) == 0)
+                       lz = tek_getnum_s7s(&s7ptr);
+               do {
+                       *q++ = *s7ptr++;
+               } while (--by);
+               if (q >= q1)
+                       break;
+               do {
+                       ds = (cp = *s7ptr++) & 0x0f;
+                       if ((ds & 1) == 0) {
+                               do {
+                                       ds = ds << 7 | *s7ptr++;
+                               } while ((ds & 1) == 0);
+                       }
+                       ds = ~(ds >> 1);
+                       if ((cp >>= 4) == 0) {
+                               do {
+                                       cp = cp << 7 | *s7ptr++;
+                               } while ((cp & 1) == 0);
+                               cp >>= 1;
+                       } /* 0\82ª\82±\82È\82¢\82±\82Æ\82ð\82 \82Ä\82É\82·\82é */
+                       cp++;
+                       if (q + ds < q0)
+                               goto err;
+                       if (q + cp > q1)
+                               cp = q1 - q;
+                       do {
+                               *q = *(q + ds);
+                               q++;
+                       } while (--cp);
+               } while (--lz);
+       } while (q < q1);
+       return 0;
+err:
+       return 1;
+}
+
+static int tek_decode1(int siz, UCHAR *p, UCHAR *q)
+{
+       int dsiz, hed, bsiz;
+       UCHAR *p1 = p + siz;
+       p += 16;
+       if ((dsiz = tek_getnum_s7s(&p)) > 0) {
+               hed = tek_getnum_s7s(&p);
+               bsiz = 1 << (((hed >> 1) & 0x0f) + 8);
+               if (dsiz > bsiz || (hed & 0x21) != 0x01)
+                       return 1;
+               if (hed & 0x40)
+                       tek_getnum_s7s(&p); /* \83I\83v\83V\83\87\83\93\8fî\95ñ\82Ö\82Ì\83|\83C\83\93\83^\82ð\93Ç\82Ý\94ò\82Î\82· */
+               if (tek_getnum_s7s(&p) != 0)
+                       return 1; /* \95â\8f\95\83o\83b\83t\83@\8eg\97p */
+               return tek_lzrestore_stk1(p1 - p, p, dsiz, q);
+       }
+       return 0;
+}
+
+static unsigned int tek_getnum_s7(UCHAR **pp)
+/* \82±\82ê\82Í\95K\82¸big-endian */
+{
+       unsigned int s = 0, b = 0, a = 1;
+       UCHAR *p = *pp;
+       for (;;) {
+               s = s << 7 | *p++;
+               if (s & 1)
+                       break;
+               a <<= 7;
+               b += a;
+       }
+       s >>= 1;
+       *pp = p;
+       return s + b;
+}
+
+static int tek_lzrestore_stk2(int srcsiz, UCHAR *src, int outsiz, UCHAR *q)
+{
+       int cp, ds, repdis[4], i, j;
+       UCHAR *q1 = q + outsiz, *s7ptr = src, *q0 = q, bylz, cbylz;
+       for (j = 0; j < 4; j++)
+               repdis[j] = -1 - j;
+       bylz = cbylz = 0;
+       if (outsiz) {
+               if (tek_getnum_s7s(&s7ptr))
+                       return 1;
+               do {
+                       /* by\83t\83F\81[\83Y */
+                       j = 0;
+                       do {
+                               j++;
+                               if (j >= 17) {
+                                       j += tek_getnum_s7s(&s7ptr);
+                                       break;
+                               }
+                               if (cbylz == 0) {
+                                       cbylz = 8;
+                                       bylz = *s7ptr++;
+                               }
+                               cbylz--;
+                               i = bylz & 1;
+                               bylz >>= 1;
+                       } while (i == 0);
+                       do {
+                               *q++ = *s7ptr++;
+                       } while (--j);
+                       if (q >= q1)
+                               break;
+
+                       /* lz\83t\83F\81[\83Y */
+                       j = 0;
+                       do {
+                               j++;
+                               if (j >= 17) {
+                                       j += tek_getnum_s7s(&s7ptr);
+                                       break;
+                               }
+                               if (cbylz == 0) {
+                                       cbylz = 8;
+                                       bylz = *s7ptr++;
+                               }
+                               cbylz--;
+                               i = bylz & 1;
+                               bylz >>= 1;
+                       } while (i == 0);
+                       do {
+                               i = *s7ptr++;
+                               cp = i >> 4;
+                               i &= 0x0f;
+                               if ((i & 1) == 0)
+                                       i |= (tek_getnum_s7(&s7ptr) + 1) << 4;
+                               i >>= 1;
+                               ds = ~(i - 6);
+                               if (i < 4)
+                                       ds = repdis[i];
+                               if (i == 4)
+                                       ds = repdis[0] - tek_getnum_s7(&s7ptr) - 1;
+                               if (i == 5)
+                                       ds = repdis[0] + tek_getnum_s7(&s7ptr) + 1;
+                               if (cp == 0)
+                                       cp = tek_getnum_s7(&s7ptr) + 16;
+                               cp++;
+                               if (i > 0) {
+                                       if (i > 1) {
+                                               if (i > 2)
+                                                       repdis[3] = repdis[2];
+                                               repdis[2] = repdis[1];
+                                       }
+                                       repdis[1] = repdis[0];
+                                       repdis[0] = ds;
+                               }
+                               if (q + ds < q0)
+                                       goto err;
+                               if (q + cp > q1)
+                                       cp = q1 - q;
+                               do {
+                                       *q = *(q + ds);
+                                       q++;
+                               } while (--cp);
+                       } while (--j);
+               } while (q < q1);
+       }
+       return 0;
+err:
+       return 1;
+}
+
+static int tek_decode2(int siz, UCHAR *p, UCHAR *q)
+{
+       UCHAR *p1 = p + siz;
+       int dsiz, hed, bsiz, st = 0;
+       p += 16;
+       if ((dsiz = tek_getnum_s7s(&p)) > 0) {
+               hed = tek_getnum_s7s(&p);
+               bsiz = 1 << (((hed >> 1) & 0x0f) + 8);
+               if (dsiz > bsiz || (hed & 0x21) != 0x01)
+                       return 1;
+               if (hed & 0x40)
+                       tek_getnum_s7s(&p); /* \83I\83v\83V\83\87\83\93\8fî\95ñ\82Ö\82Ì\83|\83C\83\93\83^\82ð\93Ç\82Ý\94ò\82Î\82· */
+               st = tek_lzrestore_stk2(p1 - p, p, dsiz, q);
+       }
+       return st;
+}
+
+static int tek_decmain5(int *work, UCHAR *src, int osiz, UCHAR *q, int lc, int pb, int lp, int flags);
+
+static int tek_lzrestore_tek5(int srcsiz, UCHAR *src, int outsiz, UCHAR *outbuf)
+{
+       int wrksiz, lc, lp, pb, flags, *work, prop0, fl;
+
+       if ((fl = (prop0 = *src) & 0x0f) == 0x01) /* 0001 */
+               flags |= -1;
+       else if (fl == 0x05)
+               flags = -2;
+       else if (fl == 0x09)
+               flags &= 0;
+       else
+               return 1;
+       src++;
+       prop0 >>= 4;
+       if (prop0 == 0)
+               prop0 = *src++;
+       else {
+               static UCHAR prop0_table[] = { 0x5d, 0x00 }, prop1_table[] = { 0x00 };
+               if (flags == -1) {
+                       if (prop0 >= 3)
+                               return 1;
+                       prop0 = prop0_table[prop0 - 1];
+               } else {
+                       if (prop0 >= 2)
+                               return 1;
+                       prop0 = prop1_table[prop0 - 1];
+               }
+       }
+       lp = prop0 / (9 * 5);
+       prop0 %= 9 * 5;
+       pb = prop0 / 9;
+       lc = prop0 % 9;
+       if (flags == 0) /* tek5:z2 */
+               flags = *src++;
+       if (flags == -1) { /* stk5 */
+               wrksiz = lp;
+               lp = pb;
+               pb = wrksiz;
+       }
+       wrksiz = 0x180 * sizeof (UINT32) + (0x840 + (0x300 << (lc + lp))) * sizeof (tek_TPRB); /* \8dÅ\92á15KB, lc+lp=3\82È\82ç\81A36KB */
+       work = (int *) memman_alloc_4k((struct MEMMAN *) MEMMAN_ADDR, wrksiz);
+       if (work == NULL)
+               return -1;
+       flags = tek_decmain5(work, src, outsiz, outbuf, lc, pb, lp, flags);
+       memman_free_4k((struct MEMMAN *) MEMMAN_ADDR, (int) work, wrksiz);
+       return flags;
+}
+
+struct tek_STR_BITMODEL {
+       UCHAR t, m, s, dmy;
+       UINT32 prb0, prb1, tmsk, ntm, lt, lt0, dmy4;
+};
+
+struct tek_STR_PRB {
+       struct tek_STR_PRB_PB {
+               struct tek_STR_PRB_PBST {
+                       tek_TPRB mch, rep0l1;
+               } st[12];
+               tek_TPRB lenlow[2][8], lenmid[2][8];
+       } pb[16];
+       struct tek_STR_PRB_ST {
+               tek_TPRB rep, repg0, repg1, repg2;
+       } st[12];
+       tek_TPRB lensel[2][2], lenhigh[2][256], pslot[4][64], algn[64];
+       tek_TPRB spdis[2][2+4+8+16+32], lenext[2+4+8+16+32];
+       tek_TPRB repg3, fchgprm[2 * 32], tbmt[16], tbmm[16], fchglt;
+       tek_TPRB lit[1];
+};
+
+struct tek_STR_RNGDEC {
+       UCHAR *p;
+       UINT32 range, code, rmsk;
+       jmp_buf errjmp;
+       struct tek_STR_BITMODEL bm[32], *ptbm[16];
+       struct tek_STR_PRB probs;
+};
+
+static void tek_setbm5(struct tek_STR_BITMODEL *bm, int t, int m)
+{
+       bm->t = t;
+       bm->m = m;
+       bm->prb1 = -1 << (m + t);
+       bm->prb0 = ~bm->prb1;
+       bm->prb1 |= 1 << t;
+       bm->tmsk = (-1 << t) & 0xffff;
+       bm->prb0 &= bm->tmsk;
+       bm->prb1 &= bm->tmsk;
+       bm->ntm = ~bm->tmsk;
+       return;
+}
+
+static int tek_rdget0(struct tek_STR_RNGDEC *rd, int n, int i)
+{
+       do {
+               while (rd->range < (UINT32) (1 << 24)) {
+                       rd->range <<= 8;
+                       rd->code = rd->code << 8 | *rd->p++;
+               }
+               rd->range >>= 1;
+               i += i;
+               if (rd->code >= rd->range) {
+                       rd->code -= rd->range;
+                       i |= 1;
+               }
+       } while (--n);
+       return ~i;
+}
+
+static int tek_rdget1(struct tek_STR_RNGDEC *rd, tek_TPRB *prob0, int n, int j, struct tek_STR_BITMODEL *bm)
+{
+       UINT32 p, i, *prob, nm = n >> 4;
+       n &= 0x0f;
+       prob0 -= j;
+       do {
+               p = *(prob = prob0 + j);
+               if (bm->lt > 0) {
+                       if (--bm->lt == 0) {
+                               /* \8eõ\96½\90Ø\82ê */
+                               if (tek_rdget1(rd, &rd->probs.fchglt, 0x71, 0, &rd->bm[3]) == 0) {
+                                       /* \8eõ\96½\95Ï\8dX\82Í\82Ü\82¾\83T\83|\81[\83g\82µ\82Ä\82È\82¢ */
+err:
+                                       longjmp(rd->errjmp, 1);
+                               }
+                               i = bm - rd->bm;
+                               if ((bm->s = tek_rdget1(rd, &rd->probs.fchgprm[i * 2 + bm->s], 0x71, 0, &rd->bm[1])) == 0) {
+                                       i = tek_rdget1(rd, rd->probs.tbmt, 0x74, 1, &rd->bm[2]) & 15;
+                                       if (i == 15)
+                                               goto err;
+                                       tek_setbm5(bm, i, ((tek_rdget1(rd, rd->probs.tbmm, 0x74, 1, &rd->bm[2]) - 1) & 15) + 1);
+                               }
+                               bm->lt = bm->lt0;
+                       }
+                       if (p < bm->prb0) {
+                               p = bm->prb0;
+                               goto fixprob;
+                       }
+                       if (p > bm->prb1) {
+                               p = bm->prb1;
+                               goto fixprob;
+                       }
+                       if (p & bm->ntm) {
+                               p &= bm->tmsk;
+       fixprob:
+                               *prob = p;
+                       }
+               }
+
+               while (rd->range < (UINT32) (1 << 24)) {
+                       rd->range <<= 8;
+                       rd->code = rd->code << 8 | *rd->p++;
+               }
+               j += j;
+               i = ((unsigned long long) (rd->range & rd->rmsk) * p) >> 16;
+               if (rd->code < i) {
+                       j |= 1;
+                       rd->range = i;
+                       *prob += ((0x10000 - p) >> bm->m) & bm->tmsk;
+               } else {
+                       rd->range -= i;
+                       rd->code -= i;
+                       *prob -= (p >> bm->m) & bm->tmsk;
+               }
+               --n;
+               if ((n & nm) == 0)
+                       bm++;
+       } while (n);
+       return j;
+}
+
+static UINT32 tek_revbit(UINT32 data, int len)
+{
+       UINT32 rev = 0;
+       do {
+               rev += rev + (data & 1);
+               data >>= 1;
+       } while (--len);
+       return rev;
+}
+
+static int tek_getlen5(struct tek_STR_RNGDEC *rd, int m, int s_pos, int stk)
+{
+       int i;
+       if (tek_rdget1(rd, &rd->probs.lensel[m][0], 0x71, 0, rd->ptbm[3]) ^ stk) /* low */
+               i = tek_rdget1(rd, rd->probs.pb[s_pos].lenlow[m], 0x73, 1, rd->ptbm[4]) & 7;
+       else if (tek_rdget1(rd, &rd->probs.lensel[m][1], 0x71, 0, rd->ptbm[3]) ^ stk) /* mid */
+               i = tek_rdget1(rd, rd->probs.pb[s_pos].lenmid[m], 0x73, 1, rd->ptbm[5]);
+       else {
+               /* high */
+               i = tek_rdget1(rd, rd->probs.lenhigh[m], 0x78, 1, rd->ptbm[6]) - (256 + 256 - 8);
+               if (i > 0) {
+                       if (i < 6 && stk == 0)
+                               i = tek_rdget1(rd, &rd->probs.lenext[(1 << i) - 2], i | 0x70, 1, rd->ptbm[7]) - 1;
+                       else
+                               i = tek_rdget0(rd, i, ~1) - 1;
+                       i = tek_rdget0(rd, i, ~1) - 1;
+               }
+               i += 256 - 8 + 16;
+       }
+       return i;
+}
+
+static int tek_decmain5(int *work, UCHAR *src, int osiz, UCHAR *q, int lc, int pb, int lp, int flags)
+{
+       static int state_table[] = { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5 };
+       int i, j, k, pmch, rep[4], s, pos, m_pos = (1 << pb) - 1, m_lp = (1 << lp) - 1;
+       int stk = (flags == -1), lcr = 8 - lc, s_pos, lit0cntmsk = 0x78;
+       UINT32 *lit1;
+       struct tek_STR_RNGDEC *rd = (struct tek_STR_RNGDEC *) work;
+       struct tek_STR_PRB *prb = &rd->probs;
+
+       rd->p = &src[4];
+       rd->range |= -1;
+       rd->code = src[0] << 24 | src[1] << 16 | src[2] << 8 | src[3];
+       for (i = 0; i < 4; i++)
+               rep[i] = ~i;
+       if (setjmp(rd->errjmp))
+               goto err;
+       for (i = sizeof (struct tek_STR_PRB) / sizeof (tek_TPRB) + (0x300 << (lc + lp)) - 2; i >= 0; i--)
+               ((tek_TPRB *) prb)[i] = 1 << 15;
+       for (i = 0; i < 32; i++) {
+               rd->bm[i].lt = (i >= 4); /* 0..3\82Í\8eõ\96½\82È\82µ */
+               rd->bm[i].lt0 = (i < 24) ? 16 * 1024 : 8 * 1024;
+               rd->bm[i].s &= 0;
+               rd->bm[i].t = rd->bm[i].m = 5;
+       }
+       lit1 = prb->lit + ((256 << (lc + lp)) - 2);
+       if (stk) {
+               rd->rmsk = -1 << 11;
+               for (i = 0; i < 32; i++)
+                       rd->bm[i].lt = 0; /* \91S\82Ä\8eõ\96½\82È\82µ */
+               for (i = 0; i < 14; i++)
+                       rd->ptbm[i] = &rd->bm[0];
+       } else {
+               UCHAR pt[14];
+               static UCHAR pt1[14] = {
+                        8,  8,  8,  8,  8,  8,  8,  8,
+                        8,  8, 18, 18, 18,  8
+               };
+               static UCHAR pt2[14] = {
+                        8,  8, 10, 11, 12, 12, 14, 15,
+                       16, 16, 18, 18, 20, 21
+               };
+               /*
+                        0- 7:mch, mch, lit1, lensel, lenlow, lenmid, lenhigh, lenext
+                        8-15:pslot, pslot, sdis, sdis, align, rep-repg2
+               */
+               rd->rmsk |= -1;
+               rd->bm[1].t = 5; rd->bm[1].m = 3; /* for fchgprm */
+               rd->bm[2].t = 9; rd->bm[2].m = 2; /* for tbmt, tbmm */
+               if (flags & 0x40) { /* lt-flag */
+                       rd->bm[3].t = 0; rd->bm[3].m = 1;
+                       prb->fchglt = 0xffff;
+               }
+               rd->bm[22].t = 0; rd->bm[22].m = 1;
+               prb->repg3 = 0xffff;
+               if (flags == -2) { /* z1 */
+                       rd->bm[22].lt = 0; /* repg3\82Ìlt\82ð0\82É */
+                       for (i = 0; i < 14; i++)
+                               pt[i] = pt1[i];
+               } else {
+                       for (i = 0; i < 14; i++)
+                               pt[i] = pt2[i];
+                       lit0cntmsk = (7 >> (flags & 3)) << 4 | 8;
+                       pt[ 1] =  8 + ((flags & 0x04) != 0); /* mch */
+                       pt[ 5] = 12 + ((flags & 0x08) != 0); /* llm */
+                       pt[ 9] = 16 + ((flags & 0x10) != 0); /* pst */
+                       pt[11] = 18 + ((flags & 0x20) != 0); /* sds */
+               }
+               for (i = 0; i < 14; i++)
+                       rd->ptbm[i] = &rd->bm[pt[i]];
+       }
+       for (i = 0; i < 32; i++)
+               tek_setbm5(&rd->bm[i], rd->bm[i].t, rd->bm[i].m);
+
+       if ((tek_rdget1(rd, &prb->pb[0].st[0].mch, 0x71, 0, rd->ptbm[0]) ^ stk) == 0)
+               goto err;
+       *q++ = tek_rdget1(rd, prb->lit, lit0cntmsk, 1, &rd->bm[24]) & 0xff;
+       pmch &= 0; s &= 0; pos = 1;
+       while (pos < osiz) {
+               s_pos = pos & m_pos;
+               if (tek_rdget1(rd, &prb->pb[s_pos].st[s].mch, 0x71, 0, rd->ptbm[s > 0]) ^ stk) { /* \94ñlz */
+                       i = (q[-1] >> lcr | (pos & m_lp) << lc) << 8;
+                       s = state_table[s];
+                       if (pmch == 0)
+                               *q = tek_rdget1(rd, &prb->lit[i], lit0cntmsk, 1, &rd->bm[24]) & 0xff;
+                       else {
+                               struct tek_STR_BITMODEL *bm = &rd->bm[24];
+                               j = 1; /* lit1\82Í\8dÅ\8f\89\82©\82ç2\82ð\8c¸\82\82Ä\82 \82é */
+                               k = 8;
+                               pmch = q[rep[0]];
+                               do {
+                                       j += j + tek_rdget1(rd, &lit1[(i + j) << 1 | pmch >> 7], 0x71, 0, rd->ptbm[2]);
+                                       k--;
+                                       if ((k & (lit0cntmsk >> 4)) == 0)
+                                               bm++;
+                                       if ((((pmch >> 7) ^ j) & 1) != 0 && k != 0) {
+                                               j = tek_rdget1(rd, &prb->lit[i + j - 1], k | (lit0cntmsk & 0x70), j, bm);
+                                               break;
+                                       }
+                                       pmch <<= 1;
+                               } while (k);
+                               *q = j & 0xff;
+                               pmch &= 0;
+                       }
+                       pos++;
+                       q++;
+               } else { /* lz */
+                       pmch |= 1;
+                       if (tek_rdget1(rd, &prb->st[s].rep, 0x71, 0, rd->ptbm[13]) ^ stk) { /* len/dis */
+                               rep[3] = rep[2];
+                               rep[2] = rep[1];
+                               rep[1] = rep[0];
+                               j = i = tek_getlen5(rd, 0, s_pos, stk);
+                               s = s < 7 ? 7 : 10;
+                               if (j >= 4)
+                                       j = 3;
+                               rep[0] = j = tek_rdget1(rd, prb->pslot[j], 0x76, 1, rd->ptbm[8 + (j == 3)]) & 0x3f;
+                               if (j >= 4) {
+                                       k = (j >> 1) - 1; /* k = [1, 30] */
+                                       rep[0] = (2 | (j & 1)) << k;
+                                       if (j < 14) /* k < 6 */
+                                               rep[0] |= tek_revbit(tek_rdget1(rd, &prb->spdis[j & 1][(1 << k) - 2], k | 0x70, 1, rd->ptbm[10 + (k >= 4)]), k);
+                                       else {
+                                               if (stk == 0) {
+                                                       if (k -= 6)
+                                                               rep[0] |= tek_rdget0(rd, k, ~0) << 6;
+                                                       rep[0] |= tek_revbit(tek_rdget1(rd, prb->algn, 0x76, 1, rd->ptbm[12]), 6);
+                                               } else {
+                                                       rep[0] |= tek_rdget0(rd, k - 4, ~0) << 4;
+                                                       rep[0] |= tek_revbit(tek_rdget1(rd, prb->algn, 0x74, 1, rd->ptbm[12]), 4);
+                                               }
+                                       }
+                               }
+                               rep[0] = ~rep[0];
+                       } else { /* repeat-dis */
+                               if (tek_rdget1(rd, &prb->st[s].repg0, 0x71, 0, rd->ptbm[13]) ^ stk) { /* rep0 */
+                                       i |= -1;
+                                       if (tek_rdget1(rd, &prb->pb[s_pos].st[s].rep0l1, 0x71, 0, rd->ptbm[13]) == 0) {
+                                               s = s < 7 ? 9 : 11;
+                                               goto skip;
+                                       }
+                               } else {
+                                       if (tek_rdget1(rd, &prb->st[s].repg1, 0x71, 0, rd->ptbm[13]) ^ stk) /* rep1 */
+                                               i = rep[1];
+                                       else {
+                                               if (tek_rdget1(rd, &prb->st[s].repg2, 0x71, 0, rd->ptbm[13]) ^ stk) /* rep2 */
+                                                       i = rep[2];
+                                               else {
+                                                       if (stk == 0) {
+                                                               if  (tek_rdget1(rd, &prb->repg3, 0x71, 0, &rd->bm[22]) == 0)
+                                                                       goto err;
+                                                       }
+                                                       i = rep[3]; /* rep3 */
+                                                       rep[3] = rep[2];
+                                               }
+                                               rep[2] = rep[1];
+                                       }
+                                       rep[1] = rep[0];
+                                       rep[0] = i;
+                               }
+                               i = tek_getlen5(rd, 1, s_pos, stk);
+                               s = s < 7 ? 8 : 11;
+                       }
+skip:
+                       i += 2;
+                       if (pos + rep[0] < 0)
+                               goto err;
+                       if (pos + i > osiz)
+                               i = osiz - pos;
+                       pos += i;
+                       do {
+                               *q = q[rep[0]];
+                               q++;
+                       } while (--i);
+               }
+       }
+       return 0;
+err:
+       return 1;
+}
+
+static int tek_decode5(int siz, UCHAR *p, UCHAR *q)
+{
+       UCHAR *p1 = p + siz;
+       int dsiz, hed, bsiz, st = 0;
+       p += 16;
+       if ((dsiz = tek_getnum_s7s(&p)) > 0) {
+               hed = tek_getnum_s7s(&p);
+               if ((hed & 1) == 0)
+                       st = tek_lzrestore_tek5(p1 - p + 1, p - 1, dsiz, q);
+               else {
+                       bsiz = 1 << (((hed >> 1) & 0x0f) + 8);
+                       if (hed & 0x20)
+                               return 1;
+                       if (bsiz == 256)
+                               st = tek_lzrestore_tek5(p1 - p, p, dsiz, q);
+                       else {
+                               if (dsiz > bsiz)
+                                       return 1;
+                               if (hed & 0x40)
+                                       tek_getnum_s7s(&p); /* \83I\83v\83V\83\87\83\93\8fî\95ñ\82Ö\82Ì\83|\83C\83\93\83^\82ð\93Ç\82Ý\94ò\82Î\82· */
+                               st = tek_lzrestore_tek5(p1 - p, p, dsiz, q);
+                       }
+               }
+       }
+       return st;
+}
diff --git a/haribote/tek.lst b/haribote/tek.lst
new file mode 100644 (file)
index 0000000..a93163c
--- /dev/null
@@ -0,0 +1,1992 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _memman_alloc_4k
+     7 00000000                                        EXTERN  _memman_free_4k
+     8 00000000                                 [FILE "tek.c"]
+     9                                          [SECTION .text]
+    10 00000000                                 _tek_getnum_s7s:
+    11 00000000 55                                     PUSH    EBP
+    12 00000001 31 C9                                  XOR     ECX,ECX
+    13 00000003 89 E5                                  MOV     EBP,ESP
+    14 00000005 53                                     PUSH    EBX
+    15 00000006 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+    16 00000009 8B 13                                  MOV     EDX,DWORD [EBX]
+    17 0000000B                                 L2:
+    18 0000000B C1 E1 07                               SAL     ECX,7
+    19 0000000E 0F B6 02                               MOVZX   EAX,BYTE [EDX]
+    20 00000011 09 C1                                  OR      ECX,EAX
+    21 00000013 42                                     INC     EDX
+    22 00000014 F7 C1 00000001                         TEST    ECX,1
+    23 0000001A 74 EF                                  JE      L2
+    24 0000001C D1 E9                                  SHR     ECX,1
+    25 0000001E 89 13                                  MOV     DWORD [EBX],EDX
+    26 00000020 5B                                     POP     EBX
+    27 00000021 89 C8                                  MOV     EAX,ECX
+    28 00000023 5D                                     POP     EBP
+    29 00000024 C3                                     RET
+    30                                          [SECTION .data]
+    31 00000000                                 _header.0:
+    32 00000000 FF                                     DB      -1
+    33 00000001 FF                                     DB      -1
+    34 00000002 FF                                     DB      -1
+    35 00000003 01                                     DB      1
+    36 00000004 00                                     DB      0
+    37 00000005 00                                     DB      0
+    38 00000006 00                                     DB      0
+    39 00000007 4F                                     DB      79
+    40 00000008 53                                     DB      83
+    41 00000009 41                                     DB      65
+    42 0000000A 53                                     DB      83
+    43 0000000B 4B                                     DB      75
+    44 0000000C 43                                     DB      67
+    45 0000000D 4D                                     DB      77
+    46 0000000E 50                                     DB      80
+    47                                          [SECTION .text]
+    48 00000025                                        GLOBAL  _tek_getsize
+    49 00000025                                 _tek_getsize:
+    50 00000025 55                                     PUSH    EBP
+    51 00000026 89 E5                                  MOV     EBP,ESP
+    52 00000028 57                                     PUSH    EDI
+    53 00000029 56                                     PUSH    ESI
+    54 0000002A BF [00000000]                          MOV     EDI,_header.0
+    55 0000002F 53                                     PUSH    EBX
+    56 00000030 83 CB FF                               OR      EBX,-1
+    57 00000033 52                                     PUSH    EDX
+    58 00000034 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    59 00000037 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+    60 0000003A 89 C6                                  MOV     ESI,EAX
+    61 0000003C FC                                     CLD
+    62 0000003D B8 0000000F                            MOV     EAX,15
+    63 00000042 46                                     INC     ESI
+    64 00000043 89 C1                                  MOV     ECX,EAX
+    65 00000045 F3                                     REPE
+    66 00000046 A6                                     CMPSB
+    67 00000047 75 11                                  JNE     L7
+    68 00000049 8B 55 F0                               MOV     EDX,DWORD [-16+EBP]
+    69 0000004C 8A 02                                  MOV     AL,BYTE [EDX]
+    70 0000004E 3C 83                                  CMP     AL,-125
+    71 00000050 74 12                                  JE      L8
+    72 00000052 3C 85                                  CMP     AL,-123
+    73 00000054 74 0E                                  JE      L8
+    74 00000056 3C 89                                  CMP     AL,-119
+    75 00000058 74 0A                                  JE      L8
+    76 0000005A                                 L7:
+    77 0000005A 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+    78 0000005D 89 D8                                  MOV     EAX,EBX
+    79 0000005F 5B                                     POP     EBX
+    80 00000060 5E                                     POP     ESI
+    81 00000061 5F                                     POP     EDI
+    82 00000062 5D                                     POP     EBP
+    83 00000063 C3                                     RET
+    84 00000064                                 L8:
+    85 00000064 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+    86 00000067 83 C0 10                               ADD     EAX,16
+    87 0000006A 89 45 08                               MOV     DWORD [8+EBP],EAX
+    88 0000006D 8D 45 08                               LEA     EAX,DWORD [8+EBP]
+    89 00000070 50                                     PUSH    EAX
+    90 00000071 E8 FFFFFF8A                            CALL    _tek_getnum_s7s
+    91 00000076 89 C3                                  MOV     EBX,EAX
+    92 00000078 58                                     POP     EAX
+    93 00000079 EB DF                                  JMP     L7
+    94 0000007B                                        GLOBAL  _tek_decomp
+    95 0000007B                                 _tek_decomp:
+    96 0000007B 55                                     PUSH    EBP
+    97 0000007C 89 E5                                  MOV     EBP,ESP
+    98 0000007E 56                                     PUSH    ESI
+    99 0000007F 53                                     PUSH    EBX
+   100 00000080 83 CB FF                               OR      EBX,-1
+   101 00000083 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   102 00000086 8B 4D 0C                               MOV     ECX,DWORD [12+EBP]
+   103 00000089 8B 75 10                               MOV     ESI,DWORD [16+EBP]
+   104 0000008C 8A 10                                  MOV     DL,BYTE [EAX]
+   105 0000008E 80 FA 83                               CMP     DL,-125
+   106 00000091 74 32                                  JE      L17
+   107 00000093 80 FA 85                               CMP     DL,-123
+   108 00000096 74 23                                  JE      L18
+   109 00000098 80 FA 89                               CMP     DL,-119
+   110 0000009B 74 0F                                  JE      L19
+   111 0000009D                                 L11:
+   112 0000009D 31 C0                                  XOR     EAX,EAX
+   113 0000009F 85 DB                                  TEST    EBX,EBX
+   114 000000A1 0F 94 C0                               SETE    AL
+   115 000000A4 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   116 000000A7 48                                     DEC     EAX
+   117 000000A8 5B                                     POP     EBX
+   118 000000A9 5E                                     POP     ESI
+   119 000000AA 5D                                     POP     EBP
+   120 000000AB C3                                     RET
+   121 000000AC                                 L19:
+   122 000000AC 51                                     PUSH    ECX
+   123 000000AD 50                                     PUSH    EAX
+   124 000000AE 56                                     PUSH    ESI
+   125 000000AF E8 00001208                            CALL    _tek_decode5
+   126 000000B4                                 L16:
+   127 000000B4 89 C3                                  MOV     EBX,EAX
+   128 000000B6 83 C4 0C                               ADD     ESP,12
+   129 000000B9 EB E2                                  JMP     L11
+   130 000000BB                                 L18:
+   131 000000BB 51                                     PUSH    ECX
+   132 000000BC 50                                     PUSH    EAX
+   133 000000BD 56                                     PUSH    ESI
+   134 000000BE E8 000003EE                            CALL    _tek_decode2
+   135 000000C3 EB EF                                  JMP     L16
+   136 000000C5                                 L17:
+   137 000000C5 51                                     PUSH    ECX
+   138 000000C6 50                                     PUSH    EAX
+   139 000000C7 56                                     PUSH    ESI
+   140 000000C8 E8 000000FF                            CALL    _tek_decode1
+   141 000000CD EB E5                                  JMP     L16
+   142 000000CF                                 _tek_lzrestore_stk1:
+   143 000000CF 55                                     PUSH    EBP
+   144 000000D0 89 E5                                  MOV     EBP,ESP
+   145 000000D2 57                                     PUSH    EDI
+   146 000000D3 56                                     PUSH    ESI
+   147 000000D4 53                                     PUSH    EBX
+   148 000000D5 83 EC 0C                               SUB     ESP,12
+   149 000000D8 8B 75 14                               MOV     ESI,DWORD [20+EBP]
+   150 000000DB 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   151 000000DE 01 F0                                  ADD     EAX,ESI
+   152 000000E0 89 75 E8                               MOV     DWORD [-24+EBP],ESI
+   153 000000E3 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   154 000000E6 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   155 000000E9 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   156 000000EC                                 L21:
+   157 000000EC 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   158 000000EF 0F B6 38                               MOVZX   EDI,BYTE [EAX]
+   159 000000F2 89 FB                                  MOV     EBX,EDI
+   160 000000F4 40                                     INC     EAX
+   161 000000F5 83 E3 0F                               AND     EBX,15
+   162 000000F8 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   163 000000FB 0F 84 000000BA                         JE      L53
+   164 00000101                                 L24:
+   165 00000101 C1 FF 04                               SAR     EDI,4
+   166 00000104 0F 84 000000A0                         JE      L54
+   167 0000010A                                 L26:
+   168 0000010A 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   169 0000010D 8A 10                                  MOV     DL,BYTE [EAX]
+   170 0000010F 40                                     INC     EAX
+   171 00000110 88 16                                  MOV     BYTE [ESI],DL
+   172 00000112 46                                     INC     ESI
+   173 00000113 4B                                     DEC     EBX
+   174 00000114 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   175 00000117 75 F1                                  JNE     L26
+   176 00000119 3B 75 EC                               CMP     ESI,DWORD [-20+EBP]
+   177 0000011C 73 7B                                  JAE     L22
+   178 0000011E                                 L31:
+   179 0000011E 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   180 00000121 0F B6 08                               MOVZX   ECX,BYTE [EAX]
+   181 00000124 89 CB                                  MOV     EBX,ECX
+   182 00000126 40                                     INC     EAX
+   183 00000127 83 E3 0F                               AND     EBX,15
+   184 0000012A 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   185 0000012D F7 C1 00000001                         TEST    ECX,1
+   186 00000133 75 17                                  JNE     L34
+   187 00000135                                 L35:
+   188 00000135 C1 E3 07                               SAL     EBX,7
+   189 00000138 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   190 0000013B 0F B6 10                               MOVZX   EDX,BYTE [EAX]
+   191 0000013E 09 D3                                  OR      EBX,EDX
+   192 00000140 40                                     INC     EAX
+   193 00000141 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   194 00000144 F7 C3 00000001                         TEST    EBX,1
+   195 0000014A 74 E9                                  JE      L35
+   196 0000014C                                 L34:
+   197 0000014C D1 FB                                  SAR     EBX,1
+   198 0000014E C1 F9 04                               SAR     ECX,4
+   199 00000151 F7 D3                                  NOT     EBX
+   200 00000153 75 19                                  JNE     L39
+   201 00000155                                 L40:
+   202 00000155 C1 E1 07                               SAL     ECX,7
+   203 00000158 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   204 0000015B 0F B6 10                               MOVZX   EDX,BYTE [EAX]
+   205 0000015E 09 D1                                  OR      ECX,EDX
+   206 00000160 40                                     INC     EAX
+   207 00000161 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   208 00000164 F7 C1 00000001                         TEST    ECX,1
+   209 0000016A 74 E9                                  JE      L40
+   210 0000016C D1 F9                                  SAR     ECX,1
+   211 0000016E                                 L39:
+   212 0000016E 8D 04 33                               LEA     EAX,DWORD [EBX+ESI*1]
+   213 00000171 41                                     INC     ECX
+   214 00000172 3B 45 E8                               CMP     EAX,DWORD [-24+EBP]
+   215 00000175 72 2C                                  JB      L45
+   216 00000177 8D 04 31                               LEA     EAX,DWORD [ECX+ESI*1]
+   217 0000017A 3B 45 EC                               CMP     EAX,DWORD [-20+EBP]
+   218 0000017D 76 05                                  JBE     L47
+   219 0000017F 8B 4D EC                               MOV     ECX,DWORD [-20+EBP]
+   220 00000182 29 F1                                  SUB     ECX,ESI
+   221 00000184                                 L47:
+   222 00000184 8A 04 33                               MOV     AL,BYTE [EBX+ESI*1]
+   223 00000187 88 06                                  MOV     BYTE [ESI],AL
+   224 00000189 46                                     INC     ESI
+   225 0000018A 49                                     DEC     ECX
+   226 0000018B 75 F7                                  JNE     L47
+   227 0000018D 4F                                     DEC     EDI
+   228 0000018E 75 8E                                  JNE     L31
+   229 00000190 3B 75 EC                               CMP     ESI,DWORD [-20+EBP]
+   230 00000193 0F 82 FFFFFF53                         JB      L21
+   231 00000199                                 L22:
+   232 00000199 31 C0                                  XOR     EAX,EAX
+   233 0000019B                                 L20:
+   234 0000019B 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   235 0000019E 5B                                     POP     EBX
+   236 0000019F 5E                                     POP     ESI
+   237 000001A0 5F                                     POP     EDI
+   238 000001A1 5D                                     POP     EBP
+   239 000001A2 C3                                     RET
+   240 000001A3                                 L45:
+   241 000001A3 B8 00000001                            MOV     EAX,1
+   242 000001A8 EB F1                                  JMP     L20
+   243 000001AA                                 L54:
+   244 000001AA 8D 45 F0                               LEA     EAX,DWORD [-16+EBP]
+   245 000001AD 50                                     PUSH    EAX
+   246 000001AE E8 FFFFFE4D                            CALL    _tek_getnum_s7s
+   247 000001B3 59                                     POP     ECX
+   248 000001B4 89 C7                                  MOV     EDI,EAX
+   249 000001B6 E9 FFFFFF4F                            JMP     L26
+   250 000001BB                                 L53:
+   251 000001BB 8D 45 F0                               LEA     EAX,DWORD [-16+EBP]
+   252 000001BE 50                                     PUSH    EAX
+   253 000001BF E8 FFFFFE3C                            CALL    _tek_getnum_s7s
+   254 000001C4 89 C3                                  MOV     EBX,EAX
+   255 000001C6 58                                     POP     EAX
+   256 000001C7 E9 FFFFFF35                            JMP     L24
+   257 000001CC                                 _tek_decode1:
+   258 000001CC 55                                     PUSH    EBP
+   259 000001CD 89 E5                                  MOV     EBP,ESP
+   260 000001CF 57                                     PUSH    EDI
+   261 000001D0 56                                     PUSH    ESI
+   262 000001D1 53                                     PUSH    EBX
+   263 000001D2 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   264 000001D5 8D 75 0C                               LEA     ESI,DWORD [12+EBP]
+   265 000001D8 89 C7                                  MOV     EDI,EAX
+   266 000001DA 56                                     PUSH    ESI
+   267 000001DB 83 C0 10                               ADD     EAX,16
+   268 000001DE 03 7D 08                               ADD     EDI,DWORD [8+EBP]
+   269 000001E1 89 45 0C                               MOV     DWORD [12+EBP],EAX
+   270 000001E4 E8 FFFFFE17                            CALL    _tek_getnum_s7s
+   271 000001E9 89 C3                                  MOV     EBX,EAX
+   272 000001EB 58                                     POP     EAX
+   273 000001EC 85 DB                                  TEST    EBX,EBX
+   274 000001EE 7E 67                                  JLE     L56
+   275 000001F0 56                                     PUSH    ESI
+   276 000001F1 E8 FFFFFE0A                            CALL    _tek_getnum_s7s
+   277 000001F6 89 C1                                  MOV     ECX,EAX
+   278 000001F8 89 C2                                  MOV     EDX,EAX
+   279 000001FA D1 F9                                  SAR     ECX,1
+   280 000001FC B8 00000001                            MOV     EAX,1
+   281 00000201 83 E1 0F                               AND     ECX,15
+   282 00000204 83 C1 08                               ADD     ECX,8
+   283 00000207 D3 E0                                  SAL     EAX,CL
+   284 00000209 39 C3                                  CMP     EBX,EAX
+   285 0000020B 59                                     POP     ECX
+   286 0000020C 7F 08                                  JG      L58
+   287 0000020E 89 D0                                  MOV     EAX,EDX
+   288 00000210 83 E0 21                               AND     EAX,33
+   289 00000213 48                                     DEC     EAX
+   290 00000214 74 0F                                  JE      L57
+   291 00000216                                 L58:
+   292 00000216 BA 00000001                            MOV     EDX,1
+   293 0000021B                                 L55:
+   294 0000021B 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   295 0000021E 89 D0                                  MOV     EAX,EDX
+   296 00000220 5B                                     POP     EBX
+   297 00000221 5E                                     POP     ESI
+   298 00000222 5F                                     POP     EDI
+   299 00000223 5D                                     POP     EBP
+   300 00000224 C3                                     RET
+   301 00000225                                 L57:
+   302 00000225 83 E2 40                               AND     EDX,64
+   303 00000228 75 24                                  JNE     L61
+   304 0000022A                                 L59:
+   305 0000022A 56                                     PUSH    ESI
+   306 0000022B E8 FFFFFDD0                            CALL    _tek_getnum_s7s
+   307 00000230 5A                                     POP     EDX
+   308 00000231 85 C0                                  TEST    EAX,EAX
+   309 00000233 BA 00000001                            MOV     EDX,1
+   310 00000238 75 E1                                  JNE     L55
+   311 0000023A FF 75 10                               PUSH    DWORD [16+EBP]
+   312 0000023D 53                                     PUSH    EBX
+   313 0000023E 2B 7D 0C                               SUB     EDI,DWORD [12+EBP]
+   314 00000241 FF 75 0C                               PUSH    DWORD [12+EBP]
+   315 00000244 57                                     PUSH    EDI
+   316 00000245 E8 FFFFFE85                            CALL    _tek_lzrestore_stk1
+   317 0000024A 89 C2                                  MOV     EDX,EAX
+   318 0000024C EB CD                                  JMP     L55
+   319 0000024E                                 L61:
+   320 0000024E 56                                     PUSH    ESI
+   321 0000024F E8 FFFFFDAC                            CALL    _tek_getnum_s7s
+   322 00000254 59                                     POP     ECX
+   323 00000255 EB D3                                  JMP     L59
+   324 00000257                                 L56:
+   325 00000257 31 D2                                  XOR     EDX,EDX
+   326 00000259 EB C0                                  JMP     L55
+   327 0000025B                                 _tek_getnum_s7:
+   328 0000025B 55                                     PUSH    EBP
+   329 0000025C 31 C9                                  XOR     ECX,ECX
+   330 0000025E 89 E5                                  MOV     EBP,ESP
+   331 00000260 57                                     PUSH    EDI
+   332 00000261 56                                     PUSH    ESI
+   333 00000262 31 F6                                  XOR     ESI,ESI
+   334 00000264 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+   335 00000267 53                                     PUSH    EBX
+   336 00000268 BB 00000001                            MOV     EBX,1
+   337 0000026D 8B 17                                  MOV     EDX,DWORD [EDI]
+   338 0000026F                                 L63:
+   339 0000026F C1 E1 07                               SAL     ECX,7
+   340 00000272 0F B6 02                               MOVZX   EAX,BYTE [EDX]
+   341 00000275 09 C1                                  OR      ECX,EAX
+   342 00000277 42                                     INC     EDX
+   343 00000278 F7 C1 00000001                         TEST    ECX,1
+   344 0000027E 75 07                                  JNE     L64
+   345 00000280 C1 E3 07                               SAL     EBX,7
+   346 00000283 01 DE                                  ADD     ESI,EBX
+   347 00000285 EB E8                                  JMP     L63
+   348 00000287                                 L64:
+   349 00000287 D1 E9                                  SHR     ECX,1
+   350 00000289 89 17                                  MOV     DWORD [EDI],EDX
+   351 0000028B 5B                                     POP     EBX
+   352 0000028C 8D 04 0E                               LEA     EAX,DWORD [ESI+ECX*1]
+   353 0000028F 5E                                     POP     ESI
+   354 00000290 5F                                     POP     EDI
+   355 00000291 5D                                     POP     EBP
+   356 00000292 C3                                     RET
+   357 00000293                                 _tek_lzrestore_stk2:
+   358 00000293 55                                     PUSH    EBP
+   359 00000294 89 E5                                  MOV     EBP,ESP
+   360 00000296 57                                     PUSH    EDI
+   361 00000297 56                                     PUSH    ESI
+   362 00000298 53                                     PUSH    EBX
+   363 00000299 83 EC 24                               SUB     ESP,36
+   364 0000029C 8B 55 10                               MOV     EDX,DWORD [16+EBP]
+   365 0000029F 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+   366 000002A2 01 D0                                  ADD     EAX,EDX
+   367 000002A4 8B 4D 14                               MOV     ECX,DWORD [20+EBP]
+   368 000002A7 89 45 D8                               MOV     DWORD [-40+EBP],EAX
+   369 000002AA 89 4D D4                               MOV     DWORD [-44+EBP],ECX
+   370 000002AD 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   371 000002B0 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   372 000002B3 C7 45 DC 00000000                      MOV     DWORD [-36+EBP],0
+   373 000002BA                                 L72:
+   374 000002BA 8B 4D DC                               MOV     ECX,DWORD [-36+EBP]
+   375 000002BD 8B 45 DC                               MOV     EAX,DWORD [-36+EBP]
+   376 000002C0 F7 D0                                  NOT     EAX
+   377 000002C2 89 44 8D E4                            MOV     DWORD [-28+EBP+ECX*4],EAX
+   378 000002C6 41                                     INC     ECX
+   379 000002C7 89 4D DC                               MOV     DWORD [-36+EBP],ECX
+   380 000002CA 83 F9 03                               CMP     ECX,3
+   381 000002CD 7E EB                                  JLE     L72
+   382 000002CF C6 45 D2 00                            MOV     BYTE [-46+EBP],0
+   383 000002D3 C6 45 D3 00                            MOV     BYTE [-45+EBP],0
+   384 000002D7 85 D2                                  TEST    EDX,EDX
+   385 000002D9 75 0C                                  JNE     L117
+   386 000002DB                                 L73:
+   387 000002DB 31 D2                                  XOR     EDX,EDX
+   388 000002DD                                 L67:
+   389 000002DD 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   390 000002E0 89 D0                                  MOV     EAX,EDX
+   391 000002E2 5B                                     POP     EBX
+   392 000002E3 5E                                     POP     ESI
+   393 000002E4 5F                                     POP     EDI
+   394 000002E5 5D                                     POP     EBP
+   395 000002E6 C3                                     RET
+   396 000002E7                                 L117:
+   397 000002E7 8D 45 E0                               LEA     EAX,DWORD [-32+EBP]
+   398 000002EA 50                                     PUSH    EAX
+   399 000002EB E8 FFFFFD10                            CALL    _tek_getnum_s7s
+   400 000002F0 BA 00000001                            MOV     EDX,1
+   401 000002F5 59                                     POP     ECX
+   402 000002F6 85 C0                                  TEST    EAX,EAX
+   403 000002F8 75 E3                                  JNE     L67
+   404 000002FA                                 L75:
+   405 000002FA C7 45 DC 00000000                      MOV     DWORD [-36+EBP],0
+   406 00000301                                 L78:
+   407 00000301 FF 45 DC                               INC     DWORD [-36+EBP]
+   408 00000304 83 7D DC 10                            CMP     DWORD [-36+EBP],16
+   409 00000308 0F 8F 00000191                         JG      L118
+   410 0000030E 80 7D D2 00                            CMP     BYTE [-46+EBP],0
+   411 00000312 75 10                                  JNE     L82
+   412 00000314 8B 45 E0                               MOV     EAX,DWORD [-32+EBP]
+   413 00000317 C6 45 D2 08                            MOV     BYTE [-46+EBP],8
+   414 0000031B 8A 10                                  MOV     DL,BYTE [EAX]
+   415 0000031D 40                                     INC     EAX
+   416 0000031E 88 55 D3                               MOV     BYTE [-45+EBP],DL
+   417 00000321 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   418 00000324                                 L82:
+   419 00000324 8A 45 D3                               MOV     AL,BYTE [-45+EBP]
+   420 00000327 FE 4D D2                               DEC     BYTE [-46+EBP]
+   421 0000032A 83 E0 01                               AND     EAX,1
+   422 0000032D D0 6D D3                               SHR     BYTE [-45+EBP],1
+   423 00000330 83 E0 01                               AND     EAX,1
+   424 00000333 74 CC                                  JE      L78
+   425 00000335                                 L84:
+   426 00000335 8B 45 E0                               MOV     EAX,DWORD [-32+EBP]
+   427 00000338 8B 4D 14                               MOV     ECX,DWORD [20+EBP]
+   428 0000033B 8A 10                                  MOV     DL,BYTE [EAX]
+   429 0000033D 40                                     INC     EAX
+   430 0000033E 88 11                                  MOV     BYTE [ECX],DL
+   431 00000340 41                                     INC     ECX
+   432 00000341 FF 4D DC                               DEC     DWORD [-36+EBP]
+   433 00000344 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   434 00000347 89 4D 14                               MOV     DWORD [20+EBP],ECX
+   435 0000034A 75 E9                                  JNE     L84
+   436 0000034C 8B 45 D8                               MOV     EAX,DWORD [-40+EBP]
+   437 0000034F 39 C1                                  CMP     ECX,EAX
+   438 00000351 73 88                                  JAE     L73
+   439 00000353                                 L89:
+   440 00000353 FF 45 DC                               INC     DWORD [-36+EBP]
+   441 00000356 83 7D DC 10                            CMP     DWORD [-36+EBP],16
+   442 0000035A 0F 8F 0000012D                         JG      L119
+   443 00000360 80 7D D2 00                            CMP     BYTE [-46+EBP],0
+   444 00000364 75 10                                  JNE     L93
+   445 00000366 8B 45 E0                               MOV     EAX,DWORD [-32+EBP]
+   446 00000369 C6 45 D2 08                            MOV     BYTE [-46+EBP],8
+   447 0000036D 8A 10                                  MOV     DL,BYTE [EAX]
+   448 0000036F 40                                     INC     EAX
+   449 00000370 88 55 D3                               MOV     BYTE [-45+EBP],DL
+   450 00000373 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   451 00000376                                 L93:
+   452 00000376 8A 45 D3                               MOV     AL,BYTE [-45+EBP]
+   453 00000379 FE 4D D2                               DEC     BYTE [-46+EBP]
+   454 0000037C 83 E0 01                               AND     EAX,1
+   455 0000037F D0 6D D3                               SHR     BYTE [-45+EBP],1
+   456 00000382 83 E0 01                               AND     EAX,1
+   457 00000385 74 CC                                  JE      L89
+   458 00000387                                 L95:
+   459 00000387 8B 45 E0                               MOV     EAX,DWORD [-32+EBP]
+   460 0000038A 0F B6 18                               MOVZX   EBX,BYTE [EAX]
+   461 0000038D 89 DF                                  MOV     EDI,EBX
+   462 0000038F 40                                     INC     EAX
+   463 00000390 C1 FF 04                               SAR     EDI,4
+   464 00000393 83 E3 0F                               AND     EBX,15
+   465 00000396 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   466 00000399 F7 C3 00000001                         TEST    EBX,1
+   467 0000039F 0F 84 000000D3                         JE      L120
+   468 000003A5                                 L98:
+   469 000003A5 D1 FB                                  SAR     EBX,1
+   470 000003A7 83 FB 03                               CMP     EBX,3
+   471 000003AA 8D 73 FA                               LEA     ESI,DWORD [-6+EBX]
+   472 000003AD F7 D6                                  NOT     ESI
+   473 000003AF 7F 04                                  JG      L99
+   474 000003B1 8B 74 9D E4                            MOV     ESI,DWORD [-28+EBP+EBX*4]
+   475 000003B5                                 L99:
+   476 000003B5 83 FB 04                               CMP     EBX,4
+   477 000003B8 0F 84 000000A4                         JE      L121
+   478 000003BE                                 L100:
+   479 000003BE 83 FB 05                               CMP     EBX,5
+   480 000003C1 0F 84 00000086                         JE      L122
+   481 000003C7                                 L101:
+   482 000003C7 85 FF                                  TEST    EDI,EDI
+   483 000003C9 74 70                                  JE      L123
+   484 000003CB                                 L102:
+   485 000003CB 47                                     INC     EDI
+   486 000003CC 85 DB                                  TEST    EBX,EBX
+   487 000003CE 7E 1F                                  JLE     L103
+   488 000003D0 83 FB 01                               CMP     EBX,1
+   489 000003D3 7E 11                                  JLE     L104
+   490 000003D5 83 FB 02                               CMP     EBX,2
+   491 000003D8 7E 06                                  JLE     L105
+   492 000003DA 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   493 000003DD 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   494 000003E0                                 L105:
+   495 000003E0 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+   496 000003E3 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   497 000003E6                                 L104:
+   498 000003E6 8B 45 E4                               MOV     EAX,DWORD [-28+EBP]
+   499 000003E9 89 75 E4                               MOV     DWORD [-28+EBP],ESI
+   500 000003EC 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   501 000003EF                                 L103:
+   502 000003EF 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+   503 000003F2 01 F0                                  ADD     EAX,ESI
+   504 000003F4 3B 45 D4                               CMP     EAX,DWORD [-44+EBP]
+   505 000003F7 72 38                                  JB      L107
+   506 000003F9 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+   507 000003FC 01 F8                                  ADD     EAX,EDI
+   508 000003FE 3B 45 D8                               CMP     EAX,DWORD [-40+EBP]
+   509 00000401 76 06                                  JBE     L109
+   510 00000403 8B 7D D8                               MOV     EDI,DWORD [-40+EBP]
+   511 00000406 2B 7D 14                               SUB     EDI,DWORD [20+EBP]
+   512 00000409                                 L109:
+   513 00000409 8B 4D 14                               MOV     ECX,DWORD [20+EBP]
+   514 0000040C 8A 04 0E                               MOV     AL,BYTE [ESI+ECX*1]
+   515 0000040F 88 01                                  MOV     BYTE [ECX],AL
+   516 00000411 41                                     INC     ECX
+   517 00000412 4F                                     DEC     EDI
+   518 00000413 89 4D 14                               MOV     DWORD [20+EBP],ECX
+   519 00000416 75 F1                                  JNE     L109
+   520 00000418 FF 4D DC                               DEC     DWORD [-36+EBP]
+   521 0000041B 0F 85 FFFFFF66                         JNE     L95
+   522 00000421 8B 45 D8                               MOV     EAX,DWORD [-40+EBP]
+   523 00000424 39 C1                                  CMP     ECX,EAX
+   524 00000426 0F 82 FFFFFECE                         JB      L75
+   525 0000042C E9 FFFFFEAA                            JMP     L73
+   526 00000431                                 L107:
+   527 00000431 BA 00000001                            MOV     EDX,1
+   528 00000436 E9 FFFFFEA2                            JMP     L67
+   529 0000043B                                 L123:
+   530 0000043B 8D 45 E0                               LEA     EAX,DWORD [-32+EBP]
+   531 0000043E 50                                     PUSH    EAX
+   532 0000043F E8 FFFFFE17                            CALL    _tek_getnum_s7
+   533 00000444 8D 78 10                               LEA     EDI,DWORD [16+EAX]
+   534 00000447 58                                     POP     EAX
+   535 00000448 E9 FFFFFF7E                            JMP     L102
+   536 0000044D                                 L122:
+   537 0000044D 8D 45 E0                               LEA     EAX,DWORD [-32+EBP]
+   538 00000450 50                                     PUSH    EAX
+   539 00000451 E8 FFFFFE05                            CALL    _tek_getnum_s7
+   540 00000456 03 45 E4                               ADD     EAX,DWORD [-28+EBP]
+   541 00000459 8D 70 01                               LEA     ESI,DWORD [1+EAX]
+   542 0000045C 58                                     POP     EAX
+   543 0000045D E9 FFFFFF65                            JMP     L101
+   544 00000462                                 L121:
+   545 00000462 8D 45 E0                               LEA     EAX,DWORD [-32+EBP]
+   546 00000465 50                                     PUSH    EAX
+   547 00000466 E8 FFFFFDF0                            CALL    _tek_getnum_s7
+   548 0000046B 89 C6                                  MOV     ESI,EAX
+   549 0000046D 58                                     POP     EAX
+   550 0000046E F7 D6                                  NOT     ESI
+   551 00000470 03 75 E4                               ADD     ESI,DWORD [-28+EBP]
+   552 00000473 E9 FFFFFF46                            JMP     L100
+   553 00000478                                 L120:
+   554 00000478 8D 45 E0                               LEA     EAX,DWORD [-32+EBP]
+   555 0000047B 50                                     PUSH    EAX
+   556 0000047C E8 FFFFFDDA                            CALL    _tek_getnum_s7
+   557 00000481 40                                     INC     EAX
+   558 00000482 C1 E0 04                               SAL     EAX,4
+   559 00000485 09 C3                                  OR      EBX,EAX
+   560 00000487 58                                     POP     EAX
+   561 00000488 E9 FFFFFF18                            JMP     L98
+   562 0000048D                                 L119:
+   563 0000048D 8D 45 E0                               LEA     EAX,DWORD [-32+EBP]
+   564 00000490 50                                     PUSH    EAX
+   565 00000491 E8 FFFFFB6A                            CALL    _tek_getnum_s7s
+   566 00000496 01 45 DC                               ADD     DWORD [-36+EBP],EAX
+   567 00000499 58                                     POP     EAX
+   568 0000049A E9 FFFFFEE8                            JMP     L95
+   569 0000049F                                 L118:
+   570 0000049F 8D 45 E0                               LEA     EAX,DWORD [-32+EBP]
+   571 000004A2 50                                     PUSH    EAX
+   572 000004A3 E8 FFFFFB58                            CALL    _tek_getnum_s7s
+   573 000004A8 5A                                     POP     EDX
+   574 000004A9 01 45 DC                               ADD     DWORD [-36+EBP],EAX
+   575 000004AC E9 FFFFFE84                            JMP     L84
+   576 000004B1                                 _tek_decode2:
+   577 000004B1 55                                     PUSH    EBP
+   578 000004B2 89 E5                                  MOV     EBP,ESP
+   579 000004B4 57                                     PUSH    EDI
+   580 000004B5 56                                     PUSH    ESI
+   581 000004B6 53                                     PUSH    EBX
+   582 000004B7 8D 7D 0C                               LEA     EDI,DWORD [12+EBP]
+   583 000004BA 50                                     PUSH    EAX
+   584 000004BB 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   585 000004BE 57                                     PUSH    EDI
+   586 000004BF 89 C6                                  MOV     ESI,EAX
+   587 000004C1 83 C0 10                               ADD     EAX,16
+   588 000004C4 03 75 08                               ADD     ESI,DWORD [8+EBP]
+   589 000004C7 89 45 0C                               MOV     DWORD [12+EBP],EAX
+   590 000004CA C7 45 F0 00000000                      MOV     DWORD [-16+EBP],0
+   591 000004D1 E8 FFFFFB2A                            CALL    _tek_getnum_s7s
+   592 000004D6 89 C3                                  MOV     EBX,EAX
+   593 000004D8 58                                     POP     EAX
+   594 000004D9 85 DB                                  TEST    EBX,EBX
+   595 000004DB 7E 4E                                  JLE     L125
+   596 000004DD 57                                     PUSH    EDI
+   597 000004DE E8 FFFFFB1D                            CALL    _tek_getnum_s7s
+   598 000004E3 89 C1                                  MOV     ECX,EAX
+   599 000004E5 89 C2                                  MOV     EDX,EAX
+   600 000004E7 D1 F9                                  SAR     ECX,1
+   601 000004E9 B8 00000001                            MOV     EAX,1
+   602 000004EE 83 E1 0F                               AND     ECX,15
+   603 000004F1 83 C1 08                               ADD     ECX,8
+   604 000004F4 D3 E0                                  SAL     EAX,CL
+   605 000004F6 39 C3                                  CMP     EBX,EAX
+   606 000004F8 59                                     POP     ECX
+   607 000004F9 7F 08                                  JG      L127
+   608 000004FB 89 D0                                  MOV     EAX,EDX
+   609 000004FD 83 E0 21                               AND     EAX,33
+   610 00000500 48                                     DEC     EAX
+   611 00000501 74 0D                                  JE      L126
+   612 00000503                                 L127:
+   613 00000503 B8 00000001                            MOV     EAX,1
+   614 00000508                                 L124:
+   615 00000508 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   616 0000050B 5B                                     POP     EBX
+   617 0000050C 5E                                     POP     ESI
+   618 0000050D 5F                                     POP     EDI
+   619 0000050E 5D                                     POP     EBP
+   620 0000050F C3                                     RET
+   621 00000510                                 L126:
+   622 00000510 83 E2 40                               AND     EDX,64
+   623 00000513 75 1B                                  JNE     L129
+   624 00000515                                 L128:
+   625 00000515 FF 75 10                               PUSH    DWORD [16+EBP]
+   626 00000518 53                                     PUSH    EBX
+   627 00000519 2B 75 0C                               SUB     ESI,DWORD [12+EBP]
+   628 0000051C FF 75 0C                               PUSH    DWORD [12+EBP]
+   629 0000051F 56                                     PUSH    ESI
+   630 00000520 E8 FFFFFD6E                            CALL    _tek_lzrestore_stk2
+   631 00000525 83 C4 10                               ADD     ESP,16
+   632 00000528 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   633 0000052B                                 L125:
+   634 0000052B 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   635 0000052E EB D8                                  JMP     L124
+   636 00000530                                 L129:
+   637 00000530 57                                     PUSH    EDI
+   638 00000531 E8 FFFFFACA                            CALL    _tek_getnum_s7s
+   639 00000536 5F                                     POP     EDI
+   640 00000537 EB DC                                  JMP     L128
+   641                                          [SECTION .data]
+   642 0000000F                                 _prop0_table.1:
+   643 0000000F 5D                                     DB      93
+   644 00000010 00                                     DB      0
+   645 00000011                                 _prop1_table.2:
+   646 00000011 00                                     DB      0
+   647                                          [SECTION .text]
+   648 00000539                                 _tek_lzrestore_tek5:
+   649 00000539 55                                     PUSH    EBP
+   650 0000053A 89 E5                                  MOV     EBP,ESP
+   651 0000053C 57                                     PUSH    EDI
+   652 0000053D 56                                     PUSH    ESI
+   653 0000053E 53                                     PUSH    EBX
+   654 0000053F 83 EC 10                               SUB     ESP,16
+   655 00000542 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   656 00000545 0F B6 0B                               MOVZX   ECX,BYTE [EBX]
+   657 00000548 89 C8                                  MOV     EAX,ECX
+   658 0000054A 83 E0 0F                               AND     EAX,15
+   659 0000054D C7 45 E8 FFFFFFFF                      MOV     DWORD [-24+EBP],-1
+   660 00000554 83 F8 01                               CMP     EAX,1
+   661 00000557 74 25                                  JE      L132
+   662 00000559 C7 45 E8 FFFFFFFE                      MOV     DWORD [-24+EBP],-2
+   663 00000560 83 F8 05                               CMP     EAX,5
+   664 00000563 74 19                                  JE      L132
+   665 00000565 C7 45 E8 00000000                      MOV     DWORD [-24+EBP],0
+   666 0000056C 83 F8 09                               CMP     EAX,9
+   667 0000056F 74 0D                                  JE      L132
+   668 00000571 B8 00000001                            MOV     EAX,1
+   669 00000576                                 L130:
+   670 00000576 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   671 00000579 5B                                     POP     EBX
+   672 0000057A 5E                                     POP     ESI
+   673 0000057B 5F                                     POP     EDI
+   674 0000057C 5D                                     POP     EBP
+   675 0000057D C3                                     RET
+   676 0000057E                                 L132:
+   677 0000057E 43                                     INC     EBX
+   678 0000057F C1 F9 04                               SAR     ECX,4
+   679 00000582 0F 85 0000009E                         JNE     L137
+   680 00000588 0F B6 0B                               MOVZX   ECX,BYTE [EBX]
+   681 0000058B 43                                     INC     EBX
+   682 0000058C                                 L138:
+   683 0000058C 89 C8                                  MOV     EAX,ECX
+   684 0000058E BE 0000002D                            MOV     ESI,45
+   685 00000593 99                                     CDQ
+   686 00000594 F7 FE                                  IDIV    ESI
+   687 00000596 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   688 00000599 BE 00000009                            MOV     ESI,9
+   689 0000059E 89 D0                                  MOV     EAX,EDX
+   690 000005A0 99                                     CDQ
+   691 000005A1 F7 FE                                  IDIV    ESI
+   692 000005A3 83 7D E8 00                            CMP     DWORD [-24+EBP],0
+   693 000005A7 89 55 E4                               MOV     DWORD [-28+EBP],EDX
+   694 000005AA 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   695 000005AD 75 07                                  JNE     L143
+   696 000005AF 0F B6 03                               MOVZX   EAX,BYTE [EBX]
+   697 000005B2 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   698 000005B5 43                                     INC     EBX
+   699 000005B6                                 L143:
+   700 000005B6 83 7D E8 FF                            CMP     DWORD [-24+EBP],-1
+   701 000005BA 74 5C                                  JE      L146
+   702 000005BC                                 L144:
+   703 000005BC 8B 4D E4                               MOV     ECX,DWORD [-28+EBP]
+   704 000005BF B8 00000C00                            MOV     EAX,3072
+   705 000005C4 03 4D F0                               ADD     ECX,DWORD [-16+EBP]
+   706 000005C7 D3 E0                                  SAL     EAX,CL
+   707 000005C9 8D B8 00002700                         LEA     EDI,DWORD [9984+EAX]
+   708 000005CF 57                                     PUSH    EDI
+   709 000005D0 68 003C0000                            PUSH    3932160
+   710 000005D5 E8 [00000000]                          CALL    _memman_alloc_4k
+   711 000005DA 89 C6                                  MOV     ESI,EAX
+   712 000005DC 58                                     POP     EAX
+   713 000005DD 5A                                     POP     EDX
+   714 000005DE 83 C8 FF                               OR      EAX,-1
+   715 000005E1 85 F6                                  TEST    ESI,ESI
+   716 000005E3 74 91                                  JE      L130
+   717 000005E5 FF 75 E8                               PUSH    DWORD [-24+EBP]
+   718 000005E8 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   719 000005EB FF 75 EC                               PUSH    DWORD [-20+EBP]
+   720 000005EE FF 75 E4                               PUSH    DWORD [-28+EBP]
+   721 000005F1 FF 75 14                               PUSH    DWORD [20+EBP]
+   722 000005F4 FF 75 10                               PUSH    DWORD [16+EBP]
+   723 000005F7 53                                     PUSH    EBX
+   724 000005F8 56                                     PUSH    ESI
+   725 000005F9 E8 00000471                            CALL    _tek_decmain5
+   726 000005FE 83 C4 20                               ADD     ESP,32
+   727 00000601 57                                     PUSH    EDI
+   728 00000602 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   729 00000605 56                                     PUSH    ESI
+   730 00000606 68 003C0000                            PUSH    3932160
+   731 0000060B E8 [00000000]                          CALL    _memman_free_4k
+   732 00000610 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+   733 00000613 E9 FFFFFF5E                            JMP     L130
+   734 00000618                                 L146:
+   735 00000618 8B 7D F0                               MOV     EDI,DWORD [-16+EBP]
+   736 0000061B 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   737 0000061E 89 55 F0                               MOV     DWORD [-16+EBP],EDX
+   738 00000621 89 7D EC                               MOV     DWORD [-20+EBP],EDI
+   739 00000624 EB 96                                  JMP     L144
+   740 00000626                                 L137:
+   741 00000626 83 7D E8 FF                            CMP     DWORD [-24+EBP],-1
+   742 0000062A 74 1A                                  JE      L147
+   743 0000062C B8 00000001                            MOV     EAX,1
+   744 00000631 83 F9 01                               CMP     ECX,1
+   745 00000634 0F 8F FFFFFF3C                         JG      L130
+   746 0000063A 0F B6 89 [00000010]                    MOVZX   ECX,BYTE [_prop1_table.2-1+ECX]
+   747 00000641 E9 FFFFFF46                            JMP     L138
+   748 00000646                                 L147:
+   749 00000646 B8 00000001                            MOV     EAX,1
+   750 0000064B 83 F9 02                               CMP     ECX,2
+   751 0000064E 0F 8F FFFFFF22                         JG      L130
+   752 00000654 0F B6 89 [0000000E]                    MOVZX   ECX,BYTE [_prop0_table.1-1+ECX]
+   753 0000065B E9 FFFFFF2C                            JMP     L138
+   754 00000660                                 _tek_setbm5:
+   755 00000660 55                                     PUSH    EBP
+   756 00000661 83 C8 FF                               OR      EAX,-1
+   757 00000664 89 E5                                  MOV     EBP,ESP
+   758 00000666 BA 00000001                            MOV     EDX,1
+   759 0000066B 57                                     PUSH    EDI
+   760 0000066C 89 C7                                  MOV     EDI,EAX
+   761 0000066E 56                                     PUSH    ESI
+   762 0000066F 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+   763 00000672 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+   764 00000675 53                                     PUSH    EBX
+   765 00000676 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+   766 00000679 88 4E 01                               MOV     BYTE [1+ESI],CL
+   767 0000067C 88 1E                                  MOV     BYTE [ESI],BL
+   768 0000067E 01 D9                                  ADD     ECX,EBX
+   769 00000680 D3 E7                                  SAL     EDI,CL
+   770 00000682 88 D9                                  MOV     CL,BL
+   771 00000684 D3 E2                                  SAL     EDX,CL
+   772 00000686 D3 E0                                  SAL     EAX,CL
+   773 00000688 25 0000FFFF                            AND     EAX,65535
+   774 0000068D 09 FA                                  OR      EDX,EDI
+   775 0000068F F7 D7                                  NOT     EDI
+   776 00000691 89 46 0C                               MOV     DWORD [12+ESI],EAX
+   777 00000694 21 C7                                  AND     EDI,EAX
+   778 00000696 21 C2                                  AND     EDX,EAX
+   779 00000698 89 7E 04                               MOV     DWORD [4+ESI],EDI
+   780 0000069B F7 D0                                  NOT     EAX
+   781 0000069D 89 56 08                               MOV     DWORD [8+ESI],EDX
+   782 000006A0 89 46 10                               MOV     DWORD [16+ESI],EAX
+   783 000006A3 5B                                     POP     EBX
+   784 000006A4 5E                                     POP     ESI
+   785 000006A5 5F                                     POP     EDI
+   786 000006A6 5D                                     POP     EBP
+   787 000006A7 C3                                     RET
+   788 000006A8                                 _tek_rdget0:
+   789 000006A8 55                                     PUSH    EBP
+   790 000006A9 89 E5                                  MOV     EBP,ESP
+   791 000006AB 57                                     PUSH    EDI
+   792 000006AC 56                                     PUSH    ESI
+   793 000006AD 53                                     PUSH    EBX
+   794 000006AE 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+   795 000006B1 8B 75 10                               MOV     ESI,DWORD [16+EBP]
+   796 000006B4                                 L150:
+   797 000006B4 8B 47 04                               MOV     EAX,DWORD [4+EDI]
+   798 000006B7 3D 00FFFFFF                            CMP     EAX,16777215
+   799 000006BC 77 25                                  JA      L160
+   800 000006BE                                 L156:
+   801 000006BE 89 C3                                  MOV     EBX,EAX
+   802 000006C0 8B 4F 08                               MOV     ECX,DWORD [8+EDI]
+   803 000006C3 C1 E3 08                               SAL     EBX,8
+   804 000006C6 8B 07                                  MOV     EAX,DWORD [EDI]
+   805 000006C8 C1 E1 08                               SAL     ECX,8
+   806 000006CB 89 5F 04                               MOV     DWORD [4+EDI],EBX
+   807 000006CE 0F B6 10                               MOVZX   EDX,BYTE [EAX]
+   808 000006D1 09 D1                                  OR      ECX,EDX
+   809 000006D3 40                                     INC     EAX
+   810 000006D4 89 07                                  MOV     DWORD [EDI],EAX
+   811 000006D6 89 4F 08                               MOV     DWORD [8+EDI],ECX
+   812 000006D9 89 D8                                  MOV     EAX,EBX
+   813 000006DB 81 FB 00FFFFFF                         CMP     EBX,16777215
+   814 000006E1 76 DB                                  JBE     L156
+   815 000006E3                                 L160:
+   816 000006E3 8B 57 04                               MOV     EDX,DWORD [4+EDI]
+   817 000006E6 8B 47 08                               MOV     EAX,DWORD [8+EDI]
+   818 000006E9 D1 EA                                  SHR     EDX,1
+   819 000006EB 01 F6                                  ADD     ESI,ESI
+   820 000006ED 89 57 04                               MOV     DWORD [4+EDI],EDX
+   821 000006F0 39 D0                                  CMP     EAX,EDX
+   822 000006F2 72 08                                  JB      L152
+   823 000006F4 29 D0                                  SUB     EAX,EDX
+   824 000006F6 83 CE 01                               OR      ESI,1
+   825 000006F9 89 47 08                               MOV     DWORD [8+EDI],EAX
+   826 000006FC                                 L152:
+   827 000006FC FF 4D 0C                               DEC     DWORD [12+EBP]
+   828 000006FF 75 B3                                  JNE     L150
+   829 00000701 F7 D6                                  NOT     ESI
+   830 00000703 5B                                     POP     EBX
+   831 00000704 89 F0                                  MOV     EAX,ESI
+   832 00000706 5E                                     POP     ESI
+   833 00000707 5F                                     POP     EDI
+   834 00000708 5D                                     POP     EBP
+   835 00000709 C3                                     RET
+   836 0000070A                                 _tek_rdget1:
+   837 0000070A 55                                     PUSH    EBP
+   838 0000070B 89 E5                                  MOV     EBP,ESP
+   839 0000070D 57                                     PUSH    EDI
+   840 0000070E 56                                     PUSH    ESI
+   841 0000070F 53                                     PUSH    EBX
+   842 00000710 83 EC 14                               SUB     ESP,20
+   843 00000713 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   844 00000716 8B 7D 18                               MOV     EDI,DWORD [24+EBP]
+   845 00000719 C1 F8 04                               SAR     EAX,4
+   846 0000071C 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   847 0000071F 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+   848 00000722 C1 E0 02                               SAL     EAX,2
+   849 00000725 83 65 10 0F                            AND     DWORD [16+EBP],15
+   850 00000729 29 45 0C                               SUB     DWORD [12+EBP],EAX
+   851 0000072C                                 L162:
+   852 0000072C 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   853 0000072F 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+   854 00000732 8D 14 90                               LEA     EDX,DWORD [EAX+EDX*4]
+   855 00000735 89 55 EC                               MOV     DWORD [-20+EBP],EDX
+   856 00000738 8B 02                                  MOV     EAX,DWORD [EDX]
+   857 0000073A 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   858 0000073D 8B 47 14                               MOV     EAX,DWORD [20+EDI]
+   859 00000740 85 C0                                  TEST    EAX,EAX
+   860 00000742 74 2B                                  JE      L165
+   861 00000744 48                                     DEC     EAX
+   862 00000745 89 47 14                               MOV     DWORD [20+EDI],EAX
+   863 00000748 85 C0                                  TEST    EAX,EAX
+   864 0000074A 0F 84 00000103                         JE      L187
+   865 00000750                                 L166:
+   866 00000750 8B 47 04                               MOV     EAX,DWORD [4+EDI]
+   867 00000753 39 45 F0                               CMP     DWORD [-16+EBP],EAX
+   868 00000756 72 0C                                  JB      L186
+   869 00000758 8B 47 08                               MOV     EAX,DWORD [8+EDI]
+   870 0000075B 39 45 F0                               CMP     DWORD [-16+EBP],EAX
+   871 0000075E 0F 86 000000D6                         JBE     L174
+   872 00000764                                 L186:
+   873 00000764 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   874 00000767                                 L173:
+   875 00000767 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   876 0000076A 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   877 0000076D 89 02                                  MOV     DWORD [EDX],EAX
+   878 0000076F                                 L165:
+   879 0000076F 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   880 00000772 8B 42 04                               MOV     EAX,DWORD [4+EDX]
+   881 00000775 3D 00FFFFFF                            CMP     EAX,16777215
+   882 0000077A 77 2B                                  JA      L185
+   883 0000077C                                 L179:
+   884 0000077C 89 C3                                  MOV     EBX,EAX
+   885 0000077E 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   886 00000781 C1 E3 08                               SAL     EBX,8
+   887 00000784 8B 48 08                               MOV     ECX,DWORD [8+EAX]
+   888 00000787 89 58 04                               MOV     DWORD [4+EAX],EBX
+   889 0000078A C1 E1 08                               SAL     ECX,8
+   890 0000078D 8B 00                                  MOV     EAX,DWORD [EAX]
+   891 0000078F 0F B6 10                               MOVZX   EDX,BYTE [EAX]
+   892 00000792 09 D1                                  OR      ECX,EDX
+   893 00000794 40                                     INC     EAX
+   894 00000795 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   895 00000798 81 FB 00FFFFFF                         CMP     EBX,16777215
+   896 0000079E 89 02                                  MOV     DWORD [EDX],EAX
+   897 000007A0 89 4A 08                               MOV     DWORD [8+EDX],ECX
+   898 000007A3 89 D8                                  MOV     EAX,EBX
+   899 000007A5 76 D5                                  JBE     L179
+   900 000007A7                                 L185:
+   901 000007A7 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   902 000007AA D1 65 14                               SAL     DWORD [20+EBP],1
+   903 000007AD 8B 70 04                               MOV     ESI,DWORD [4+EAX]
+   904 000007B0 89 F1                                  MOV     ECX,ESI
+   905 000007B2 23 48 0C                               AND     ECX,DWORD [12+EAX]
+   906 000007B5 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   907 000007B8 F7 E1                                  MUL     ECX
+   908 000007BA 0F AC D0 10                            SHRD    EAX,EDX,16
+   909 000007BE C1 EA 10                               SHR     EDX,16
+   910 000007C1 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   911 000007C4 89 55 E4                               MOV     DWORD [-28+EBP],EDX
+   912 000007C7 89 C3                                  MOV     EBX,EAX
+   913 000007C9 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   914 000007CC 8B 4A 08                               MOV     ECX,DWORD [8+EDX]
+   915 000007CF 39 C1                                  CMP     ECX,EAX
+   916 000007D1 73 43                                  JAE     L180
+   917 000007D3 8B 45 E0                               MOV     EAX,DWORD [-32+EBP]
+   918 000007D6 83 4D 14 01                            OR      DWORD [20+EBP],1
+   919 000007DA 89 42 04                               MOV     DWORD [4+EDX],EAX
+   920 000007DD 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+   921 000007E0 B8 00010000                            MOV     EAX,65536
+   922 000007E5 2B 45 F0                               SUB     EAX,DWORD [-16+EBP]
+   923 000007E8 0F B6 4F 01                            MOVZX   ECX,BYTE [1+EDI]
+   924 000007EC D3 E8                                  SHR     EAX,CL
+   925 000007EE 23 47 0C                               AND     EAX,DWORD [12+EDI]
+   926 000007F1 01 02                                  ADD     DWORD [EDX],EAX
+   927 000007F3                                 L181:
+   928 000007F3 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+   929 000007F6 FF 4D 10                               DEC     DWORD [16+EBP]
+   930 000007F9 85 45 10                               TEST    DWORD [16+EBP],EAX
+   931 000007FC 75 03                                  JNE     L164
+   932 000007FE 83 C7 20                               ADD     EDI,32
+   933 00000801                                 L164:
+   934 00000801 83 7D 10 00                            CMP     DWORD [16+EBP],0
+   935 00000805 0F 85 FFFFFF21                         JNE     L162
+   936 0000080B 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+   937 0000080E 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   938 00000811 5B                                     POP     EBX
+   939 00000812 5E                                     POP     ESI
+   940 00000813 5F                                     POP     EDI
+   941 00000814 5D                                     POP     EBP
+   942 00000815 C3                                     RET
+   943 00000816                                 L180:
+   944 00000816 29 C6                                  SUB     ESI,EAX
+   945 00000818 29 D9                                  SUB     ECX,EBX
+   946 0000081A 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   947 0000081D 89 70 04                               MOV     DWORD [4+EAX],ESI
+   948 00000820 89 48 08                               MOV     DWORD [8+EAX],ECX
+   949 00000823 0F B6 4F 01                            MOVZX   ECX,BYTE [1+EDI]
+   950 00000827 D3 6D F0                               SHR     DWORD [-16+EBP],CL
+   951 0000082A 8B 57 0C                               MOV     EDX,DWORD [12+EDI]
+   952 0000082D 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   953 00000830 21 55 F0                               AND     DWORD [-16+EBP],EDX
+   954 00000833 8B 55 F0                               MOV     EDX,DWORD [-16+EBP]
+   955 00000836 29 10                                  SUB     DWORD [EAX],EDX
+   956 00000838 EB B9                                  JMP     L181
+   957 0000083A                                 L174:
+   958 0000083A 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   959 0000083D 23 47 10                               AND     EAX,DWORD [16+EDI]
+   960 00000840 85 C0                                  TEST    EAX,EAX
+   961 00000842 0F 84 FFFFFF27                         JE      L165
+   962 00000848 8B 47 0C                               MOV     EAX,DWORD [12+EDI]
+   963 0000084B 21 45 F0                               AND     DWORD [-16+EBP],EAX
+   964 0000084E E9 FFFFFF14                            JMP     L173
+   965 00000853                                 L187:
+   966 00000853 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   967 00000856 83 C0 7C                               ADD     EAX,124
+   968 00000859 50                                     PUSH    EAX
+   969 0000085A 6A 00                                  PUSH    0
+   970 0000085C 6A 71                                  PUSH    113
+   971 0000085E 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   972 00000861 05 00002498                            ADD     EAX,9368
+   973 00000866 50                                     PUSH    EAX
+   974 00000867 FF 75 08                               PUSH    DWORD [8+EBP]
+   975 0000086A E8 FFFFFE9B                            CALL    _tek_rdget1
+   976 0000086F 83 C4 14                               ADD     ESP,20
+   977 00000872 85 C0                                  TEST    EAX,EAX
+   978 00000874 0F 84 00000097                         JE      L169
+   979 0000087A 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   980 0000087D 89 F8                                  MOV     EAX,EDI
+   981 0000087F 83 C2 3C                               ADD     EDX,60
+   982 00000882 2B 45 08                               SUB     EAX,DWORD [8+EBP]
+   983 00000885 52                                     PUSH    EDX
+   984 00000886 6A 00                                  PUSH    0
+   985 00000888 83 E8 1C                               SUB     EAX,28
+   986 0000088B C1 F8 05                               SAR     EAX,5
+   987 0000088E 6A 71                                  PUSH    113
+   988 00000890 0F B6 57 02                            MOVZX   EDX,BYTE [2+EDI]
+   989 00000894 8D 04 42                               LEA     EAX,DWORD [EDX+EAX*2]
+   990 00000897 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   991 0000089A 8D 84 82 00002318                      LEA     EAX,DWORD [8984+EDX+EAX*4]
+   992 000008A1 50                                     PUSH    EAX
+   993 000008A2 52                                     PUSH    EDX
+   994 000008A3 E8 FFFFFE62                            CALL    _tek_rdget1
+   995 000008A8 83 C4 14                               ADD     ESP,20
+   996 000008AB 84 C0                                  TEST    AL,AL
+   997 000008AD 88 47 02                               MOV     BYTE [2+EDI],AL
+   998 000008B0 74 0B                                  JE      L188
+   999 000008B2                                 L170:
+  1000 000008B2 8B 47 18                               MOV     EAX,DWORD [24+EDI]
+  1001 000008B5 89 47 14                               MOV     DWORD [20+EDI],EAX
+  1002 000008B8 E9 FFFFFE93                            JMP     L166
+  1003 000008BD                                 L188:
+  1004 000008BD 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+  1005 000008C0 83 C6 5C                               ADD     ESI,92
+  1006 000008C3 56                                     PUSH    ESI
+  1007 000008C4 6A 01                                  PUSH    1
+  1008 000008C6 6A 74                                  PUSH    116
+  1009 000008C8 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1010 000008CB 05 00002418                            ADD     EAX,9240
+  1011 000008D0 50                                     PUSH    EAX
+  1012 000008D1 FF 75 08                               PUSH    DWORD [8+EBP]
+  1013 000008D4 E8 FFFFFE31                            CALL    _tek_rdget1
+  1014 000008D9 83 C4 14                               ADD     ESP,20
+  1015 000008DC 89 C3                                  MOV     EBX,EAX
+  1016 000008DE 83 E3 0F                               AND     EBX,15
+  1017 000008E1 83 FB 0F                               CMP     EBX,15
+  1018 000008E4 74 2B                                  JE      L169
+  1019 000008E6 56                                     PUSH    ESI
+  1020 000008E7 6A 01                                  PUSH    1
+  1021 000008E9 6A 74                                  PUSH    116
+  1022 000008EB 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1023 000008EE 05 00002458                            ADD     EAX,9304
+  1024 000008F3 50                                     PUSH    EAX
+  1025 000008F4 FF 75 08                               PUSH    DWORD [8+EBP]
+  1026 000008F7 E8 FFFFFE0E                            CALL    _tek_rdget1
+  1027 000008FC 83 C4 14                               ADD     ESP,20
+  1028 000008FF 48                                     DEC     EAX
+  1029 00000900 83 E0 0F                               AND     EAX,15
+  1030 00000903 40                                     INC     EAX
+  1031 00000904 50                                     PUSH    EAX
+  1032 00000905 53                                     PUSH    EBX
+  1033 00000906 57                                     PUSH    EDI
+  1034 00000907 E8 FFFFFD54                            CALL    _tek_setbm5
+  1035 0000090C 83 C4 0C                               ADD     ESP,12
+  1036 0000090F EB A1                                  JMP     L170
+  1037 00000911                                 L169:
+  1038 00000911 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+  1039 00000914 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+  1040 00000917 83 C0 10                               ADD     EAX,16
+  1041 0000091A 8B 6A 10                               MOV     EBP,DWORD [16+EDX]
+  1042 0000091D 8B 60 08                               MOV     ESP,DWORD [8+EAX]
+  1043 00000920 FF 60 04                               JMP     DWORD [4+EAX]
+  1044 00000923                                 _tek_revbit:
+  1045 00000923 55                                     PUSH    EBP
+  1046 00000924 89 E5                                  MOV     EBP,ESP
+  1047 00000926 53                                     PUSH    EBX
+  1048 00000927 31 DB                                  XOR     EBX,EBX
+  1049 00000929 8B 4D 08                               MOV     ECX,DWORD [8+EBP]
+  1050 0000092C 8B 55 0C                               MOV     EDX,DWORD [12+EBP]
+  1051 0000092F                                 L190:
+  1052 0000092F 89 C8                                  MOV     EAX,ECX
+  1053 00000931 D1 E9                                  SHR     ECX,1
+  1054 00000933 83 E0 01                               AND     EAX,1
+  1055 00000936 4A                                     DEC     EDX
+  1056 00000937 8D 1C 58                               LEA     EBX,DWORD [EAX+EBX*2]
+  1057 0000093A 75 F3                                  JNE     L190
+  1058 0000093C 89 D8                                  MOV     EAX,EBX
+  1059 0000093E 5B                                     POP     EBX
+  1060 0000093F 5D                                     POP     EBP
+  1061 00000940 C3                                     RET
+  1062 00000941                                 _tek_getlen5:
+  1063 00000941 55                                     PUSH    EBP
+  1064 00000942 89 E5                                  MOV     EBP,ESP
+  1065 00000944 57                                     PUSH    EDI
+  1066 00000945 56                                     PUSH    ESI
+  1067 00000946 53                                     PUSH    EBX
+  1068 00000947 8B 75 0C                               MOV     ESI,DWORD [12+EBP]
+  1069 0000094A 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+  1070 0000094D FF B3 00000428                         PUSH    DWORD [1064+EBX]
+  1071 00000953 8D 3C F3                               LEA     EDI,DWORD [EBX+ESI*8]
+  1072 00000956 6A 00                                  PUSH    0
+  1073 00000958 6A 71                                  PUSH    113
+  1074 0000095A 8D 87 0000131C                         LEA     EAX,DWORD [4892+EDI]
+  1075 00000960 50                                     PUSH    EAX
+  1076 00000961 53                                     PUSH    EBX
+  1077 00000962 E8 FFFFFDA3                            CALL    _tek_rdget1
+  1078 00000967 83 C4 14                               ADD     ESP,20
+  1079 0000096A 3B 45 14                               CMP     EAX,DWORD [20+EBP]
+  1080 0000096D 74 33                                  JE      L195
+  1081 0000096F 6B 45 10 07                            IMUL    EAX,DWORD [16+EBP],7
+  1082 00000973 01 F0                                  ADD     EAX,ESI
+  1083 00000975 FF B3 0000042C                         PUSH    DWORD [1068+EBX]
+  1084 0000097B C1 E0 05                               SAL     EAX,5
+  1085 0000097E 6A 01                                  PUSH    1
+  1086 00000980 6A 73                                  PUSH    115
+  1087 00000982 8D 84 03 000004BC                      LEA     EAX,DWORD [1212+EBX+EAX*1]
+  1088 00000989 50                                     PUSH    EAX
+  1089 0000098A 53                                     PUSH    EBX
+  1090 0000098B E8 FFFFFD7A                            CALL    _tek_rdget1
+  1091 00000990 89 C2                                  MOV     EDX,EAX
+  1092 00000992 83 E2 07                               AND     EDX,7
+  1093 00000995                                 L202:
+  1094 00000995 83 C4 14                               ADD     ESP,20
+  1095 00000998                                 L196:
+  1096 00000998 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1097 0000099B 89 D0                                  MOV     EAX,EDX
+  1098 0000099D 5B                                     POP     EBX
+  1099 0000099E 5E                                     POP     ESI
+  1100 0000099F 5F                                     POP     EDI
+  1101 000009A0 5D                                     POP     EBP
+  1102 000009A1 C3                                     RET
+  1103 000009A2                                 L195:
+  1104 000009A2 FF B3 00000428                         PUSH    DWORD [1064+EBX]
+  1105 000009A8 6A 00                                  PUSH    0
+  1106 000009AA 8D 87 00001320                         LEA     EAX,DWORD [4896+EDI]
+  1107 000009B0 6A 71                                  PUSH    113
+  1108 000009B2 50                                     PUSH    EAX
+  1109 000009B3 53                                     PUSH    EBX
+  1110 000009B4 E8 FFFFFD51                            CALL    _tek_rdget1
+  1111 000009B9 83 C4 14                               ADD     ESP,20
+  1112 000009BC 3B 45 14                               CMP     EAX,DWORD [20+EBP]
+  1113 000009BF 74 25                                  JE      L197
+  1114 000009C1 6B 45 10 07                            IMUL    EAX,DWORD [16+EBP],7
+  1115 000009C5 01 F0                                  ADD     EAX,ESI
+  1116 000009C7 FF B3 00000430                         PUSH    DWORD [1072+EBX]
+  1117 000009CD C1 E0 05                               SAL     EAX,5
+  1118 000009D0 6A 01                                  PUSH    1
+  1119 000009D2 6A 73                                  PUSH    115
+  1120 000009D4 8D 84 03 000004FC                      LEA     EAX,DWORD [1276+EBX+EAX*1]
+  1121 000009DB 50                                     PUSH    EAX
+  1122 000009DC 53                                     PUSH    EBX
+  1123 000009DD E8 FFFFFD28                            CALL    _tek_rdget1
+  1124 000009E2 89 C2                                  MOV     EDX,EAX
+  1125 000009E4 EB AF                                  JMP     L202
+  1126 000009E6                                 L197:
+  1127 000009E6 FF B3 00000434                         PUSH    DWORD [1076+EBX]
+  1128 000009EC C1 E6 0A                               SAL     ESI,10
+  1129 000009EF 6A 01                                  PUSH    1
+  1130 000009F1 6A 78                                  PUSH    120
+  1131 000009F3 8D 84 1E 0000132C                      LEA     EAX,DWORD [4908+ESI+EBX*1]
+  1132 000009FA 50                                     PUSH    EAX
+  1133 000009FB 53                                     PUSH    EBX
+  1134 000009FC E8 FFFFFD09                            CALL    _tek_rdget1
+  1135 00000A01 83 C4 14                               ADD     ESP,20
+  1136 00000A04 8D 90 FFFFFE08                         LEA     EDX,DWORD [-504+EAX]
+  1137 00000A0A 85 D2                                  TEST    EDX,EDX
+  1138 00000A0C 7E 29                                  JLE     L199
+  1139 00000A0E 83 FA 05                               CMP     EDX,5
+  1140 00000A11 7F 06                                  JG      L200
+  1141 00000A13 83 7D 14 00                            CMP     DWORD [20+EBP],0
+  1142 00000A17 74 29                                  JE      L203
+  1143 00000A19                                 L200:
+  1144 00000A19 6A FE                                  PUSH    -2
+  1145 00000A1B 52                                     PUSH    EDX
+  1146 00000A1C 53                                     PUSH    EBX
+  1147 00000A1D E8 FFFFFC86                            CALL    _tek_rdget0
+  1148 00000A22 83 C4 0C                               ADD     ESP,12
+  1149 00000A25 8D 50 FF                               LEA     EDX,DWORD [-1+EAX]
+  1150 00000A28                                 L201:
+  1151 00000A28 6A FE                                  PUSH    -2
+  1152 00000A2A 52                                     PUSH    EDX
+  1153 00000A2B 53                                     PUSH    EBX
+  1154 00000A2C E8 FFFFFC77                            CALL    _tek_rdget0
+  1155 00000A31 83 C4 0C                               ADD     ESP,12
+  1156 00000A34 8D 50 FF                               LEA     EDX,DWORD [-1+EAX]
+  1157 00000A37                                 L199:
+  1158 00000A37 81 C2 00000108                         ADD     EDX,264
+  1159 00000A3D E9 FFFFFF56                            JMP     L196
+  1160 00000A42                                 L203:
+  1161 00000A42 FF B3 00000438                         PUSH    DWORD [1080+EBX]
+  1162 00000A48 89 D0                                  MOV     EAX,EDX
+  1163 00000A4A 6A 01                                  PUSH    1
+  1164 00000A4C 83 C8 70                               OR      EAX,112
+  1165 00000A4F 88 D1                                  MOV     CL,DL
+  1166 00000A51 50                                     PUSH    EAX
+  1167 00000A52 B8 00000004                            MOV     EAX,4
+  1168 00000A57 D3 E0                                  SAL     EAX,CL
+  1169 00000A59 8D 84 18 00002214                      LEA     EAX,DWORD [8724+EAX+EBX*1]
+  1170 00000A60 50                                     PUSH    EAX
+  1171 00000A61 53                                     PUSH    EBX
+  1172 00000A62 E8 FFFFFCA3                            CALL    _tek_rdget1
+  1173 00000A67 83 C4 14                               ADD     ESP,20
+  1174 00000A6A 8D 50 FF                               LEA     EDX,DWORD [-1+EAX]
+  1175 00000A6D EB B9                                  JMP     L201
+  1176                                          [SECTION .data]
+  1177 00000012                                 _state_table.3:
+  1178 00000012 00000000                               DD      0
+  1179 00000016 00000000                               DD      0
+  1180 0000001A 00000000                               DD      0
+  1181 0000001E 00000000                               DD      0
+  1182 00000022 00000001                               DD      1
+  1183 00000026 00000002                               DD      2
+  1184 0000002A 00000003                               DD      3
+  1185 0000002E 00000004                               DD      4
+  1186 00000032 00000005                               DD      5
+  1187 00000036 00000006                               DD      6
+  1188 0000003A 00000004                               DD      4
+  1189 0000003E 00000005                               DD      5
+  1190 00000042                                 _pt1.4:
+  1191 00000042 08                                     DB      8
+  1192 00000043 08                                     DB      8
+  1193 00000044 08                                     DB      8
+  1194 00000045 08                                     DB      8
+  1195 00000046 08                                     DB      8
+  1196 00000047 08                                     DB      8
+  1197 00000048 08                                     DB      8
+  1198 00000049 08                                     DB      8
+  1199 0000004A 08                                     DB      8
+  1200 0000004B 08                                     DB      8
+  1201 0000004C 12                                     DB      18
+  1202 0000004D 12                                     DB      18
+  1203 0000004E 12                                     DB      18
+  1204 0000004F 08                                     DB      8
+  1205 00000050                                 _pt2.5:
+  1206 00000050 08                                     DB      8
+  1207 00000051 08                                     DB      8
+  1208 00000052 0A                                     DB      10
+  1209 00000053 0B                                     DB      11
+  1210 00000054 0C                                     DB      12
+  1211 00000055 0C                                     DB      12
+  1212 00000056 0E                                     DB      14
+  1213 00000057 0F                                     DB      15
+  1214 00000058 10                                     DB      16
+  1215 00000059 10                                     DB      16
+  1216 0000005A 12                                     DB      18
+  1217 0000005B 12                                     DB      18
+  1218 0000005C 14                                     DB      20
+  1219 0000005D 15                                     DB      21
+  1220                                          [SECTION .text]
+  1221 00000A6F                                 _tek_decmain5:
+  1222 00000A6F 55                                     PUSH    EBP
+  1223 00000A70 B8 00000001                            MOV     EAX,1
+  1224 00000A75 89 E5                                  MOV     EBP,ESP
+  1225 00000A77 89 C2                                  MOV     EDX,EAX
+  1226 00000A79 57                                     PUSH    EDI
+  1227 00000A7A 56                                     PUSH    ESI
+  1228 00000A7B 53                                     PUSH    EBX
+  1229 00000A7C 83 EC 74                               SUB     ESP,116
+  1230 00000A7F 8B 4D 1C                               MOV     ECX,DWORD [28+EBP]
+  1231 00000A82 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+  1232 00000A85 D3 E2                                  SAL     EDX,CL
+  1233 00000A87 89 D1                                  MOV     ECX,EDX
+  1234 00000A89 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+  1235 00000A8C 49                                     DEC     ECX
+  1236 00000A8D 89 55 9C                               MOV     DWORD [-100+EBP],EDX
+  1237 00000A90 89 4D B8                               MOV     DWORD [-72+EBP],ECX
+  1238 00000A93 8A 4D 20                               MOV     CL,BYTE [32+EBP]
+  1239 00000A96 D3 E0                                  SAL     EAX,CL
+  1240 00000A98 48                                     DEC     EAX
+  1241 00000A99 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1242 00000A9C 89 45 B4                               MOV     DWORD [-76+EBP],EAX
+  1243 00000A9F 31 C0                                  XOR     EAX,EAX
+  1244 00000AA1 83 7D 24 FF                            CMP     DWORD [36+EBP],-1
+  1245 00000AA5 0F 94 C0                               SETE    AL
+  1246 00000AA8 89 45 B0                               MOV     DWORD [-80+EBP],EAX
+  1247 00000AAB 81 C2 0000045C                         ADD     EDX,1116
+  1248 00000AB1 C7 45 AC 00000008                      MOV     DWORD [-84+EBP],8
+  1249 00000AB8 8B 45 18                               MOV     EAX,DWORD [24+EBP]
+  1250 00000ABB 89 55 98                               MOV     DWORD [-104+EBP],EDX
+  1251 00000ABE 29 45 AC                               SUB     DWORD [-84+EBP],EAX
+  1252 00000AC1 8D 43 04                               LEA     EAX,DWORD [4+EBX]
+  1253 00000AC4 89 01                                  MOV     DWORD [ECX],EAX
+  1254 00000AC6 C7 45 A4 00000078                      MOV     DWORD [-92+EBP],120
+  1255 00000ACD C7 41 04 FFFFFFFF                      MOV     DWORD [4+ECX],-1
+  1256 00000AD4 0F B6 13                               MOVZX   EDX,BYTE [EBX]
+  1257 00000AD7 0F B6 43 01                            MOVZX   EAX,BYTE [1+EBX]
+  1258 00000ADB C1 E0 10                               SAL     EAX,16
+  1259 00000ADE C1 E2 18                               SAL     EDX,24
+  1260 00000AE1 09 C2                                  OR      EDX,EAX
+  1261 00000AE3 0F B6 43 02                            MOVZX   EAX,BYTE [2+EBX]
+  1262 00000AE7 C1 E0 08                               SAL     EAX,8
+  1263 00000AEA 09 C2                                  OR      EDX,EAX
+  1264 00000AEC 0F B6 43 03                            MOVZX   EAX,BYTE [3+EBX]
+  1265 00000AF0 09 C2                                  OR      EDX,EAX
+  1266 00000AF2 89 51 08                               MOV     DWORD [8+ECX],EDX
+  1267 00000AF5 C7 45 D0 00000000                      MOV     DWORD [-48+EBP],0
+  1268 00000AFC                                 L209:
+  1269 00000AFC 8B 55 D0                               MOV     EDX,DWORD [-48+EBP]
+  1270 00000AFF 8B 45 D0                               MOV     EAX,DWORD [-48+EBP]
+  1271 00000B02 F7 D0                                  NOT     EAX
+  1272 00000B04 89 44 95 E4                            MOV     DWORD [-28+EBP+EDX*4],EAX
+  1273 00000B08 42                                     INC     EDX
+  1274 00000B09 89 55 D0                               MOV     DWORD [-48+EBP],EDX
+  1275 00000B0C 83 FA 03                               CMP     EDX,3
+  1276 00000B0F 7E EB                                  JLE     L209
+  1277 00000B11 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1278 00000B14 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1279 00000B17 83 C0 10                               ADD     EAX,16
+  1280 00000B1A 8D 55 F4                               LEA     EDX,DWORD [-12+EBP]
+  1281 00000B1D 89 51 10                               MOV     DWORD [16+ECX],EDX
+  1282 00000B20 C7 40 04 [000012AF]                    MOV     DWORD [4+EAX],L211
+  1283 00000B27 89 60 08                               MOV     DWORD [8+EAX],ESP
+  1284 00000B2A 31 C0                                  XOR     EAX,EAX
+  1285 00000B2C                                 L212:
+  1286 00000B2C 85 C0                                  TEST    EAX,EAX
+  1287 00000B2E 0F 85 0000048C                         JNE     L213
+  1288 00000B34 8B 4D 18                               MOV     ECX,DWORD [24+EBP]
+  1289 00000B37 B8 00000300                            MOV     EAX,768
+  1290 00000B3C 03 4D 20                               ADD     ECX,DWORD [32+EBP]
+  1291 00000B3F D3 E0                                  SAL     EAX,CL
+  1292 00000B41 05 0000080F                            ADD     EAX,2063
+  1293 00000B46 89 45 D0                               MOV     DWORD [-48+EBP],EAX
+  1294 00000B49 78 13                                  JS      L330
+  1295 00000B4B                                 L218:
+  1296 00000B4B 8B 4D D0                               MOV     ECX,DWORD [-48+EBP]
+  1297 00000B4E 8B 45 98                               MOV     EAX,DWORD [-104+EBP]
+  1298 00000B51 C7 04 88 00008000                      MOV     DWORD [EAX+ECX*4],32768
+  1299 00000B58 49                                     DEC     ECX
+  1300 00000B59 89 4D D0                               MOV     DWORD [-48+EBP],ECX
+  1301 00000B5C 79 ED                                  JNS     L218
+  1302 00000B5E                                 L330:
+  1303 00000B5E C7 45 D0 00000000                      MOV     DWORD [-48+EBP],0
+  1304 00000B65 8B 55 9C                               MOV     EDX,DWORD [-100+EBP]
+  1305 00000B68                                 L225:
+  1306 00000B68 31 C0                                  XOR     EAX,EAX
+  1307 00000B6A 83 7D D0 03                            CMP     DWORD [-48+EBP],3
+  1308 00000B6E 0F 9F C0                               SETG    AL
+  1309 00000B71 89 42 30                               MOV     DWORD [48+EDX],EAX
+  1310 00000B74 B8 00004000                            MOV     EAX,16384
+  1311 00000B79 83 7D D0 17                            CMP     DWORD [-48+EBP],23
+  1312 00000B7D 7E 05                                  JLE     L224
+  1313 00000B7F B8 00002000                            MOV     EAX,8192
+  1314 00000B84                                 L224:
+  1315 00000B84 C6 42 1E 00                            MOV     BYTE [30+EDX],0
+  1316 00000B88 C6 42 1D 05                            MOV     BYTE [29+EDX],5
+  1317 00000B8C C6 42 1C 05                            MOV     BYTE [28+EDX],5
+  1318 00000B90 FF 45 D0                               INC     DWORD [-48+EBP]
+  1319 00000B93 89 42 34                               MOV     DWORD [52+EDX],EAX
+  1320 00000B96 83 C2 20                               ADD     EDX,32
+  1321 00000B99 83 7D D0 1F                            CMP     DWORD [-48+EBP],31
+  1322 00000B9D 7E C9                                  JLE     L225
+  1323 00000B9F 8B 4D 18                               MOV     ECX,DWORD [24+EBP]
+  1324 00000BA2 B8 00000400                            MOV     EAX,1024
+  1325 00000BA7 03 4D 20                               ADD     ECX,DWORD [32+EBP]
+  1326 00000BAA 8B 55 98                               MOV     EDX,DWORD [-104+EBP]
+  1327 00000BAD D3 E0                                  SAL     EAX,CL
+  1328 00000BAF 83 7D B0 00                            CMP     DWORD [-80+EBP],0
+  1329 00000BB3 8D 84 10 00002038                      LEA     EAX,DWORD [8248+EAX+EDX*1]
+  1330 00000BBA 89 45 A0                               MOV     DWORD [-96+EBP],EAX
+  1331 00000BBD 0F 84 000005BC                         JE      L226
+  1332 00000BC3 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1333 00000BC6 89 C8                                  MOV     EAX,ECX
+  1334 00000BC8 C7 41 0C FFFFF800                      MOV     DWORD [12+ECX],-2048
+  1335 00000BCF 83 C0 30                               ADD     EAX,48
+  1336 00000BD2 C7 45 D0 0000001F                      MOV     DWORD [-48+EBP],31
+  1337 00000BD9                                 L231:
+  1338 00000BD9 C7 00 00000000                         MOV     DWORD [EAX],0
+  1339 00000BDF 83 C0 20                               ADD     EAX,32
+  1340 00000BE2 FF 4D D0                               DEC     DWORD [-48+EBP]
+  1341 00000BE5 79 F2                                  JNS     L231
+  1342 00000BE7 C7 45 D0 00000000                      MOV     DWORD [-48+EBP],0
+  1343 00000BEE                                 L236:
+  1344 00000BEE 8B 55 D0                               MOV     EDX,DWORD [-48+EBP]
+  1345 00000BF1 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1346 00000BF4 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1347 00000BF7 83 C0 1C                               ADD     EAX,28
+  1348 00000BFA 89 84 91 0000041C                      MOV     DWORD [1052+ECX+EDX*4],EAX
+  1349 00000C01 42                                     INC     EDX
+  1350 00000C02 89 55 D0                               MOV     DWORD [-48+EBP],EDX
+  1351 00000C05 83 FA 0D                               CMP     EDX,13
+  1352 00000C08 7E E4                                  JLE     L236
+  1353 00000C0A                                 L237:
+  1354 00000C0A 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1355 00000C0D 89 45 80                               MOV     DWORD [-128+EBP],EAX
+  1356 00000C10 C7 45 D0 0000001F                      MOV     DWORD [-48+EBP],31
+  1357 00000C17                                 L268:
+  1358 00000C17 8B 55 80                               MOV     EDX,DWORD [-128+EBP]
+  1359 00000C1A 0F B6 42 1D                            MOVZX   EAX,BYTE [29+EDX]
+  1360 00000C1E 50                                     PUSH    EAX
+  1361 00000C1F 0F B6 42 1C                            MOVZX   EAX,BYTE [28+EDX]
+  1362 00000C23 50                                     PUSH    EAX
+  1363 00000C24 89 D0                                  MOV     EAX,EDX
+  1364 00000C26 83 C0 1C                               ADD     EAX,28
+  1365 00000C29 50                                     PUSH    EAX
+  1366 00000C2A E8 FFFFFA31                            CALL    _tek_setbm5
+  1367 00000C2F 83 C4 0C                               ADD     ESP,12
+  1368 00000C32 83 45 80 20                            ADD     DWORD [-128+EBP],32
+  1369 00000C36 FF 4D D0                               DEC     DWORD [-48+EBP]
+  1370 00000C39 79 DC                                  JNS     L268
+  1371 00000C3B 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1372 00000C3E FF B1 0000041C                         PUSH    DWORD [1052+ECX]
+  1373 00000C44 6A 00                                  PUSH    0
+  1374 00000C46 6A 71                                  PUSH    113
+  1375 00000C48 FF 75 98                               PUSH    DWORD [-104+EBP]
+  1376 00000C4B 51                                     PUSH    ECX
+  1377 00000C4C E8 FFFFFAB9                            CALL    _tek_rdget1
+  1378 00000C51 83 C4 14                               ADD     ESP,20
+  1379 00000C54 3B 45 B0                               CMP     EAX,DWORD [-80+EBP]
+  1380 00000C57 0F 84 00000363                         JE      L213
+  1381 00000C5D 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+  1382 00000C60 FF 45 14                               INC     DWORD [20+EBP]
+  1383 00000C63 89 45 94                               MOV     DWORD [-108+EBP],EAX
+  1384 00000C66 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1385 00000C69 05 0000031C                            ADD     EAX,796
+  1386 00000C6E 50                                     PUSH    EAX
+  1387 00000C6F 8B 45 98                               MOV     EAX,DWORD [-104+EBP]
+  1388 00000C72 6A 01                                  PUSH    1
+  1389 00000C74 05 00002040                            ADD     EAX,8256
+  1390 00000C79 FF 75 A4                               PUSH    DWORD [-92+EBP]
+  1391 00000C7C 50                                     PUSH    EAX
+  1392 00000C7D FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1393 00000C80 E8 FFFFFA85                            CALL    _tek_rdget1
+  1394 00000C85 8B 55 94                               MOV     EDX,DWORD [-108+EBP]
+  1395 00000C88 83 C4 14                               ADD     ESP,20
+  1396 00000C8B 88 02                                  MOV     BYTE [EDX],AL
+  1397 00000C8D 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+  1398 00000C90 C7 45 BC 00000001                      MOV     DWORD [-68+EBP],1
+  1399 00000C97 C7 45 C4 00000000                      MOV     DWORD [-60+EBP],0
+  1400 00000C9E C7 45 C0 00000000                      MOV     DWORD [-64+EBP],0
+  1401 00000CA5 39 4D BC                               CMP     DWORD [-68+EBP],ECX
+  1402 00000CA8 0F 8D 0000012D                         JGE     L343
+  1403 00000CAE                                 L326:
+  1404 00000CAE 8B 45 BC                               MOV     EAX,DWORD [-68+EBP]
+  1405 00000CB1 8B 55 9C                               MOV     EDX,DWORD [-100+EBP]
+  1406 00000CB4 23 45 B8                               AND     EAX,DWORD [-72+EBP]
+  1407 00000CB7 8B 4D 98                               MOV     ECX,DWORD [-104+EBP]
+  1408 00000CBA 89 45 A8                               MOV     DWORD [-88+EBP],EAX
+  1409 00000CBD 31 C0                                  XOR     EAX,EAX
+  1410 00000CBF 83 7D C0 00                            CMP     DWORD [-64+EBP],0
+  1411 00000CC3 0F 9F C0                               SETG    AL
+  1412 00000CC6 FF B4 82 0000041C                      PUSH    DWORD [1052+EDX+EAX*4]
+  1413 00000CCD 6B 45 A8 1C                            IMUL    EAX,DWORD [-88+EBP],28
+  1414 00000CD1 03 45 C0                               ADD     EAX,DWORD [-64+EBP]
+  1415 00000CD4 6A 00                                  PUSH    0
+  1416 00000CD6 6A 71                                  PUSH    113
+  1417 00000CD8 8D 04 C1                               LEA     EAX,DWORD [ECX+EAX*8]
+  1418 00000CDB 50                                     PUSH    EAX
+  1419 00000CDC 89 45 90                               MOV     DWORD [-112+EBP],EAX
+  1420 00000CDF 52                                     PUSH    EDX
+  1421 00000CE0 E8 FFFFFA25                            CALL    _tek_rdget1
+  1422 00000CE5 83 C4 14                               ADD     ESP,20
+  1423 00000CE8 3B 45 B0                               CMP     EAX,DWORD [-80+EBP]
+  1424 00000CEB 0F 84 00000155                         JE      L273
+  1425 00000CF1 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+  1426 00000CF4 8A 4D AC                               MOV     CL,BYTE [-84+EBP]
+  1427 00000CF7 0F B6 50 FF                            MOVZX   EDX,BYTE [-1+EAX]
+  1428 00000CFB 8B 45 BC                               MOV     EAX,DWORD [-68+EBP]
+  1429 00000CFE 23 45 B4                               AND     EAX,DWORD [-76+EBP]
+  1430 00000D01 D3 FA                                  SAR     EDX,CL
+  1431 00000D03 8A 4D 18                               MOV     CL,BYTE [24+EBP]
+  1432 00000D06 D3 E0                                  SAL     EAX,CL
+  1433 00000D08 09 C2                                  OR      EDX,EAX
+  1434 00000D0A 8B 4D C0                               MOV     ECX,DWORD [-64+EBP]
+  1435 00000D0D 89 D0                                  MOV     EAX,EDX
+  1436 00000D0F C1 E0 08                               SAL     EAX,8
+  1437 00000D12 8B 0C 8D [00000012]                    MOV     ECX,DWORD [_state_table.3+ECX*4]
+  1438 00000D19 89 45 D0                               MOV     DWORD [-48+EBP],EAX
+  1439 00000D1C 89 4D C0                               MOV     DWORD [-64+EBP],ECX
+  1440 00000D1F 83 7D C4 00                            CMP     DWORD [-60+EBP],0
+  1441 00000D23 0F 84 000000EF                         JE      L349
+  1442 00000D29 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1443 00000D2C 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+  1444 00000D2F 05 0000031C                            ADD     EAX,796
+  1445 00000D34 89 45 8C                               MOV     DWORD [-116+EBP],EAX
+  1446 00000D37 8B 45 E4                               MOV     EAX,DWORD [-28+EBP]
+  1447 00000D3A C7 45 CC 00000001                      MOV     DWORD [-52+EBP],1
+  1448 00000D41 C7 45 C8 00000008                      MOV     DWORD [-56+EBP],8
+  1449 00000D48 0F B6 04 10                            MOVZX   EAX,BYTE [EAX+EDX*1]
+  1450 00000D4C 89 45 C4                               MOV     DWORD [-60+EBP],EAX
+  1451 00000D4F                                 L280:
+  1452 00000D4F 8B 45 D0                               MOV     EAX,DWORD [-48+EBP]
+  1453 00000D52 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1454 00000D55 03 45 CC                               ADD     EAX,DWORD [-52+EBP]
+  1455 00000D58 8B 55 C4                               MOV     EDX,DWORD [-60+EBP]
+  1456 00000D5B C1 FA 07                               SAR     EDX,7
+  1457 00000D5E 01 C0                                  ADD     EAX,EAX
+  1458 00000D60 89 55 88                               MOV     DWORD [-120+EBP],EDX
+  1459 00000D63 FF B1 00000424                         PUSH    DWORD [1060+ECX]
+  1460 00000D69 09 D0                                  OR      EAX,EDX
+  1461 00000D6B 8B 4D A0                               MOV     ECX,DWORD [-96+EBP]
+  1462 00000D6E 6A 00                                  PUSH    0
+  1463 00000D70 6A 71                                  PUSH    113
+  1464 00000D72 8D 04 81                               LEA     EAX,DWORD [ECX+EAX*4]
+  1465 00000D75 50                                     PUSH    EAX
+  1466 00000D76 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1467 00000D79 E8 FFFFF98C                            CALL    _tek_rdget1
+  1468 00000D7E 8B 55 CC                               MOV     EDX,DWORD [-52+EBP]
+  1469 00000D81 FF 4D C8                               DEC     DWORD [-56+EBP]
+  1470 00000D84 83 C4 14                               ADD     ESP,20
+  1471 00000D87 8D 04 50                               LEA     EAX,DWORD [EAX+EDX*2]
+  1472 00000D8A 89 45 CC                               MOV     DWORD [-52+EBP],EAX
+  1473 00000D8D 8B 45 A4                               MOV     EAX,DWORD [-92+EBP]
+  1474 00000D90 C1 F8 04                               SAR     EAX,4
+  1475 00000D93 85 45 C8                               TEST    DWORD [-56+EBP],EAX
+  1476 00000D96 75 04                                  JNE     L283
+  1477 00000D98 83 45 8C 20                            ADD     DWORD [-116+EBP],32
+  1478 00000D9C                                 L283:
+  1479 00000D9C 8B 4D CC                               MOV     ECX,DWORD [-52+EBP]
+  1480 00000D9F 31 4D 88                               XOR     DWORD [-120+EBP],ECX
+  1481 00000DA2 F7 45 88 00000001                      TEST    DWORD [-120+EBP],1
+  1482 00000DA9 74 06                                  JE      L284
+  1483 00000DAB 83 7D C8 00                            CMP     DWORD [-56+EBP],0
+  1484 00000DAF 75 34                                  JNE     L344
+  1485 00000DB1                                 L284:
+  1486 00000DB1 D1 65 C4                               SAL     DWORD [-60+EBP],1
+  1487 00000DB4 83 7D C8 00                            CMP     DWORD [-56+EBP],0
+  1488 00000DB8 75 95                                  JNE     L280
+  1489 00000DBA                                 L281:
+  1490 00000DBA 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+  1491 00000DBD 8A 45 CC                               MOV     AL,BYTE [-52+EBP]
+  1492 00000DC0 88 02                                  MOV     BYTE [EDX],AL
+  1493 00000DC2 C7 45 C4 00000000                      MOV     DWORD [-60+EBP],0
+  1494 00000DC9                                 L279:
+  1495 00000DC9 FF 45 BC                               INC     DWORD [-68+EBP]
+  1496 00000DCC FF 45 14                               INC     DWORD [20+EBP]
+  1497 00000DCF                                 L270:
+  1498 00000DCF 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+  1499 00000DD2 39 4D BC                               CMP     DWORD [-68+EBP],ECX
+  1500 00000DD5 0F 8C FFFFFED3                         JL      L326
+  1501 00000DDB                                 L343:
+  1502 00000DDB 31 C0                                  XOR     EAX,EAX
+  1503 00000DDD                                 L204:
+  1504 00000DDD 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1505 00000DE0 5B                                     POP     EBX
+  1506 00000DE1 5E                                     POP     ESI
+  1507 00000DE2 5F                                     POP     EDI
+  1508 00000DE3 5D                                     POP     EBP
+  1509 00000DE4 C3                                     RET
+  1510 00000DE5                                 L344:
+  1511 00000DE5 8B 45 A4                               MOV     EAX,DWORD [-92+EBP]
+  1512 00000DE8 8B 4D 98                               MOV     ECX,DWORD [-104+EBP]
+  1513 00000DEB 83 E0 70                               AND     EAX,112
+  1514 00000DEE 09 45 C8                               OR      DWORD [-56+EBP],EAX
+  1515 00000DF1 8B 45 D0                               MOV     EAX,DWORD [-48+EBP]
+  1516 00000DF4 03 45 CC                               ADD     EAX,DWORD [-52+EBP]
+  1517 00000DF7 FF 75 8C                               PUSH    DWORD [-116+EBP]
+  1518 00000DFA FF 75 CC                               PUSH    DWORD [-52+EBP]
+  1519 00000DFD FF 75 C8                               PUSH    DWORD [-56+EBP]
+  1520 00000E00 8D 84 81 0000203C                      LEA     EAX,DWORD [8252+ECX+EAX*4]
+  1521 00000E07 50                                     PUSH    EAX
+  1522 00000E08 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1523 00000E0B E8 FFFFF8FA                            CALL    _tek_rdget1
+  1524 00000E10 83 C4 14                               ADD     ESP,20
+  1525 00000E13 89 45 CC                               MOV     DWORD [-52+EBP],EAX
+  1526 00000E16 EB A2                                  JMP     L281
+  1527 00000E18                                 L349:
+  1528 00000E18 C1 E2 0A                               SAL     EDX,10
+  1529 00000E1B 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1530 00000E1E 05 0000031C                            ADD     EAX,796
+  1531 00000E23 8B 4D 98                               MOV     ECX,DWORD [-104+EBP]
+  1532 00000E26 50                                     PUSH    EAX
+  1533 00000E27 6A 01                                  PUSH    1
+  1534 00000E29 8D 84 0A 00002040                      LEA     EAX,DWORD [8256+EDX+ECX*1]
+  1535 00000E30 FF 75 A4                               PUSH    DWORD [-92+EBP]
+  1536 00000E33 50                                     PUSH    EAX
+  1537 00000E34 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1538 00000E37 E8 FFFFF8CE                            CALL    _tek_rdget1
+  1539 00000E3C 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+  1540 00000E3F 83 C4 14                               ADD     ESP,20
+  1541 00000E42 88 02                                  MOV     BYTE [EDX],AL
+  1542 00000E44 EB 83                                  JMP     L279
+  1543 00000E46                                 L273:
+  1544 00000E46 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1545 00000E49 8B 45 C0                               MOV     EAX,DWORD [-64+EBP]
+  1546 00000E4C C1 E0 04                               SAL     EAX,4
+  1547 00000E4F FF B1 00000450                         PUSH    DWORD [1104+ECX]
+  1548 00000E55 03 45 98                               ADD     EAX,DWORD [-104+EBP]
+  1549 00000E58 6A 00                                  PUSH    0
+  1550 00000E5A 6A 71                                  PUSH    113
+  1551 00000E5C 89 45 84                               MOV     DWORD [-124+EBP],EAX
+  1552 00000E5F 05 00000E00                            ADD     EAX,3584
+  1553 00000E64 50                                     PUSH    EAX
+  1554 00000E65 51                                     PUSH    ECX
+  1555 00000E66 83 4D C4 01                            OR      DWORD [-60+EBP],1
+  1556 00000E6A E8 FFFFF89B                            CALL    _tek_rdget1
+  1557 00000E6F 83 C4 14                               ADD     ESP,20
+  1558 00000E72 3B 45 B0                               CMP     EAX,DWORD [-80+EBP]
+  1559 00000E75 0F 84 000001D2                         JE      L287
+  1560 00000E7B FF 75 B0                               PUSH    DWORD [-80+EBP]
+  1561 00000E7E 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+  1562 00000E81 FF 75 A8                               PUSH    DWORD [-88+EBP]
+  1563 00000E84 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+  1564 00000E87 6A 00                                  PUSH    0
+  1565 00000E89 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+  1566 00000E8C 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+  1567 00000E8F 8B 45 E4                               MOV     EAX,DWORD [-28+EBP]
+  1568 00000E92 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1569 00000E95 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+  1570 00000E98 E8 FFFFFAA4                            CALL    _tek_getlen5
+  1571 00000E9D 89 45 D0                               MOV     DWORD [-48+EBP],EAX
+  1572 00000EA0 89 45 CC                               MOV     DWORD [-52+EBP],EAX
+  1573 00000EA3 83 C4 10                               ADD     ESP,16
+  1574 00000EA6 31 C0                                  XOR     EAX,EAX
+  1575 00000EA8 83 7D C0 06                            CMP     DWORD [-64+EBP],6
+  1576 00000EAC 0F 9F C0                               SETG    AL
+  1577 00000EAF 83 7D D0 03                            CMP     DWORD [-48+EBP],3
+  1578 00000EB3 8D 44 40 07                            LEA     EAX,DWORD [7+EAX+EAX*2]
+  1579 00000EB7 89 45 C0                               MOV     DWORD [-64+EBP],EAX
+  1580 00000EBA 7E 07                                  JLE     L290
+  1581 00000EBC C7 45 CC 00000003                      MOV     DWORD [-52+EBP],3
+  1582 00000EC3                                 L290:
+  1583 00000EC3 31 C0                                  XOR     EAX,EAX
+  1584 00000EC5 8B 55 9C                               MOV     EDX,DWORD [-100+EBP]
+  1585 00000EC8 83 7D CC 03                            CMP     DWORD [-52+EBP],3
+  1586 00000ECC 0F 94 C0                               SETE    AL
+  1587 00000ECF C1 65 CC 08                            SAL     DWORD [-52+EBP],8
+  1588 00000ED3 FF B4 82 0000043C                      PUSH    DWORD [1084+EDX+EAX*4]
+  1589 00000EDA 8B 4D 98                               MOV     ECX,DWORD [-104+EBP]
+  1590 00000EDD 8B 55 CC                               MOV     EDX,DWORD [-52+EBP]
+  1591 00000EE0 6A 01                                  PUSH    1
+  1592 00000EE2 6A 76                                  PUSH    118
+  1593 00000EE4 8D 84 0A 000016D0                      LEA     EAX,DWORD [5840+EDX+ECX*1]
+  1594 00000EEB 50                                     PUSH    EAX
+  1595 00000EEC FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1596 00000EEF E8 FFFFF816                            CALL    _tek_rdget1
+  1597 00000EF4 89 C1                                  MOV     ECX,EAX
+  1598 00000EF6 83 C4 14                               ADD     ESP,20
+  1599 00000EF9 83 E1 3F                               AND     ECX,63
+  1600 00000EFC 89 4D CC                               MOV     DWORD [-52+EBP],ECX
+  1601 00000EFF 89 4D E4                               MOV     DWORD [-28+EBP],ECX
+  1602 00000F02 83 F9 03                               CMP     ECX,3
+  1603 00000F05 7E 77                                  JLE     L295
+  1604 00000F07 89 CA                                  MOV     EDX,ECX
+  1605 00000F09 89 C3                                  MOV     EBX,EAX
+  1606 00000F0B D1 FA                                  SAR     EDX,1
+  1607 00000F0D 83 E3 01                               AND     EBX,1
+  1608 00000F10 89 D8                                  MOV     EAX,EBX
+  1609 00000F12 8D 4A FF                               LEA     ECX,DWORD [-1+EDX]
+  1610 00000F15 83 C8 02                               OR      EAX,2
+  1611 00000F18 D3 E0                                  SAL     EAX,CL
+  1612 00000F1A 89 4D C8                               MOV     DWORD [-56+EBP],ECX
+  1613 00000F1D 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+  1614 00000F20 83 7D CC 0D                            CMP     DWORD [-52+EBP],13
+  1615 00000F24 0F 8E 000000E6                         JLE     L350
+  1616 00000F2A 83 7D B0 00                            CMP     DWORD [-80+EBP],0
+  1617 00000F2E 0F 85 00000096                         JNE     L302
+  1618 00000F34 83 EA 07                               SUB     EDX,7
+  1619 00000F37 89 55 C8                               MOV     DWORD [-56+EBP],EDX
+  1620 00000F3A 74 14                                  JE      L303
+  1621 00000F3C 6A FF                                  PUSH    -1
+  1622 00000F3E 52                                     PUSH    EDX
+  1623 00000F3F FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1624 00000F42 E8 FFFFF761                            CALL    _tek_rdget0
+  1625 00000F47 C1 E0 06                               SAL     EAX,6
+  1626 00000F4A 83 C4 0C                               ADD     ESP,12
+  1627 00000F4D 09 45 E4                               OR      DWORD [-28+EBP],EAX
+  1628 00000F50                                 L303:
+  1629 00000F50 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1630 00000F53 6A 06                                  PUSH    6
+  1631 00000F55 FF B0 0000044C                         PUSH    DWORD [1100+EAX]
+  1632 00000F5B 6A 01                                  PUSH    1
+  1633 00000F5D 8B 45 98                               MOV     EAX,DWORD [-104+EBP]
+  1634 00000F60 6A 76                                  PUSH    118
+  1635 00000F62 05 00001AD0                            ADD     EAX,6864
+  1636 00000F67 50                                     PUSH    EAX
+  1637 00000F68                                 L348:
+  1638 00000F68 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1639 00000F6B E8 FFFFF79A                            CALL    _tek_rdget1
+  1640 00000F70 83 C4 14                               ADD     ESP,20
+  1641 00000F73 50                                     PUSH    EAX
+  1642 00000F74 E8 FFFFF9AA                            CALL    _tek_revbit
+  1643 00000F79 59                                     POP     ECX
+  1644 00000F7A 09 45 E4                               OR      DWORD [-28+EBP],EAX
+  1645 00000F7D 5B                                     POP     EBX
+  1646 00000F7E                                 L295:
+  1647 00000F7E F7 55 E4                               NOT     DWORD [-28+EBP]
+  1648 00000F81                                 L310:
+  1649 00000F81 8B 55 BC                               MOV     EDX,DWORD [-68+EBP]
+  1650 00000F84 83 45 D0 02                            ADD     DWORD [-48+EBP],2
+  1651 00000F88 03 55 E4                               ADD     EDX,DWORD [-28+EBP]
+  1652 00000F8B 78 33                                  JS      L213
+  1653 00000F8D 8B 45 BC                               MOV     EAX,DWORD [-68+EBP]
+  1654 00000F90 03 45 D0                               ADD     EAX,DWORD [-48+EBP]
+  1655 00000F93 3B 45 10                               CMP     EAX,DWORD [16+EBP]
+  1656 00000F96 7E 09                                  JLE     L321
+  1657 00000F98 8B 4D 10                               MOV     ECX,DWORD [16+EBP]
+  1658 00000F9B 2B 4D BC                               SUB     ECX,DWORD [-68+EBP]
+  1659 00000F9E 89 4D D0                               MOV     DWORD [-48+EBP],ECX
+  1660 00000FA1                                 L321:
+  1661 00000FA1 8B 45 D0                               MOV     EAX,DWORD [-48+EBP]
+  1662 00000FA4 01 45 BC                               ADD     DWORD [-68+EBP],EAX
+  1663 00000FA7                                 L322:
+  1664 00000FA7 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+  1665 00000FAA 8B 45 E4                               MOV     EAX,DWORD [-28+EBP]
+  1666 00000FAD 8A 04 10                               MOV     AL,BYTE [EAX+EDX*1]
+  1667 00000FB0 88 02                                  MOV     BYTE [EDX],AL
+  1668 00000FB2 42                                     INC     EDX
+  1669 00000FB3 FF 4D D0                               DEC     DWORD [-48+EBP]
+  1670 00000FB6 89 55 14                               MOV     DWORD [20+EBP],EDX
+  1671 00000FB9 75 EC                                  JNE     L322
+  1672 00000FBB E9 FFFFFE0F                            JMP     L270
+  1673 00000FC0                                 L213:
+  1674 00000FC0 B8 00000001                            MOV     EAX,1
+  1675 00000FC5 E9 FFFFFE13                            JMP     L204
+  1676 00000FCA                                 L302:
+  1677 00000FCA 6A FF                                  PUSH    -1
+  1678 00000FCC 8D 42 FB                               LEA     EAX,DWORD [-5+EDX]
+  1679 00000FCF 50                                     PUSH    EAX
+  1680 00000FD0 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1681 00000FD3 E8 FFFFF6D0                            CALL    _tek_rdget0
+  1682 00000FD8 C1 E0 04                               SAL     EAX,4
+  1683 00000FDB 8B 55 9C                               MOV     EDX,DWORD [-100+EBP]
+  1684 00000FDE 6A 04                                  PUSH    4
+  1685 00000FE0 09 45 E4                               OR      DWORD [-28+EBP],EAX
+  1686 00000FE3 8B 45 98                               MOV     EAX,DWORD [-104+EBP]
+  1687 00000FE6 05 00001AD0                            ADD     EAX,6864
+  1688 00000FEB FF B2 0000044C                         PUSH    DWORD [1100+EDX]
+  1689 00000FF1 6A 01                                  PUSH    1
+  1690 00000FF3 6A 74                                  PUSH    116
+  1691 00000FF5 50                                     PUSH    EAX
+  1692 00000FF6 52                                     PUSH    EDX
+  1693 00000FF7 E8 FFFFF70E                            CALL    _tek_rdget1
+  1694 00000FFC 83 C4 14                               ADD     ESP,20
+  1695 00000FFF 50                                     PUSH    EAX
+  1696 00001000 E8 FFFFF91E                            CALL    _tek_revbit
+  1697 00001005 09 45 E4                               OR      DWORD [-28+EBP],EAX
+  1698 00001008 83 C4 14                               ADD     ESP,20
+  1699 0000100B E9 FFFFFF6E                            JMP     L295
+  1700 00001010                                 L350:
+  1701 00001010 31 C0                                  XOR     EAX,EAX
+  1702 00001012 8B 55 9C                               MOV     EDX,DWORD [-100+EBP]
+  1703 00001015 83 F9 04                               CMP     ECX,4
+  1704 00001018 51                                     PUSH    ECX
+  1705 00001019 0F 9D C0                               SETGE   AL
+  1706 0000101C 69 DB 000000F8                         IMUL    EBX,EBX,248
+  1707 00001022 FF B4 82 00000444                      PUSH    DWORD [1092+EDX+EAX*4]
+  1708 00001029 89 C8                                  MOV     EAX,ECX
+  1709 0000102B 6A 01                                  PUSH    1
+  1710 0000102D 83 C8 70                               OR      EAX,112
+  1711 00001030 8B 55 98                               MOV     EDX,DWORD [-104+EBP]
+  1712 00001033 50                                     PUSH    EAX
+  1713 00001034 8A 4D C8                               MOV     CL,BYTE [-56+EBP]
+  1714 00001037 B8 00000004                            MOV     EAX,4
+  1715 0000103C 01 DA                                  ADD     EDX,EBX
+  1716 0000103E D3 E0                                  SAL     EAX,CL
+  1717 00001040 8D 94 10 00001BC8                      LEA     EDX,DWORD [7112+EAX+EDX*1]
+  1718 00001047 52                                     PUSH    EDX
+  1719 00001048 E9 FFFFFF1B                            JMP     L348
+  1720 0000104D                                 L287:
+  1721 0000104D 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1722 00001050 8B 45 84                               MOV     EAX,DWORD [-124+EBP]
+  1723 00001053 05 00000E04                            ADD     EAX,3588
+  1724 00001058 FF B1 00000450                         PUSH    DWORD [1104+ECX]
+  1725 0000105E 6A 00                                  PUSH    0
+  1726 00001060 6A 71                                  PUSH    113
+  1727 00001062 50                                     PUSH    EAX
+  1728 00001063 51                                     PUSH    ECX
+  1729 00001064 E8 FFFFF6A1                            CALL    _tek_rdget1
+  1730 00001069 83 C4 14                               ADD     ESP,20
+  1731 0000106C 3B 45 B0                               CMP     EAX,DWORD [-80+EBP]
+  1732 0000106F 74 64                                  JE      L306
+  1733 00001071 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1734 00001074 C7 45 D0 FFFFFFFF                      MOV     DWORD [-48+EBP],-1
+  1735 0000107B FF B0 00000450                         PUSH    DWORD [1104+EAX]
+  1736 00001081 6A 00                                  PUSH    0
+  1737 00001083 8B 45 90                               MOV     EAX,DWORD [-112+EBP]
+  1738 00001086 6A 71                                  PUSH    113
+  1739 00001088 83 C0 04                               ADD     EAX,4
+  1740 0000108B 50                                     PUSH    EAX
+  1741 0000108C FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1742 0000108F E8 FFFFF676                            CALL    _tek_rdget1
+  1743 00001094 83 C4 14                               ADD     ESP,20
+  1744 00001097 85 C0                                  TEST    EAX,EAX
+  1745 00001099 75 15                                  JNE     L311
+  1746 0000109B 31 C0                                  XOR     EAX,EAX
+  1747 0000109D 83 7D C0 06                            CMP     DWORD [-64+EBP],6
+  1748 000010A1 0F 9F C0                               SETG    AL
+  1749 000010A4 8D 44 00 09                            LEA     EAX,DWORD [9+EAX+EAX*1]
+  1750 000010A8                                 L346:
+  1751 000010A8 89 45 C0                               MOV     DWORD [-64+EBP],EAX
+  1752 000010AB E9 FFFFFED1                            JMP     L310
+  1753 000010B0                                 L311:
+  1754 000010B0 FF 75 B0                               PUSH    DWORD [-80+EBP]
+  1755 000010B3 FF 75 A8                               PUSH    DWORD [-88+EBP]
+  1756 000010B6 6A 01                                  PUSH    1
+  1757 000010B8 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1758 000010BB E8 FFFFF881                            CALL    _tek_getlen5
+  1759 000010C0 89 45 D0                               MOV     DWORD [-48+EBP],EAX
+  1760 000010C3 83 C4 10                               ADD     ESP,16
+  1761 000010C6 31 C0                                  XOR     EAX,EAX
+  1762 000010C8 83 7D C0 06                            CMP     DWORD [-64+EBP],6
+  1763 000010CC 0F 9F C0                               SETG    AL
+  1764 000010CF 8D 44 40 08                            LEA     EAX,DWORD [8+EAX+EAX*2]
+  1765 000010D3 EB D3                                  JMP     L346
+  1766 000010D5                                 L306:
+  1767 000010D5 8B 55 9C                               MOV     EDX,DWORD [-100+EBP]
+  1768 000010D8 8B 45 84                               MOV     EAX,DWORD [-124+EBP]
+  1769 000010DB 05 00000E08                            ADD     EAX,3592
+  1770 000010E0 FF B2 00000450                         PUSH    DWORD [1104+EDX]
+  1771 000010E6 6A 00                                  PUSH    0
+  1772 000010E8 6A 71                                  PUSH    113
+  1773 000010EA 50                                     PUSH    EAX
+  1774 000010EB 52                                     PUSH    EDX
+  1775 000010EC E8 FFFFF619                            CALL    _tek_rdget1
+  1776 000010F1 83 C4 14                               ADD     ESP,20
+  1777 000010F4 3B 45 B0                               CMP     EAX,DWORD [-80+EBP]
+  1778 000010F7 74 14                                  JE      L312
+  1779 000010F9 8B 4D E8                               MOV     ECX,DWORD [-24+EBP]
+  1780 000010FC 89 4D D0                               MOV     DWORD [-48+EBP],ECX
+  1781 000010FF                                 L313:
+  1782 000010FF 8B 45 E4                               MOV     EAX,DWORD [-28+EBP]
+  1783 00001102 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+  1784 00001105 8B 45 D0                               MOV     EAX,DWORD [-48+EBP]
+  1785 00001108 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+  1786 0000110B EB A3                                  JMP     L311
+  1787 0000110D                                 L312:
+  1788 0000110D 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1789 00001110 FF B0 00000450                         PUSH    DWORD [1104+EAX]
+  1790 00001116 6A 00                                  PUSH    0
+  1791 00001118 8B 45 84                               MOV     EAX,DWORD [-124+EBP]
+  1792 0000111B 6A 71                                  PUSH    113
+  1793 0000111D 05 00000E0C                            ADD     EAX,3596
+  1794 00001122 50                                     PUSH    EAX
+  1795 00001123 FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1796 00001126 E8 FFFFF5DF                            CALL    _tek_rdget1
+  1797 0000112B 83 C4 14                               ADD     ESP,20
+  1798 0000112E 3B 45 B0                               CMP     EAX,DWORD [-80+EBP]
+  1799 00001131 74 0E                                  JE      L314
+  1800 00001133 8B 55 EC                               MOV     EDX,DWORD [-20+EBP]
+  1801 00001136 89 55 D0                               MOV     DWORD [-48+EBP],EDX
+  1802 00001139                                 L315:
+  1803 00001139 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+  1804 0000113C 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+  1805 0000113F EB BE                                  JMP     L313
+  1806 00001141                                 L314:
+  1807 00001141 83 7D B0 00                            CMP     DWORD [-80+EBP],0
+  1808 00001145 74 0E                                  JE      L351
+  1809 00001147                                 L316:
+  1810 00001147 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+  1811 0000114A 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+  1812 0000114D 89 4D D0                               MOV     DWORD [-48+EBP],ECX
+  1813 00001150 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+  1814 00001153 EB E4                                  JMP     L315
+  1815 00001155                                 L351:
+  1816 00001155 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1817 00001158 05 000002DC                            ADD     EAX,732
+  1818 0000115D 50                                     PUSH    EAX
+  1819 0000115E 8B 45 98                               MOV     EAX,DWORD [-104+EBP]
+  1820 00001161 6A 00                                  PUSH    0
+  1821 00001163 05 00001EB8                            ADD     EAX,7864
+  1822 00001168 6A 71                                  PUSH    113
+  1823 0000116A 50                                     PUSH    EAX
+  1824 0000116B FF 75 9C                               PUSH    DWORD [-100+EBP]
+  1825 0000116E E8 FFFFF597                            CALL    _tek_rdget1
+  1826 00001173 83 C4 14                               ADD     ESP,20
+  1827 00001176 85 C0                                  TEST    EAX,EAX
+  1828 00001178 75 CD                                  JNE     L316
+  1829 0000117A E9 FFFFFE41                            JMP     L213
+  1830 0000117F                                 L226:
+  1831 0000117F 8B 45 9C                               MOV     EAX,DWORD [-100+EBP]
+  1832 00001182 C6 40 3C 05                            MOV     BYTE [60+EAX],5
+  1833 00001186 C6 40 3D 03                            MOV     BYTE [61+EAX],3
+  1834 0000118A C6 40 5C 09                            MOV     BYTE [92+EAX],9
+  1835 0000118E C6 40 5D 02                            MOV     BYTE [93+EAX],2
+  1836 00001192 C7 40 0C FFFFFFFF                      MOV     DWORD [12+EAX],-1
+  1837 00001199 F7 45 24 00000040                      TEST    DWORD [36+EBP],64
+  1838 000011A0 74 15                                  JE      L238
+  1839 000011A2 C6 40 7C 00                            MOV     BYTE [124+EAX],0
+  1840 000011A6 C6 40 7D 01                            MOV     BYTE [125+EAX],1
+  1841 000011AA 8B 55 98                               MOV     EDX,DWORD [-104+EBP]
+  1842 000011AD C7 82 0000203C 0000FFFF                MOV     DWORD [8252+EDX],65535
+  1843 000011B7                                 L238:
+  1844 000011B7 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1845 000011BA C6 81 000002DC 00                      MOV     BYTE [732+ECX],0
+  1846 000011C1 C6 81 000002DD 01                      MOV     BYTE [733+ECX],1
+  1847 000011C8 8B 45 98                               MOV     EAX,DWORD [-104+EBP]
+  1848 000011CB 83 7D 24 FE                            CMP     DWORD [36+EBP],-2
+  1849 000011CF C7 80 00001EB8 0000FFFF                MOV     DWORD [7864+EAX],65535
+  1850 000011D9 0F 84 000000A7                         JE      L352
+  1851 000011DF C7 45 D0 00000000                      MOV     DWORD [-48+EBP],0
+  1852 000011E6                                 L250:
+  1853 000011E6 8B 4D D0                               MOV     ECX,DWORD [-48+EBP]
+  1854 000011E9 8A 81 [00000050]                       MOV     AL,BYTE [_pt2.5+ECX]
+  1855 000011EF 88 44 0D D4                            MOV     BYTE [-44+EBP+ECX*1],AL
+  1856 000011F3 41                                     INC     ECX
+  1857 000011F4 89 4D D0                               MOV     DWORD [-48+EBP],ECX
+  1858 000011F7 83 F9 0D                               CMP     ECX,13
+  1859 000011FA 7E EA                                  JLE     L250
+  1860 000011FC 8B 4D 24                               MOV     ECX,DWORD [36+EBP]
+  1861 000011FF B0 09                                  MOV     AL,9
+  1862 00001201 C7 45 A4 00000007                      MOV     DWORD [-92+EBP],7
+  1863 00001208 83 E1 03                               AND     ECX,3
+  1864 0000120B D3 7D A4                               SAR     DWORD [-92+EBP],CL
+  1865 0000120E C1 65 A4 04                            SAL     DWORD [-92+EBP],4
+  1866 00001212 83 4D A4 08                            OR      DWORD [-92+EBP],8
+  1867 00001216 F7 45 24 00000004                      TEST    DWORD [36+EBP],4
+  1868 0000121D 0F 94 C2                               SETE    DL
+  1869 00001220 28 D0                                  SUB     AL,DL
+  1870 00001222 F7 45 24 00000008                      TEST    DWORD [36+EBP],8
+  1871 00001229 88 45 D5                               MOV     BYTE [-43+EBP],AL
+  1872 0000122C B0 0D                                  MOV     AL,13
+  1873 0000122E 0F 94 C2                               SETE    DL
+  1874 00001231 28 D0                                  SUB     AL,DL
+  1875 00001233 F7 45 24 00000010                      TEST    DWORD [36+EBP],16
+  1876 0000123A 88 45 D9                               MOV     BYTE [-39+EBP],AL
+  1877 0000123D B0 11                                  MOV     AL,17
+  1878 0000123F 0F 94 C2                               SETE    DL
+  1879 00001242 28 D0                                  SUB     AL,DL
+  1880 00001244 F7 45 24 00000020                      TEST    DWORD [36+EBP],32
+  1881 0000124B 88 45 DD                               MOV     BYTE [-35+EBP],AL
+  1882 0000124E B0 13                                  MOV     AL,19
+  1883 00001250 0F 94 C2                               SETE    DL
+  1884 00001253 28 D0                                  SUB     AL,DL
+  1885 00001255 88 45 DF                               MOV     BYTE [-33+EBP],AL
+  1886 00001258                                 L245:
+  1887 00001258 C7 45 D0 00000000                      MOV     DWORD [-48+EBP],0
+  1888 0000125F                                 L263:
+  1889 0000125F 8B 55 D0                               MOV     EDX,DWORD [-48+EBP]
+  1890 00001262 8B 4D 9C                               MOV     ECX,DWORD [-100+EBP]
+  1891 00001265 0F B6 44 15 D4                         MOVZX   EAX,BYTE [-44+EBP+EDX*1]
+  1892 0000126A C1 E0 05                               SAL     EAX,5
+  1893 0000126D 8D 44 08 1C                            LEA     EAX,DWORD [28+EAX+ECX*1]
+  1894 00001271 89 84 91 0000041C                      MOV     DWORD [1052+ECX+EDX*4],EAX
+  1895 00001278 42                                     INC     EDX
+  1896 00001279 89 55 D0                               MOV     DWORD [-48+EBP],EDX
+  1897 0000127C 83 FA 0D                               CMP     EDX,13
+  1898 0000127F 7E DE                                  JLE     L263
+  1899 00001281 E9 FFFFF984                            JMP     L237
+  1900 00001286                                 L352:
+  1901 00001286 C7 81 000002F0 00000000                MOV     DWORD [752+ECX],0
+  1902 00001290 C7 45 D0 00000000                      MOV     DWORD [-48+EBP],0
+  1903 00001297                                 L244:
+  1904 00001297 8B 55 D0                               MOV     EDX,DWORD [-48+EBP]
+  1905 0000129A 8A 82 [00000042]                       MOV     AL,BYTE [_pt1.4+EDX]
+  1906 000012A0 88 44 15 D4                            MOV     BYTE [-44+EBP+EDX*1],AL
+  1907 000012A4 42                                     INC     EDX
+  1908 000012A5 89 55 D0                               MOV     DWORD [-48+EBP],EDX
+  1909 000012A8 83 FA 0D                               CMP     EDX,13
+  1910 000012AB 7E EA                                  JLE     L244
+  1911 000012AD EB A9                                  JMP     L245
+  1912 000012AF                                 L211:
+  1913 000012AF 83 C5 0C                               ADD     EBP,12
+  1914 000012B2 B8 00000001                            MOV     EAX,1
+  1915 000012B7 E9 FFFFF870                            JMP     L212
+  1916 000012BC                                 _tek_decode5:
+  1917 000012BC 55                                     PUSH    EBP
+  1918 000012BD 89 E5                                  MOV     EBP,ESP
+  1919 000012BF 57                                     PUSH    EDI
+  1920 000012C0 56                                     PUSH    ESI
+  1921 000012C1 31 FF                                  XOR     EDI,EDI
+  1922 000012C3 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+  1923 000012C6 53                                     PUSH    EBX
+  1924 000012C7 89 C3                                  MOV     EBX,EAX
+  1925 000012C9 83 C0 10                               ADD     EAX,16
+  1926 000012CC 89 45 0C                               MOV     DWORD [12+EBP],EAX
+  1927 000012CF 03 5D 08                               ADD     EBX,DWORD [8+EBP]
+  1928 000012D2 8D 45 0C                               LEA     EAX,DWORD [12+EBP]
+  1929 000012D5 50                                     PUSH    EAX
+  1930 000012D6 E8 FFFFED25                            CALL    _tek_getnum_s7s
+  1931 000012DB 59                                     POP     ECX
+  1932 000012DC 89 C6                                  MOV     ESI,EAX
+  1933 000012DE 85 C0                                  TEST    EAX,EAX
+  1934 000012E0 7E 59                                  JLE     L354
+  1935 000012E2 8D 45 0C                               LEA     EAX,DWORD [12+EBP]
+  1936 000012E5 50                                     PUSH    EAX
+  1937 000012E6 E8 FFFFED15                            CALL    _tek_getnum_s7s
+  1938 000012EB 5A                                     POP     EDX
+  1939 000012EC A9 00000001                            TEST    EAX,1
+  1940 000012F1 74 60                                  JE      L363
+  1941 000012F3 89 C1                                  MOV     ECX,EAX
+  1942 000012F5 BA 00000001                            MOV     EDX,1
+  1943 000012FA D1 F9                                  SAR     ECX,1
+  1944 000012FC 83 E1 0F                               AND     ECX,15
+  1945 000012FF 83 C1 08                               ADD     ECX,8
+  1946 00001302 D3 E2                                  SAL     EDX,CL
+  1947 00001304 B9 00000001                            MOV     ECX,1
+  1948 00001309 A9 00000020                            TEST    EAX,32
+  1949 0000130E 75 2D                                  JNE     L353
+  1950 00001310 81 FA 00000100                         CMP     EDX,256
+  1951 00001316 74 0E                                  JE      L361
+  1952 00001318 B9 00000001                            MOV     ECX,1
+  1953 0000131D 39 D6                                  CMP     ESI,EDX
+  1954 0000131F 7F 1C                                  JG      L353
+  1955 00001321 83 E0 40                               AND     EAX,64
+  1956 00001324 75 21                                  JNE     L364
+  1957 00001326                                 L361:
+  1958 00001326 FF 75 10                               PUSH    DWORD [16+EBP]
+  1959 00001329 56                                     PUSH    ESI
+  1960 0000132A 2B 5D 0C                               SUB     EBX,DWORD [12+EBP]
+  1961 0000132D FF 75 0C                               PUSH    DWORD [12+EBP]
+  1962 00001330 53                                     PUSH    EBX
+  1963 00001331                                 L362:
+  1964 00001331 E8 FFFFF203                            CALL    _tek_lzrestore_tek5
+  1965 00001336 83 C4 10                               ADD     ESP,16
+  1966 00001339 89 C7                                  MOV     EDI,EAX
+  1967 0000133B                                 L354:
+  1968 0000133B 89 F9                                  MOV     ECX,EDI
+  1969 0000133D                                 L353:
+  1970 0000133D 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+  1971 00001340 89 C8                                  MOV     EAX,ECX
+  1972 00001342 5B                                     POP     EBX
+  1973 00001343 5E                                     POP     ESI
+  1974 00001344 5F                                     POP     EDI
+  1975 00001345 5D                                     POP     EBP
+  1976 00001346 C3                                     RET
+  1977 00001347                                 L364:
+  1978 00001347 8D 45 0C                               LEA     EAX,DWORD [12+EBP]
+  1979 0000134A 50                                     PUSH    EAX
+  1980 0000134B E8 FFFFECB0                            CALL    _tek_getnum_s7s
+  1981 00001350 5F                                     POP     EDI
+  1982 00001351 EB D3                                  JMP     L361
+  1983 00001353                                 L363:
+  1984 00001353 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+  1985 00001356 FF 75 10                               PUSH    DWORD [16+EBP]
+  1986 00001359 29 C3                                  SUB     EBX,EAX
+  1987 0000135B 56                                     PUSH    ESI
+  1988 0000135C 8D 50 FF                               LEA     EDX,DWORD [-1+EAX]
+  1989 0000135F 52                                     PUSH    EDX
+  1990 00001360 8D 43 01                               LEA     EAX,DWORD [1+EBX]
+  1991 00001363 50                                     PUSH    EAX
+  1992 00001364 EB CB                                  JMP     L362
diff --git a/haribote/tek.nas b/haribote/tek.nas
new file mode 100644 (file)
index 0000000..e5d5f05
--- /dev/null
@@ -0,0 +1,1992 @@
+[FORMAT "WCOFF"]
+[INSTRSET "i486p"]
+[OPTIMIZE 1]
+[OPTION 1]
+[BITS 32]
+       EXTERN  _memman_alloc_4k
+       EXTERN  _memman_free_4k
+[FILE "tek.c"]
+[SECTION .text]
+_tek_getnum_s7s:
+       PUSH    EBP
+       XOR     ECX,ECX
+       MOV     EBP,ESP
+       PUSH    EBX
+       MOV     EBX,DWORD [8+EBP]
+       MOV     EDX,DWORD [EBX]
+L2:
+       SAL     ECX,7
+       MOVZX   EAX,BYTE [EDX]
+       OR      ECX,EAX
+       INC     EDX
+       TEST    ECX,1
+       JE      L2
+       SHR     ECX,1
+       MOV     DWORD [EBX],EDX
+       POP     EBX
+       MOV     EAX,ECX
+       POP     EBP
+       RET
+[SECTION .data]
+_header.0:
+       DB      -1
+       DB      -1
+       DB      -1
+       DB      1
+       DB      0
+       DB      0
+       DB      0
+       DB      79
+       DB      83
+       DB      65
+       DB      83
+       DB      75
+       DB      67
+       DB      77
+       DB      80
+[SECTION .text]
+       GLOBAL  _tek_getsize
+_tek_getsize:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       MOV     EDI,_header.0
+       PUSH    EBX
+       OR      EBX,-1
+       PUSH    EDX
+       MOV     EAX,DWORD [8+EBP]
+       MOV     DWORD [-16+EBP],EAX
+       MOV     ESI,EAX
+       CLD
+       MOV     EAX,15
+       INC     ESI
+       MOV     ECX,EAX
+       REPE
+       CMPSB
+       JNE     L7
+       MOV     EDX,DWORD [-16+EBP]
+       MOV     AL,BYTE [EDX]
+       CMP     AL,-125
+       JE      L8
+       CMP     AL,-123
+       JE      L8
+       CMP     AL,-119
+       JE      L8
+L7:
+       LEA     ESP,DWORD [-12+EBP]
+       MOV     EAX,EBX
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L8:
+       MOV     EAX,DWORD [-16+EBP]
+       ADD     EAX,16
+       MOV     DWORD [8+EBP],EAX
+       LEA     EAX,DWORD [8+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       MOV     EBX,EAX
+       POP     EAX
+       JMP     L7
+       GLOBAL  _tek_decomp
+_tek_decomp:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    ESI
+       PUSH    EBX
+       OR      EBX,-1
+       MOV     EAX,DWORD [8+EBP]
+       MOV     ECX,DWORD [12+EBP]
+       MOV     ESI,DWORD [16+EBP]
+       MOV     DL,BYTE [EAX]
+       CMP     DL,-125
+       JE      L17
+       CMP     DL,-123
+       JE      L18
+       CMP     DL,-119
+       JE      L19
+L11:
+       XOR     EAX,EAX
+       TEST    EBX,EBX
+       SETE    AL
+       LEA     ESP,DWORD [-8+EBP]
+       DEC     EAX
+       POP     EBX
+       POP     ESI
+       POP     EBP
+       RET
+L19:
+       PUSH    ECX
+       PUSH    EAX
+       PUSH    ESI
+       CALL    _tek_decode5
+L16:
+       MOV     EBX,EAX
+       ADD     ESP,12
+       JMP     L11
+L18:
+       PUSH    ECX
+       PUSH    EAX
+       PUSH    ESI
+       CALL    _tek_decode2
+       JMP     L16
+L17:
+       PUSH    ECX
+       PUSH    EAX
+       PUSH    ESI
+       CALL    _tek_decode1
+       JMP     L16
+_tek_lzrestore_stk1:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       SUB     ESP,12
+       MOV     ESI,DWORD [20+EBP]
+       MOV     EAX,DWORD [16+EBP]
+       ADD     EAX,ESI
+       MOV     DWORD [-24+EBP],ESI
+       MOV     DWORD [-20+EBP],EAX
+       MOV     EAX,DWORD [12+EBP]
+       MOV     DWORD [-16+EBP],EAX
+L21:
+       MOV     EAX,DWORD [-16+EBP]
+       MOVZX   EDI,BYTE [EAX]
+       MOV     EBX,EDI
+       INC     EAX
+       AND     EBX,15
+       MOV     DWORD [-16+EBP],EAX
+       JE      L53
+L24:
+       SAR     EDI,4
+       JE      L54
+L26:
+       MOV     EAX,DWORD [-16+EBP]
+       MOV     DL,BYTE [EAX]
+       INC     EAX
+       MOV     BYTE [ESI],DL
+       INC     ESI
+       DEC     EBX
+       MOV     DWORD [-16+EBP],EAX
+       JNE     L26
+       CMP     ESI,DWORD [-20+EBP]
+       JAE     L22
+L31:
+       MOV     EAX,DWORD [-16+EBP]
+       MOVZX   ECX,BYTE [EAX]
+       MOV     EBX,ECX
+       INC     EAX
+       AND     EBX,15
+       MOV     DWORD [-16+EBP],EAX
+       TEST    ECX,1
+       JNE     L34
+L35:
+       SAL     EBX,7
+       MOV     EAX,DWORD [-16+EBP]
+       MOVZX   EDX,BYTE [EAX]
+       OR      EBX,EDX
+       INC     EAX
+       MOV     DWORD [-16+EBP],EAX
+       TEST    EBX,1
+       JE      L35
+L34:
+       SAR     EBX,1
+       SAR     ECX,4
+       NOT     EBX
+       JNE     L39
+L40:
+       SAL     ECX,7
+       MOV     EAX,DWORD [-16+EBP]
+       MOVZX   EDX,BYTE [EAX]
+       OR      ECX,EDX
+       INC     EAX
+       MOV     DWORD [-16+EBP],EAX
+       TEST    ECX,1
+       JE      L40
+       SAR     ECX,1
+L39:
+       LEA     EAX,DWORD [EBX+ESI*1]
+       INC     ECX
+       CMP     EAX,DWORD [-24+EBP]
+       JB      L45
+       LEA     EAX,DWORD [ECX+ESI*1]
+       CMP     EAX,DWORD [-20+EBP]
+       JBE     L47
+       MOV     ECX,DWORD [-20+EBP]
+       SUB     ECX,ESI
+L47:
+       MOV     AL,BYTE [EBX+ESI*1]
+       MOV     BYTE [ESI],AL
+       INC     ESI
+       DEC     ECX
+       JNE     L47
+       DEC     EDI
+       JNE     L31
+       CMP     ESI,DWORD [-20+EBP]
+       JB      L21
+L22:
+       XOR     EAX,EAX
+L20:
+       LEA     ESP,DWORD [-12+EBP]
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L45:
+       MOV     EAX,1
+       JMP     L20
+L54:
+       LEA     EAX,DWORD [-16+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       POP     ECX
+       MOV     EDI,EAX
+       JMP     L26
+L53:
+       LEA     EAX,DWORD [-16+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       MOV     EBX,EAX
+       POP     EAX
+       JMP     L24
+_tek_decode1:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       MOV     EAX,DWORD [12+EBP]
+       LEA     ESI,DWORD [12+EBP]
+       MOV     EDI,EAX
+       PUSH    ESI
+       ADD     EAX,16
+       ADD     EDI,DWORD [8+EBP]
+       MOV     DWORD [12+EBP],EAX
+       CALL    _tek_getnum_s7s
+       MOV     EBX,EAX
+       POP     EAX
+       TEST    EBX,EBX
+       JLE     L56
+       PUSH    ESI
+       CALL    _tek_getnum_s7s
+       MOV     ECX,EAX
+       MOV     EDX,EAX
+       SAR     ECX,1
+       MOV     EAX,1
+       AND     ECX,15
+       ADD     ECX,8
+       SAL     EAX,CL
+       CMP     EBX,EAX
+       POP     ECX
+       JG      L58
+       MOV     EAX,EDX
+       AND     EAX,33
+       DEC     EAX
+       JE      L57
+L58:
+       MOV     EDX,1
+L55:
+       LEA     ESP,DWORD [-12+EBP]
+       MOV     EAX,EDX
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L57:
+       AND     EDX,64
+       JNE     L61
+L59:
+       PUSH    ESI
+       CALL    _tek_getnum_s7s
+       POP     EDX
+       TEST    EAX,EAX
+       MOV     EDX,1
+       JNE     L55
+       PUSH    DWORD [16+EBP]
+       PUSH    EBX
+       SUB     EDI,DWORD [12+EBP]
+       PUSH    DWORD [12+EBP]
+       PUSH    EDI
+       CALL    _tek_lzrestore_stk1
+       MOV     EDX,EAX
+       JMP     L55
+L61:
+       PUSH    ESI
+       CALL    _tek_getnum_s7s
+       POP     ECX
+       JMP     L59
+L56:
+       XOR     EDX,EDX
+       JMP     L55
+_tek_getnum_s7:
+       PUSH    EBP
+       XOR     ECX,ECX
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       XOR     ESI,ESI
+       MOV     EDI,DWORD [8+EBP]
+       PUSH    EBX
+       MOV     EBX,1
+       MOV     EDX,DWORD [EDI]
+L63:
+       SAL     ECX,7
+       MOVZX   EAX,BYTE [EDX]
+       OR      ECX,EAX
+       INC     EDX
+       TEST    ECX,1
+       JNE     L64
+       SAL     EBX,7
+       ADD     ESI,EBX
+       JMP     L63
+L64:
+       SHR     ECX,1
+       MOV     DWORD [EDI],EDX
+       POP     EBX
+       LEA     EAX,DWORD [ESI+ECX*1]
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+_tek_lzrestore_stk2:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       SUB     ESP,36
+       MOV     EDX,DWORD [16+EBP]
+       MOV     EAX,DWORD [20+EBP]
+       ADD     EAX,EDX
+       MOV     ECX,DWORD [20+EBP]
+       MOV     DWORD [-40+EBP],EAX
+       MOV     DWORD [-44+EBP],ECX
+       MOV     EAX,DWORD [12+EBP]
+       MOV     DWORD [-32+EBP],EAX
+       MOV     DWORD [-36+EBP],0
+L72:
+       MOV     ECX,DWORD [-36+EBP]
+       MOV     EAX,DWORD [-36+EBP]
+       NOT     EAX
+       MOV     DWORD [-28+EBP+ECX*4],EAX
+       INC     ECX
+       MOV     DWORD [-36+EBP],ECX
+       CMP     ECX,3
+       JLE     L72
+       MOV     BYTE [-46+EBP],0
+       MOV     BYTE [-45+EBP],0
+       TEST    EDX,EDX
+       JNE     L117
+L73:
+       XOR     EDX,EDX
+L67:
+       LEA     ESP,DWORD [-12+EBP]
+       MOV     EAX,EDX
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L117:
+       LEA     EAX,DWORD [-32+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       MOV     EDX,1
+       POP     ECX
+       TEST    EAX,EAX
+       JNE     L67
+L75:
+       MOV     DWORD [-36+EBP],0
+L78:
+       INC     DWORD [-36+EBP]
+       CMP     DWORD [-36+EBP],16
+       JG      L118
+       CMP     BYTE [-46+EBP],0
+       JNE     L82
+       MOV     EAX,DWORD [-32+EBP]
+       MOV     BYTE [-46+EBP],8
+       MOV     DL,BYTE [EAX]
+       INC     EAX
+       MOV     BYTE [-45+EBP],DL
+       MOV     DWORD [-32+EBP],EAX
+L82:
+       MOV     AL,BYTE [-45+EBP]
+       DEC     BYTE [-46+EBP]
+       AND     EAX,1
+       SHR     BYTE [-45+EBP],1
+       AND     EAX,1
+       JE      L78
+L84:
+       MOV     EAX,DWORD [-32+EBP]
+       MOV     ECX,DWORD [20+EBP]
+       MOV     DL,BYTE [EAX]
+       INC     EAX
+       MOV     BYTE [ECX],DL
+       INC     ECX
+       DEC     DWORD [-36+EBP]
+       MOV     DWORD [-32+EBP],EAX
+       MOV     DWORD [20+EBP],ECX
+       JNE     L84
+       MOV     EAX,DWORD [-40+EBP]
+       CMP     ECX,EAX
+       JAE     L73
+L89:
+       INC     DWORD [-36+EBP]
+       CMP     DWORD [-36+EBP],16
+       JG      L119
+       CMP     BYTE [-46+EBP],0
+       JNE     L93
+       MOV     EAX,DWORD [-32+EBP]
+       MOV     BYTE [-46+EBP],8
+       MOV     DL,BYTE [EAX]
+       INC     EAX
+       MOV     BYTE [-45+EBP],DL
+       MOV     DWORD [-32+EBP],EAX
+L93:
+       MOV     AL,BYTE [-45+EBP]
+       DEC     BYTE [-46+EBP]
+       AND     EAX,1
+       SHR     BYTE [-45+EBP],1
+       AND     EAX,1
+       JE      L89
+L95:
+       MOV     EAX,DWORD [-32+EBP]
+       MOVZX   EBX,BYTE [EAX]
+       MOV     EDI,EBX
+       INC     EAX
+       SAR     EDI,4
+       AND     EBX,15
+       MOV     DWORD [-32+EBP],EAX
+       TEST    EBX,1
+       JE      L120
+L98:
+       SAR     EBX,1
+       CMP     EBX,3
+       LEA     ESI,DWORD [-6+EBX]
+       NOT     ESI
+       JG      L99
+       MOV     ESI,DWORD [-28+EBP+EBX*4]
+L99:
+       CMP     EBX,4
+       JE      L121
+L100:
+       CMP     EBX,5
+       JE      L122
+L101:
+       TEST    EDI,EDI
+       JE      L123
+L102:
+       INC     EDI
+       TEST    EBX,EBX
+       JLE     L103
+       CMP     EBX,1
+       JLE     L104
+       CMP     EBX,2
+       JLE     L105
+       MOV     EAX,DWORD [-20+EBP]
+       MOV     DWORD [-16+EBP],EAX
+L105:
+       MOV     EAX,DWORD [-24+EBP]
+       MOV     DWORD [-20+EBP],EAX
+L104:
+       MOV     EAX,DWORD [-28+EBP]
+       MOV     DWORD [-28+EBP],ESI
+       MOV     DWORD [-24+EBP],EAX
+L103:
+       MOV     EAX,DWORD [20+EBP]
+       ADD     EAX,ESI
+       CMP     EAX,DWORD [-44+EBP]
+       JB      L107
+       MOV     EAX,DWORD [20+EBP]
+       ADD     EAX,EDI
+       CMP     EAX,DWORD [-40+EBP]
+       JBE     L109
+       MOV     EDI,DWORD [-40+EBP]
+       SUB     EDI,DWORD [20+EBP]
+L109:
+       MOV     ECX,DWORD [20+EBP]
+       MOV     AL,BYTE [ESI+ECX*1]
+       MOV     BYTE [ECX],AL
+       INC     ECX
+       DEC     EDI
+       MOV     DWORD [20+EBP],ECX
+       JNE     L109
+       DEC     DWORD [-36+EBP]
+       JNE     L95
+       MOV     EAX,DWORD [-40+EBP]
+       CMP     ECX,EAX
+       JB      L75
+       JMP     L73
+L107:
+       MOV     EDX,1
+       JMP     L67
+L123:
+       LEA     EAX,DWORD [-32+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7
+       LEA     EDI,DWORD [16+EAX]
+       POP     EAX
+       JMP     L102
+L122:
+       LEA     EAX,DWORD [-32+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7
+       ADD     EAX,DWORD [-28+EBP]
+       LEA     ESI,DWORD [1+EAX]
+       POP     EAX
+       JMP     L101
+L121:
+       LEA     EAX,DWORD [-32+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7
+       MOV     ESI,EAX
+       POP     EAX
+       NOT     ESI
+       ADD     ESI,DWORD [-28+EBP]
+       JMP     L100
+L120:
+       LEA     EAX,DWORD [-32+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7
+       INC     EAX
+       SAL     EAX,4
+       OR      EBX,EAX
+       POP     EAX
+       JMP     L98
+L119:
+       LEA     EAX,DWORD [-32+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       ADD     DWORD [-36+EBP],EAX
+       POP     EAX
+       JMP     L95
+L118:
+       LEA     EAX,DWORD [-32+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       POP     EDX
+       ADD     DWORD [-36+EBP],EAX
+       JMP     L84
+_tek_decode2:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       LEA     EDI,DWORD [12+EBP]
+       PUSH    EAX
+       MOV     EAX,DWORD [12+EBP]
+       PUSH    EDI
+       MOV     ESI,EAX
+       ADD     EAX,16
+       ADD     ESI,DWORD [8+EBP]
+       MOV     DWORD [12+EBP],EAX
+       MOV     DWORD [-16+EBP],0
+       CALL    _tek_getnum_s7s
+       MOV     EBX,EAX
+       POP     EAX
+       TEST    EBX,EBX
+       JLE     L125
+       PUSH    EDI
+       CALL    _tek_getnum_s7s
+       MOV     ECX,EAX
+       MOV     EDX,EAX
+       SAR     ECX,1
+       MOV     EAX,1
+       AND     ECX,15
+       ADD     ECX,8
+       SAL     EAX,CL
+       CMP     EBX,EAX
+       POP     ECX
+       JG      L127
+       MOV     EAX,EDX
+       AND     EAX,33
+       DEC     EAX
+       JE      L126
+L127:
+       MOV     EAX,1
+L124:
+       LEA     ESP,DWORD [-12+EBP]
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L126:
+       AND     EDX,64
+       JNE     L129
+L128:
+       PUSH    DWORD [16+EBP]
+       PUSH    EBX
+       SUB     ESI,DWORD [12+EBP]
+       PUSH    DWORD [12+EBP]
+       PUSH    ESI
+       CALL    _tek_lzrestore_stk2
+       ADD     ESP,16
+       MOV     DWORD [-16+EBP],EAX
+L125:
+       MOV     EAX,DWORD [-16+EBP]
+       JMP     L124
+L129:
+       PUSH    EDI
+       CALL    _tek_getnum_s7s
+       POP     EDI
+       JMP     L128
+[SECTION .data]
+_prop0_table.1:
+       DB      93
+       DB      0
+_prop1_table.2:
+       DB      0
+[SECTION .text]
+_tek_lzrestore_tek5:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       SUB     ESP,16
+       MOV     EBX,DWORD [12+EBP]
+       MOVZX   ECX,BYTE [EBX]
+       MOV     EAX,ECX
+       AND     EAX,15
+       MOV     DWORD [-24+EBP],-1
+       CMP     EAX,1
+       JE      L132
+       MOV     DWORD [-24+EBP],-2
+       CMP     EAX,5
+       JE      L132
+       MOV     DWORD [-24+EBP],0
+       CMP     EAX,9
+       JE      L132
+       MOV     EAX,1
+L130:
+       LEA     ESP,DWORD [-12+EBP]
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L132:
+       INC     EBX
+       SAR     ECX,4
+       JNE     L137
+       MOVZX   ECX,BYTE [EBX]
+       INC     EBX
+L138:
+       MOV     EAX,ECX
+       MOV     ESI,45
+       CDQ
+       IDIV    ESI
+       MOV     DWORD [-16+EBP],EAX
+       MOV     ESI,9
+       MOV     EAX,EDX
+       CDQ
+       IDIV    ESI
+       CMP     DWORD [-24+EBP],0
+       MOV     DWORD [-28+EBP],EDX
+       MOV     DWORD [-20+EBP],EAX
+       JNE     L143
+       MOVZX   EAX,BYTE [EBX]
+       MOV     DWORD [-24+EBP],EAX
+       INC     EBX
+L143:
+       CMP     DWORD [-24+EBP],-1
+       JE      L146
+L144:
+       MOV     ECX,DWORD [-28+EBP]
+       MOV     EAX,3072
+       ADD     ECX,DWORD [-16+EBP]
+       SAL     EAX,CL
+       LEA     EDI,DWORD [9984+EAX]
+       PUSH    EDI
+       PUSH    3932160
+       CALL    _memman_alloc_4k
+       MOV     ESI,EAX
+       POP     EAX
+       POP     EDX
+       OR      EAX,-1
+       TEST    ESI,ESI
+       JE      L130
+       PUSH    DWORD [-24+EBP]
+       PUSH    DWORD [-16+EBP]
+       PUSH    DWORD [-20+EBP]
+       PUSH    DWORD [-28+EBP]
+       PUSH    DWORD [20+EBP]
+       PUSH    DWORD [16+EBP]
+       PUSH    EBX
+       PUSH    ESI
+       CALL    _tek_decmain5
+       ADD     ESP,32
+       PUSH    EDI
+       MOV     DWORD [-24+EBP],EAX
+       PUSH    ESI
+       PUSH    3932160
+       CALL    _memman_free_4k
+       MOV     EAX,DWORD [-24+EBP]
+       JMP     L130
+L146:
+       MOV     EDI,DWORD [-16+EBP]
+       MOV     EDX,DWORD [-20+EBP]
+       MOV     DWORD [-16+EBP],EDX
+       MOV     DWORD [-20+EBP],EDI
+       JMP     L144
+L137:
+       CMP     DWORD [-24+EBP],-1
+       JE      L147
+       MOV     EAX,1
+       CMP     ECX,1
+       JG      L130
+       MOVZX   ECX,BYTE [_prop1_table.2-1+ECX]
+       JMP     L138
+L147:
+       MOV     EAX,1
+       CMP     ECX,2
+       JG      L130
+       MOVZX   ECX,BYTE [_prop0_table.1-1+ECX]
+       JMP     L138
+_tek_setbm5:
+       PUSH    EBP
+       OR      EAX,-1
+       MOV     EBP,ESP
+       MOV     EDX,1
+       PUSH    EDI
+       MOV     EDI,EAX
+       PUSH    ESI
+       MOV     ECX,DWORD [16+EBP]
+       MOV     ESI,DWORD [8+EBP]
+       PUSH    EBX
+       MOV     EBX,DWORD [12+EBP]
+       MOV     BYTE [1+ESI],CL
+       MOV     BYTE [ESI],BL
+       ADD     ECX,EBX
+       SAL     EDI,CL
+       MOV     CL,BL
+       SAL     EDX,CL
+       SAL     EAX,CL
+       AND     EAX,65535
+       OR      EDX,EDI
+       NOT     EDI
+       MOV     DWORD [12+ESI],EAX
+       AND     EDI,EAX
+       AND     EDX,EAX
+       MOV     DWORD [4+ESI],EDI
+       NOT     EAX
+       MOV     DWORD [8+ESI],EDX
+       MOV     DWORD [16+ESI],EAX
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+_tek_rdget0:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       MOV     EDI,DWORD [8+EBP]
+       MOV     ESI,DWORD [16+EBP]
+L150:
+       MOV     EAX,DWORD [4+EDI]
+       CMP     EAX,16777215
+       JA      L160
+L156:
+       MOV     EBX,EAX
+       MOV     ECX,DWORD [8+EDI]
+       SAL     EBX,8
+       MOV     EAX,DWORD [EDI]
+       SAL     ECX,8
+       MOV     DWORD [4+EDI],EBX
+       MOVZX   EDX,BYTE [EAX]
+       OR      ECX,EDX
+       INC     EAX
+       MOV     DWORD [EDI],EAX
+       MOV     DWORD [8+EDI],ECX
+       MOV     EAX,EBX
+       CMP     EBX,16777215
+       JBE     L156
+L160:
+       MOV     EDX,DWORD [4+EDI]
+       MOV     EAX,DWORD [8+EDI]
+       SHR     EDX,1
+       ADD     ESI,ESI
+       MOV     DWORD [4+EDI],EDX
+       CMP     EAX,EDX
+       JB      L152
+       SUB     EAX,EDX
+       OR      ESI,1
+       MOV     DWORD [8+EDI],EAX
+L152:
+       DEC     DWORD [12+EBP]
+       JNE     L150
+       NOT     ESI
+       POP     EBX
+       MOV     EAX,ESI
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+_tek_rdget1:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       SUB     ESP,20
+       MOV     EAX,DWORD [16+EBP]
+       MOV     EDI,DWORD [24+EBP]
+       SAR     EAX,4
+       MOV     DWORD [-24+EBP],EAX
+       MOV     EAX,DWORD [20+EBP]
+       SAL     EAX,2
+       AND     DWORD [16+EBP],15
+       SUB     DWORD [12+EBP],EAX
+L162:
+       MOV     EAX,DWORD [12+EBP]
+       MOV     EDX,DWORD [20+EBP]
+       LEA     EDX,DWORD [EAX+EDX*4]
+       MOV     DWORD [-20+EBP],EDX
+       MOV     EAX,DWORD [EDX]
+       MOV     DWORD [-16+EBP],EAX
+       MOV     EAX,DWORD [20+EDI]
+       TEST    EAX,EAX
+       JE      L165
+       DEC     EAX
+       MOV     DWORD [20+EDI],EAX
+       TEST    EAX,EAX
+       JE      L187
+L166:
+       MOV     EAX,DWORD [4+EDI]
+       CMP     DWORD [-16+EBP],EAX
+       JB      L186
+       MOV     EAX,DWORD [8+EDI]
+       CMP     DWORD [-16+EBP],EAX
+       JBE     L174
+L186:
+       MOV     DWORD [-16+EBP],EAX
+L173:
+       MOV     EDX,DWORD [-20+EBP]
+       MOV     EAX,DWORD [-16+EBP]
+       MOV     DWORD [EDX],EAX
+L165:
+       MOV     EDX,DWORD [8+EBP]
+       MOV     EAX,DWORD [4+EDX]
+       CMP     EAX,16777215
+       JA      L185
+L179:
+       MOV     EBX,EAX
+       MOV     EAX,DWORD [8+EBP]
+       SAL     EBX,8
+       MOV     ECX,DWORD [8+EAX]
+       MOV     DWORD [4+EAX],EBX
+       SAL     ECX,8
+       MOV     EAX,DWORD [EAX]
+       MOVZX   EDX,BYTE [EAX]
+       OR      ECX,EDX
+       INC     EAX
+       MOV     EDX,DWORD [8+EBP]
+       CMP     EBX,16777215
+       MOV     DWORD [EDX],EAX
+       MOV     DWORD [8+EDX],ECX
+       MOV     EAX,EBX
+       JBE     L179
+L185:
+       MOV     EAX,DWORD [8+EBP]
+       SAL     DWORD [20+EBP],1
+       MOV     ESI,DWORD [4+EAX]
+       MOV     ECX,ESI
+       AND     ECX,DWORD [12+EAX]
+       MOV     EAX,DWORD [-16+EBP]
+       MUL     ECX
+       SHRD    EAX,EDX,16
+       SHR     EDX,16
+       MOV     DWORD [-32+EBP],EAX
+       MOV     DWORD [-28+EBP],EDX
+       MOV     EBX,EAX
+       MOV     EDX,DWORD [8+EBP]
+       MOV     ECX,DWORD [8+EDX]
+       CMP     ECX,EAX
+       JAE     L180
+       MOV     EAX,DWORD [-32+EBP]
+       OR      DWORD [20+EBP],1
+       MOV     DWORD [4+EDX],EAX
+       MOV     EDX,DWORD [-20+EBP]
+       MOV     EAX,65536
+       SUB     EAX,DWORD [-16+EBP]
+       MOVZX   ECX,BYTE [1+EDI]
+       SHR     EAX,CL
+       AND     EAX,DWORD [12+EDI]
+       ADD     DWORD [EDX],EAX
+L181:
+       MOV     EAX,DWORD [-24+EBP]
+       DEC     DWORD [16+EBP]
+       TEST    DWORD [16+EBP],EAX
+       JNE     L164
+       ADD     EDI,32
+L164:
+       CMP     DWORD [16+EBP],0
+       JNE     L162
+       MOV     EAX,DWORD [20+EBP]
+       LEA     ESP,DWORD [-12+EBP]
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L180:
+       SUB     ESI,EAX
+       SUB     ECX,EBX
+       MOV     EAX,DWORD [8+EBP]
+       MOV     DWORD [4+EAX],ESI
+       MOV     DWORD [8+EAX],ECX
+       MOVZX   ECX,BYTE [1+EDI]
+       SHR     DWORD [-16+EBP],CL
+       MOV     EDX,DWORD [12+EDI]
+       MOV     EAX,DWORD [-20+EBP]
+       AND     DWORD [-16+EBP],EDX
+       MOV     EDX,DWORD [-16+EBP]
+       SUB     DWORD [EAX],EDX
+       JMP     L181
+L174:
+       MOV     EAX,DWORD [-16+EBP]
+       AND     EAX,DWORD [16+EDI]
+       TEST    EAX,EAX
+       JE      L165
+       MOV     EAX,DWORD [12+EDI]
+       AND     DWORD [-16+EBP],EAX
+       JMP     L173
+L187:
+       MOV     EAX,DWORD [8+EBP]
+       ADD     EAX,124
+       PUSH    EAX
+       PUSH    0
+       PUSH    113
+       MOV     EAX,DWORD [8+EBP]
+       ADD     EAX,9368
+       PUSH    EAX
+       PUSH    DWORD [8+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       TEST    EAX,EAX
+       JE      L169
+       MOV     EDX,DWORD [8+EBP]
+       MOV     EAX,EDI
+       ADD     EDX,60
+       SUB     EAX,DWORD [8+EBP]
+       PUSH    EDX
+       PUSH    0
+       SUB     EAX,28
+       SAR     EAX,5
+       PUSH    113
+       MOVZX   EDX,BYTE [2+EDI]
+       LEA     EAX,DWORD [EDX+EAX*2]
+       MOV     EDX,DWORD [8+EBP]
+       LEA     EAX,DWORD [8984+EDX+EAX*4]
+       PUSH    EAX
+       PUSH    EDX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       TEST    AL,AL
+       MOV     BYTE [2+EDI],AL
+       JE      L188
+L170:
+       MOV     EAX,DWORD [24+EDI]
+       MOV     DWORD [20+EDI],EAX
+       JMP     L166
+L188:
+       MOV     ESI,DWORD [8+EBP]
+       ADD     ESI,92
+       PUSH    ESI
+       PUSH    1
+       PUSH    116
+       MOV     EAX,DWORD [8+EBP]
+       ADD     EAX,9240
+       PUSH    EAX
+       PUSH    DWORD [8+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       MOV     EBX,EAX
+       AND     EBX,15
+       CMP     EBX,15
+       JE      L169
+       PUSH    ESI
+       PUSH    1
+       PUSH    116
+       MOV     EAX,DWORD [8+EBP]
+       ADD     EAX,9304
+       PUSH    EAX
+       PUSH    DWORD [8+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       DEC     EAX
+       AND     EAX,15
+       INC     EAX
+       PUSH    EAX
+       PUSH    EBX
+       PUSH    EDI
+       CALL    _tek_setbm5
+       ADD     ESP,12
+       JMP     L170
+L169:
+       MOV     EAX,DWORD [8+EBP]
+       MOV     EDX,DWORD [8+EBP]
+       ADD     EAX,16
+       MOV     EBP,DWORD [16+EDX]
+       MOV     ESP,DWORD [8+EAX]
+       JMP     DWORD [4+EAX]
+_tek_revbit:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EBX
+       XOR     EBX,EBX
+       MOV     ECX,DWORD [8+EBP]
+       MOV     EDX,DWORD [12+EBP]
+L190:
+       MOV     EAX,ECX
+       SHR     ECX,1
+       AND     EAX,1
+       DEC     EDX
+       LEA     EBX,DWORD [EAX+EBX*2]
+       JNE     L190
+       MOV     EAX,EBX
+       POP     EBX
+       POP     EBP
+       RET
+_tek_getlen5:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       MOV     ESI,DWORD [12+EBP]
+       MOV     EBX,DWORD [8+EBP]
+       PUSH    DWORD [1064+EBX]
+       LEA     EDI,DWORD [EBX+ESI*8]
+       PUSH    0
+       PUSH    113
+       LEA     EAX,DWORD [4892+EDI]
+       PUSH    EAX
+       PUSH    EBX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [20+EBP]
+       JE      L195
+       IMUL    EAX,DWORD [16+EBP],7
+       ADD     EAX,ESI
+       PUSH    DWORD [1068+EBX]
+       SAL     EAX,5
+       PUSH    1
+       PUSH    115
+       LEA     EAX,DWORD [1212+EBX+EAX*1]
+       PUSH    EAX
+       PUSH    EBX
+       CALL    _tek_rdget1
+       MOV     EDX,EAX
+       AND     EDX,7
+L202:
+       ADD     ESP,20
+L196:
+       LEA     ESP,DWORD [-12+EBP]
+       MOV     EAX,EDX
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L195:
+       PUSH    DWORD [1064+EBX]
+       PUSH    0
+       LEA     EAX,DWORD [4896+EDI]
+       PUSH    113
+       PUSH    EAX
+       PUSH    EBX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [20+EBP]
+       JE      L197
+       IMUL    EAX,DWORD [16+EBP],7
+       ADD     EAX,ESI
+       PUSH    DWORD [1072+EBX]
+       SAL     EAX,5
+       PUSH    1
+       PUSH    115
+       LEA     EAX,DWORD [1276+EBX+EAX*1]
+       PUSH    EAX
+       PUSH    EBX
+       CALL    _tek_rdget1
+       MOV     EDX,EAX
+       JMP     L202
+L197:
+       PUSH    DWORD [1076+EBX]
+       SAL     ESI,10
+       PUSH    1
+       PUSH    120
+       LEA     EAX,DWORD [4908+ESI+EBX*1]
+       PUSH    EAX
+       PUSH    EBX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       LEA     EDX,DWORD [-504+EAX]
+       TEST    EDX,EDX
+       JLE     L199
+       CMP     EDX,5
+       JG      L200
+       CMP     DWORD [20+EBP],0
+       JE      L203
+L200:
+       PUSH    -2
+       PUSH    EDX
+       PUSH    EBX
+       CALL    _tek_rdget0
+       ADD     ESP,12
+       LEA     EDX,DWORD [-1+EAX]
+L201:
+       PUSH    -2
+       PUSH    EDX
+       PUSH    EBX
+       CALL    _tek_rdget0
+       ADD     ESP,12
+       LEA     EDX,DWORD [-1+EAX]
+L199:
+       ADD     EDX,264
+       JMP     L196
+L203:
+       PUSH    DWORD [1080+EBX]
+       MOV     EAX,EDX
+       PUSH    1
+       OR      EAX,112
+       MOV     CL,DL
+       PUSH    EAX
+       MOV     EAX,4
+       SAL     EAX,CL
+       LEA     EAX,DWORD [8724+EAX+EBX*1]
+       PUSH    EAX
+       PUSH    EBX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       LEA     EDX,DWORD [-1+EAX]
+       JMP     L201
+[SECTION .data]
+_state_table.3:
+       DD      0
+       DD      0
+       DD      0
+       DD      0
+       DD      1
+       DD      2
+       DD      3
+       DD      4
+       DD      5
+       DD      6
+       DD      4
+       DD      5
+_pt1.4:
+       DB      8
+       DB      8
+       DB      8
+       DB      8
+       DB      8
+       DB      8
+       DB      8
+       DB      8
+       DB      8
+       DB      8
+       DB      18
+       DB      18
+       DB      18
+       DB      8
+_pt2.5:
+       DB      8
+       DB      8
+       DB      10
+       DB      11
+       DB      12
+       DB      12
+       DB      14
+       DB      15
+       DB      16
+       DB      16
+       DB      18
+       DB      18
+       DB      20
+       DB      21
+[SECTION .text]
+_tek_decmain5:
+       PUSH    EBP
+       MOV     EAX,1
+       MOV     EBP,ESP
+       MOV     EDX,EAX
+       PUSH    EDI
+       PUSH    ESI
+       PUSH    EBX
+       SUB     ESP,116
+       MOV     ECX,DWORD [28+EBP]
+       MOV     EBX,DWORD [12+EBP]
+       SAL     EDX,CL
+       MOV     ECX,EDX
+       MOV     EDX,DWORD [8+EBP]
+       DEC     ECX
+       MOV     DWORD [-100+EBP],EDX
+       MOV     DWORD [-72+EBP],ECX
+       MOV     CL,BYTE [32+EBP]
+       SAL     EAX,CL
+       DEC     EAX
+       MOV     ECX,DWORD [-100+EBP]
+       MOV     DWORD [-76+EBP],EAX
+       XOR     EAX,EAX
+       CMP     DWORD [36+EBP],-1
+       SETE    AL
+       MOV     DWORD [-80+EBP],EAX
+       ADD     EDX,1116
+       MOV     DWORD [-84+EBP],8
+       MOV     EAX,DWORD [24+EBP]
+       MOV     DWORD [-104+EBP],EDX
+       SUB     DWORD [-84+EBP],EAX
+       LEA     EAX,DWORD [4+EBX]
+       MOV     DWORD [ECX],EAX
+       MOV     DWORD [-92+EBP],120
+       MOV     DWORD [4+ECX],-1
+       MOVZX   EDX,BYTE [EBX]
+       MOVZX   EAX,BYTE [1+EBX]
+       SAL     EAX,16
+       SAL     EDX,24
+       OR      EDX,EAX
+       MOVZX   EAX,BYTE [2+EBX]
+       SAL     EAX,8
+       OR      EDX,EAX
+       MOVZX   EAX,BYTE [3+EBX]
+       OR      EDX,EAX
+       MOV     DWORD [8+ECX],EDX
+       MOV     DWORD [-48+EBP],0
+L209:
+       MOV     EDX,DWORD [-48+EBP]
+       MOV     EAX,DWORD [-48+EBP]
+       NOT     EAX
+       MOV     DWORD [-28+EBP+EDX*4],EAX
+       INC     EDX
+       MOV     DWORD [-48+EBP],EDX
+       CMP     EDX,3
+       JLE     L209
+       MOV     EAX,DWORD [-100+EBP]
+       MOV     ECX,DWORD [-100+EBP]
+       ADD     EAX,16
+       LEA     EDX,DWORD [-12+EBP]
+       MOV     DWORD [16+ECX],EDX
+       MOV     DWORD [4+EAX],L211
+       MOV     DWORD [8+EAX],ESP
+       XOR     EAX,EAX
+L212:
+       TEST    EAX,EAX
+       JNE     L213
+       MOV     ECX,DWORD [24+EBP]
+       MOV     EAX,768
+       ADD     ECX,DWORD [32+EBP]
+       SAL     EAX,CL
+       ADD     EAX,2063
+       MOV     DWORD [-48+EBP],EAX
+       JS      L330
+L218:
+       MOV     ECX,DWORD [-48+EBP]
+       MOV     EAX,DWORD [-104+EBP]
+       MOV     DWORD [EAX+ECX*4],32768
+       DEC     ECX
+       MOV     DWORD [-48+EBP],ECX
+       JNS     L218
+L330:
+       MOV     DWORD [-48+EBP],0
+       MOV     EDX,DWORD [-100+EBP]
+L225:
+       XOR     EAX,EAX
+       CMP     DWORD [-48+EBP],3
+       SETG    AL
+       MOV     DWORD [48+EDX],EAX
+       MOV     EAX,16384
+       CMP     DWORD [-48+EBP],23
+       JLE     L224
+       MOV     EAX,8192
+L224:
+       MOV     BYTE [30+EDX],0
+       MOV     BYTE [29+EDX],5
+       MOV     BYTE [28+EDX],5
+       INC     DWORD [-48+EBP]
+       MOV     DWORD [52+EDX],EAX
+       ADD     EDX,32
+       CMP     DWORD [-48+EBP],31
+       JLE     L225
+       MOV     ECX,DWORD [24+EBP]
+       MOV     EAX,1024
+       ADD     ECX,DWORD [32+EBP]
+       MOV     EDX,DWORD [-104+EBP]
+       SAL     EAX,CL
+       CMP     DWORD [-80+EBP],0
+       LEA     EAX,DWORD [8248+EAX+EDX*1]
+       MOV     DWORD [-96+EBP],EAX
+       JE      L226
+       MOV     ECX,DWORD [-100+EBP]
+       MOV     EAX,ECX
+       MOV     DWORD [12+ECX],-2048
+       ADD     EAX,48
+       MOV     DWORD [-48+EBP],31
+L231:
+       MOV     DWORD [EAX],0
+       ADD     EAX,32
+       DEC     DWORD [-48+EBP]
+       JNS     L231
+       MOV     DWORD [-48+EBP],0
+L236:
+       MOV     EDX,DWORD [-48+EBP]
+       MOV     EAX,DWORD [-100+EBP]
+       MOV     ECX,DWORD [-100+EBP]
+       ADD     EAX,28
+       MOV     DWORD [1052+ECX+EDX*4],EAX
+       INC     EDX
+       MOV     DWORD [-48+EBP],EDX
+       CMP     EDX,13
+       JLE     L236
+L237:
+       MOV     EAX,DWORD [-100+EBP]
+       MOV     DWORD [-128+EBP],EAX
+       MOV     DWORD [-48+EBP],31
+L268:
+       MOV     EDX,DWORD [-128+EBP]
+       MOVZX   EAX,BYTE [29+EDX]
+       PUSH    EAX
+       MOVZX   EAX,BYTE [28+EDX]
+       PUSH    EAX
+       MOV     EAX,EDX
+       ADD     EAX,28
+       PUSH    EAX
+       CALL    _tek_setbm5
+       ADD     ESP,12
+       ADD     DWORD [-128+EBP],32
+       DEC     DWORD [-48+EBP]
+       JNS     L268
+       MOV     ECX,DWORD [-100+EBP]
+       PUSH    DWORD [1052+ECX]
+       PUSH    0
+       PUSH    113
+       PUSH    DWORD [-104+EBP]
+       PUSH    ECX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [-80+EBP]
+       JE      L213
+       MOV     EAX,DWORD [20+EBP]
+       INC     DWORD [20+EBP]
+       MOV     DWORD [-108+EBP],EAX
+       MOV     EAX,DWORD [-100+EBP]
+       ADD     EAX,796
+       PUSH    EAX
+       MOV     EAX,DWORD [-104+EBP]
+       PUSH    1
+       ADD     EAX,8256
+       PUSH    DWORD [-92+EBP]
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       MOV     EDX,DWORD [-108+EBP]
+       ADD     ESP,20
+       MOV     BYTE [EDX],AL
+       MOV     ECX,DWORD [16+EBP]
+       MOV     DWORD [-68+EBP],1
+       MOV     DWORD [-60+EBP],0
+       MOV     DWORD [-64+EBP],0
+       CMP     DWORD [-68+EBP],ECX
+       JGE     L343
+L326:
+       MOV     EAX,DWORD [-68+EBP]
+       MOV     EDX,DWORD [-100+EBP]
+       AND     EAX,DWORD [-72+EBP]
+       MOV     ECX,DWORD [-104+EBP]
+       MOV     DWORD [-88+EBP],EAX
+       XOR     EAX,EAX
+       CMP     DWORD [-64+EBP],0
+       SETG    AL
+       PUSH    DWORD [1052+EDX+EAX*4]
+       IMUL    EAX,DWORD [-88+EBP],28
+       ADD     EAX,DWORD [-64+EBP]
+       PUSH    0
+       PUSH    113
+       LEA     EAX,DWORD [ECX+EAX*8]
+       PUSH    EAX
+       MOV     DWORD [-112+EBP],EAX
+       PUSH    EDX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [-80+EBP]
+       JE      L273
+       MOV     EAX,DWORD [20+EBP]
+       MOV     CL,BYTE [-84+EBP]
+       MOVZX   EDX,BYTE [-1+EAX]
+       MOV     EAX,DWORD [-68+EBP]
+       AND     EAX,DWORD [-76+EBP]
+       SAR     EDX,CL
+       MOV     CL,BYTE [24+EBP]
+       SAL     EAX,CL
+       OR      EDX,EAX
+       MOV     ECX,DWORD [-64+EBP]
+       MOV     EAX,EDX
+       SAL     EAX,8
+       MOV     ECX,DWORD [_state_table.3+ECX*4]
+       MOV     DWORD [-48+EBP],EAX
+       MOV     DWORD [-64+EBP],ECX
+       CMP     DWORD [-60+EBP],0
+       JE      L349
+       MOV     EAX,DWORD [-100+EBP]
+       MOV     EDX,DWORD [20+EBP]
+       ADD     EAX,796
+       MOV     DWORD [-116+EBP],EAX
+       MOV     EAX,DWORD [-28+EBP]
+       MOV     DWORD [-52+EBP],1
+       MOV     DWORD [-56+EBP],8
+       MOVZX   EAX,BYTE [EAX+EDX*1]
+       MOV     DWORD [-60+EBP],EAX
+L280:
+       MOV     EAX,DWORD [-48+EBP]
+       MOV     ECX,DWORD [-100+EBP]
+       ADD     EAX,DWORD [-52+EBP]
+       MOV     EDX,DWORD [-60+EBP]
+       SAR     EDX,7
+       ADD     EAX,EAX
+       MOV     DWORD [-120+EBP],EDX
+       PUSH    DWORD [1060+ECX]
+       OR      EAX,EDX
+       MOV     ECX,DWORD [-96+EBP]
+       PUSH    0
+       PUSH    113
+       LEA     EAX,DWORD [ECX+EAX*4]
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       MOV     EDX,DWORD [-52+EBP]
+       DEC     DWORD [-56+EBP]
+       ADD     ESP,20
+       LEA     EAX,DWORD [EAX+EDX*2]
+       MOV     DWORD [-52+EBP],EAX
+       MOV     EAX,DWORD [-92+EBP]
+       SAR     EAX,4
+       TEST    DWORD [-56+EBP],EAX
+       JNE     L283
+       ADD     DWORD [-116+EBP],32
+L283:
+       MOV     ECX,DWORD [-52+EBP]
+       XOR     DWORD [-120+EBP],ECX
+       TEST    DWORD [-120+EBP],1
+       JE      L284
+       CMP     DWORD [-56+EBP],0
+       JNE     L344
+L284:
+       SAL     DWORD [-60+EBP],1
+       CMP     DWORD [-56+EBP],0
+       JNE     L280
+L281:
+       MOV     EDX,DWORD [20+EBP]
+       MOV     AL,BYTE [-52+EBP]
+       MOV     BYTE [EDX],AL
+       MOV     DWORD [-60+EBP],0
+L279:
+       INC     DWORD [-68+EBP]
+       INC     DWORD [20+EBP]
+L270:
+       MOV     ECX,DWORD [16+EBP]
+       CMP     DWORD [-68+EBP],ECX
+       JL      L326
+L343:
+       XOR     EAX,EAX
+L204:
+       LEA     ESP,DWORD [-12+EBP]
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L344:
+       MOV     EAX,DWORD [-92+EBP]
+       MOV     ECX,DWORD [-104+EBP]
+       AND     EAX,112
+       OR      DWORD [-56+EBP],EAX
+       MOV     EAX,DWORD [-48+EBP]
+       ADD     EAX,DWORD [-52+EBP]
+       PUSH    DWORD [-116+EBP]
+       PUSH    DWORD [-52+EBP]
+       PUSH    DWORD [-56+EBP]
+       LEA     EAX,DWORD [8252+ECX+EAX*4]
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       MOV     DWORD [-52+EBP],EAX
+       JMP     L281
+L349:
+       SAL     EDX,10
+       MOV     EAX,DWORD [-100+EBP]
+       ADD     EAX,796
+       MOV     ECX,DWORD [-104+EBP]
+       PUSH    EAX
+       PUSH    1
+       LEA     EAX,DWORD [8256+EDX+ECX*1]
+       PUSH    DWORD [-92+EBP]
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       MOV     EDX,DWORD [20+EBP]
+       ADD     ESP,20
+       MOV     BYTE [EDX],AL
+       JMP     L279
+L273:
+       MOV     ECX,DWORD [-100+EBP]
+       MOV     EAX,DWORD [-64+EBP]
+       SAL     EAX,4
+       PUSH    DWORD [1104+ECX]
+       ADD     EAX,DWORD [-104+EBP]
+       PUSH    0
+       PUSH    113
+       MOV     DWORD [-124+EBP],EAX
+       ADD     EAX,3584
+       PUSH    EAX
+       PUSH    ECX
+       OR      DWORD [-60+EBP],1
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [-80+EBP]
+       JE      L287
+       PUSH    DWORD [-80+EBP]
+       MOV     EAX,DWORD [-20+EBP]
+       PUSH    DWORD [-88+EBP]
+       MOV     DWORD [-16+EBP],EAX
+       PUSH    0
+       MOV     EAX,DWORD [-24+EBP]
+       MOV     DWORD [-20+EBP],EAX
+       MOV     EAX,DWORD [-28+EBP]
+       PUSH    DWORD [-100+EBP]
+       MOV     DWORD [-24+EBP],EAX
+       CALL    _tek_getlen5
+       MOV     DWORD [-48+EBP],EAX
+       MOV     DWORD [-52+EBP],EAX
+       ADD     ESP,16
+       XOR     EAX,EAX
+       CMP     DWORD [-64+EBP],6
+       SETG    AL
+       CMP     DWORD [-48+EBP],3
+       LEA     EAX,DWORD [7+EAX+EAX*2]
+       MOV     DWORD [-64+EBP],EAX
+       JLE     L290
+       MOV     DWORD [-52+EBP],3
+L290:
+       XOR     EAX,EAX
+       MOV     EDX,DWORD [-100+EBP]
+       CMP     DWORD [-52+EBP],3
+       SETE    AL
+       SAL     DWORD [-52+EBP],8
+       PUSH    DWORD [1084+EDX+EAX*4]
+       MOV     ECX,DWORD [-104+EBP]
+       MOV     EDX,DWORD [-52+EBP]
+       PUSH    1
+       PUSH    118
+       LEA     EAX,DWORD [5840+EDX+ECX*1]
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       MOV     ECX,EAX
+       ADD     ESP,20
+       AND     ECX,63
+       MOV     DWORD [-52+EBP],ECX
+       MOV     DWORD [-28+EBP],ECX
+       CMP     ECX,3
+       JLE     L295
+       MOV     EDX,ECX
+       MOV     EBX,EAX
+       SAR     EDX,1
+       AND     EBX,1
+       MOV     EAX,EBX
+       LEA     ECX,DWORD [-1+EDX]
+       OR      EAX,2
+       SAL     EAX,CL
+       MOV     DWORD [-56+EBP],ECX
+       MOV     DWORD [-28+EBP],EAX
+       CMP     DWORD [-52+EBP],13
+       JLE     L350
+       CMP     DWORD [-80+EBP],0
+       JNE     L302
+       SUB     EDX,7
+       MOV     DWORD [-56+EBP],EDX
+       JE      L303
+       PUSH    -1
+       PUSH    EDX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget0
+       SAL     EAX,6
+       ADD     ESP,12
+       OR      DWORD [-28+EBP],EAX
+L303:
+       MOV     EAX,DWORD [-100+EBP]
+       PUSH    6
+       PUSH    DWORD [1100+EAX]
+       PUSH    1
+       MOV     EAX,DWORD [-104+EBP]
+       PUSH    118
+       ADD     EAX,6864
+       PUSH    EAX
+L348:
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       PUSH    EAX
+       CALL    _tek_revbit
+       POP     ECX
+       OR      DWORD [-28+EBP],EAX
+       POP     EBX
+L295:
+       NOT     DWORD [-28+EBP]
+L310:
+       MOV     EDX,DWORD [-68+EBP]
+       ADD     DWORD [-48+EBP],2
+       ADD     EDX,DWORD [-28+EBP]
+       JS      L213
+       MOV     EAX,DWORD [-68+EBP]
+       ADD     EAX,DWORD [-48+EBP]
+       CMP     EAX,DWORD [16+EBP]
+       JLE     L321
+       MOV     ECX,DWORD [16+EBP]
+       SUB     ECX,DWORD [-68+EBP]
+       MOV     DWORD [-48+EBP],ECX
+L321:
+       MOV     EAX,DWORD [-48+EBP]
+       ADD     DWORD [-68+EBP],EAX
+L322:
+       MOV     EDX,DWORD [20+EBP]
+       MOV     EAX,DWORD [-28+EBP]
+       MOV     AL,BYTE [EAX+EDX*1]
+       MOV     BYTE [EDX],AL
+       INC     EDX
+       DEC     DWORD [-48+EBP]
+       MOV     DWORD [20+EBP],EDX
+       JNE     L322
+       JMP     L270
+L213:
+       MOV     EAX,1
+       JMP     L204
+L302:
+       PUSH    -1
+       LEA     EAX,DWORD [-5+EDX]
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget0
+       SAL     EAX,4
+       MOV     EDX,DWORD [-100+EBP]
+       PUSH    4
+       OR      DWORD [-28+EBP],EAX
+       MOV     EAX,DWORD [-104+EBP]
+       ADD     EAX,6864
+       PUSH    DWORD [1100+EDX]
+       PUSH    1
+       PUSH    116
+       PUSH    EAX
+       PUSH    EDX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       PUSH    EAX
+       CALL    _tek_revbit
+       OR      DWORD [-28+EBP],EAX
+       ADD     ESP,20
+       JMP     L295
+L350:
+       XOR     EAX,EAX
+       MOV     EDX,DWORD [-100+EBP]
+       CMP     ECX,4
+       PUSH    ECX
+       SETGE   AL
+       IMUL    EBX,EBX,248
+       PUSH    DWORD [1092+EDX+EAX*4]
+       MOV     EAX,ECX
+       PUSH    1
+       OR      EAX,112
+       MOV     EDX,DWORD [-104+EBP]
+       PUSH    EAX
+       MOV     CL,BYTE [-56+EBP]
+       MOV     EAX,4
+       ADD     EDX,EBX
+       SAL     EAX,CL
+       LEA     EDX,DWORD [7112+EAX+EDX*1]
+       PUSH    EDX
+       JMP     L348
+L287:
+       MOV     ECX,DWORD [-100+EBP]
+       MOV     EAX,DWORD [-124+EBP]
+       ADD     EAX,3588
+       PUSH    DWORD [1104+ECX]
+       PUSH    0
+       PUSH    113
+       PUSH    EAX
+       PUSH    ECX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [-80+EBP]
+       JE      L306
+       MOV     EAX,DWORD [-100+EBP]
+       MOV     DWORD [-48+EBP],-1
+       PUSH    DWORD [1104+EAX]
+       PUSH    0
+       MOV     EAX,DWORD [-112+EBP]
+       PUSH    113
+       ADD     EAX,4
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       TEST    EAX,EAX
+       JNE     L311
+       XOR     EAX,EAX
+       CMP     DWORD [-64+EBP],6
+       SETG    AL
+       LEA     EAX,DWORD [9+EAX+EAX*1]
+L346:
+       MOV     DWORD [-64+EBP],EAX
+       JMP     L310
+L311:
+       PUSH    DWORD [-80+EBP]
+       PUSH    DWORD [-88+EBP]
+       PUSH    1
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_getlen5
+       MOV     DWORD [-48+EBP],EAX
+       ADD     ESP,16
+       XOR     EAX,EAX
+       CMP     DWORD [-64+EBP],6
+       SETG    AL
+       LEA     EAX,DWORD [8+EAX+EAX*2]
+       JMP     L346
+L306:
+       MOV     EDX,DWORD [-100+EBP]
+       MOV     EAX,DWORD [-124+EBP]
+       ADD     EAX,3592
+       PUSH    DWORD [1104+EDX]
+       PUSH    0
+       PUSH    113
+       PUSH    EAX
+       PUSH    EDX
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [-80+EBP]
+       JE      L312
+       MOV     ECX,DWORD [-24+EBP]
+       MOV     DWORD [-48+EBP],ECX
+L313:
+       MOV     EAX,DWORD [-28+EBP]
+       MOV     DWORD [-24+EBP],EAX
+       MOV     EAX,DWORD [-48+EBP]
+       MOV     DWORD [-28+EBP],EAX
+       JMP     L311
+L312:
+       MOV     EAX,DWORD [-100+EBP]
+       PUSH    DWORD [1104+EAX]
+       PUSH    0
+       MOV     EAX,DWORD [-124+EBP]
+       PUSH    113
+       ADD     EAX,3596
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       CMP     EAX,DWORD [-80+EBP]
+       JE      L314
+       MOV     EDX,DWORD [-20+EBP]
+       MOV     DWORD [-48+EBP],EDX
+L315:
+       MOV     EAX,DWORD [-24+EBP]
+       MOV     DWORD [-20+EBP],EAX
+       JMP     L313
+L314:
+       CMP     DWORD [-80+EBP],0
+       JE      L351
+L316:
+       MOV     ECX,DWORD [-16+EBP]
+       MOV     EAX,DWORD [-20+EBP]
+       MOV     DWORD [-48+EBP],ECX
+       MOV     DWORD [-16+EBP],EAX
+       JMP     L315
+L351:
+       MOV     EAX,DWORD [-100+EBP]
+       ADD     EAX,732
+       PUSH    EAX
+       MOV     EAX,DWORD [-104+EBP]
+       PUSH    0
+       ADD     EAX,7864
+       PUSH    113
+       PUSH    EAX
+       PUSH    DWORD [-100+EBP]
+       CALL    _tek_rdget1
+       ADD     ESP,20
+       TEST    EAX,EAX
+       JNE     L316
+       JMP     L213
+L226:
+       MOV     EAX,DWORD [-100+EBP]
+       MOV     BYTE [60+EAX],5
+       MOV     BYTE [61+EAX],3
+       MOV     BYTE [92+EAX],9
+       MOV     BYTE [93+EAX],2
+       MOV     DWORD [12+EAX],-1
+       TEST    DWORD [36+EBP],64
+       JE      L238
+       MOV     BYTE [124+EAX],0
+       MOV     BYTE [125+EAX],1
+       MOV     EDX,DWORD [-104+EBP]
+       MOV     DWORD [8252+EDX],65535
+L238:
+       MOV     ECX,DWORD [-100+EBP]
+       MOV     BYTE [732+ECX],0
+       MOV     BYTE [733+ECX],1
+       MOV     EAX,DWORD [-104+EBP]
+       CMP     DWORD [36+EBP],-2
+       MOV     DWORD [7864+EAX],65535
+       JE      L352
+       MOV     DWORD [-48+EBP],0
+L250:
+       MOV     ECX,DWORD [-48+EBP]
+       MOV     AL,BYTE [_pt2.5+ECX]
+       MOV     BYTE [-44+EBP+ECX*1],AL
+       INC     ECX
+       MOV     DWORD [-48+EBP],ECX
+       CMP     ECX,13
+       JLE     L250
+       MOV     ECX,DWORD [36+EBP]
+       MOV     AL,9
+       MOV     DWORD [-92+EBP],7
+       AND     ECX,3
+       SAR     DWORD [-92+EBP],CL
+       SAL     DWORD [-92+EBP],4
+       OR      DWORD [-92+EBP],8
+       TEST    DWORD [36+EBP],4
+       SETE    DL
+       SUB     AL,DL
+       TEST    DWORD [36+EBP],8
+       MOV     BYTE [-43+EBP],AL
+       MOV     AL,13
+       SETE    DL
+       SUB     AL,DL
+       TEST    DWORD [36+EBP],16
+       MOV     BYTE [-39+EBP],AL
+       MOV     AL,17
+       SETE    DL
+       SUB     AL,DL
+       TEST    DWORD [36+EBP],32
+       MOV     BYTE [-35+EBP],AL
+       MOV     AL,19
+       SETE    DL
+       SUB     AL,DL
+       MOV     BYTE [-33+EBP],AL
+L245:
+       MOV     DWORD [-48+EBP],0
+L263:
+       MOV     EDX,DWORD [-48+EBP]
+       MOV     ECX,DWORD [-100+EBP]
+       MOVZX   EAX,BYTE [-44+EBP+EDX*1]
+       SAL     EAX,5
+       LEA     EAX,DWORD [28+EAX+ECX*1]
+       MOV     DWORD [1052+ECX+EDX*4],EAX
+       INC     EDX
+       MOV     DWORD [-48+EBP],EDX
+       CMP     EDX,13
+       JLE     L263
+       JMP     L237
+L352:
+       MOV     DWORD [752+ECX],0
+       MOV     DWORD [-48+EBP],0
+L244:
+       MOV     EDX,DWORD [-48+EBP]
+       MOV     AL,BYTE [_pt1.4+EDX]
+       MOV     BYTE [-44+EBP+EDX*1],AL
+       INC     EDX
+       MOV     DWORD [-48+EBP],EDX
+       CMP     EDX,13
+       JLE     L244
+       JMP     L245
+L211:
+       ADD     EBP,12
+       MOV     EAX,1
+       JMP     L212
+_tek_decode5:
+       PUSH    EBP
+       MOV     EBP,ESP
+       PUSH    EDI
+       PUSH    ESI
+       XOR     EDI,EDI
+       MOV     EAX,DWORD [12+EBP]
+       PUSH    EBX
+       MOV     EBX,EAX
+       ADD     EAX,16
+       MOV     DWORD [12+EBP],EAX
+       ADD     EBX,DWORD [8+EBP]
+       LEA     EAX,DWORD [12+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       POP     ECX
+       MOV     ESI,EAX
+       TEST    EAX,EAX
+       JLE     L354
+       LEA     EAX,DWORD [12+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       POP     EDX
+       TEST    EAX,1
+       JE      L363
+       MOV     ECX,EAX
+       MOV     EDX,1
+       SAR     ECX,1
+       AND     ECX,15
+       ADD     ECX,8
+       SAL     EDX,CL
+       MOV     ECX,1
+       TEST    EAX,32
+       JNE     L353
+       CMP     EDX,256
+       JE      L361
+       MOV     ECX,1
+       CMP     ESI,EDX
+       JG      L353
+       AND     EAX,64
+       JNE     L364
+L361:
+       PUSH    DWORD [16+EBP]
+       PUSH    ESI
+       SUB     EBX,DWORD [12+EBP]
+       PUSH    DWORD [12+EBP]
+       PUSH    EBX
+L362:
+       CALL    _tek_lzrestore_tek5
+       ADD     ESP,16
+       MOV     EDI,EAX
+L354:
+       MOV     ECX,EDI
+L353:
+       LEA     ESP,DWORD [-12+EBP]
+       MOV     EAX,ECX
+       POP     EBX
+       POP     ESI
+       POP     EDI
+       POP     EBP
+       RET
+L364:
+       LEA     EAX,DWORD [12+EBP]
+       PUSH    EAX
+       CALL    _tek_getnum_s7s
+       POP     EDI
+       JMP     L361
+L363:
+       MOV     EAX,DWORD [12+EBP]
+       PUSH    DWORD [16+EBP]
+       SUB     EBX,EAX
+       PUSH    ESI
+       LEA     EDX,DWORD [-1+EAX]
+       PUSH    EDX
+       LEA     EAX,DWORD [1+EBX]
+       PUSH    EAX
+       JMP     L362
diff --git a/haribote/test.sec b/haribote/test.sec
new file mode 100644 (file)
index 0000000..883d4b0
Binary files /dev/null and b/haribote/test.sec differ
diff --git a/haribote/timer.cpp b/haribote/timer.cpp
new file mode 100644 (file)
index 0000000..a6a9b48
--- /dev/null
@@ -0,0 +1,50 @@
+/* \83^\83C\83}\8aÖ\8cW */
+
+#include "bootpack.h"
+#include "timer.h"
+#include "naskfunc.h"
+#include "pic.h"
+#include "screen.h"
+#include "ThreadMan.h"
+#define PIT_CTRL       0x0043
+#define PIT_CNT0       0x0040
+
+TIMERCTL timerctl;
+
+void init_pit(void)
+{
+       io_out8(PIT_CTRL, 0x34);
+
+       //0x04A9\82Å\96ñ1ms\82É\88ê\89ñint0x20\82ª\94­\8ds\82³\82ê\82é
+       //\82ªqemu\82Å\82Í10ms\88È\89º\82Ì\8eü\8aú\82É\90Ý\92è\82Å\82«\82È\82¢\82ç\82µ\82¢
+       io_out8(PIT_CNT0, 0xA9);
+       io_out8(PIT_CNT0, 0x04);
+       //io_out8(PIT_CNT0, 0x0);
+       //io_out8(PIT_CNT0, 0x0);
+       timerctl.count = 0;
+       timerctl.subcount = 0;
+       return;
+}
+
+extern "C" void inthandler20(int *esp)
+{
+       io_out8(PIC0_OCW2, 0x60);       /* IRQ-00\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92m */
+       timerctl.subcount++;
+       if(timerctl.subcount >= 55){
+               timerctl.subcount = 0;
+               timerctl.count++;
+               //Screen::Inst().printf("t, %d\n", timerctl.count);
+       
+       if(timerctl.count == 50){
+               WORD tr = 2;
+               asm("str [eax]": :"a"(&tr));
+               Screen::Inst().printf("test, %d\n", tr);
+               ThreadMan::Inst().SwitchThread();
+       }
+       }
+       return;
+}
+
+unsigned long long timer_getbiostimer(){
+       return timerctl.count;//\96ñ55sm\82²\82Æ\82É\91\9d\82â\82¹\82Î\82æ\82¢
+}
diff --git a/haribote/timer.h b/haribote/timer.h
new file mode 100644 (file)
index 0000000..27a9a47
--- /dev/null
@@ -0,0 +1,9 @@
+#pragma once
+
+void init_pit(void);
+unsigned long long timer_getbiostimer();
+
+struct TIMERCTL{
+       unsigned long count;
+       unsigned long subcount;
+};
diff --git a/haribote/timer.lst b/haribote/timer.lst
new file mode 100644 (file)
index 0000000..4781dde
--- /dev/null
@@ -0,0 +1,1262 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _io_out8
+     7 00000000                                        EXTERN  _io_load_eflags
+     8 00000000                                        EXTERN  _io_cli
+     9 00000000                                        EXTERN  _io_store_eflags
+    10 00000000                                        EXTERN  _task_timer
+    11 00000000                                        EXTERN  _fifo32_put
+    12 00000000                                        EXTERN  _task_switch
+    13 00000000                                 [FILE "timer.c"]
+    14                                          [SECTION .text]
+    15 00000000                                        GLOBAL  _init_pit
+    16 00000000                                 _init_pit:
+    17 00000000 55                                     PUSH    EBP
+    18 00000001 89 E5                                  MOV     EBP,ESP
+    19 00000003 6A 34                                  PUSH    52
+    20 00000005 6A 43                                  PUSH    67
+    21 00000007 E8 [00000000]                          CALL    _io_out8
+    22 0000000C 68 0000009C                            PUSH    156
+    23 00000011 6A 40                                  PUSH    64
+    24 00000013 E8 [00000000]                          CALL    _io_out8
+    25 00000018 6A 2E                                  PUSH    46
+    26 0000001A 6A 40                                  PUSH    64
+    27 0000001C E8 [00000000]                          CALL    _io_out8
+    28 00000021 BA [00002710]                          MOV     EDX,_timerctl+10000
+    29 00000026 C7 05 [00000000] 00000000              MOV     DWORD [_timerctl],0
+    30 00000030 83 C4 18                               ADD     ESP,24
+    31 00000033 B8 [00000014]                          MOV     EAX,_timerctl+20
+    32 00000038                                 L6:
+    33 00000038 C6 00 00                               MOV     BYTE [EAX],0
+    34 0000003B 83 C0 14                               ADD     EAX,20
+    35 0000003E 39 D0                                  CMP     EAX,EDX
+    36 00000040 7E F6                                  JLE     L6
+    37 00000042 E8 00000022                            CALL    _timer_alloc
+    38 00000047 C6 40 08 02                            MOV     BYTE [8+EAX],2
+    39 0000004B C7 40 04 FFFFFFFF                      MOV     DWORD [4+EAX],-1
+    40 00000052 C7 00 00000000                         MOV     DWORD [EAX],0
+    41 00000058 A3 [00000008]                          MOV     DWORD [_timerctl+8],EAX
+    42 0000005D C7 05 [00000004] FFFFFFFF              MOV     DWORD [_timerctl+4],-1
+    43 00000067 C9                                     LEAVE
+    44 00000068 C3                                     RET
+    45 00000069                                        GLOBAL  _timer_alloc
+    46 00000069                                 _timer_alloc:
+    47 00000069 55                                     PUSH    EBP
+    48 0000006A 31 D2                                  XOR     EDX,EDX
+    49 0000006C 89 E5                                  MOV     EBP,ESP
+    50 0000006E B8 [0000000C]                          MOV     EAX,_timerctl+12
+    51 00000073                                 L15:
+    52 00000073 80 78 08 00                            CMP     BYTE [8+EAX],0
+    53 00000077 74 10                                  JE      L18
+    54 00000079 42                                     INC     EDX
+    55 0000007A 83 C0 14                               ADD     EAX,20
+    56 0000007D 81 FA 000001F3                         CMP     EDX,499
+    57 00000083 7E EE                                  JLE     L15
+    58 00000085 31 C0                                  XOR     EAX,EAX
+    59 00000087                                 L9:
+    60 00000087 5D                                     POP     EBP
+    61 00000088 C3                                     RET
+    62 00000089                                 L18:
+    63 00000089 C6 40 08 01                            MOV     BYTE [8+EAX],1
+    64 0000008D C6 40 09 00                            MOV     BYTE [9+EAX],0
+    65 00000091 EB F4                                  JMP     L9
+    66 00000093                                        GLOBAL  _timer_free
+    67 00000093                                 _timer_free:
+    68 00000093 55                                     PUSH    EBP
+    69 00000094 89 E5                                  MOV     EBP,ESP
+    70 00000096 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    71 00000099 C6 40 08 00                            MOV     BYTE [8+EAX],0
+    72 0000009D 5D                                     POP     EBP
+    73 0000009E C3                                     RET
+    74 0000009F                                        GLOBAL  _timer_init
+    75 0000009F                                 _timer_init:
+    76 0000009F 55                                     PUSH    EBP
+    77 000000A0 89 E5                                  MOV     EBP,ESP
+    78 000000A2 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+    79 000000A5 8B 55 0C                               MOV     EDX,DWORD [12+EBP]
+    80 000000A8 89 50 0C                               MOV     DWORD [12+EAX],EDX
+    81 000000AB 8B 55 10                               MOV     EDX,DWORD [16+EBP]
+    82 000000AE 89 50 10                               MOV     DWORD [16+EAX],EDX
+    83 000000B1 5D                                     POP     EBP
+    84 000000B2 C3                                     RET
+    85 000000B3                                        GLOBAL  _timer_settime
+    86 000000B3                                 _timer_settime:
+    87 000000B3 55                                     PUSH    EBP
+    88 000000B4 A1 [00000000]                          MOV     EAX,DWORD [_timerctl]
+    89 000000B9 89 E5                                  MOV     EBP,ESP
+    90 000000BB 56                                     PUSH    ESI
+    91 000000BC 53                                     PUSH    EBX
+    92 000000BD 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+    93 000000C0 03 45 0C                               ADD     EAX,DWORD [12+EBP]
+    94 000000C3 C6 43 08 02                            MOV     BYTE [8+EBX],2
+    95 000000C7 89 43 04                               MOV     DWORD [4+EBX],EAX
+    96 000000CA E8 [00000000]                          CALL    _io_load_eflags
+    97 000000CF 89 C6                                  MOV     ESI,EAX
+    98 000000D1 E8 [00000000]                          CALL    _io_cli
+    99 000000D6 A1 [00000008]                          MOV     EAX,DWORD [_timerctl+8]
+   100 000000DB 8B 53 04                               MOV     EDX,DWORD [4+EBX]
+   101 000000DE 3B 50 04                               CMP     EDX,DWORD [4+EAX]
+   102 000000E1 76 18                                  JBE     L28
+   103 000000E3                                 L23:
+   104 000000E3 89 C1                                  MOV     ECX,EAX
+   105 000000E5 8B 00                                  MOV     EAX,DWORD [EAX]
+   106 000000E7 3B 50 04                               CMP     EDX,DWORD [4+EAX]
+   107 000000EA 77 F7                                  JA      L23
+   108 000000EC 89 19                                  MOV     DWORD [ECX],EBX
+   109 000000EE 89 03                                  MOV     DWORD [EBX],EAX
+   110 000000F0                                 L27:
+   111 000000F0 89 75 08                               MOV     DWORD [8+EBP],ESI
+   112 000000F3 5B                                     POP     EBX
+   113 000000F4 5E                                     POP     ESI
+   114 000000F5 5D                                     POP     EBP
+   115 000000F6 E9 [00000000]                          JMP     _io_store_eflags
+   116 000000FB                                 L28:
+   117 000000FB 89 1D [00000008]                       MOV     DWORD [_timerctl+8],EBX
+   118 00000101 89 15 [00000004]                       MOV     DWORD [_timerctl+4],EDX
+   119 00000107 89 03                                  MOV     DWORD [EBX],EAX
+   120 00000109 EB E5                                  JMP     L27
+   121 0000010B                                        GLOBAL  _inthandler20
+   122 0000010B                                 _inthandler20:
+   123 0000010B 55                                     PUSH    EBP
+   124 0000010C 89 E5                                  MOV     EBP,ESP
+   125 0000010E 56                                     PUSH    ESI
+   126 0000010F 53                                     PUSH    EBX
+   127 00000110 31 F6                                  XOR     ESI,ESI
+   128 00000112 6A 60                                  PUSH    96
+   129 00000114 6A 20                                  PUSH    32
+   130 00000116 E8 [00000000]                          CALL    _io_out8
+   131 0000011B A1 [00000000]                          MOV     EAX,DWORD [_timerctl]
+   132 00000120 40                                     INC     EAX
+   133 00000121 A3 [00000000]                          MOV     DWORD [_timerctl],EAX
+   134 00000126 39 05 [00000004]                       CMP     DWORD [_timerctl+4],EAX
+   135 0000012C 59                                     POP     ECX
+   136 0000012D 5B                                     POP     EBX
+   137 0000012E 77 46                                  JA      L29
+   138 00000130 8B 1D [00000008]                       MOV     EBX,DWORD [_timerctl+8]
+   139 00000136                                 L31:
+   140 00000136 8B 43 04                               MOV     EAX,DWORD [4+EBX]
+   141 00000139 3B 05 [00000000]                       CMP     EAX,DWORD [_timerctl]
+   142 0000013F 77 24                                  JA      L32
+   143 00000141 C6 43 08 01                            MOV     BYTE [8+EBX],1
+   144 00000145 3B 1D [00000000]                       CMP     EBX,DWORD [_task_timer]
+   145 0000014B 74 11                                  JE      L35
+   146 0000014D FF 73 10                               PUSH    DWORD [16+EBX]
+   147 00000150 FF 73 0C                               PUSH    DWORD [12+EBX]
+   148 00000153 E8 [00000000]                          CALL    _fifo32_put
+   149 00000158 58                                     POP     EAX
+   150 00000159 5A                                     POP     EDX
+   151 0000015A                                 L36:
+   152 0000015A 8B 1B                                  MOV     EBX,DWORD [EBX]
+   153 0000015C EB D8                                  JMP     L31
+   154 0000015E                                 L35:
+   155 0000015E BE 00000001                            MOV     ESI,1
+   156 00000163 EB F5                                  JMP     L36
+   157 00000165                                 L32:
+   158 00000165 A3 [00000004]                          MOV     DWORD [_timerctl+4],EAX
+   159 0000016A 89 1D [00000008]                       MOV     DWORD [_timerctl+8],EBX
+   160 00000170 89 F0                                  MOV     EAX,ESI
+   161 00000172 84 C0                                  TEST    AL,AL
+   162 00000174 75 07                                  JNE     L38
+   163 00000176                                 L29:
+   164 00000176 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   165 00000179 5B                                     POP     EBX
+   166 0000017A 5E                                     POP     ESI
+   167 0000017B 5D                                     POP     EBP
+   168 0000017C C3                                     RET
+   169 0000017D                                 L38:
+   170 0000017D 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   171 00000180 5B                                     POP     EBX
+   172 00000181 5E                                     POP     ESI
+   173 00000182 5D                                     POP     EBP
+   174 00000183 E9 [00000000]                          JMP     _task_switch
+   175 00000188                                        GLOBAL  _timer_cancel
+   176 00000188                                 _timer_cancel:
+   177 00000188 55                                     PUSH    EBP
+   178 00000189 89 E5                                  MOV     EBP,ESP
+   179 0000018B 56                                     PUSH    ESI
+   180 0000018C 53                                     PUSH    EBX
+   181 0000018D 8B 5D 08                               MOV     EBX,DWORD [8+EBP]
+   182 00000190 E8 [00000000]                          CALL    _io_load_eflags
+   183 00000195 89 C6                                  MOV     ESI,EAX
+   184 00000197 E8 [00000000]                          CALL    _io_cli
+   185 0000019C 80 7B 08 02                            CMP     BYTE [8+EBX],2
+   186 000001A0 74 0F                                  JE      L47
+   187 000001A2 56                                     PUSH    ESI
+   188 000001A3 E8 [00000000]                          CALL    _io_store_eflags
+   189 000001A8 31 C0                                  XOR     EAX,EAX
+   190 000001AA                                 L39:
+   191 000001AA 8D 65 F8                               LEA     ESP,DWORD [-8+EBP]
+   192 000001AD 5B                                     POP     EBX
+   193 000001AE 5E                                     POP     ESI
+   194 000001AF 5D                                     POP     EBP
+   195 000001B0 C3                                     RET
+   196 000001B1                                 L47:
+   197 000001B1 A1 [00000008]                          MOV     EAX,DWORD [_timerctl+8]
+   198 000001B6 39 C3                                  CMP     EBX,EAX
+   199 000001B8 74 1D                                  JE      L48
+   200 000001BA                                 L41:
+   201 000001BA 89 C2                                  MOV     EDX,EAX
+   202 000001BC 8B 00                                  MOV     EAX,DWORD [EAX]
+   203 000001BE 39 D8                                  CMP     EAX,EBX
+   204 000001C0 75 F8                                  JNE     L41
+   205 000001C2 8B 03                                  MOV     EAX,DWORD [EBX]
+   206 000001C4 89 02                                  MOV     DWORD [EDX],EAX
+   207 000001C6                                 L42:
+   208 000001C6 C6 43 08 01                            MOV     BYTE [8+EBX],1
+   209 000001CA 56                                     PUSH    ESI
+   210 000001CB E8 [00000000]                          CALL    _io_store_eflags
+   211 000001D0 B8 00000001                            MOV     EAX,1
+   212 000001D5 EB D3                                  JMP     L39
+   213 000001D7                                 L48:
+   214 000001D7 8B 13                                  MOV     EDX,DWORD [EBX]
+   215 000001D9 89 15 [00000008]                       MOV     DWORD [_timerctl+8],EDX
+   216 000001DF 8B 42 04                               MOV     EAX,DWORD [4+EDX]
+   217 000001E2 A3 [00000004]                          MOV     DWORD [_timerctl+4],EAX
+   218 000001E7 EB DD                                  JMP     L42
+   219 000001E9                                        GLOBAL  _timer_cancelall
+   220 000001E9                                 _timer_cancelall:
+   221 000001E9 55                                     PUSH    EBP
+   222 000001EA 89 E5                                  MOV     EBP,ESP
+   223 000001EC 57                                     PUSH    EDI
+   224 000001ED 56                                     PUSH    ESI
+   225 000001EE 53                                     PUSH    EBX
+   226 000001EF BB [0000000C]                          MOV     EBX,_timerctl+12
+   227 000001F4 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+   228 000001F7 E8 [00000000]                          CALL    _io_load_eflags
+   229 000001FC 89 C6                                  MOV     ESI,EAX
+   230 000001FE E8 [00000000]                          CALL    _io_cli
+   231 00000203                                 L55:
+   232 00000203 80 7B 08 00                            CMP     BYTE [8+EBX],0
+   233 00000207 74 0B                                  JE      L52
+   234 00000209 80 7B 09 00                            CMP     BYTE [9+EBX],0
+   235 0000020D 74 05                                  JE      L52
+   236 0000020F 39 7B 0C                               CMP     DWORD [12+EBX],EDI
+   237 00000212 74 1A                                  JE      L58
+   238 00000214                                 L52:
+   239 00000214 83 C3 14                               ADD     EBX,20
+   240 00000217 81 FB [00002708]                       CMP     EBX,_timerctl+9992
+   241 0000021D 7E E4                                  JLE     L55
+   242 0000021F 89 75 08                               MOV     DWORD [8+EBP],ESI
+   243 00000222 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   244 00000225 5B                                     POP     EBX
+   245 00000226 5E                                     POP     ESI
+   246 00000227 5F                                     POP     EDI
+   247 00000228 5D                                     POP     EBP
+   248 00000229 E9 [00000000]                          JMP     _io_store_eflags
+   249 0000022E                                 L58:
+   250 0000022E 53                                     PUSH    EBX
+   251 0000022F E8 FFFFFF54                            CALL    _timer_cancel
+   252 00000234 53                                     PUSH    EBX
+   253 00000235 E8 FFFFFE59                            CALL    _timer_free
+   254 0000023A 58                                     POP     EAX
+   255 0000023B 5A                                     POP     EDX
+   256 0000023C EB D6                                  JMP     L52
+   257 0000023E                                        GLOBAL  _timerctl
+   258                                          [SECTION .data]
+   259 00000000                                        ALIGNB  16
+   260 00000000                                 _timerctl:
+   261 00000000 00 00 00 00 00 00 00 00 00 00          RESB    10012
+       0000000A 00 00 00 00 00 00 00 00 00 00 
+       00000014 00 00 00 00 00 00 00 00 00 00 
+       0000001E 00 00 00 00 00 00 00 00 00 00 
+       00000028 00 00 00 00 00 00 00 00 00 00 
+       00000032 00 00 00 00 00 00 00 00 00 00 
+       0000003C 00 00 00 00 00 00 00 00 00 00 
+       00000046 00 00 00 00 00 00 00 00 00 00 
+       00000050 00 00 00 00 00 00 00 00 00 00 
+       0000005A 00 00 00 00 00 00 00 00 00 00 
+       00000064 00 00 00 00 00 00 00 00 00 00 
+       0000006E 00 00 00 00 00 00 00 00 00 00 
+       00000078 00 00 00 00 00 00 00 00 00 00 
+       00000082 00 00 00 00 00 00 00 00 00 00 
+       0000008C 00 00 00 00 00 00 00 00 00 00 
+       00000096 00 00 00 00 00 00 00 00 00 00 
+       000000A0 00 00 00 00 00 00 00 00 00 00 
+       000000AA 00 00 00 00 00 00 00 00 00 00 
+       000000B4 00 00 00 00 00 00 00 00 00 00 
+       000000BE 00 00 00 00 00 00 00 00 00 00 
+       000000C8 00 00 00 00 00 00 00 00 00 00 
+       000000D2 00 00 00 00 00 00 00 00 00 00 
+       000000DC 00 00 00 00 00 00 00 00 00 00 
+       000000E6 00 00 00 00 00 00 00 00 00 00 
+       000000F0 00 00 00 00 00 00 00 00 00 00 
+       000000FA 00 00 00 00 00 00 00 00 00 00 
+       00000104 00 00 00 00 00 00 00 00 00 00 
+       0000010E 00 00 00 00 00 00 00 00 00 00 
+       00000118 00 00 00 00 00 00 00 00 00 00 
+       00000122 00 00 00 00 00 00 00 00 00 00 
+       0000012C 00 00 00 00 00 00 00 00 00 00 
+       00000136 00 00 00 00 00 00 00 00 00 00 
+       00000140 00 00 00 00 00 00 00 00 00 00 
+       0000014A 00 00 00 00 00 00 00 00 00 00 
+       00000154 00 00 00 00 00 00 00 00 00 00 
+       0000015E 00 00 00 00 00 00 00 00 00 00 
+       00000168 00 00 00 00 00 00 00 00 00 00 
+       00000172 00 00 00 00 00 00 00 00 00 00 
+       0000017C 00 00 00 00 00 00 00 00 00 00 
+       00000186 00 00 00 00 00 00 00 00 00 00 
+       00000190 00 00 00 00 00 00 00 00 00 00 
+       0000019A 00 00 00 00 00 00 00 00 00 00 
+       000001A4 00 00 00 00 00 00 00 00 00 00 
+       000001AE 00 00 00 00 00 00 00 00 00 00 
+       000001B8 00 00 00 00 00 00 00 00 00 00 
+       000001C2 00 00 00 00 00 00 00 00 00 00 
+       000001CC 00 00 00 00 00 00 00 00 00 00 
+       000001D6 00 00 00 00 00 00 00 00 00 00 
+       000001E0 00 00 00 00 00 00 00 00 00 00 
+       000001EA 00 00 00 00 00 00 00 00 00 00 
+       000001F4 00 00 00 00 00 00 00 00 00 00 
+       000001FE 00 00 00 00 00 00 00 00 00 00 
+       00000208 00 00 00 00 00 00 00 00 00 00 
+       00000212 00 00 00 00 00 00 00 00 00 00 
+       0000021C 00 00 00 00 00 00 00 00 00 00 
+       00000226 00 00 00 00 00 00 00 00 00 00 
+       00000230 00 00 00 00 00 00 00 00 00 00 
+       0000023A 00 00 00 00 00 00 00 00 00 00 
+       00000244 00 00 00 00 00 00 00 00 00 00 
+       0000024E 00 00 00 00 00 00 00 00 00 00 
+       00000258 00 00 00 00 00 00 00 00 00 00 
+       00000262 00 00 00 00 00 00 00 00 00 00 
+       0000026C 00 00 00 00 00 00 00 00 00 00 
+       00000276 00 00 00 00 00 00 00 00 00 00 
+       00000280 00 00 00 00 00 00 00 00 00 00 
+       0000028A 00 00 00 00 00 00 00 00 00 00 
+       00000294 00 00 00 00 00 00 00 00 00 00 
+       0000029E 00 00 00 00 00 00 00 00 00 00 
+       000002A8 00 00 00 00 00 00 00 00 00 00 
+       000002B2 00 00 00 00 00 00 00 00 00 00 
+       000002BC 00 00 00 00 00 00 00 00 00 00 
+       000002C6 00 00 00 00 00 00 00 00 00 00 
+       000002D0 00 00 00 00 00 00 00 00 00 00 
+       000002DA 00 00 00 00 00 00 00 00 00 00 
+       000002E4 00 00 00 00 00 00 00 00 00 00 
+       000002EE 00 00 00 00 00 00 00 00 00 00 
+       000002F8 00 00 00 00 00 00 00 00 00 00 
+       00000302 00 00 00 00 00 00 00 00 00 00 
+       0000030C 00 00 00 00 00 00 00 00 00 00 
+       00000316 00 00 00 00 00 00 00 00 00 00 
+       00000320 00 00 00 00 00 00 00 00 00 00 
+       0000032A 00 00 00 00 00 00 00 00 00 00 
+       00000334 00 00 00 00 00 00 00 00 00 00 
+       0000033E 00 00 00 00 00 00 00 00 00 00 
+       00000348 00 00 00 00 00 00 00 00 00 00 
+       00000352 00 00 00 00 00 00 00 00 00 00 
+       0000035C 00 00 00 00 00 00 00 00 00 00 
+       00000366 00 00 00 00 00 00 00 00 00 00 
+       00000370 00 00 00 00 00 00 00 00 00 00 
+       0000037A 00 00 00 00 00 00 00 00 00 00 
+       00000384 00 00 00 00 00 00 00 00 00 00 
+       0000038E 00 00 00 00 00 00 00 00 00 00 
+       00000398 00 00 00 00 00 00 00 00 00 00 
+       000003A2 00 00 00 00 00 00 00 00 00 00 
+       000003AC 00 00 00 00 00 00 00 00 00 00 
+       000003B6 00 00 00 00 00 00 00 00 00 00 
+       000003C0 00 00 00 00 00 00 00 00 00 00 
+       000003CA 00 00 00 00 00 00 00 00 00 00 
+       000003D4 00 00 00 00 00 00 00 00 00 00 
+       000003DE 00 00 00 00 00 00 00 00 00 00 
+       000003E8 00 00 00 00 00 00 00 00 00 00 
+       000003F2 00 00 00 00 00 00 00 00 00 00 
+       000003FC 00 00 00 00 00 00 00 00 00 00 
+       00000406 00 00 00 00 00 00 00 00 00 00 
+       00000410 00 00 00 00 00 00 00 00 00 00 
+       0000041A 00 00 00 00 00 00 00 00 00 00 
+       00000424 00 00 00 00 00 00 00 00 00 00 
+       0000042E 00 00 00 00 00 00 00 00 00 00 
+       00000438 00 00 00 00 00 00 00 00 00 00 
+       00000442 00 00 00 00 00 00 00 00 00 00 
+       0000044C 00 00 00 00 00 00 00 00 00 00 
+       00000456 00 00 00 00 00 00 00 00 00 00 
+       00000460 00 00 00 00 00 00 00 00 00 00 
+       0000046A 00 00 00 00 00 00 00 00 00 00 
+       00000474 00 00 00 00 00 00 00 00 00 00 
+       0000047E 00 00 00 00 00 00 00 00 00 00 
+       00000488 00 00 00 00 00 00 00 00 00 00 
+       00000492 00 00 00 00 00 00 00 00 00 00 
+       0000049C 00 00 00 00 00 00 00 00 00 00 
+       000004A6 00 00 00 00 00 00 00 00 00 00 
+       000004B0 00 00 00 00 00 00 00 00 00 00 
+       000004BA 00 00 00 00 00 00 00 00 00 00 
+       000004C4 00 00 00 00 00 00 00 00 00 00 
+       000004CE 00 00 00 00 00 00 00 00 00 00 
+       000004D8 00 00 00 00 00 00 00 00 00 00 
+       000004E2 00 00 00 00 00 00 00 00 00 00 
+       000004EC 00 00 00 00 00 00 00 00 00 00 
+       000004F6 00 00 00 00 00 00 00 00 00 00 
+       00000500 00 00 00 00 00 00 00 00 00 00 
+       0000050A 00 00 00 00 00 00 00 00 00 00 
+       00000514 00 00 00 00 00 00 00 00 00 00 
+       0000051E 00 00 00 00 00 00 00 00 00 00 
+       00000528 00 00 00 00 00 00 00 00 00 00 
+       00000532 00 00 00 00 00 00 00 00 00 00 
+       0000053C 00 00 00 00 00 00 00 00 00 00 
+       00000546 00 00 00 00 00 00 00 00 00 00 
+       00000550 00 00 00 00 00 00 00 00 00 00 
+       0000055A 00 00 00 00 00 00 00 00 00 00 
+       00000564 00 00 00 00 00 00 00 00 00 00 
+       0000056E 00 00 00 00 00 00 00 00 00 00 
+       00000578 00 00 00 00 00 00 00 00 00 00 
+       00000582 00 00 00 00 00 00 00 00 00 00 
+       0000058C 00 00 00 00 00 00 00 00 00 00 
+       00000596 00 00 00 00 00 00 00 00 00 00 
+       000005A0 00 00 00 00 00 00 00 00 00 00 
+       000005AA 00 00 00 00 00 00 00 00 00 00 
+       000005B4 00 00 00 00 00 00 00 00 00 00 
+       000005BE 00 00 00 00 00 00 00 00 00 00 
+       000005C8 00 00 00 00 00 00 00 00 00 00 
+       000005D2 00 00 00 00 00 00 00 00 00 00 
+       000005DC 00 00 00 00 00 00 00 00 00 00 
+       000005E6 00 00 00 00 00 00 00 00 00 00 
+       000005F0 00 00 00 00 00 00 00 00 00 00 
+       000005FA 00 00 00 00 00 00 00 00 00 00 
+       00000604 00 00 00 00 00 00 00 00 00 00 
+       0000060E 00 00 00 00 00 00 00 00 00 00 
+       00000618 00 00 00 00 00 00 00 00 00 00 
+       00000622 00 00 00 00 00 00 00 00 00 00 
+       0000062C 00 00 00 00 00 00 00 00 00 00 
+       00000636 00 00 00 00 00 00 00 00 00 00 
+       00000640 00 00 00 00 00 00 00 00 00 00 
+       0000064A 00 00 00 00 00 00 00 00 00 00 
+       00000654 00 00 00 00 00 00 00 00 00 00 
+       0000065E 00 00 00 00 00 00 00 00 00 00 
+       00000668 00 00 00 00 00 00 00 00 00 00 
+       00000672 00 00 00 00 00 00 00 00 00 00 
+       0000067C 00 00 00 00 00 00 00 00 00 00 
+       00000686 00 00 00 00 00 00 00 00 00 00 
+       00000690 00 00 00 00 00 00 00 00 00 00 
+       0000069A 00 00 00 00 00 00 00 00 00 00 
+       000006A4 00 00 00 00 00 00 00 00 00 00 
+       000006AE 00 00 00 00 00 00 00 00 00 00 
+       000006B8 00 00 00 00 00 00 00 00 00 00 
+       000006C2 00 00 00 00 00 00 00 00 00 00 
+       000006CC 00 00 00 00 00 00 00 00 00 00 
+       000006D6 00 00 00 00 00 00 00 00 00 00 
+       000006E0 00 00 00 00 00 00 00 00 00 00 
+       000006EA 00 00 00 00 00 00 00 00 00 00 
+       000006F4 00 00 00 00 00 00 00 00 00 00 
+       000006FE 00 00 00 00 00 00 00 00 00 00 
+       00000708 00 00 00 00 00 00 00 00 00 00 
+       00000712 00 00 00 00 00 00 00 00 00 00 
+       0000071C 00 00 00 00 00 00 00 00 00 00 
+       00000726 00 00 00 00 00 00 00 00 00 00 
+       00000730 00 00 00 00 00 00 00 00 00 00 
+       0000073A 00 00 00 00 00 00 00 00 00 00 
+       00000744 00 00 00 00 00 00 00 00 00 00 
+       0000074E 00 00 00 00 00 00 00 00 00 00 
+       00000758 00 00 00 00 00 00 00 00 00 00 
+       00000762 00 00 00 00 00 00 00 00 00 00 
+       0000076C 00 00 00 00 00 00 00 00 00 00 
+       00000776 00 00 00 00 00 00 00 00 00 00 
+       00000780 00 00 00 00 00 00 00 00 00 00 
+       0000078A 00 00 00 00 00 00 00 00 00 00 
+       00000794 00 00 00 00 00 00 00 00 00 00 
+       0000079E 00 00 00 00 00 00 00 00 00 00 
+       000007A8 00 00 00 00 00 00 00 00 00 00 
+       000007B2 00 00 00 00 00 00 00 00 00 00 
+       000007BC 00 00 00 00 00 00 00 00 00 00 
+       000007C6 00 00 00 00 00 00 00 00 00 00 
+       000007D0 00 00 00 00 00 00 00 00 00 00 
+       000007DA 00 00 00 00 00 00 00 00 00 00 
+       000007E4 00 00 00 00 00 00 00 00 00 00 
+       000007EE 00 00 00 00 00 00 00 00 00 00 
+       000007F8 00 00 00 00 00 00 00 00 00 00 
+       00000802 00 00 00 00 00 00 00 00 00 00 
+       0000080C 00 00 00 00 00 00 00 00 00 00 
+       00000816 00 00 00 00 00 00 00 00 00 00 
+       00000820 00 00 00 00 00 00 00 00 00 00 
+       0000082A 00 00 00 00 00 00 00 00 00 00 
+       00000834 00 00 00 00 00 00 00 00 00 00 
+       0000083E 00 00 00 00 00 00 00 00 00 00 
+       00000848 00 00 00 00 00 00 00 00 00 00 
+       00000852 00 00 00 00 00 00 00 00 00 00 
+       0000085C 00 00 00 00 00 00 00 00 00 00 
+       00000866 00 00 00 00 00 00 00 00 00 00 
+       00000870 00 00 00 00 00 00 00 00 00 00 
+       0000087A 00 00 00 00 00 00 00 00 00 00 
+       00000884 00 00 00 00 00 00 00 00 00 00 
+       0000088E 00 00 00 00 00 00 00 00 00 00 
+       00000898 00 00 00 00 00 00 00 00 00 00 
+       000008A2 00 00 00 00 00 00 00 00 00 00 
+       000008AC 00 00 00 00 00 00 00 00 00 00 
+       000008B6 00 00 00 00 00 00 00 00 00 00 
+       000008C0 00 00 00 00 00 00 00 00 00 00 
+       000008CA 00 00 00 00 00 00 00 00 00 00 
+       000008D4 00 00 00 00 00 00 00 00 00 00 
+       000008DE 00 00 00 00 00 00 00 00 00 00 
+       000008E8 00 00 00 00 00 00 00 00 00 00 
+       000008F2 00 00 00 00 00 00 00 00 00 00 
+       000008FC 00 00 00 00 00 00 00 00 00 00 
+       00000906 00 00 00 00 00 00 00 00 00 00 
+       00000910 00 00 00 00 00 00 00 00 00 00 
+       0000091A 00 00 00 00 00 00 00 00 00 00 
+       00000924 00 00 00 00 00 00 00 00 00 00 
+       0000092E 00 00 00 00 00 00 00 00 00 00 
+       00000938 00 00 00 00 00 00 00 00 00 00 
+       00000942 00 00 00 00 00 00 00 00 00 00 
+       0000094C 00 00 00 00 00 00 00 00 00 00 
+       00000956 00 00 00 00 00 00 00 00 00 00 
+       00000960 00 00 00 00 00 00 00 00 00 00 
+       0000096A 00 00 00 00 00 00 00 00 00 00 
+       00000974 00 00 00 00 00 00 00 00 00 00 
+       0000097E 00 00 00 00 00 00 00 00 00 00 
+       00000988 00 00 00 00 00 00 00 00 00 00 
+       00000992 00 00 00 00 00 00 00 00 00 00 
+       0000099C 00 00 00 00 00 00 00 00 00 00 
+       000009A6 00 00 00 00 00 00 00 00 00 00 
+       000009B0 00 00 00 00 00 00 00 00 00 00 
+       000009BA 00 00 00 00 00 00 00 00 00 00 
+       000009C4 00 00 00 00 00 00 00 00 00 00 
+       000009CE 00 00 00 00 00 00 00 00 00 00 
+       000009D8 00 00 00 00 00 00 00 00 00 00 
+       000009E2 00 00 00 00 00 00 00 00 00 00 
+       000009EC 00 00 00 00 00 00 00 00 00 00 
+       000009F6 00 00 00 00 00 00 00 00 00 00 
+       00000A00 00 00 00 00 00 00 00 00 00 00 
+       00000A0A 00 00 00 00 00 00 00 00 00 00 
+       00000A14 00 00 00 00 00 00 00 00 00 00 
+       00000A1E 00 00 00 00 00 00 00 00 00 00 
+       00000A28 00 00 00 00 00 00 00 00 00 00 
+       00000A32 00 00 00 00 00 00 00 00 00 00 
+       00000A3C 00 00 00 00 00 00 00 00 00 00 
+       00000A46 00 00 00 00 00 00 00 00 00 00 
+       00000A50 00 00 00 00 00 00 00 00 00 00 
+       00000A5A 00 00 00 00 00 00 00 00 00 00 
+       00000A64 00 00 00 00 00 00 00 00 00 00 
+       00000A6E 00 00 00 00 00 00 00 00 00 00 
+       00000A78 00 00 00 00 00 00 00 00 00 00 
+       00000A82 00 00 00 00 00 00 00 00 00 00 
+       00000A8C 00 00 00 00 00 00 00 00 00 00 
+       00000A96 00 00 00 00 00 00 00 00 00 00 
+       00000AA0 00 00 00 00 00 00 00 00 00 00 
+       00000AAA 00 00 00 00 00 00 00 00 00 00 
+       00000AB4 00 00 00 00 00 00 00 00 00 00 
+       00000ABE 00 00 00 00 00 00 00 00 00 00 
+       00000AC8 00 00 00 00 00 00 00 00 00 00 
+       00000AD2 00 00 00 00 00 00 00 00 00 00 
+       00000ADC 00 00 00 00 00 00 00 00 00 00 
+       00000AE6 00 00 00 00 00 00 00 00 00 00 
+       00000AF0 00 00 00 00 00 00 00 00 00 00 
+       00000AFA 00 00 00 00 00 00 00 00 00 00 
+       00000B04 00 00 00 00 00 00 00 00 00 00 
+       00000B0E 00 00 00 00 00 00 00 00 00 00 
+       00000B18 00 00 00 00 00 00 00 00 00 00 
+       00000B22 00 00 00 00 00 00 00 00 00 00 
+       00000B2C 00 00 00 00 00 00 00 00 00 00 
+       00000B36 00 00 00 00 00 00 00 00 00 00 
+       00000B40 00 00 00 00 00 00 00 00 00 00 
+       00000B4A 00 00 00 00 00 00 00 00 00 00 
+       00000B54 00 00 00 00 00 00 00 00 00 00 
+       00000B5E 00 00 00 00 00 00 00 00 00 00 
+       00000B68 00 00 00 00 00 00 00 00 00 00 
+       00000B72 00 00 00 00 00 00 00 00 00 00 
+       00000B7C 00 00 00 00 00 00 00 00 00 00 
+       00000B86 00 00 00 00 00 00 00 00 00 00 
+       00000B90 00 00 00 00 00 00 00 00 00 00 
+       00000B9A 00 00 00 00 00 00 00 00 00 00 
+       00000BA4 00 00 00 00 00 00 00 00 00 00 
+       00000BAE 00 00 00 00 00 00 00 00 00 00 
+       00000BB8 00 00 00 00 00 00 00 00 00 00 
+       00000BC2 00 00 00 00 00 00 00 00 00 00 
+       00000BCC 00 00 00 00 00 00 00 00 00 00 
+       00000BD6 00 00 00 00 00 00 00 00 00 00 
+       00000BE0 00 00 00 00 00 00 00 00 00 00 
+       00000BEA 00 00 00 00 00 00 00 00 00 00 
+       00000BF4 00 00 00 00 00 00 00 00 00 00 
+       00000BFE 00 00 00 00 00 00 00 00 00 00 
+       00000C08 00 00 00 00 00 00 00 00 00 00 
+       00000C12 00 00 00 00 00 00 00 00 00 00 
+       00000C1C 00 00 00 00 00 00 00 00 00 00 
+       00000C26 00 00 00 00 00 00 00 00 00 00 
+       00000C30 00 00 00 00 00 00 00 00 00 00 
+       00000C3A 00 00 00 00 00 00 00 00 00 00 
+       00000C44 00 00 00 00 00 00 00 00 00 00 
+       00000C4E 00 00 00 00 00 00 00 00 00 00 
+       00000C58 00 00 00 00 00 00 00 00 00 00 
+       00000C62 00 00 00 00 00 00 00 00 00 00 
+       00000C6C 00 00 00 00 00 00 00 00 00 00 
+       00000C76 00 00 00 00 00 00 00 00 00 00 
+       00000C80 00 00 00 00 00 00 00 00 00 00 
+       00000C8A 00 00 00 00 00 00 00 00 00 00 
+       00000C94 00 00 00 00 00 00 00 00 00 00 
+       00000C9E 00 00 00 00 00 00 00 00 00 00 
+       00000CA8 00 00 00 00 00 00 00 00 00 00 
+       00000CB2 00 00 00 00 00 00 00 00 00 00 
+       00000CBC 00 00 00 00 00 00 00 00 00 00 
+       00000CC6 00 00 00 00 00 00 00 00 00 00 
+       00000CD0 00 00 00 00 00 00 00 00 00 00 
+       00000CDA 00 00 00 00 00 00 00 00 00 00 
+       00000CE4 00 00 00 00 00 00 00 00 00 00 
+       00000CEE 00 00 00 00 00 00 00 00 00 00 
+       00000CF8 00 00 00 00 00 00 00 00 00 00 
+       00000D02 00 00 00 00 00 00 00 00 00 00 
+       00000D0C 00 00 00 00 00 00 00 00 00 00 
+       00000D16 00 00 00 00 00 00 00 00 00 00 
+       00000D20 00 00 00 00 00 00 00 00 00 00 
+       00000D2A 00 00 00 00 00 00 00 00 00 00 
+       00000D34 00 00 00 00 00 00 00 00 00 00 
+       00000D3E 00 00 00 00 00 00 00 00 00 00 
+       00000D48 00 00 00 00 00 00 00 00 00 00 
+       00000D52 00 00 00 00 00 00 00 00 00 00 
+       00000D5C 00 00 00 00 00 00 00 00 00 00 
+       00000D66 00 00 00 00 00 00 00 00 00 00 
+       00000D70 00 00 00 00 00 00 00 00 00 00 
+       00000D7A 00 00 00 00 00 00 00 00 00 00 
+       00000D84 00 00 00 00 00 00 00 00 00 00 
+       00000D8E 00 00 00 00 00 00 00 00 00 00 
+       00000D98 00 00 00 00 00 00 00 00 00 00 
+       00000DA2 00 00 00 00 00 00 00 00 00 00 
+       00000DAC 00 00 00 00 00 00 00 00 00 00 
+       00000DB6 00 00 00 00 00 00 00 00 00 00 
+       00000DC0 00 00 00 00 00 00 00 00 00 00 
+       00000DCA 00 00 00 00 00 00 00 00 00 00 
+       00000DD4 00 00 00 00 00 00 00 00 00 00 
+       00000DDE 00 00 00 00 00 00 00 00 00 00 
+       00000DE8 00 00 00 00 00 00 00 00 00 00 
+       00000DF2 00 00 00 00 00 00 00 00 00 00 
+       00000DFC 00 00 00 00 00 00 00 00 00 00 
+       00000E06 00 00 00 00 00 00 00 00 00 00 
+       00000E10 00 00 00 00 00 00 00 00 00 00 
+       00000E1A 00 00 00 00 00 00 00 00 00 00 
+       00000E24 00 00 00 00 00 00 00 00 00 00 
+       00000E2E 00 00 00 00 00 00 00 00 00 00 
+       00000E38 00 00 00 00 00 00 00 00 00 00 
+       00000E42 00 00 00 00 00 00 00 00 00 00 
+       00000E4C 00 00 00 00 00 00 00 00 00 00 
+       00000E56 00 00 00 00 00 00 00 00 00 00 
+       00000E60 00 00 00 00 00 00 00 00 00 00 
+       00000E6A 00 00 00 00 00 00 00 00 00 00 
+       00000E74 00 00 00 00 00 00 00 00 00 00 
+       00000E7E 00 00 00 00 00 00 00 00 00 00 
+       00000E88 00 00 00 00 00 00 00 00 00 00 
+       00000E92 00 00 00 00 00 00 00 00 00 00 
+       00000E9C 00 00 00 00 00 00 00 00 00 00 
+       00000EA6 00 00 00 00 00 00 00 00 00 00 
+       00000EB0 00 00 00 00 00 00 00 00 00 00 
+       00000EBA 00 00 00 00 00 00 00 00 00 00 
+       00000EC4 00 00 00 00 00 00 00 00 00 00 
+       00000ECE 00 00 00 00 00 00 00 00 00 00 
+       00000ED8 00 00 00 00 00 00 00 00 00 00 
+       00000EE2 00 00 00 00 00 00 00 00 00 00 
+       00000EEC 00 00 00 00 00 00 00 00 00 00 
+       00000EF6 00 00 00 00 00 00 00 00 00 00 
+       00000F00 00 00 00 00 00 00 00 00 00 00 
+       00000F0A 00 00 00 00 00 00 00 00 00 00 
+       00000F14 00 00 00 00 00 00 00 00 00 00 
+       00000F1E 00 00 00 00 00 00 00 00 00 00 
+       00000F28 00 00 00 00 00 00 00 00 00 00 
+       00000F32 00 00 00 00 00 00 00 00 00 00 
+       00000F3C 00 00 00 00 00 00 00 00 00 00 
+       00000F46 00 00 00 00 00 00 00 00 00 00 
+       00000F50 00 00 00 00 00 00 00 00 00 00 
+       00000F5A 00 00 00 00 00 00 00 00 00 00 
+       00000F64 00 00 00 00 00 00 00 00 00 00 
+       00000F6E 00 00 00 00 00 00 00 00 00 00 
+       00000F78 00 00 00 00 00 00 00 00 00 00 
+       00000F82 00 00 00 00 00 00 00 00 00 00 
+       00000F8C 00 00 00 00 00 00 00 00 00 00 
+       00000F96 00 00 00 00 00 00 00 00 00 00 
+       00000FA0 00 00 00 00 00 00 00 00 00 00 
+       00000FAA 00 00 00 00 00 00 00 00 00 00 
+       00000FB4 00 00 00 00 00 00 00 00 00 00 
+       00000FBE 00 00 00 00 00 00 00 00 00 00 
+       00000FC8 00 00 00 00 00 00 00 00 00 00 
+       00000FD2 00 00 00 00 00 00 00 00 00 00 
+       00000FDC 00 00 00 00 00 00 00 00 00 00 
+       00000FE6 00 00 00 00 00 00 00 00 00 00 
+       00000FF0 00 00 00 00 00 00 00 00 00 00 
+       00000FFA 00 00 00 00 00 00 00 00 00 00 
+       00001004 00 00 00 00 00 00 00 00 00 00 
+       0000100E 00 00 00 00 00 00 00 00 00 00 
+       00001018 00 00 00 00 00 00 00 00 00 00 
+       00001022 00 00 00 00 00 00 00 00 00 00 
+       0000102C 00 00 00 00 00 00 00 00 00 00 
+       00001036 00 00 00 00 00 00 00 00 00 00 
+       00001040 00 00 00 00 00 00 00 00 00 00 
+       0000104A 00 00 00 00 00 00 00 00 00 00 
+       00001054 00 00 00 00 00 00 00 00 00 00 
+       0000105E 00 00 00 00 00 00 00 00 00 00 
+       00001068 00 00 00 00 00 00 00 00 00 00 
+       00001072 00 00 00 00 00 00 00 00 00 00 
+       0000107C 00 00 00 00 00 00 00 00 00 00 
+       00001086 00 00 00 00 00 00 00 00 00 00 
+       00001090 00 00 00 00 00 00 00 00 00 00 
+       0000109A 00 00 00 00 00 00 00 00 00 00 
+       000010A4 00 00 00 00 00 00 00 00 00 00 
+       000010AE 00 00 00 00 00 00 00 00 00 00 
+       000010B8 00 00 00 00 00 00 00 00 00 00 
+       000010C2 00 00 00 00 00 00 00 00 00 00 
+       000010CC 00 00 00 00 00 00 00 00 00 00 
+       000010D6 00 00 00 00 00 00 00 00 00 00 
+       000010E0 00 00 00 00 00 00 00 00 00 00 
+       000010EA 00 00 00 00 00 00 00 00 00 00 
+       000010F4 00 00 00 00 00 00 00 00 00 00 
+       000010FE 00 00 00 00 00 00 00 00 00 00 
+       00001108 00 00 00 00 00 00 00 00 00 00 
+       00001112 00 00 00 00 00 00 00 00 00 00 
+       0000111C 00 00 00 00 00 00 00 00 00 00 
+       00001126 00 00 00 00 00 00 00 00 00 00 
+       00001130 00 00 00 00 00 00 00 00 00 00 
+       0000113A 00 00 00 00 00 00 00 00 00 00 
+       00001144 00 00 00 00 00 00 00 00 00 00 
+       0000114E 00 00 00 00 00 00 00 00 00 00 
+       00001158 00 00 00 00 00 00 00 00 00 00 
+       00001162 00 00 00 00 00 00 00 00 00 00 
+       0000116C 00 00 00 00 00 00 00 00 00 00 
+       00001176 00 00 00 00 00 00 00 00 00 00 
+       00001180 00 00 00 00 00 00 00 00 00 00 
+       0000118A 00 00 00 00 00 00 00 00 00 00 
+       00001194 00 00 00 00 00 00 00 00 00 00 
+       0000119E 00 00 00 00 00 00 00 00 00 00 
+       000011A8 00 00 00 00 00 00 00 00 00 00 
+       000011B2 00 00 00 00 00 00 00 00 00 00 
+       000011BC 00 00 00 00 00 00 00 00 00 00 
+       000011C6 00 00 00 00 00 00 00 00 00 00 
+       000011D0 00 00 00 00 00 00 00 00 00 00 
+       000011DA 00 00 00 00 00 00 00 00 00 00 
+       000011E4 00 00 00 00 00 00 00 00 00 00 
+       000011EE 00 00 00 00 00 00 00 00 00 00 
+       000011F8 00 00 00 00 00 00 00 00 00 00 
+       00001202 00 00 00 00 00 00 00 00 00 00 
+       0000120C 00 00 00 00 00 00 00 00 00 00 
+       00001216 00 00 00 00 00 00 00 00 00 00 
+       00001220 00 00 00 00 00 00 00 00 00 00 
+       0000122A 00 00 00 00 00 00 00 00 00 00 
+       00001234 00 00 00 00 00 00 00 00 00 00 
+       0000123E 00 00 00 00 00 00 00 00 00 00 
+       00001248 00 00 00 00 00 00 00 00 00 00 
+       00001252 00 00 00 00 00 00 00 00 00 00 
+       0000125C 00 00 00 00 00 00 00 00 00 00 
+       00001266 00 00 00 00 00 00 00 00 00 00 
+       00001270 00 00 00 00 00 00 00 00 00 00 
+       0000127A 00 00 00 00 00 00 00 00 00 00 
+       00001284 00 00 00 00 00 00 00 00 00 00 
+       0000128E 00 00 00 00 00 00 00 00 00 00 
+       00001298 00 00 00 00 00 00 00 00 00 00 
+       000012A2 00 00 00 00 00 00 00 00 00 00 
+       000012AC 00 00 00 00 00 00 00 00 00 00 
+       000012B6 00 00 00 00 00 00 00 00 00 00 
+       000012C0 00 00 00 00 00 00 00 00 00 00 
+       000012CA 00 00 00 00 00 00 00 00 00 00 
+       000012D4 00 00 00 00 00 00 00 00 00 00 
+       000012DE 00 00 00 00 00 00 00 00 00 00 
+       000012E8 00 00 00 00 00 00 00 00 00 00 
+       000012F2 00 00 00 00 00 00 00 00 00 00 
+       000012FC 00 00 00 00 00 00 00 00 00 00 
+       00001306 00 00 00 00 00 00 00 00 00 00 
+       00001310 00 00 00 00 00 00 00 00 00 00 
+       0000131A 00 00 00 00 00 00 00 00 00 00 
+       00001324 00 00 00 00 00 00 00 00 00 00 
+       0000132E 00 00 00 00 00 00 00 00 00 00 
+       00001338 00 00 00 00 00 00 00 00 00 00 
+       00001342 00 00 00 00 00 00 00 00 00 00 
+       0000134C 00 00 00 00 00 00 00 00 00 00 
+       00001356 00 00 00 00 00 00 00 00 00 00 
+       00001360 00 00 00 00 00 00 00 00 00 00 
+       0000136A 00 00 00 00 00 00 00 00 00 00 
+       00001374 00 00 00 00 00 00 00 00 00 00 
+       0000137E 00 00 00 00 00 00 00 00 00 00 
+       00001388 00 00 00 00 00 00 00 00 00 00 
+       00001392 00 00 00 00 00 00 00 00 00 00 
+       0000139C 00 00 00 00 00 00 00 00 00 00 
+       000013A6 00 00 00 00 00 00 00 00 00 00 
+       000013B0 00 00 00 00 00 00 00 00 00 00 
+       000013BA 00 00 00 00 00 00 00 00 00 00 
+       000013C4 00 00 00 00 00 00 00 00 00 00 
+       000013CE 00 00 00 00 00 00 00 00 00 00 
+       000013D8 00 00 00 00 00 00 00 00 00 00 
+       000013E2 00 00 00 00 00 00 00 00 00 00 
+       000013EC 00 00 00 00 00 00 00 00 00 00 
+       000013F6 00 00 00 00 00 00 00 00 00 00 
+       00001400 00 00 00 00 00 00 00 00 00 00 
+       0000140A 00 00 00 00 00 00 00 00 00 00 
+       00001414 00 00 00 00 00 00 00 00 00 00 
+       0000141E 00 00 00 00 00 00 00 00 00 00 
+       00001428 00 00 00 00 00 00 00 00 00 00 
+       00001432 00 00 00 00 00 00 00 00 00 00 
+       0000143C 00 00 00 00 00 00 00 00 00 00 
+       00001446 00 00 00 00 00 00 00 00 00 00 
+       00001450 00 00 00 00 00 00 00 00 00 00 
+       0000145A 00 00 00 00 00 00 00 00 00 00 
+       00001464 00 00 00 00 00 00 00 00 00 00 
+       0000146E 00 00 00 00 00 00 00 00 00 00 
+       00001478 00 00 00 00 00 00 00 00 00 00 
+       00001482 00 00 00 00 00 00 00 00 00 00 
+       0000148C 00 00 00 00 00 00 00 00 00 00 
+       00001496 00 00 00 00 00 00 00 00 00 00 
+       000014A0 00 00 00 00 00 00 00 00 00 00 
+       000014AA 00 00 00 00 00 00 00 00 00 00 
+       000014B4 00 00 00 00 00 00 00 00 00 00 
+       000014BE 00 00 00 00 00 00 00 00 00 00 
+       000014C8 00 00 00 00 00 00 00 00 00 00 
+       000014D2 00 00 00 00 00 00 00 00 00 00 
+       000014DC 00 00 00 00 00 00 00 00 00 00 
+       000014E6 00 00 00 00 00 00 00 00 00 00 
+       000014F0 00 00 00 00 00 00 00 00 00 00 
+       000014FA 00 00 00 00 00 00 00 00 00 00 
+       00001504 00 00 00 00 00 00 00 00 00 00 
+       0000150E 00 00 00 00 00 00 00 00 00 00 
+       00001518 00 00 00 00 00 00 00 00 00 00 
+       00001522 00 00 00 00 00 00 00 00 00 00 
+       0000152C 00 00 00 00 00 00 00 00 00 00 
+       00001536 00 00 00 00 00 00 00 00 00 00 
+       00001540 00 00 00 00 00 00 00 00 00 00 
+       0000154A 00 00 00 00 00 00 00 00 00 00 
+       00001554 00 00 00 00 00 00 00 00 00 00 
+       0000155E 00 00 00 00 00 00 00 00 00 00 
+       00001568 00 00 00 00 00 00 00 00 00 00 
+       00001572 00 00 00 00 00 00 00 00 00 00 
+       0000157C 00 00 00 00 00 00 00 00 00 00 
+       00001586 00 00 00 00 00 00 00 00 00 00 
+       00001590 00 00 00 00 00 00 00 00 00 00 
+       0000159A 00 00 00 00 00 00 00 00 00 00 
+       000015A4 00 00 00 00 00 00 00 00 00 00 
+       000015AE 00 00 00 00 00 00 00 00 00 00 
+       000015B8 00 00 00 00 00 00 00 00 00 00 
+       000015C2 00 00 00 00 00 00 00 00 00 00 
+       000015CC 00 00 00 00 00 00 00 00 00 00 
+       000015D6 00 00 00 00 00 00 00 00 00 00 
+       000015E0 00 00 00 00 00 00 00 00 00 00 
+       000015EA 00 00 00 00 00 00 00 00 00 00 
+       000015F4 00 00 00 00 00 00 00 00 00 00 
+       000015FE 00 00 00 00 00 00 00 00 00 00 
+       00001608 00 00 00 00 00 00 00 00 00 00 
+       00001612 00 00 00 00 00 00 00 00 00 00 
+       0000161C 00 00 00 00 00 00 00 00 00 00 
+       00001626 00 00 00 00 00 00 00 00 00 00 
+       00001630 00 00 00 00 00 00 00 00 00 00 
+       0000163A 00 00 00 00 00 00 00 00 00 00 
+       00001644 00 00 00 00 00 00 00 00 00 00 
+       0000164E 00 00 00 00 00 00 00 00 00 00 
+       00001658 00 00 00 00 00 00 00 00 00 00 
+       00001662 00 00 00 00 00 00 00 00 00 00 
+       0000166C 00 00 00 00 00 00 00 00 00 00 
+       00001676 00 00 00 00 00 00 00 00 00 00 
+       00001680 00 00 00 00 00 00 00 00 00 00 
+       0000168A 00 00 00 00 00 00 00 00 00 00 
+       00001694 00 00 00 00 00 00 00 00 00 00 
+       0000169E 00 00 00 00 00 00 00 00 00 00 
+       000016A8 00 00 00 00 00 00 00 00 00 00 
+       000016B2 00 00 00 00 00 00 00 00 00 00 
+       000016BC 00 00 00 00 00 00 00 00 00 00 
+       000016C6 00 00 00 00 00 00 00 00 00 00 
+       000016D0 00 00 00 00 00 00 00 00 00 00 
+       000016DA 00 00 00 00 00 00 00 00 00 00 
+       000016E4 00 00 00 00 00 00 00 00 00 00 
+       000016EE 00 00 00 00 00 00 00 00 00 00 
+       000016F8 00 00 00 00 00 00 00 00 00 00 
+       00001702 00 00 00 00 00 00 00 00 00 00 
+       0000170C 00 00 00 00 00 00 00 00 00 00 
+       00001716 00 00 00 00 00 00 00 00 00 00 
+       00001720 00 00 00 00 00 00 00 00 00 00 
+       0000172A 00 00 00 00 00 00 00 00 00 00 
+       00001734 00 00 00 00 00 00 00 00 00 00 
+       0000173E 00 00 00 00 00 00 00 00 00 00 
+       00001748 00 00 00 00 00 00 00 00 00 00 
+       00001752 00 00 00 00 00 00 00 00 00 00 
+       0000175C 00 00 00 00 00 00 00 00 00 00 
+       00001766 00 00 00 00 00 00 00 00 00 00 
+       00001770 00 00 00 00 00 00 00 00 00 00 
+       0000177A 00 00 00 00 00 00 00 00 00 00 
+       00001784 00 00 00 00 00 00 00 00 00 00 
+       0000178E 00 00 00 00 00 00 00 00 00 00 
+       00001798 00 00 00 00 00 00 00 00 00 00 
+       000017A2 00 00 00 00 00 00 00 00 00 00 
+       000017AC 00 00 00 00 00 00 00 00 00 00 
+       000017B6 00 00 00 00 00 00 00 00 00 00 
+       000017C0 00 00 00 00 00 00 00 00 00 00 
+       000017CA 00 00 00 00 00 00 00 00 00 00 
+       000017D4 00 00 00 00 00 00 00 00 00 00 
+       000017DE 00 00 00 00 00 00 00 00 00 00 
+       000017E8 00 00 00 00 00 00 00 00 00 00 
+       000017F2 00 00 00 00 00 00 00 00 00 00 
+       000017FC 00 00 00 00 00 00 00 00 00 00 
+       00001806 00 00 00 00 00 00 00 00 00 00 
+       00001810 00 00 00 00 00 00 00 00 00 00 
+       0000181A 00 00 00 00 00 00 00 00 00 00 
+       00001824 00 00 00 00 00 00 00 00 00 00 
+       0000182E 00 00 00 00 00 00 00 00 00 00 
+       00001838 00 00 00 00 00 00 00 00 00 00 
+       00001842 00 00 00 00 00 00 00 00 00 00 
+       0000184C 00 00 00 00 00 00 00 00 00 00 
+       00001856 00 00 00 00 00 00 00 00 00 00 
+       00001860 00 00 00 00 00 00 00 00 00 00 
+       0000186A 00 00 00 00 00 00 00 00 00 00 
+       00001874 00 00 00 00 00 00 00 00 00 00 
+       0000187E 00 00 00 00 00 00 00 00 00 00 
+       00001888 00 00 00 00 00 00 00 00 00 00 
+       00001892 00 00 00 00 00 00 00 00 00 00 
+       0000189C 00 00 00 00 00 00 00 00 00 00 
+       000018A6 00 00 00 00 00 00 00 00 00 00 
+       000018B0 00 00 00 00 00 00 00 00 00 00 
+       000018BA 00 00 00 00 00 00 00 00 00 00 
+       000018C4 00 00 00 00 00 00 00 00 00 00 
+       000018CE 00 00 00 00 00 00 00 00 00 00 
+       000018D8 00 00 00 00 00 00 00 00 00 00 
+       000018E2 00 00 00 00 00 00 00 00 00 00 
+       000018EC 00 00 00 00 00 00 00 00 00 00 
+       000018F6 00 00 00 00 00 00 00 00 00 00 
+       00001900 00 00 00 00 00 00 00 00 00 00 
+       0000190A 00 00 00 00 00 00 00 00 00 00 
+       00001914 00 00 00 00 00 00 00 00 00 00 
+       0000191E 00 00 00 00 00 00 00 00 00 00 
+       00001928 00 00 00 00 00 00 00 00 00 00 
+       00001932 00 00 00 00 00 00 00 00 00 00 
+       0000193C 00 00 00 00 00 00 00 00 00 00 
+       00001946 00 00 00 00 00 00 00 00 00 00 
+       00001950 00 00 00 00 00 00 00 00 00 00 
+       0000195A 00 00 00 00 00 00 00 00 00 00 
+       00001964 00 00 00 00 00 00 00 00 00 00 
+       0000196E 00 00 00 00 00 00 00 00 00 00 
+       00001978 00 00 00 00 00 00 00 00 00 00 
+       00001982 00 00 00 00 00 00 00 00 00 00 
+       0000198C 00 00 00 00 00 00 00 00 00 00 
+       00001996 00 00 00 00 00 00 00 00 00 00 
+       000019A0 00 00 00 00 00 00 00 00 00 00 
+       000019AA 00 00 00 00 00 00 00 00 00 00 
+       000019B4 00 00 00 00 00 00 00 00 00 00 
+       000019BE 00 00 00 00 00 00 00 00 00 00 
+       000019C8 00 00 00 00 00 00 00 00 00 00 
+       000019D2 00 00 00 00 00 00 00 00 00 00 
+       000019DC 00 00 00 00 00 00 00 00 00 00 
+       000019E6 00 00 00 00 00 00 00 00 00 00 
+       000019F0 00 00 00 00 00 00 00 00 00 00 
+       000019FA 00 00 00 00 00 00 00 00 00 00 
+       00001A04 00 00 00 00 00 00 00 00 00 00 
+       00001A0E 00 00 00 00 00 00 00 00 00 00 
+       00001A18 00 00 00 00 00 00 00 00 00 00 
+       00001A22 00 00 00 00 00 00 00 00 00 00 
+       00001A2C 00 00 00 00 00 00 00 00 00 00 
+       00001A36 00 00 00 00 00 00 00 00 00 00 
+       00001A40 00 00 00 00 00 00 00 00 00 00 
+       00001A4A 00 00 00 00 00 00 00 00 00 00 
+       00001A54 00 00 00 00 00 00 00 00 00 00 
+       00001A5E 00 00 00 00 00 00 00 00 00 00 
+       00001A68 00 00 00 00 00 00 00 00 00 00 
+       00001A72 00 00 00 00 00 00 00 00 00 00 
+       00001A7C 00 00 00 00 00 00 00 00 00 00 
+       00001A86 00 00 00 00 00 00 00 00 00 00 
+       00001A90 00 00 00 00 00 00 00 00 00 00 
+       00001A9A 00 00 00 00 00 00 00 00 00 00 
+       00001AA4 00 00 00 00 00 00 00 00 00 00 
+       00001AAE 00 00 00 00 00 00 00 00 00 00 
+       00001AB8 00 00 00 00 00 00 00 00 00 00 
+       00001AC2 00 00 00 00 00 00 00 00 00 00 
+       00001ACC 00 00 00 00 00 00 00 00 00 00 
+       00001AD6 00 00 00 00 00 00 00 00 00 00 
+       00001AE0 00 00 00 00 00 00 00 00 00 00 
+       00001AEA 00 00 00 00 00 00 00 00 00 00 
+       00001AF4 00 00 00 00 00 00 00 00 00 00 
+       00001AFE 00 00 00 00 00 00 00 00 00 00 
+       00001B08 00 00 00 00 00 00 00 00 00 00 
+       00001B12 00 00 00 00 00 00 00 00 00 00 
+       00001B1C 00 00 00 00 00 00 00 00 00 00 
+       00001B26 00 00 00 00 00 00 00 00 00 00 
+       00001B30 00 00 00 00 00 00 00 00 00 00 
+       00001B3A 00 00 00 00 00 00 00 00 00 00 
+       00001B44 00 00 00 00 00 00 00 00 00 00 
+       00001B4E 00 00 00 00 00 00 00 00 00 00 
+       00001B58 00 00 00 00 00 00 00 00 00 00 
+       00001B62 00 00 00 00 00 00 00 00 00 00 
+       00001B6C 00 00 00 00 00 00 00 00 00 00 
+       00001B76 00 00 00 00 00 00 00 00 00 00 
+       00001B80 00 00 00 00 00 00 00 00 00 00 
+       00001B8A 00 00 00 00 00 00 00 00 00 00 
+       00001B94 00 00 00 00 00 00 00 00 00 00 
+       00001B9E 00 00 00 00 00 00 00 00 00 00 
+       00001BA8 00 00 00 00 00 00 00 00 00 00 
+       00001BB2 00 00 00 00 00 00 00 00 00 00 
+       00001BBC 00 00 00 00 00 00 00 00 00 00 
+       00001BC6 00 00 00 00 00 00 00 00 00 00 
+       00001BD0 00 00 00 00 00 00 00 00 00 00 
+       00001BDA 00 00 00 00 00 00 00 00 00 00 
+       00001BE4 00 00 00 00 00 00 00 00 00 00 
+       00001BEE 00 00 00 00 00 00 00 00 00 00 
+       00001BF8 00 00 00 00 00 00 00 00 00 00 
+       00001C02 00 00 00 00 00 00 00 00 00 00 
+       00001C0C 00 00 00 00 00 00 00 00 00 00 
+       00001C16 00 00 00 00 00 00 00 00 00 00 
+       00001C20 00 00 00 00 00 00 00 00 00 00 
+       00001C2A 00 00 00 00 00 00 00 00 00 00 
+       00001C34 00 00 00 00 00 00 00 00 00 00 
+       00001C3E 00 00 00 00 00 00 00 00 00 00 
+       00001C48 00 00 00 00 00 00 00 00 00 00 
+       00001C52 00 00 00 00 00 00 00 00 00 00 
+       00001C5C 00 00 00 00 00 00 00 00 00 00 
+       00001C66 00 00 00 00 00 00 00 00 00 00 
+       00001C70 00 00 00 00 00 00 00 00 00 00 
+       00001C7A 00 00 00 00 00 00 00 00 00 00 
+       00001C84 00 00 00 00 00 00 00 00 00 00 
+       00001C8E 00 00 00 00 00 00 00 00 00 00 
+       00001C98 00 00 00 00 00 00 00 00 00 00 
+       00001CA2 00 00 00 00 00 00 00 00 00 00 
+       00001CAC 00 00 00 00 00 00 00 00 00 00 
+       00001CB6 00 00 00 00 00 00 00 00 00 00 
+       00001CC0 00 00 00 00 00 00 00 00 00 00 
+       00001CCA 00 00 00 00 00 00 00 00 00 00 
+       00001CD4 00 00 00 00 00 00 00 00 00 00 
+       00001CDE 00 00 00 00 00 00 00 00 00 00 
+       00001CE8 00 00 00 00 00 00 00 00 00 00 
+       00001CF2 00 00 00 00 00 00 00 00 00 00 
+       00001CFC 00 00 00 00 00 00 00 00 00 00 
+       00001D06 00 00 00 00 00 00 00 00 00 00 
+       00001D10 00 00 00 00 00 00 00 00 00 00 
+       00001D1A 00 00 00 00 00 00 00 00 00 00 
+       00001D24 00 00 00 00 00 00 00 00 00 00 
+       00001D2E 00 00 00 00 00 00 00 00 00 00 
+       00001D38 00 00 00 00 00 00 00 00 00 00 
+       00001D42 00 00 00 00 00 00 00 00 00 00 
+       00001D4C 00 00 00 00 00 00 00 00 00 00 
+       00001D56 00 00 00 00 00 00 00 00 00 00 
+       00001D60 00 00 00 00 00 00 00 00 00 00 
+       00001D6A 00 00 00 00 00 00 00 00 00 00 
+       00001D74 00 00 00 00 00 00 00 00 00 00 
+       00001D7E 00 00 00 00 00 00 00 00 00 00 
+       00001D88 00 00 00 00 00 00 00 00 00 00 
+       00001D92 00 00 00 00 00 00 00 00 00 00 
+       00001D9C 00 00 00 00 00 00 00 00 00 00 
+       00001DA6 00 00 00 00 00 00 00 00 00 00 
+       00001DB0 00 00 00 00 00 00 00 00 00 00 
+       00001DBA 00 00 00 00 00 00 00 00 00 00 
+       00001DC4 00 00 00 00 00 00 00 00 00 00 
+       00001DCE 00 00 00 00 00 00 00 00 00 00 
+       00001DD8 00 00 00 00 00 00 00 00 00 00 
+       00001DE2 00 00 00 00 00 00 00 00 00 00 
+       00001DEC 00 00 00 00 00 00 00 00 00 00 
+       00001DF6 00 00 00 00 00 00 00 00 00 00 
+       00001E00 00 00 00 00 00 00 00 00 00 00 
+       00001E0A 00 00 00 00 00 00 00 00 00 00 
+       00001E14 00 00 00 00 00 00 00 00 00 00 
+       00001E1E 00 00 00 00 00 00 00 00 00 00 
+       00001E28 00 00 00 00 00 00 00 00 00 00 
+       00001E32 00 00 00 00 00 00 00 00 00 00 
+       00001E3C 00 00 00 00 00 00 00 00 00 00 
+       00001E46 00 00 00 00 00 00 00 00 00 00 
+       00001E50 00 00 00 00 00 00 00 00 00 00 
+       00001E5A 00 00 00 00 00 00 00 00 00 00 
+       00001E64 00 00 00 00 00 00 00 00 00 00 
+       00001E6E 00 00 00 00 00 00 00 00 00 00 
+       00001E78 00 00 00 00 00 00 00 00 00 00 
+       00001E82 00 00 00 00 00 00 00 00 00 00 
+       00001E8C 00 00 00 00 00 00 00 00 00 00 
+       00001E96 00 00 00 00 00 00 00 00 00 00 
+       00001EA0 00 00 00 00 00 00 00 00 00 00 
+       00001EAA 00 00 00 00 00 00 00 00 00 00 
+       00001EB4 00 00 00 00 00 00 00 00 00 00 
+       00001EBE 00 00 00 00 00 00 00 00 00 00 
+       00001EC8 00 00 00 00 00 00 00 00 00 00 
+       00001ED2 00 00 00 00 00 00 00 00 00 00 
+       00001EDC 00 00 00 00 00 00 00 00 00 00 
+       00001EE6 00 00 00 00 00 00 00 00 00 00 
+       00001EF0 00 00 00 00 00 00 00 00 00 00 
+       00001EFA 00 00 00 00 00 00 00 00 00 00 
+       00001F04 00 00 00 00 00 00 00 00 00 00 
+       00001F0E 00 00 00 00 00 00 00 00 00 00 
+       00001F18 00 00 00 00 00 00 00 00 00 00 
+       00001F22 00 00 00 00 00 00 00 00 00 00 
+       00001F2C 00 00 00 00 00 00 00 00 00 00 
+       00001F36 00 00 00 00 00 00 00 00 00 00 
+       00001F40 00 00 00 00 00 00 00 00 00 00 
+       00001F4A 00 00 00 00 00 00 00 00 00 00 
+       00001F54 00 00 00 00 00 00 00 00 00 00 
+       00001F5E 00 00 00 00 00 00 00 00 00 00 
+       00001F68 00 00 00 00 00 00 00 00 00 00 
+       00001F72 00 00 00 00 00 00 00 00 00 00 
+       00001F7C 00 00 00 00 00 00 00 00 00 00 
+       00001F86 00 00 00 00 00 00 00 00 00 00 
+       00001F90 00 00 00 00 00 00 00 00 00 00 
+       00001F9A 00 00 00 00 00 00 00 00 00 00 
+       00001FA4 00 00 00 00 00 00 00 00 00 00 
+       00001FAE 00 00 00 00 00 00 00 00 00 00 
+       00001FB8 00 00 00 00 00 00 00 00 00 00 
+       00001FC2 00 00 00 00 00 00 00 00 00 00 
+       00001FCC 00 00 00 00 00 00 00 00 00 00 
+       00001FD6 00 00 00 00 00 00 00 00 00 00 
+       00001FE0 00 00 00 00 00 00 00 00 00 00 
+       00001FEA 00 00 00 00 00 00 00 00 00 00 
+       00001FF4 00 00 00 00 00 00 00 00 00 00 
+       00001FFE 00 00 00 00 00 00 00 00 00 00 
+       00002008 00 00 00 00 00 00 00 00 00 00 
+       00002012 00 00 00 00 00 00 00 00 00 00 
+       0000201C 00 00 00 00 00 00 00 00 00 00 
+       00002026 00 00 00 00 00 00 00 00 00 00 
+       00002030 00 00 00 00 00 00 00 00 00 00 
+       0000203A 00 00 00 00 00 00 00 00 00 00 
+       00002044 00 00 00 00 00 00 00 00 00 00 
+       0000204E 00 00 00 00 00 00 00 00 00 00 
+       00002058 00 00 00 00 00 00 00 00 00 00 
+       00002062 00 00 00 00 00 00 00 00 00 00 
+       0000206C 00 00 00 00 00 00 00 00 00 00 
+       00002076 00 00 00 00 00 00 00 00 00 00 
+       00002080 00 00 00 00 00 00 00 00 00 00 
+       0000208A 00 00 00 00 00 00 00 00 00 00 
+       00002094 00 00 00 00 00 00 00 00 00 00 
+       0000209E 00 00 00 00 00 00 00 00 00 00 
+       000020A8 00 00 00 00 00 00 00 00 00 00 
+       000020B2 00 00 00 00 00 00 00 00 00 00 
+       000020BC 00 00 00 00 00 00 00 00 00 00 
+       000020C6 00 00 00 00 00 00 00 00 00 00 
+       000020D0 00 00 00 00 00 00 00 00 00 00 
+       000020DA 00 00 00 00 00 00 00 00 00 00 
+       000020E4 00 00 00 00 00 00 00 00 00 00 
+       000020EE 00 00 00 00 00 00 00 00 00 00 
+       000020F8 00 00 00 00 00 00 00 00 00 00 
+       00002102 00 00 00 00 00 00 00 00 00 00 
+       0000210C 00 00 00 00 00 00 00 00 00 00 
+       00002116 00 00 00 00 00 00 00 00 00 00 
+       00002120 00 00 00 00 00 00 00 00 00 00 
+       0000212A 00 00 00 00 00 00 00 00 00 00 
+       00002134 00 00 00 00 00 00 00 00 00 00 
+       0000213E 00 00 00 00 00 00 00 00 00 00 
+       00002148 00 00 00 00 00 00 00 00 00 00 
+       00002152 00 00 00 00 00 00 00 00 00 00 
+       0000215C 00 00 00 00 00 00 00 00 00 00 
+       00002166 00 00 00 00 00 00 00 00 00 00 
+       00002170 00 00 00 00 00 00 00 00 00 00 
+       0000217A 00 00 00 00 00 00 00 00 00 00 
+       00002184 00 00 00 00 00 00 00 00 00 00 
+       0000218E 00 00 00 00 00 00 00 00 00 00 
+       00002198 00 00 00 00 00 00 00 00 00 00 
+       000021A2 00 00 00 00 00 00 00 00 00 00 
+       000021AC 00 00 00 00 00 00 00 00 00 00 
+       000021B6 00 00 00 00 00 00 00 00 00 00 
+       000021C0 00 00 00 00 00 00 00 00 00 00 
+       000021CA 00 00 00 00 00 00 00 00 00 00 
+       000021D4 00 00 00 00 00 00 00 00 00 00 
+       000021DE 00 00 00 00 00 00 00 00 00 00 
+       000021E8 00 00 00 00 00 00 00 00 00 00 
+       000021F2 00 00 00 00 00 00 00 00 00 00 
+       000021FC 00 00 00 00 00 00 00 00 00 00 
+       00002206 00 00 00 00 00 00 00 00 00 00 
+       00002210 00 00 00 00 00 00 00 00 00 00 
+       0000221A 00 00 00 00 00 00 00 00 00 00 
+       00002224 00 00 00 00 00 00 00 00 00 00 
+       0000222E 00 00 00 00 00 00 00 00 00 00 
+       00002238 00 00 00 00 00 00 00 00 00 00 
+       00002242 00 00 00 00 00 00 00 00 00 00 
+       0000224C 00 00 00 00 00 00 00 00 00 00 
+       00002256 00 00 00 00 00 00 00 00 00 00 
+       00002260 00 00 00 00 00 00 00 00 00 00 
+       0000226A 00 00 00 00 00 00 00 00 00 00 
+       00002274 00 00 00 00 00 00 00 00 00 00 
+       0000227E 00 00 00 00 00 00 00 00 00 00 
+       00002288 00 00 00 00 00 00 00 00 00 00 
+       00002292 00 00 00 00 00 00 00 00 00 00 
+       0000229C 00 00 00 00 00 00 00 00 00 00 
+       000022A6 00 00 00 00 00 00 00 00 00 00 
+       000022B0 00 00 00 00 00 00 00 00 00 00 
+       000022BA 00 00 00 00 00 00 00 00 00 00 
+       000022C4 00 00 00 00 00 00 00 00 00 00 
+       000022CE 00 00 00 00 00 00 00 00 00 00 
+       000022D8 00 00 00 00 00 00 00 00 00 00 
+       000022E2 00 00 00 00 00 00 00 00 00 00 
+       000022EC 00 00 00 00 00 00 00 00 00 00 
+       000022F6 00 00 00 00 00 00 00 00 00 00 
+       00002300 00 00 00 00 00 00 00 00 00 00 
+       0000230A 00 00 00 00 00 00 00 00 00 00 
+       00002314 00 00 00 00 00 00 00 00 00 00 
+       0000231E 00 00 00 00 00 00 00 00 00 00 
+       00002328 00 00 00 00 00 00 00 00 00 00 
+       00002332 00 00 00 00 00 00 00 00 00 00 
+       0000233C 00 00 00 00 00 00 00 00 00 00 
+       00002346 00 00 00 00 00 00 00 00 00 00 
+       00002350 00 00 00 00 00 00 00 00 00 00 
+       0000235A 00 00 00 00 00 00 00 00 00 00 
+       00002364 00 00 00 00 00 00 00 00 00 00 
+       0000236E 00 00 00 00 00 00 00 00 00 00 
+       00002378 00 00 00 00 00 00 00 00 00 00 
+       00002382 00 00 00 00 00 00 00 00 00 00 
+       0000238C 00 00 00 00 00 00 00 00 00 00 
+       00002396 00 00 00 00 00 00 00 00 00 00 
+       000023A0 00 00 00 00 00 00 00 00 00 00 
+       000023AA 00 00 00 00 00 00 00 00 00 00 
+       000023B4 00 00 00 00 00 00 00 00 00 00 
+       000023BE 00 00 00 00 00 00 00 00 00 00 
+       000023C8 00 00 00 00 00 00 00 00 00 00 
+       000023D2 00 00 00 00 00 00 00 00 00 00 
+       000023DC 00 00 00 00 00 00 00 00 00 00 
+       000023E6 00 00 00 00 00 00 00 00 00 00 
+       000023F0 00 00 00 00 00 00 00 00 00 00 
+       000023FA 00 00 00 00 00 00 00 00 00 00 
+       00002404 00 00 00 00 00 00 00 00 00 00 
+       0000240E 00 00 00 00 00 00 00 00 00 00 
+       00002418 00 00 00 00 00 00 00 00 00 00 
+       00002422 00 00 00 00 00 00 00 00 00 00 
+       0000242C 00 00 00 00 00 00 00 00 00 00 
+       00002436 00 00 00 00 00 00 00 00 00 00 
+       00002440 00 00 00 00 00 00 00 00 00 00 
+       0000244A 00 00 00 00 00 00 00 00 00 00 
+       00002454 00 00 00 00 00 00 00 00 00 00 
+       0000245E 00 00 00 00 00 00 00 00 00 00 
+       00002468 00 00 00 00 00 00 00 00 00 00 
+       00002472 00 00 00 00 00 00 00 00 00 00 
+       0000247C 00 00 00 00 00 00 00 00 00 00 
+       00002486 00 00 00 00 00 00 00 00 00 00 
+       00002490 00 00 00 00 00 00 00 00 00 00 
+       0000249A 00 00 00 00 00 00 00 00 00 00 
+       000024A4 00 00 00 00 00 00 00 00 00 00 
+       000024AE 00 00 00 00 00 00 00 00 00 00 
+       000024B8 00 00 00 00 00 00 00 00 00 00 
+       000024C2 00 00 00 00 00 00 00 00 00 00 
+       000024CC 00 00 00 00 00 00 00 00 00 00 
+       000024D6 00 00 00 00 00 00 00 00 00 00 
+       000024E0 00 00 00 00 00 00 00 00 00 00 
+       000024EA 00 00 00 00 00 00 00 00 00 00 
+       000024F4 00 00 00 00 00 00 00 00 00 00 
+       000024FE 00 00 00 00 00 00 00 00 00 00 
+       00002508 00 00 00 00 00 00 00 00 00 00 
+       00002512 00 00 00 00 00 00 00 00 00 00 
+       0000251C 00 00 00 00 00 00 00 00 00 00 
+       00002526 00 00 00 00 00 00 00 00 00 00 
+       00002530 00 00 00 00 00 00 00 00 00 00 
+       0000253A 00 00 00 00 00 00 00 00 00 00 
+       00002544 00 00 00 00 00 00 00 00 00 00 
+       0000254E 00 00 00 00 00 00 00 00 00 00 
+       00002558 00 00 00 00 00 00 00 00 00 00 
+       00002562 00 00 00 00 00 00 00 00 00 00 
+       0000256C 00 00 00 00 00 00 00 00 00 00 
+       00002576 00 00 00 00 00 00 00 00 00 00 
+       00002580 00 00 00 00 00 00 00 00 00 00 
+       0000258A 00 00 00 00 00 00 00 00 00 00 
+       00002594 00 00 00 00 00 00 00 00 00 00 
+       0000259E 00 00 00 00 00 00 00 00 00 00 
+       000025A8 00 00 00 00 00 00 00 00 00 00 
+       000025B2 00 00 00 00 00 00 00 00 00 00 
+       000025BC 00 00 00 00 00 00 00 00 00 00 
+       000025C6 00 00 00 00 00 00 00 00 00 00 
+       000025D0 00 00 00 00 00 00 00 00 00 00 
+       000025DA 00 00 00 00 00 00 00 00 00 00 
+       000025E4 00 00 00 00 00 00 00 00 00 00 
+       000025EE 00 00 00 00 00 00 00 00 00 00 
+       000025F8 00 00 00 00 00 00 00 00 00 00 
+       00002602 00 00 00 00 00 00 00 00 00 00 
+       0000260C 00 00 00 00 00 00 00 00 00 00 
+       00002616 00 00 00 00 00 00 00 00 00 00 
+       00002620 00 00 00 00 00 00 00 00 00 00 
+       0000262A 00 00 00 00 00 00 00 00 00 00 
+       00002634 00 00 00 00 00 00 00 00 00 00 
+       0000263E 00 00 00 00 00 00 00 00 00 00 
+       00002648 00 00 00 00 00 00 00 00 00 00 
+       00002652 00 00 00 00 00 00 00 00 00 00 
+       0000265C 00 00 00 00 00 00 00 00 00 00 
+       00002666 00 00 00 00 00 00 00 00 00 00 
+       00002670 00 00 00 00 00 00 00 00 00 00 
+       0000267A 00 00 00 00 00 00 00 00 00 00 
+       00002684 00 00 00 00 00 00 00 00 00 00 
+       0000268E 00 00 00 00 00 00 00 00 00 00 
+       00002698 00 00 00 00 00 00 00 00 00 00 
+       000026A2 00 00 00 00 00 00 00 00 00 00 
+       000026AC 00 00 00 00 00 00 00 00 00 00 
+       000026B6 00 00 00 00 00 00 00 00 00 00 
+       000026C0 00 00 00 00 00 00 00 00 00 00 
+       000026CA 00 00 00 00 00 00 00 00 00 00 
+       000026D4 00 00 00 00 00 00 00 00 00 00 
+       000026DE 00 00 00 00 00 00 00 00 00 00 
+       000026E8 00 00 00 00 00 00 00 00 00 00 
+       000026F2 00 00 00 00 00 00 00 00 00 00 
+       000026FC 00 00 00 00 00 00 00 00 00 00 
+       00002706 00 00 00 00 00 00 00 00 00 00 
+       00002710 00 00 00 00 00 00 00 00 00 00 
+       0000271A 00 00 
diff --git a/haribote/typedefs.h b/haribote/typedefs.h
new file mode 100644 (file)
index 0000000..107ade5
--- /dev/null
@@ -0,0 +1,171 @@
+#pragma once
+
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned int DWORD;
+typedef unsigned long long QWORD;
+
+typedef long LONG;
+
+typedef DWORD HANDLE;
+
+const DWORD PAGE_SIZE = 0x1000;
+
+#define INVALID_HANDLE_VALUE ((DWORD)-1)
+#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
+#define IMAGE_SIZEOF_SHORT_NAME 8
+
+#define IMAGE_DIRECTORY_ENTRY_EXPORT   0
+#define IMAGE_DIRECTORY_ENTRY_IMPORT   1
+#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
+#define IMAGE_DIRECTORY_ENTRY_EXCEPTION        3
+#define IMAGE_DIRECTORY_ENTRY_SECURITY 4
+#define IMAGE_DIRECTORY_ENTRY_BASERELOC        5
+#define IMAGE_DIRECTORY_ENTRY_DEBUG    6
+#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT        7
+#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE     7
+#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR        8
+#define IMAGE_DIRECTORY_ENTRY_TLS      9
+#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG      10
+#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT     11
+#define IMAGE_DIRECTORY_ENTRY_IAT      12
+#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT     13
+#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR   14
+
+#pragma pack(push,1)
+typedef struct _IMAGE_DOS_HEADER {
+       WORD e_magic;
+       WORD e_cblp;
+       WORD e_cp;
+       WORD e_crlc;
+       WORD e_cparhdr;
+       WORD e_minalloc;
+       WORD e_maxalloc;
+       WORD e_ss;
+       WORD e_sp;
+       WORD e_csum;
+       WORD e_ip;
+       WORD e_cs;
+       WORD e_lfarlc;
+       WORD e_ovno;
+       WORD e_res[4];
+       WORD e_oemid;
+       WORD e_oeminfo;
+       WORD e_res2[10];
+       LONG e_lfanew;
+} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
+
+typedef struct _IMAGE_FILE_HEADER {
+       WORD Machine;
+       WORD NumberOfSections;
+       DWORD TimeDateStamp;
+       DWORD PointerToSymbolTable;
+       DWORD NumberOfSymbols;
+       WORD SizeOfOptionalHeader;
+       WORD Characteristics;
+} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
+
+typedef struct _IMAGE_DATA_DIRECTORY {
+       DWORD VirtualAddress;
+       DWORD Size;
+} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
+
+typedef struct _IMAGE_OPTIONAL_HEADER {
+       WORD Magic;
+       BYTE MajorLinkerVersion;
+       BYTE MinorLinkerVersion;
+       DWORD SizeOfCode;
+       DWORD SizeOfInitializedData;
+       DWORD SizeOfUninitializedData;
+       DWORD AddressOfEntryPoint;
+       DWORD BaseOfCode;
+       DWORD BaseOfData;
+       DWORD ImageBase;
+       DWORD SectionAlignment;
+       DWORD FileAlignment;
+       WORD MajorOperatingSystemVersion;
+       WORD MinorOperatingSystemVersion;
+       WORD MajorImageVersion;
+       WORD MinorImageVersion;
+       WORD MajorSubsystemVersion;
+       WORD MinorSubsystemVersion;
+       DWORD Win32VersionValue;
+       DWORD SizeOfImage;
+       DWORD SizeOfHeaders;
+       DWORD CheckSum;
+       WORD Subsystem;
+       WORD DllCharacteristics;
+       DWORD SizeOfStackReserve;
+       DWORD SizeOfStackCommit;
+       DWORD SizeOfHeapReserve;
+       DWORD SizeOfHeapCommit;
+       DWORD LoaderFlags;
+       DWORD NumberOfRvaAndSizes;
+       IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
+} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;
+typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
+typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
+
+typedef struct _IMAGE_NT_HEADERS {
+       DWORD Signature;
+       IMAGE_FILE_HEADER FileHeader;
+       IMAGE_OPTIONAL_HEADER OptionalHeader;
+} IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;
+typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
+typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
+
+
+typedef struct _IMAGE_SECTION_HEADER {
+       BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
+       union {
+               DWORD PhysicalAddress;
+               DWORD VirtualSize;
+       } Misc;
+       DWORD VirtualAddress;
+       DWORD SizeOfRawData;
+       DWORD PointerToRawData;
+       DWORD PointerToRelocations;
+       DWORD PointerToLinenumbers;
+       WORD NumberOfRelocations;
+       WORD NumberOfLinenumbers;
+       DWORD Characteristics;
+} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
+
+
+
+typedef struct _IMAGE_EXPORT_DIRECTORY {
+       DWORD Characteristics;
+       DWORD TimeDateStamp;
+       WORD MajorVersion;
+       WORD MinorVersion;
+       DWORD Name;
+       DWORD Base;
+       DWORD NumberOfFunctions;
+       DWORD NumberOfNames;
+       DWORD AddressOfFunctions;
+       DWORD AddressOfNames;
+       DWORD AddressOfNameOrdinals;
+} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
+
+typedef struct tagBITMAPFILEHEADER {
+  WORD  bfType;
+  DWORD bfSize;
+  WORD  bfReserved1;
+  WORD  bfReserved2;
+  DWORD bfOffBits;
+} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
+typedef struct tagBITMAPINFOHEADER {
+    DWORD  biSize;
+    LONG   biWidth;
+    LONG   biHeight;
+    WORD   biPlanes;
+    WORD   biBitCount;
+    DWORD  biCompression;
+    DWORD  biSizeImage;
+    LONG   biXPelsPerMeter;
+    LONG   biYPelsPerMeter;
+    DWORD  biClrUsed;
+    DWORD  biClrImportant;
+} BITMAPINFOHEADER;
+
+#pragma pack(pop)
\ No newline at end of file
diff --git a/haribote/window.c b/haribote/window.c
new file mode 100644 (file)
index 0000000..2186fd3
--- /dev/null
@@ -0,0 +1,124 @@
+/* \83E\83B\83\93\83h\83E\8aÖ\8cW */
+
+#include "bootpack.h"
+
+void make_window8(unsigned char *buf, int xsize, int ysize, char *title, char act)
+{
+       boxfill8(buf, xsize, COL8_C6C6C6, 0,         0,         xsize - 1, 0        );
+       boxfill8(buf, xsize, COL8_FFFFFF, 1,         1,         xsize - 2, 1        );
+       boxfill8(buf, xsize, COL8_C6C6C6, 0,         0,         0,         ysize - 1);
+       boxfill8(buf, xsize, COL8_FFFFFF, 1,         1,         1,         ysize - 2);
+       boxfill8(buf, xsize, COL8_848484, xsize - 2, 1,         xsize - 2, ysize - 2);
+       boxfill8(buf, xsize, COL8_000000, xsize - 1, 0,         xsize - 1, ysize - 1);
+       boxfill8(buf, xsize, COL8_C6C6C6, 2,         2,         xsize - 3, ysize - 3);
+       boxfill8(buf, xsize, COL8_848484, 1,         ysize - 2, xsize - 2, ysize - 2);
+       boxfill8(buf, xsize, COL8_000000, 0,         ysize - 1, xsize - 1, ysize - 1);
+       make_wtitle8(buf, xsize, title, act);
+       return;
+}
+
+void make_wtitle8(unsigned char *buf, int xsize, char *title, char act)
+{
+       static char closebtn[14][16] = {
+               "OOOOOOOOOOOOOOO@",
+               "OQQQQQQQQQQQQQ$@",
+               "OQQQQQQQQQQQQQ$@",
+               "OQQQ@@QQQQ@@QQ$@",
+               "OQQQQ@@QQ@@QQQ$@",
+               "OQQQQQ@@@@QQQQ$@",
+               "OQQQQQQ@@QQQQQ$@",
+               "OQQQQQ@@@@QQQQ$@",
+               "OQQQQ@@QQ@@QQQ$@",
+               "OQQQ@@QQQQ@@QQ$@",
+               "OQQQQQQQQQQQQQ$@",
+               "OQQQQQQQQQQQQQ$@",
+               "O$$$$$$$$$$$$$$@",
+               "@@@@@@@@@@@@@@@@"
+       };
+       int x, y;
+       char c, tc, tbc;
+       if (act != 0) {
+               tc = COL8_FFFFFF;
+               tbc = COL8_000084;
+       } else {
+               tc = COL8_C6C6C6;
+               tbc = COL8_848484;
+       }
+       boxfill8(buf, xsize, tbc, 3, 3, xsize - 4, 20);
+       putfonts8_asc(buf, xsize, 24, 4, tc, title);
+       for (y = 0; y < 14; y++) {
+               for (x = 0; x < 16; x++) {
+                       c = closebtn[y][x];
+                       if (c == '@') {
+                               c = COL8_000000;
+                       } else if (c == '$') {
+                               c = COL8_848484;
+                       } else if (c == 'Q') {
+                               c = COL8_C6C6C6;
+                       } else {
+                               c = COL8_FFFFFF;
+                       }
+                       buf[(5 + y) * xsize + (xsize - 21 + x)] = c;
+               }
+       }
+       return;
+}
+
+void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b, char *s, int l)
+{
+       struct TASK *task = task_now();
+       boxfill8(sht->buf, sht->bxsize, b, x, y, x + l * 8 - 1, y + 15);
+       if (task->langmode != 0 && task->langbyte1 != 0) {
+               putfonts8_asc(sht->buf, sht->bxsize, x, y, c, s);
+               sheet_refresh(sht, x - 8, y, x + l * 8, y + 16);
+       } else {
+               putfonts8_asc(sht->buf, sht->bxsize, x, y, c, s);
+               sheet_refresh(sht, x, y, x + l * 8, y + 16);
+       }
+       return;
+}
+
+void make_textbox8(struct SHEET *sht, int x0, int y0, int sx, int sy, int c)
+{
+       int x1 = x0 + sx, y1 = y0 + sy;
+       boxfill8(sht->buf, sht->bxsize, COL8_848484, x0 - 2, y0 - 3, x1 + 1, y0 - 3);
+       boxfill8(sht->buf, sht->bxsize, COL8_848484, x0 - 3, y0 - 3, x0 - 3, y1 + 1);
+       boxfill8(sht->buf, sht->bxsize, COL8_FFFFFF, x0 - 3, y1 + 2, x1 + 1, y1 + 2);
+       boxfill8(sht->buf, sht->bxsize, COL8_FFFFFF, x1 + 2, y0 - 3, x1 + 2, y1 + 2);
+       boxfill8(sht->buf, sht->bxsize, COL8_000000, x0 - 1, y0 - 2, x1 + 0, y0 - 2);
+       boxfill8(sht->buf, sht->bxsize, COL8_000000, x0 - 2, y0 - 2, x0 - 2, y1 + 0);
+       boxfill8(sht->buf, sht->bxsize, COL8_C6C6C6, x0 - 2, y1 + 1, x1 + 0, y1 + 1);
+       boxfill8(sht->buf, sht->bxsize, COL8_C6C6C6, x1 + 1, y0 - 2, x1 + 1, y1 + 1);
+       boxfill8(sht->buf, sht->bxsize, c,           x0 - 1, y0 - 1, x1 + 0, y1 + 0);
+       return;
+}
+
+void change_wtitle8(struct SHEET *sht, char act)
+{
+       int x, y, xsize = sht->bxsize;
+       char c, tc_new, tbc_new, tc_old, tbc_old, *buf = sht->buf;
+       if (act != 0) {
+               tc_new  = COL8_FFFFFF;
+               tbc_new = COL8_000084;
+               tc_old  = COL8_C6C6C6;
+               tbc_old = COL8_848484;
+       } else {
+               tc_new  = COL8_C6C6C6;
+               tbc_new = COL8_848484;
+               tc_old  = COL8_FFFFFF;
+               tbc_old = COL8_000084;
+       }
+       for (y = 3; y <= 20; y++) {
+               for (x = 3; x <= xsize - 4; x++) {
+                       c = buf[y * xsize + x];
+                       if (c == tc_old && x <= xsize - 22) {
+                               c = tc_new;
+                       } else if (c == tbc_old) {
+                               c = tbc_new;
+                       }
+                       buf[y * xsize + x] = c;
+               }
+       }
+       sheet_refresh(sht, 3, 3, xsize, 21);
+       return;
+}
diff --git a/haribote/window.lst b/haribote/window.lst
new file mode 100644 (file)
index 0000000..555e385
--- /dev/null
@@ -0,0 +1,533 @@
+     1 00000000                                 [FORMAT "WCOFF"]
+     2 00000000                                 [INSTRSET "i486p"]
+     3 00000000                                 [OPTIMIZE 1]
+     4 00000000                                 [OPTION 1]
+     5 00000000                                 [BITS 32]
+     6 00000000                                        EXTERN  _boxfill8
+     7 00000000                                        EXTERN  _putfonts8_asc
+     8 00000000                                        EXTERN  _task_now
+     9 00000000                                        EXTERN  _sheet_refresh
+    10 00000000                                 [FILE "window.c"]
+    11                                          [SECTION .text]
+    12 00000000                                        GLOBAL  _make_window8
+    13 00000000                                 _make_window8:
+    14 00000000 55                                     PUSH    EBP
+    15 00000001 89 E5                                  MOV     EBP,ESP
+    16 00000003 57                                     PUSH    EDI
+    17 00000004 56                                     PUSH    ESI
+    18 00000005 53                                     PUSH    EBX
+    19 00000006 83 EC 18                               SUB     ESP,24
+    20 00000009 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+    21 0000000C 8B 5D 0C                               MOV     EBX,DWORD [12+EBP]
+    22 0000000F 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+    23 00000012 8B 75 08                               MOV     ESI,DWORD [8+EBP]
+    24 00000015 8B 45 14                               MOV     EAX,DWORD [20+EBP]
+    25 00000018 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+    26 0000001B 0F BE 45 18                            MOVSX   EAX,BYTE [24+EBP]
+    27 0000001F 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+    28 00000022 8D 43 FF                               LEA     EAX,DWORD [-1+EBX]
+    29 00000025 6A 00                                  PUSH    0
+    30 00000027 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+    31 0000002A 50                                     PUSH    EAX
+    32 0000002B 6A 00                                  PUSH    0
+    33 0000002D 6A 00                                  PUSH    0
+    34 0000002F 6A 08                                  PUSH    8
+    35 00000031 53                                     PUSH    EBX
+    36 00000032 56                                     PUSH    ESI
+    37 00000033 E8 [00000000]                          CALL    _boxfill8
+    38 00000038 8D 43 FE                               LEA     EAX,DWORD [-2+EBX]
+    39 0000003B 6A 01                                  PUSH    1
+    40 0000003D 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+    41 00000040 50                                     PUSH    EAX
+    42 00000041 6A 01                                  PUSH    1
+    43 00000043 6A 01                                  PUSH    1
+    44 00000045 6A 07                                  PUSH    7
+    45 00000047 53                                     PUSH    EBX
+    46 00000048 56                                     PUSH    ESI
+    47 00000049 E8 [00000000]                          CALL    _boxfill8
+    48 0000004E 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+    49 00000051 83 C4 38                               ADD     ESP,56
+    50 00000054 48                                     DEC     EAX
+    51 00000055 89 45 DC                               MOV     DWORD [-36+EBP],EAX
+    52 00000058 50                                     PUSH    EAX
+    53 00000059 6A 00                                  PUSH    0
+    54 0000005B 6A 00                                  PUSH    0
+    55 0000005D 6A 00                                  PUSH    0
+    56 0000005F 6A 08                                  PUSH    8
+    57 00000061 53                                     PUSH    EBX
+    58 00000062 56                                     PUSH    ESI
+    59 00000063 E8 [00000000]                          CALL    _boxfill8
+    60 00000068 8B 7D F0                               MOV     EDI,DWORD [-16+EBP]
+    61 0000006B 83 EF 02                               SUB     EDI,2
+    62 0000006E 57                                     PUSH    EDI
+    63 0000006F 6A 01                                  PUSH    1
+    64 00000071 6A 01                                  PUSH    1
+    65 00000073 6A 01                                  PUSH    1
+    66 00000075 6A 07                                  PUSH    7
+    67 00000077 53                                     PUSH    EBX
+    68 00000078 56                                     PUSH    ESI
+    69 00000079 E8 [00000000]                          CALL    _boxfill8
+    70 0000007E 83 C4 38                               ADD     ESP,56
+    71 00000081 57                                     PUSH    EDI
+    72 00000082 FF 75 E0                               PUSH    DWORD [-32+EBP]
+    73 00000085 6A 01                                  PUSH    1
+    74 00000087 FF 75 E0                               PUSH    DWORD [-32+EBP]
+    75 0000008A 6A 0F                                  PUSH    15
+    76 0000008C 53                                     PUSH    EBX
+    77 0000008D 56                                     PUSH    ESI
+    78 0000008E E8 [00000000]                          CALL    _boxfill8
+    79 00000093 FF 75 DC                               PUSH    DWORD [-36+EBP]
+    80 00000096 FF 75 E4                               PUSH    DWORD [-28+EBP]
+    81 00000099 6A 00                                  PUSH    0
+    82 0000009B FF 75 E4                               PUSH    DWORD [-28+EBP]
+    83 0000009E 6A 00                                  PUSH    0
+    84 000000A0 53                                     PUSH    EBX
+    85 000000A1 56                                     PUSH    ESI
+    86 000000A2 E8 [00000000]                          CALL    _boxfill8
+    87 000000A7 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+    88 000000AA 83 C4 38                               ADD     ESP,56
+    89 000000AD 83 E8 03                               SUB     EAX,3
+    90 000000B0 50                                     PUSH    EAX
+    91 000000B1 8D 43 FD                               LEA     EAX,DWORD [-3+EBX]
+    92 000000B4 50                                     PUSH    EAX
+    93 000000B5 6A 02                                  PUSH    2
+    94 000000B7 6A 02                                  PUSH    2
+    95 000000B9 6A 08                                  PUSH    8
+    96 000000BB 53                                     PUSH    EBX
+    97 000000BC 56                                     PUSH    ESI
+    98 000000BD E8 [00000000]                          CALL    _boxfill8
+    99 000000C2 57                                     PUSH    EDI
+   100 000000C3 FF 75 E0                               PUSH    DWORD [-32+EBP]
+   101 000000C6 57                                     PUSH    EDI
+   102 000000C7 6A 01                                  PUSH    1
+   103 000000C9 6A 0F                                  PUSH    15
+   104 000000CB 53                                     PUSH    EBX
+   105 000000CC 56                                     PUSH    ESI
+   106 000000CD E8 [00000000]                          CALL    _boxfill8
+   107 000000D2 83 C4 38                               ADD     ESP,56
+   108 000000D5 FF 75 DC                               PUSH    DWORD [-36+EBP]
+   109 000000D8 FF 75 E4                               PUSH    DWORD [-28+EBP]
+   110 000000DB FF 75 DC                               PUSH    DWORD [-36+EBP]
+   111 000000DE 6A 00                                  PUSH    0
+   112 000000E0 6A 00                                  PUSH    0
+   113 000000E2 53                                     PUSH    EBX
+   114 000000E3 56                                     PUSH    ESI
+   115 000000E4 E8 [00000000]                          CALL    _boxfill8
+   116 000000E9 89 75 08                               MOV     DWORD [8+EBP],ESI
+   117 000000EC 8B 45 E8                               MOV     EAX,DWORD [-24+EBP]
+   118 000000EF 89 5D 0C                               MOV     DWORD [12+EBP],EBX
+   119 000000F2 89 45 14                               MOV     DWORD [20+EBP],EAX
+   120 000000F5 83 C4 1C                               ADD     ESP,28
+   121 000000F8 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   122 000000FB 89 45 10                               MOV     DWORD [16+EBP],EAX
+   123 000000FE 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   124 00000101 5B                                     POP     EBX
+   125 00000102 5E                                     POP     ESI
+   126 00000103 5F                                     POP     EDI
+   127 00000104 5D                                     POP     EBP
+   128 00000105 EB 00                                  JMP     _make_wtitle8
+   129                                          [SECTION .data]
+   130 00000000                                 _closebtn.0:
+   131 00000000 4F 4F 4F 4F 4F 4F 4F 4F 4F 4F          DB      "OOOOOOOOOOOOOOO@"
+       0000000A 4F 4F 4F 4F 4F 40 
+   132 00000010 4F 51 51 51 51 51 51 51 51 51          DB      "OQQQQQQQQQQQQQ$@"
+       0000001A 51 51 51 51 24 40 
+   133 00000020 4F 51 51 51 51 51 51 51 51 51          DB      "OQQQQQQQQQQQQQ$@"
+       0000002A 51 51 51 51 24 40 
+   134 00000030 4F 51 51 51 40 40 51 51 51 51          DB      "OQQQ@@QQQQ@@QQ$@"
+       0000003A 40 40 51 51 24 40 
+   135 00000040 4F 51 51 51 51 40 40 51 51 40          DB      "OQQQQ@@QQ@@QQQ$@"
+       0000004A 40 51 51 51 24 40 
+   136 00000050 4F 51 51 51 51 51 40 40 40 40          DB      "OQQQQQ@@@@QQQQ$@"
+       0000005A 51 51 51 51 24 40 
+   137 00000060 4F 51 51 51 51 51 51 40 40 51          DB      "OQQQQQQ@@QQQQQ$@"
+       0000006A 51 51 51 51 24 40 
+   138 00000070 4F 51 51 51 51 51 40 40 40 40          DB      "OQQQQQ@@@@QQQQ$@"
+       0000007A 51 51 51 51 24 40 
+   139 00000080 4F 51 51 51 51 40 40 51 51 40          DB      "OQQQQ@@QQ@@QQQ$@"
+       0000008A 40 51 51 51 24 40 
+   140 00000090 4F 51 51 51 40 40 51 51 51 51          DB      "OQQQ@@QQQQ@@QQ$@"
+       0000009A 40 40 51 51 24 40 
+   141 000000A0 4F 51 51 51 51 51 51 51 51 51          DB      "OQQQQQQQQQQQQQ$@"
+       000000AA 51 51 51 51 24 40 
+   142 000000B0 4F 51 51 51 51 51 51 51 51 51          DB      "OQQQQQQQQQQQQQ$@"
+       000000BA 51 51 51 51 24 40 
+   143 000000C0 4F 24 24 24 24 24 24 24 24 24          DB      "O$$$$$$$$$$$$$$@"
+       000000CA 24 24 24 24 24 40 
+   144 000000D0 40 40 40 40 40 40 40 40 40 40          DB      "@@@@@@@@@@@@@@@@"
+       000000DA 40 40 40 40 40 40 
+   145                                          [SECTION .text]
+   146 00000107                                        GLOBAL  _make_wtitle8
+   147 00000107                                 _make_wtitle8:
+   148 00000107 55                                     PUSH    EBP
+   149 00000108 89 E5                                  MOV     EBP,ESP
+   150 0000010A 57                                     PUSH    EDI
+   151 0000010B 56                                     PUSH    ESI
+   152 0000010C 53                                     PUSH    EBX
+   153 0000010D 50                                     PUSH    EAX
+   154 0000010E 80 7D 14 00                            CMP     BYTE [20+EBP],0
+   155 00000112 0F 84 00000097                         JE      L3
+   156 00000118 B3 07                                  MOV     BL,7
+   157 0000011A B2 0C                                  MOV     DL,12
+   158 0000011C                                 L4:
+   159 0000011C 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   160 0000011F 6A 14                                  PUSH    20
+   161 00000121 83 E8 04                               SUB     EAX,4
+   162 00000124 31 FF                                  XOR     EDI,EDI
+   163 00000126 50                                     PUSH    EAX
+   164 00000127 6A 03                                  PUSH    3
+   165 00000129 6A 03                                  PUSH    3
+   166 0000012B 0F B6 C2                               MOVZX   EAX,DL
+   167 0000012E 50                                     PUSH    EAX
+   168 0000012F FF 75 0C                               PUSH    DWORD [12+EBP]
+   169 00000132 FF 75 08                               PUSH    DWORD [8+EBP]
+   170 00000135 E8 [00000000]                          CALL    _boxfill8
+   171 0000013A FF 75 10                               PUSH    DWORD [16+EBP]
+   172 0000013D 0F BE C3                               MOVSX   EAX,BL
+   173 00000140 50                                     PUSH    EAX
+   174 00000141 6A 04                                  PUSH    4
+   175 00000143 6A 18                                  PUSH    24
+   176 00000145 FF 75 0C                               PUSH    DWORD [12+EBP]
+   177 00000148 FF 75 08                               PUSH    DWORD [8+EBP]
+   178 0000014B E8 [00000000]                          CALL    _putfonts8_asc
+   179 00000150 83 C4 34                               ADD     ESP,52
+   180 00000153 6B 5D 0C 05                            IMUL    EBX,DWORD [12+EBP],5
+   181 00000157 C7 45 F0 00000000                      MOV     DWORD [-16+EBP],0
+   182 0000015E                                 L20:
+   183 0000015E 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   184 00000161 8B 55 08                               MOV     EDX,DWORD [8+EBP]
+   185 00000164 01 D8                                  ADD     EAX,EBX
+   186 00000166 31 F6                                  XOR     ESI,ESI
+   187 00000168 8D 4C 02 EB                            LEA     ECX,DWORD [-21+EDX+EAX*1]
+   188 0000016C                                 L19:
+   189 0000016C 8A 94 3E [00000000]                    MOV     DL,BYTE [_closebtn.0+ESI+EDI*1]
+   190 00000173 80 FA 40                               CMP     DL,64
+   191 00000176 74 33                                  JE      L25
+   192 00000178 80 FA 24                               CMP     DL,36
+   193 0000017B 74 2A                                  JE      L26
+   194 0000017D 80 FA 51                               CMP     DL,81
+   195 00000180 B2 08                                  MOV     DL,8
+   196 00000182 0F 95 C0                               SETNE   AL
+   197 00000185 28 C2                                  SUB     DL,AL
+   198 00000187                                 L14:
+   199 00000187 46                                     INC     ESI
+   200 00000188 88 11                                  MOV     BYTE [ECX],DL
+   201 0000018A 41                                     INC     ECX
+   202 0000018B 83 FE 0F                               CMP     ESI,15
+   203 0000018E 7E DC                                  JLE     L19
+   204 00000190 FF 45 F0                               INC     DWORD [-16+EBP]
+   205 00000193 83 C7 10                               ADD     EDI,16
+   206 00000196 03 5D 0C                               ADD     EBX,DWORD [12+EBP]
+   207 00000199 83 7D F0 0D                            CMP     DWORD [-16+EBP],13
+   208 0000019D 7E BF                                  JLE     L20
+   209 0000019F 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   210 000001A2 5B                                     POP     EBX
+   211 000001A3 5E                                     POP     ESI
+   212 000001A4 5F                                     POP     EDI
+   213 000001A5 5D                                     POP     EBP
+   214 000001A6 C3                                     RET
+   215 000001A7                                 L26:
+   216 000001A7 B2 0F                                  MOV     DL,15
+   217 000001A9 EB DC                                  JMP     L14
+   218 000001AB                                 L25:
+   219 000001AB 31 D2                                  XOR     EDX,EDX
+   220 000001AD EB D8                                  JMP     L14
+   221 000001AF                                 L3:
+   222 000001AF B3 08                                  MOV     BL,8
+   223 000001B1 B2 0F                                  MOV     DL,15
+   224 000001B3 E9 FFFFFF64                            JMP     L4
+   225 000001B8                                        GLOBAL  _putfonts8_asc_sht
+   226 000001B8                                 _putfonts8_asc_sht:
+   227 000001B8 55                                     PUSH    EBP
+   228 000001B9 89 E5                                  MOV     EBP,ESP
+   229 000001BB 57                                     PUSH    EDI
+   230 000001BC 56                                     PUSH    ESI
+   231 000001BD 53                                     PUSH    EBX
+   232 000001BE 83 EC 18                               SUB     ESP,24
+   233 000001C1 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   234 000001C4 8B 55 14                               MOV     EDX,DWORD [20+EBP]
+   235 000001C7 8B 4D 1C                               MOV     ECX,DWORD [28+EBP]
+   236 000001CA 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   237 000001CD 8B 45 20                               MOV     EAX,DWORD [32+EBP]
+   238 000001D0 89 55 EC                               MOV     DWORD [-20+EBP],EDX
+   239 000001D3 89 4D E8                               MOV     DWORD [-24+EBP],ECX
+   240 000001D6 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+   241 000001D9 8B 7D 08                               MOV     EDI,DWORD [8+EBP]
+   242 000001DC 8B 75 10                               MOV     ESI,DWORD [16+EBP]
+   243 000001DF 8B 5D 18                               MOV     EBX,DWORD [24+EBP]
+   244 000001E2 E8 [00000000]                          CALL    _task_now
+   245 000001E7 0F B6 DB                               MOVZX   EBX,BL
+   246 000001EA 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   247 000001ED 8D 46 0F                               LEA     EAX,DWORD [15+ESI]
+   248 000001F0 50                                     PUSH    EAX
+   249 000001F1 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+   250 000001F4 8B 55 E4                               MOV     EDX,DWORD [-28+EBP]
+   251 000001F7 8D 14 D1                               LEA     EDX,DWORD [ECX+EDX*8]
+   252 000001FA 89 D0                                  MOV     EAX,EDX
+   253 000001FC 89 55 DC                               MOV     DWORD [-36+EBP],EDX
+   254 000001FF 48                                     DEC     EAX
+   255 00000200 50                                     PUSH    EAX
+   256 00000201 56                                     PUSH    ESI
+   257 00000202 51                                     PUSH    ECX
+   258 00000203 53                                     PUSH    EBX
+   259 00000204 FF 77 04                               PUSH    DWORD [4+EDI]
+   260 00000207 FF 37                                  PUSH    DWORD [EDI]
+   261 00000209 E8 [00000000]                          CALL    _boxfill8
+   262 0000020E 8B 4D E0                               MOV     ECX,DWORD [-32+EBP]
+   263 00000211 83 C4 1C                               ADD     ESP,28
+   264 00000214 80 B9 000000BC 00                      CMP     BYTE [188+ECX],0
+   265 0000021B 74 09                                  JE      L28
+   266 0000021D 80 B9 000000BD 00                      CMP     BYTE [189+ECX],0
+   267 00000224 75 40                                  JNE     L31
+   268 00000226                                 L28:
+   269 00000226 FF 75 E8                               PUSH    DWORD [-24+EBP]
+   270 00000229 0F BE 45 EC                            MOVSX   EAX,BYTE [-20+EBP]
+   271 0000022D 50                                     PUSH    EAX
+   272 0000022E 56                                     PUSH    ESI
+   273 0000022F FF 75 F0                               PUSH    DWORD [-16+EBP]
+   274 00000232 FF 77 04                               PUSH    DWORD [4+EDI]
+   275 00000235 FF 37                                  PUSH    DWORD [EDI]
+   276 00000237 E8 [00000000]                          CALL    _putfonts8_asc
+   277 0000023C 89 75 10                               MOV     DWORD [16+EBP],ESI
+   278 0000023F 8B 4D F0                               MOV     ECX,DWORD [-16+EBP]
+   279 00000242 8B 55 E4                               MOV     EDX,DWORD [-28+EBP]
+   280 00000245 8D 46 10                               LEA     EAX,DWORD [16+ESI]
+   281 00000248 83 C4 18                               ADD     ESP,24
+   282 0000024B 89 45 18                               MOV     DWORD [24+EBP],EAX
+   283 0000024E 89 4D 0C                               MOV     DWORD [12+EBP],ECX
+   284 00000251 8D 04 D1                               LEA     EAX,DWORD [ECX+EDX*8]
+   285 00000254 89 45 14                               MOV     DWORD [20+EBP],EAX
+   286 00000257                                 L30:
+   287 00000257 89 7D 08                               MOV     DWORD [8+EBP],EDI
+   288 0000025A 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   289 0000025D 5B                                     POP     EBX
+   290 0000025E 5E                                     POP     ESI
+   291 0000025F 5F                                     POP     EDI
+   292 00000260 5D                                     POP     EBP
+   293 00000261 E9 [00000000]                          JMP     _sheet_refresh
+   294 00000266                                 L31:
+   295 00000266 FF 75 E8                               PUSH    DWORD [-24+EBP]
+   296 00000269 0F BE 45 EC                            MOVSX   EAX,BYTE [-20+EBP]
+   297 0000026D 50                                     PUSH    EAX
+   298 0000026E 56                                     PUSH    ESI
+   299 0000026F FF 75 F0                               PUSH    DWORD [-16+EBP]
+   300 00000272 FF 77 04                               PUSH    DWORD [4+EDI]
+   301 00000275 FF 37                                  PUSH    DWORD [EDI]
+   302 00000277 E8 [00000000]                          CALL    _putfonts8_asc
+   303 0000027C 89 75 10                               MOV     DWORD [16+EBP],ESI
+   304 0000027F 8D 46 10                               LEA     EAX,DWORD [16+ESI]
+   305 00000282 83 C4 18                               ADD     ESP,24
+   306 00000285 89 45 18                               MOV     DWORD [24+EBP],EAX
+   307 00000288 8B 45 DC                               MOV     EAX,DWORD [-36+EBP]
+   308 0000028B 89 45 14                               MOV     DWORD [20+EBP],EAX
+   309 0000028E 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   310 00000291 83 E8 08                               SUB     EAX,8
+   311 00000294 89 45 0C                               MOV     DWORD [12+EBP],EAX
+   312 00000297 EB BE                                  JMP     L30
+   313 00000299                                        GLOBAL  _make_textbox8
+   314 00000299                                 _make_textbox8:
+   315 00000299 55                                     PUSH    EBP
+   316 0000029A 89 E5                                  MOV     EBP,ESP
+   317 0000029C 57                                     PUSH    EDI
+   318 0000029D 56                                     PUSH    ESI
+   319 0000029E 53                                     PUSH    EBX
+   320 0000029F 83 EC 14                               SUB     ESP,20
+   321 000002A2 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   322 000002A5 8B 75 10                               MOV     ESI,DWORD [16+EBP]
+   323 000002A8 03 45 14                               ADD     EAX,DWORD [20+EBP]
+   324 000002AB 83 EE 03                               SUB     ESI,3
+   325 000002AE 56                                     PUSH    ESI
+   326 000002AF 89 45 F0                               MOV     DWORD [-16+EBP],EAX
+   327 000002B2 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   328 000002B5 03 45 18                               ADD     EAX,DWORD [24+EBP]
+   329 000002B8 89 45 EC                               MOV     DWORD [-20+EBP],EAX
+   330 000002BB 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   331 000002BE 40                                     INC     EAX
+   332 000002BF 50                                     PUSH    EAX
+   333 000002C0 89 45 E8                               MOV     DWORD [-24+EBP],EAX
+   334 000002C3 8B 45 0C                               MOV     EAX,DWORD [12+EBP]
+   335 000002C6 56                                     PUSH    ESI
+   336 000002C7 83 E8 02                               SUB     EAX,2
+   337 000002CA 50                                     PUSH    EAX
+   338 000002CB 89 45 E4                               MOV     DWORD [-28+EBP],EAX
+   339 000002CE 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   340 000002D1 6A 0F                                  PUSH    15
+   341 000002D3 FF 70 04                               PUSH    DWORD [4+EAX]
+   342 000002D6 FF 30                                  PUSH    DWORD [EAX]
+   343 000002D8 E8 [00000000]                          CALL    _boxfill8
+   344 000002DD 8B 7D 0C                               MOV     EDI,DWORD [12+EBP]
+   345 000002E0 8B 45 EC                               MOV     EAX,DWORD [-20+EBP]
+   346 000002E3 83 EF 03                               SUB     EDI,3
+   347 000002E6 40                                     INC     EAX
+   348 000002E7 50                                     PUSH    EAX
+   349 000002E8 89 45 E0                               MOV     DWORD [-32+EBP],EAX
+   350 000002EB 57                                     PUSH    EDI
+   351 000002EC 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   352 000002EF 56                                     PUSH    ESI
+   353 000002F0 57                                     PUSH    EDI
+   354 000002F1 6A 0F                                  PUSH    15
+   355 000002F3 FF 70 04                               PUSH    DWORD [4+EAX]
+   356 000002F6 FF 30                                  PUSH    DWORD [EAX]
+   357 000002F8 E8 [00000000]                          CALL    _boxfill8
+   358 000002FD 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   359 00000300 83 C4 38                               ADD     ESP,56
+   360 00000303 8B 5D EC                               MOV     EBX,DWORD [-20+EBP]
+   361 00000306 83 C3 02                               ADD     EBX,2
+   362 00000309 53                                     PUSH    EBX
+   363 0000030A FF 75 E8                               PUSH    DWORD [-24+EBP]
+   364 0000030D 53                                     PUSH    EBX
+   365 0000030E 57                                     PUSH    EDI
+   366 0000030F 6A 07                                  PUSH    7
+   367 00000311 FF 70 04                               PUSH    DWORD [4+EAX]
+   368 00000314 FF 30                                  PUSH    DWORD [EAX]
+   369 00000316 E8 [00000000]                          CALL    _boxfill8
+   370 0000031B 8B 45 F0                               MOV     EAX,DWORD [-16+EBP]
+   371 0000031E 53                                     PUSH    EBX
+   372 0000031F 83 C0 02                               ADD     EAX,2
+   373 00000322 50                                     PUSH    EAX
+   374 00000323 56                                     PUSH    ESI
+   375 00000324 50                                     PUSH    EAX
+   376 00000325 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   377 00000328 6A 07                                  PUSH    7
+   378 0000032A FF 70 04                               PUSH    DWORD [4+EAX]
+   379 0000032D FF 30                                  PUSH    DWORD [EAX]
+   380 0000032F E8 [00000000]                          CALL    _boxfill8
+   381 00000334 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   382 00000337 83 C4 38                               ADD     ESP,56
+   383 0000033A 8B 5D 10                               MOV     EBX,DWORD [16+EBP]
+   384 0000033D 83 EB 02                               SUB     EBX,2
+   385 00000340 8B 7D 0C                               MOV     EDI,DWORD [12+EBP]
+   386 00000343 53                                     PUSH    EBX
+   387 00000344 4F                                     DEC     EDI
+   388 00000345 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   389 00000348 53                                     PUSH    EBX
+   390 00000349 57                                     PUSH    EDI
+   391 0000034A 6A 00                                  PUSH    0
+   392 0000034C FF 70 04                               PUSH    DWORD [4+EAX]
+   393 0000034F FF 30                                  PUSH    DWORD [EAX]
+   394 00000351 E8 [00000000]                          CALL    _boxfill8
+   395 00000356 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   396 00000359 FF 75 EC                               PUSH    DWORD [-20+EBP]
+   397 0000035C FF 75 E4                               PUSH    DWORD [-28+EBP]
+   398 0000035F 53                                     PUSH    EBX
+   399 00000360 FF 75 E4                               PUSH    DWORD [-28+EBP]
+   400 00000363 6A 00                                  PUSH    0
+   401 00000365 FF 70 04                               PUSH    DWORD [4+EAX]
+   402 00000368 FF 30                                  PUSH    DWORD [EAX]
+   403 0000036A E8 [00000000]                          CALL    _boxfill8
+   404 0000036F 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   405 00000372 83 C4 38                               ADD     ESP,56
+   406 00000375 FF 75 E0                               PUSH    DWORD [-32+EBP]
+   407 00000378 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   408 0000037B FF 75 E0                               PUSH    DWORD [-32+EBP]
+   409 0000037E FF 75 E4                               PUSH    DWORD [-28+EBP]
+   410 00000381 6A 08                                  PUSH    8
+   411 00000383 FF 70 04                               PUSH    DWORD [4+EAX]
+   412 00000386 FF 30                                  PUSH    DWORD [EAX]
+   413 00000388 E8 [00000000]                          CALL    _boxfill8
+   414 0000038D 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   415 00000390 FF 75 E0                               PUSH    DWORD [-32+EBP]
+   416 00000393 FF 75 E8                               PUSH    DWORD [-24+EBP]
+   417 00000396 53                                     PUSH    EBX
+   418 00000397 FF 75 E8                               PUSH    DWORD [-24+EBP]
+   419 0000039A 6A 08                                  PUSH    8
+   420 0000039C FF 70 04                               PUSH    DWORD [4+EAX]
+   421 0000039F FF 30                                  PUSH    DWORD [EAX]
+   422 000003A1 E8 [00000000]                          CALL    _boxfill8
+   423 000003A6 8B 45 10                               MOV     EAX,DWORD [16+EBP]
+   424 000003A9 83 C4 38                               ADD     ESP,56
+   425 000003AC 48                                     DEC     EAX
+   426 000003AD FF 75 EC                               PUSH    DWORD [-20+EBP]
+   427 000003B0 FF 75 F0                               PUSH    DWORD [-16+EBP]
+   428 000003B3 50                                     PUSH    EAX
+   429 000003B4 57                                     PUSH    EDI
+   430 000003B5 0F B6 45 1C                            MOVZX   EAX,BYTE [28+EBP]
+   431 000003B9 50                                     PUSH    EAX
+   432 000003BA 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   433 000003BD FF 70 04                               PUSH    DWORD [4+EAX]
+   434 000003C0 FF 30                                  PUSH    DWORD [EAX]
+   435 000003C2 E8 [00000000]                          CALL    _boxfill8
+   436 000003C7 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   437 000003CA 5B                                     POP     EBX
+   438 000003CB 5E                                     POP     ESI
+   439 000003CC 5F                                     POP     EDI
+   440 000003CD 5D                                     POP     EBP
+   441 000003CE C3                                     RET
+   442 000003CF                                        GLOBAL  _change_wtitle8
+   443 000003CF                                 _change_wtitle8:
+   444 000003CF 55                                     PUSH    EBP
+   445 000003D0 89 E5                                  MOV     EBP,ESP
+   446 000003D2 57                                     PUSH    EDI
+   447 000003D3 56                                     PUSH    ESI
+   448 000003D4 53                                     PUSH    EBX
+   449 000003D5 83 EC 14                               SUB     ESP,20
+   450 000003D8 8B 45 08                               MOV     EAX,DWORD [8+EBP]
+   451 000003DB 80 7D 0C 00                            CMP     BYTE [12+EBP],0
+   452 000003DF 8B 10                                  MOV     EDX,DWORD [EAX]
+   453 000003E1 8B 48 04                               MOV     ECX,DWORD [4+EAX]
+   454 000003E4 89 55 E4                               MOV     DWORD [-28+EBP],EDX
+   455 000003E7 0F 84 00000088                         JE      L34
+   456 000003ED C6 45 EB 07                            MOV     BYTE [-21+EBP],7
+   457 000003F1 C6 45 EA 0C                            MOV     BYTE [-22+EBP],12
+   458 000003F5 C6 45 E9 08                            MOV     BYTE [-23+EBP],8
+   459 000003F9 C6 45 E8 0F                            MOV     BYTE [-24+EBP],15
+   460 000003FD                                 L35:
+   461 000003FD 6B F9 03                               IMUL    EDI,ECX,3
+   462 00000400 C7 45 EC 00000011                      MOV     DWORD [-20+EBP],17
+   463 00000407 89 7D E0                               MOV     DWORD [-32+EBP],EDI
+   464 0000040A                                 L48:
+   465 0000040A C7 45 F0 00000003                      MOV     DWORD [-16+EBP],3
+   466 00000411 8D 41 FC                               LEA     EAX,DWORD [-4+ECX]
+   467 00000414 39 45 F0                               CMP     DWORD [-16+EBP],EAX
+   468 00000417 7F 29                                  JG      L52
+   469 00000419 8B 45 E4                               MOV     EAX,DWORD [-28+EBP]
+   470 0000041C 8B 55 E0                               MOV     EDX,DWORD [-32+EBP]
+   471 0000041F 8D 74 38 03                            LEA     ESI,DWORD [3+EAX+EDI*1]
+   472 00000423 8D 5C 10 03                            LEA     EBX,DWORD [3+EAX+EDX*1]
+   473 00000427                                 L47:
+   474 00000427 8A 13                                  MOV     DL,BYTE [EBX]
+   475 00000429 3A 55 E9                               CMP     DL,BYTE [-23+EBP]
+   476 0000042C 74 3A                                  JE      L53
+   477 0000042E                                 L44:
+   478 0000042E 3A 55 E8                               CMP     DL,BYTE [-24+EBP]
+   479 00000431 74 30                                  JE      L54
+   480 00000433                                 L45:
+   481 00000433 88 16                                  MOV     BYTE [ESI],DL
+   482 00000435 8D 41 FC                               LEA     EAX,DWORD [-4+ECX]
+   483 00000438 FF 45 F0                               INC     DWORD [-16+EBP]
+   484 0000043B 46                                     INC     ESI
+   485 0000043C 43                                     INC     EBX
+   486 0000043D 39 45 F0                               CMP     DWORD [-16+EBP],EAX
+   487 00000440 7E E5                                  JLE     L47
+   488 00000442                                 L52:
+   489 00000442 01 CF                                  ADD     EDI,ECX
+   490 00000444 01 4D E0                               ADD     DWORD [-32+EBP],ECX
+   491 00000447 FF 4D EC                               DEC     DWORD [-20+EBP]
+   492 0000044A 79 BE                                  JNS     L48
+   493 0000044C 6A 15                                  PUSH    21
+   494 0000044E 51                                     PUSH    ECX
+   495 0000044F 6A 03                                  PUSH    3
+   496 00000451 6A 03                                  PUSH    3
+   497 00000453 FF 75 08                               PUSH    DWORD [8+EBP]
+   498 00000456 E8 [00000000]                          CALL    _sheet_refresh
+   499 0000045B 8D 65 F4                               LEA     ESP,DWORD [-12+EBP]
+   500 0000045E 5B                                     POP     EBX
+   501 0000045F 5E                                     POP     ESI
+   502 00000460 5F                                     POP     EDI
+   503 00000461 5D                                     POP     EBP
+   504 00000462 C3                                     RET
+   505 00000463                                 L54:
+   506 00000463 8A 55 EA                               MOV     DL,BYTE [-22+EBP]
+   507 00000466 EB CB                                  JMP     L45
+   508 00000468                                 L53:
+   509 00000468 8D 41 EA                               LEA     EAX,DWORD [-22+ECX]
+   510 0000046B 39 45 F0                               CMP     DWORD [-16+EBP],EAX
+   511 0000046E 7F BE                                  JG      L44
+   512 00000470 8A 55 EB                               MOV     DL,BYTE [-21+EBP]
+   513 00000473 EB BE                                  JMP     L45
+   514 00000475                                 L34:
+   515 00000475 C6 45 EB 08                            MOV     BYTE [-21+EBP],8
+   516 00000479 C6 45 EA 0F                            MOV     BYTE [-22+EBP],15
+   517 0000047D C6 45 E9 07                            MOV     BYTE [-23+EBP],7
+   518 00000481 C6 45 E8 0C                            MOV     BYTE [-24+EBP],12
+   519 00000485 E9 FFFFFF73                            JMP     L35
diff --git a/haribote2.img b/haribote2.img
new file mode 100644 (file)
index 0000000..b2e10b7
Binary files /dev/null and b/haribote2.img differ
diff --git a/imgconv.bat b/imgconv.bat
new file mode 100644 (file)
index 0000000..2bc71cd
--- /dev/null
@@ -0,0 +1 @@
+"G:\Program Files\Oracle\VirtualBox\VBoxManage" internalcommands converthd -srcformat RAW -dstformat VHD haribote.img haribote.vhd
diff --git a/include/CP932.TXT b/include/CP932.TXT
new file mode 100644 (file)
index 0000000..7ff471b
--- /dev/null
@@ -0,0 +1,7998 @@
+#
+#    Name:     cp932 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       Shawn.Steele@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp932 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp932 order
+#
+0x00   0x0000  #NULL
+0x01   0x0001  #START OF HEADING
+0x02   0x0002  #START OF TEXT
+0x03   0x0003  #END OF TEXT
+0x04   0x0004  #END OF TRANSMISSION
+0x05   0x0005  #ENQUIRY
+0x06   0x0006  #ACKNOWLEDGE
+0x07   0x0007  #BELL
+0x08   0x0008  #BACKSPACE
+0x09   0x0009  #HORIZONTAL TABULATION
+0x0A   0x000A  #LINE FEED
+0x0B   0x000B  #VERTICAL TABULATION
+0x0C   0x000C  #FORM FEED
+0x0D   0x000D  #CARRIAGE RETURN
+0x0E   0x000E  #SHIFT OUT
+0x0F   0x000F  #SHIFT IN
+0x10   0x0010  #DATA LINK ESCAPE
+0x11   0x0011  #DEVICE CONTROL ONE
+0x12   0x0012  #DEVICE CONTROL TWO
+0x13   0x0013  #DEVICE CONTROL THREE
+0x14   0x0014  #DEVICE CONTROL FOUR
+0x15   0x0015  #NEGATIVE ACKNOWLEDGE
+0x16   0x0016  #SYNCHRONOUS IDLE
+0x17   0x0017  #END OF TRANSMISSION BLOCK
+0x18   0x0018  #CANCEL
+0x19   0x0019  #END OF MEDIUM
+0x1A   0x001A  #SUBSTITUTE
+0x1B   0x001B  #ESCAPE
+0x1C   0x001C  #FILE SEPARATOR
+0x1D   0x001D  #GROUP SEPARATOR
+0x1E   0x001E  #RECORD SEPARATOR
+0x1F   0x001F  #UNIT SEPARATOR
+0x20   0x0020  #SPACE
+0x21   0x0021  #EXCLAMATION MARK
+0x22   0x0022  #QUOTATION MARK
+0x23   0x0023  #NUMBER SIGN
+0x24   0x0024  #DOLLAR SIGN
+0x25   0x0025  #PERCENT SIGN
+0x26   0x0026  #AMPERSAND
+0x27   0x0027  #APOSTROPHE
+0x28   0x0028  #LEFT PARENTHESIS
+0x29   0x0029  #RIGHT PARENTHESIS
+0x2A   0x002A  #ASTERISK
+0x2B   0x002B  #PLUS SIGN
+0x2C   0x002C  #COMMA
+0x2D   0x002D  #HYPHEN-MINUS
+0x2E   0x002E  #FULL STOP
+0x2F   0x002F  #SOLIDUS
+0x30   0x0030  #DIGIT ZERO
+0x31   0x0031  #DIGIT ONE
+0x32   0x0032  #DIGIT TWO
+0x33   0x0033  #DIGIT THREE
+0x34   0x0034  #DIGIT FOUR
+0x35   0x0035  #DIGIT FIVE
+0x36   0x0036  #DIGIT SIX
+0x37   0x0037  #DIGIT SEVEN
+0x38   0x0038  #DIGIT EIGHT
+0x39   0x0039  #DIGIT NINE
+0x3A   0x003A  #COLON
+0x3B   0x003B  #SEMICOLON
+0x3C   0x003C  #LESS-THAN SIGN
+0x3D   0x003D  #EQUALS SIGN
+0x3E   0x003E  #GREATER-THAN SIGN
+0x3F   0x003F  #QUESTION MARK
+0x40   0x0040  #COMMERCIAL AT
+0x41   0x0041  #LATIN CAPITAL LETTER A
+0x42   0x0042  #LATIN CAPITAL LETTER B
+0x43   0x0043  #LATIN CAPITAL LETTER C
+0x44   0x0044  #LATIN CAPITAL LETTER D
+0x45   0x0045  #LATIN CAPITAL LETTER E
+0x46   0x0046  #LATIN CAPITAL LETTER F
+0x47   0x0047  #LATIN CAPITAL LETTER G
+0x48   0x0048  #LATIN CAPITAL LETTER H
+0x49   0x0049  #LATIN CAPITAL LETTER I
+0x4A   0x004A  #LATIN CAPITAL LETTER J
+0x4B   0x004B  #LATIN CAPITAL LETTER K
+0x4C   0x004C  #LATIN CAPITAL LETTER L
+0x4D   0x004D  #LATIN CAPITAL LETTER M
+0x4E   0x004E  #LATIN CAPITAL LETTER N
+0x4F   0x004F  #LATIN CAPITAL LETTER O
+0x50   0x0050  #LATIN CAPITAL LETTER P
+0x51   0x0051  #LATIN CAPITAL LETTER Q
+0x52   0x0052  #LATIN CAPITAL LETTER R
+0x53   0x0053  #LATIN CAPITAL LETTER S
+0x54   0x0054  #LATIN CAPITAL LETTER T
+0x55   0x0055  #LATIN CAPITAL LETTER U
+0x56   0x0056  #LATIN CAPITAL LETTER V
+0x57   0x0057  #LATIN CAPITAL LETTER W
+0x58   0x0058  #LATIN CAPITAL LETTER X
+0x59   0x0059  #LATIN CAPITAL LETTER Y
+0x5A   0x005A  #LATIN CAPITAL LETTER Z
+0x5B   0x005B  #LEFT SQUARE BRACKET
+0x5C   0x005C  #REVERSE SOLIDUS
+0x5D   0x005D  #RIGHT SQUARE BRACKET
+0x5E   0x005E  #CIRCUMFLEX ACCENT
+0x5F   0x005F  #LOW LINE
+0x60   0x0060  #GRAVE ACCENT
+0x61   0x0061  #LATIN SMALL LETTER A
+0x62   0x0062  #LATIN SMALL LETTER B
+0x63   0x0063  #LATIN SMALL LETTER C
+0x64   0x0064  #LATIN SMALL LETTER D
+0x65   0x0065  #LATIN SMALL LETTER E
+0x66   0x0066  #LATIN SMALL LETTER F
+0x67   0x0067  #LATIN SMALL LETTER G
+0x68   0x0068  #LATIN SMALL LETTER H
+0x69   0x0069  #LATIN SMALL LETTER I
+0x6A   0x006A  #LATIN SMALL LETTER J
+0x6B   0x006B  #LATIN SMALL LETTER K
+0x6C   0x006C  #LATIN SMALL LETTER L
+0x6D   0x006D  #LATIN SMALL LETTER M
+0x6E   0x006E  #LATIN SMALL LETTER N
+0x6F   0x006F  #LATIN SMALL LETTER O
+0x70   0x0070  #LATIN SMALL LETTER P
+0x71   0x0071  #LATIN SMALL LETTER Q
+0x72   0x0072  #LATIN SMALL LETTER R
+0x73   0x0073  #LATIN SMALL LETTER S
+0x74   0x0074  #LATIN SMALL LETTER T
+0x75   0x0075  #LATIN SMALL LETTER U
+0x76   0x0076  #LATIN SMALL LETTER V
+0x77   0x0077  #LATIN SMALL LETTER W
+0x78   0x0078  #LATIN SMALL LETTER X
+0x79   0x0079  #LATIN SMALL LETTER Y
+0x7A   0x007A  #LATIN SMALL LETTER Z
+0x7B   0x007B  #LEFT CURLY BRACKET
+0x7C   0x007C  #VERTICAL LINE
+0x7D   0x007D  #RIGHT CURLY BRACKET
+0x7E   0x007E  #TILDE
+0x7F   0x007F  #DELETE
+0x80           #UNDEFINED
+0x81           #DBCS LEAD BYTE
+0x82           #DBCS LEAD BYTE
+0x83           #DBCS LEAD BYTE
+0x84           #DBCS LEAD BYTE
+0x85           #DBCS LEAD BYTE
+0x86           #DBCS LEAD BYTE
+0x87           #DBCS LEAD BYTE
+0x88           #DBCS LEAD BYTE
+0x89           #DBCS LEAD BYTE
+0x8A           #DBCS LEAD BYTE
+0x8B           #DBCS LEAD BYTE
+0x8C           #DBCS LEAD BYTE
+0x8D           #DBCS LEAD BYTE
+0x8E           #DBCS LEAD BYTE
+0x8F           #DBCS LEAD BYTE
+0x90           #DBCS LEAD BYTE
+0x91           #DBCS LEAD BYTE
+0x92           #DBCS LEAD BYTE
+0x93           #DBCS LEAD BYTE
+0x94           #DBCS LEAD BYTE
+0x95           #DBCS LEAD BYTE
+0x96           #DBCS LEAD BYTE
+0x97           #DBCS LEAD BYTE
+0x98           #DBCS LEAD BYTE
+0x99           #DBCS LEAD BYTE
+0x9A           #DBCS LEAD BYTE
+0x9B           #DBCS LEAD BYTE
+0x9C           #DBCS LEAD BYTE
+0x9D           #DBCS LEAD BYTE
+0x9E           #DBCS LEAD BYTE
+0x9F           #DBCS LEAD BYTE
+0xA0           #UNDEFINED
+0xA1   0xFF61  #HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2   0xFF62  #HALFWIDTH LEFT CORNER BRACKET
+0xA3   0xFF63  #HALFWIDTH RIGHT CORNER BRACKET
+0xA4   0xFF64  #HALFWIDTH IDEOGRAPHIC COMMA
+0xA5   0xFF65  #HALFWIDTH KATAKANA MIDDLE DOT
+0xA6   0xFF66  #HALFWIDTH KATAKANA LETTER WO
+0xA7   0xFF67  #HALFWIDTH KATAKANA LETTER SMALL A
+0xA8   0xFF68  #HALFWIDTH KATAKANA LETTER SMALL I
+0xA9   0xFF69  #HALFWIDTH KATAKANA LETTER SMALL U
+0xAA   0xFF6A  #HALFWIDTH KATAKANA LETTER SMALL E
+0xAB   0xFF6B  #HALFWIDTH KATAKANA LETTER SMALL O
+0xAC   0xFF6C  #HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD   0xFF6D  #HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE   0xFF6E  #HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF   0xFF6F  #HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0   0xFF70  #HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1   0xFF71  #HALFWIDTH KATAKANA LETTER A
+0xB2   0xFF72  #HALFWIDTH KATAKANA LETTER I
+0xB3   0xFF73  #HALFWIDTH KATAKANA LETTER U
+0xB4   0xFF74  #HALFWIDTH KATAKANA LETTER E
+0xB5   0xFF75  #HALFWIDTH KATAKANA LETTER O
+0xB6   0xFF76  #HALFWIDTH KATAKANA LETTER KA
+0xB7   0xFF77  #HALFWIDTH KATAKANA LETTER KI
+0xB8   0xFF78  #HALFWIDTH KATAKANA LETTER KU
+0xB9   0xFF79  #HALFWIDTH KATAKANA LETTER KE
+0xBA   0xFF7A  #HALFWIDTH KATAKANA LETTER KO
+0xBB   0xFF7B  #HALFWIDTH KATAKANA LETTER SA
+0xBC   0xFF7C  #HALFWIDTH KATAKANA LETTER SI
+0xBD   0xFF7D  #HALFWIDTH KATAKANA LETTER SU
+0xBE   0xFF7E  #HALFWIDTH KATAKANA LETTER SE
+0xBF   0xFF7F  #HALFWIDTH KATAKANA LETTER SO
+0xC0   0xFF80  #HALFWIDTH KATAKANA LETTER TA
+0xC1   0xFF81  #HALFWIDTH KATAKANA LETTER TI
+0xC2   0xFF82  #HALFWIDTH KATAKANA LETTER TU
+0xC3   0xFF83  #HALFWIDTH KATAKANA LETTER TE
+0xC4   0xFF84  #HALFWIDTH KATAKANA LETTER TO
+0xC5   0xFF85  #HALFWIDTH KATAKANA LETTER NA
+0xC6   0xFF86  #HALFWIDTH KATAKANA LETTER NI
+0xC7   0xFF87  #HALFWIDTH KATAKANA LETTER NU
+0xC8   0xFF88  #HALFWIDTH KATAKANA LETTER NE
+0xC9   0xFF89  #HALFWIDTH KATAKANA LETTER NO
+0xCA   0xFF8A  #HALFWIDTH KATAKANA LETTER HA
+0xCB   0xFF8B  #HALFWIDTH KATAKANA LETTER HI
+0xCC   0xFF8C  #HALFWIDTH KATAKANA LETTER HU
+0xCD   0xFF8D  #HALFWIDTH KATAKANA LETTER HE
+0xCE   0xFF8E  #HALFWIDTH KATAKANA LETTER HO
+0xCF   0xFF8F  #HALFWIDTH KATAKANA LETTER MA
+0xD0   0xFF90  #HALFWIDTH KATAKANA LETTER MI
+0xD1   0xFF91  #HALFWIDTH KATAKANA LETTER MU
+0xD2   0xFF92  #HALFWIDTH KATAKANA LETTER ME
+0xD3   0xFF93  #HALFWIDTH KATAKANA LETTER MO
+0xD4   0xFF94  #HALFWIDTH KATAKANA LETTER YA
+0xD5   0xFF95  #HALFWIDTH KATAKANA LETTER YU
+0xD6   0xFF96  #HALFWIDTH KATAKANA LETTER YO
+0xD7   0xFF97  #HALFWIDTH KATAKANA LETTER RA
+0xD8   0xFF98  #HALFWIDTH KATAKANA LETTER RI
+0xD9   0xFF99  #HALFWIDTH KATAKANA LETTER RU
+0xDA   0xFF9A  #HALFWIDTH KATAKANA LETTER RE
+0xDB   0xFF9B  #HALFWIDTH KATAKANA LETTER RO
+0xDC   0xFF9C  #HALFWIDTH KATAKANA LETTER WA
+0xDD   0xFF9D  #HALFWIDTH KATAKANA LETTER N
+0xDE   0xFF9E  #HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF   0xFF9F  #HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE0           #DBCS LEAD BYTE
+0xE1           #DBCS LEAD BYTE
+0xE2           #DBCS LEAD BYTE
+0xE3           #DBCS LEAD BYTE
+0xE4           #DBCS LEAD BYTE
+0xE5           #DBCS LEAD BYTE
+0xE6           #DBCS LEAD BYTE
+0xE7           #DBCS LEAD BYTE
+0xE8           #DBCS LEAD BYTE
+0xE9           #DBCS LEAD BYTE
+0xEA           #DBCS LEAD BYTE
+0xEB           #DBCS LEAD BYTE
+0xEC           #DBCS LEAD BYTE
+0xED           #DBCS LEAD BYTE
+0xEE           #DBCS LEAD BYTE
+0xEF           #DBCS LEAD BYTE
+0xF0           #DBCS LEAD BYTE
+0xF1           #DBCS LEAD BYTE
+0xF2           #DBCS LEAD BYTE
+0xF3           #DBCS LEAD BYTE
+0xF4           #DBCS LEAD BYTE
+0xF5           #DBCS LEAD BYTE
+0xF6           #DBCS LEAD BYTE
+0xF7           #DBCS LEAD BYTE
+0xF8           #DBCS LEAD BYTE
+0xF9           #DBCS LEAD BYTE
+0xFA           #DBCS LEAD BYTE
+0xFB           #DBCS LEAD BYTE
+0xFC           #DBCS LEAD BYTE
+0xFD           #UNDEFINED
+0xFE           #UNDEFINED
+0xFF           #UNDEFINED
+0x8140 0x3000  #IDEOGRAPHIC SPACE
+0x8141 0x3001  #IDEOGRAPHIC COMMA
+0x8142 0x3002  #IDEOGRAPHIC FULL STOP
+0x8143 0xFF0C  #FULLWIDTH COMMA
+0x8144 0xFF0E  #FULLWIDTH FULL STOP
+0x8145 0x30FB  #KATAKANA MIDDLE DOT
+0x8146 0xFF1A  #FULLWIDTH COLON
+0x8147 0xFF1B  #FULLWIDTH SEMICOLON
+0x8148 0xFF1F  #FULLWIDTH QUESTION MARK
+0x8149 0xFF01  #FULLWIDTH EXCLAMATION MARK
+0x814A 0x309B  #KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B 0x309C  #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C 0x00B4  #ACUTE ACCENT
+0x814D 0xFF40  #FULLWIDTH GRAVE ACCENT
+0x814E 0x00A8  #DIAERESIS
+0x814F 0xFF3E  #FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 0xFFE3  #FULLWIDTH MACRON
+0x8151 0xFF3F  #FULLWIDTH LOW LINE
+0x8152 0x30FD  #KATAKANA ITERATION MARK
+0x8153 0x30FE  #KATAKANA VOICED ITERATION MARK
+0x8154 0x309D  #HIRAGANA ITERATION MARK
+0x8155 0x309E  #HIRAGANA VOICED ITERATION MARK
+0x8156 0x3003  #DITTO MARK
+0x8157 0x4EDD  #CJK UNIFIED IDEOGRAPH
+0x8158 0x3005  #IDEOGRAPHIC ITERATION MARK
+0x8159 0x3006  #IDEOGRAPHIC CLOSING MARK
+0x815A 0x3007  #IDEOGRAPHIC NUMBER ZERO
+0x815B 0x30FC  #KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C 0x2015  #HORIZONTAL BAR
+0x815D 0x2010  #HYPHEN
+0x815E 0xFF0F  #FULLWIDTH SOLIDUS
+0x815F 0xFF3C  #FULLWIDTH REVERSE SOLIDUS
+0x8160 0xFF5E  #FULLWIDTH TILDE
+0x8161 0x2225  #PARALLEL TO
+0x8162 0xFF5C  #FULLWIDTH VERTICAL LINE
+0x8163 0x2026  #HORIZONTAL ELLIPSIS
+0x8164 0x2025  #TWO DOT LEADER
+0x8165 0x2018  #LEFT SINGLE QUOTATION MARK
+0x8166 0x2019  #RIGHT SINGLE QUOTATION MARK
+0x8167 0x201C  #LEFT DOUBLE QUOTATION MARK
+0x8168 0x201D  #RIGHT DOUBLE QUOTATION MARK
+0x8169 0xFF08  #FULLWIDTH LEFT PARENTHESIS
+0x816A 0xFF09  #FULLWIDTH RIGHT PARENTHESIS
+0x816B 0x3014  #LEFT TORTOISE SHELL BRACKET
+0x816C 0x3015  #RIGHT TORTOISE SHELL BRACKET
+0x816D 0xFF3B  #FULLWIDTH LEFT SQUARE BRACKET
+0x816E 0xFF3D  #FULLWIDTH RIGHT SQUARE BRACKET
+0x816F 0xFF5B  #FULLWIDTH LEFT CURLY BRACKET
+0x8170 0xFF5D  #FULLWIDTH RIGHT CURLY BRACKET
+0x8171 0x3008  #LEFT ANGLE BRACKET
+0x8172 0x3009  #RIGHT ANGLE BRACKET
+0x8173 0x300A  #LEFT DOUBLE ANGLE BRACKET
+0x8174 0x300B  #RIGHT DOUBLE ANGLE BRACKET
+0x8175 0x300C  #LEFT CORNER BRACKET
+0x8176 0x300D  #RIGHT CORNER BRACKET
+0x8177 0x300E  #LEFT WHITE CORNER BRACKET
+0x8178 0x300F  #RIGHT WHITE CORNER BRACKET
+0x8179 0x3010  #LEFT BLACK LENTICULAR BRACKET
+0x817A 0x3011  #RIGHT BLACK LENTICULAR BRACKET
+0x817B 0xFF0B  #FULLWIDTH PLUS SIGN
+0x817C 0xFF0D  #FULLWIDTH HYPHEN-MINUS
+0x817D 0x00B1  #PLUS-MINUS SIGN
+0x817E 0x00D7  #MULTIPLICATION SIGN
+0x8180 0x00F7  #DIVISION SIGN
+0x8181 0xFF1D  #FULLWIDTH EQUALS SIGN
+0x8182 0x2260  #NOT EQUAL TO
+0x8183 0xFF1C  #FULLWIDTH LESS-THAN SIGN
+0x8184 0xFF1E  #FULLWIDTH GREATER-THAN SIGN
+0x8185 0x2266  #LESS-THAN OVER EQUAL TO
+0x8186 0x2267  #GREATER-THAN OVER EQUAL TO
+0x8187 0x221E  #INFINITY
+0x8188 0x2234  #THEREFORE
+0x8189 0x2642  #MALE SIGN
+0x818A 0x2640  #FEMALE SIGN
+0x818B 0x00B0  #DEGREE SIGN
+0x818C 0x2032  #PRIME
+0x818D 0x2033  #DOUBLE PRIME
+0x818E 0x2103  #DEGREE CELSIUS
+0x818F 0xFFE5  #FULLWIDTH YEN SIGN
+0x8190 0xFF04  #FULLWIDTH DOLLAR SIGN
+0x8191 0xFFE0  #FULLWIDTH CENT SIGN
+0x8192 0xFFE1  #FULLWIDTH POUND SIGN
+0x8193 0xFF05  #FULLWIDTH PERCENT SIGN
+0x8194 0xFF03  #FULLWIDTH NUMBER SIGN
+0x8195 0xFF06  #FULLWIDTH AMPERSAND
+0x8196 0xFF0A  #FULLWIDTH ASTERISK
+0x8197 0xFF20  #FULLWIDTH COMMERCIAL AT
+0x8198 0x00A7  #SECTION SIGN
+0x8199 0x2606  #WHITE STAR
+0x819A 0x2605  #BLACK STAR
+0x819B 0x25CB  #WHITE CIRCLE
+0x819C 0x25CF  #BLACK CIRCLE
+0x819D 0x25CE  #BULLSEYE
+0x819E 0x25C7  #WHITE DIAMOND
+0x819F 0x25C6  #BLACK DIAMOND
+0x81A0 0x25A1  #WHITE SQUARE
+0x81A1 0x25A0  #BLACK SQUARE
+0x81A2 0x25B3  #WHITE UP-POINTING TRIANGLE
+0x81A3 0x25B2  #BLACK UP-POINTING TRIANGLE
+0x81A4 0x25BD  #WHITE DOWN-POINTING TRIANGLE
+0x81A5 0x25BC  #BLACK DOWN-POINTING TRIANGLE
+0x81A6 0x203B  #REFERENCE MARK
+0x81A7 0x3012  #POSTAL MARK
+0x81A8 0x2192  #RIGHTWARDS ARROW
+0x81A9 0x2190  #LEFTWARDS ARROW
+0x81AA 0x2191  #UPWARDS ARROW
+0x81AB 0x2193  #DOWNWARDS ARROW
+0x81AC 0x3013  #GETA MARK
+0x81B8 0x2208  #ELEMENT OF
+0x81B9 0x220B  #CONTAINS AS MEMBER
+0x81BA 0x2286  #SUBSET OF OR EQUAL TO
+0x81BB 0x2287  #SUPERSET OF OR EQUAL TO
+0x81BC 0x2282  #SUBSET OF
+0x81BD 0x2283  #SUPERSET OF
+0x81BE 0x222A  #UNION
+0x81BF 0x2229  #INTERSECTION
+0x81C8 0x2227  #LOGICAL AND
+0x81C9 0x2228  #LOGICAL OR
+0x81CA 0xFFE2  #FULLWIDTH NOT SIGN
+0x81CB 0x21D2  #RIGHTWARDS DOUBLE ARROW
+0x81CC 0x21D4  #LEFT RIGHT DOUBLE ARROW
+0x81CD 0x2200  #FOR ALL
+0x81CE 0x2203  #THERE EXISTS
+0x81DA 0x2220  #ANGLE
+0x81DB 0x22A5  #UP TACK
+0x81DC 0x2312  #ARC
+0x81DD 0x2202  #PARTIAL DIFFERENTIAL
+0x81DE 0x2207  #NABLA
+0x81DF 0x2261  #IDENTICAL TO
+0x81E0 0x2252  #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1 0x226A  #MUCH LESS-THAN
+0x81E2 0x226B  #MUCH GREATER-THAN
+0x81E3 0x221A  #SQUARE ROOT
+0x81E4 0x223D  #REVERSED TILDE
+0x81E5 0x221D  #PROPORTIONAL TO
+0x81E6 0x2235  #BECAUSE
+0x81E7 0x222B  #INTEGRAL
+0x81E8 0x222C  #DOUBLE INTEGRAL
+0x81F0 0x212B  #ANGSTROM SIGN
+0x81F1 0x2030  #PER MILLE SIGN
+0x81F2 0x266F  #MUSIC SHARP SIGN
+0x81F3 0x266D  #MUSIC FLAT SIGN
+0x81F4 0x266A  #EIGHTH NOTE
+0x81F5 0x2020  #DAGGER
+0x81F6 0x2021  #DOUBLE DAGGER
+0x81F7 0x00B6  #PILCROW SIGN
+0x81FC 0x25EF  #LARGE CIRCLE
+0x824F 0xFF10  #FULLWIDTH DIGIT ZERO
+0x8250 0xFF11  #FULLWIDTH DIGIT ONE
+0x8251 0xFF12  #FULLWIDTH DIGIT TWO
+0x8252 0xFF13  #FULLWIDTH DIGIT THREE
+0x8253 0xFF14  #FULLWIDTH DIGIT FOUR
+0x8254 0xFF15  #FULLWIDTH DIGIT FIVE
+0x8255 0xFF16  #FULLWIDTH DIGIT SIX
+0x8256 0xFF17  #FULLWIDTH DIGIT SEVEN
+0x8257 0xFF18  #FULLWIDTH DIGIT EIGHT
+0x8258 0xFF19  #FULLWIDTH DIGIT NINE
+0x8260 0xFF21  #FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 0xFF22  #FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 0xFF23  #FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 0xFF24  #FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 0xFF25  #FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 0xFF26  #FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 0xFF27  #FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 0xFF28  #FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 0xFF29  #FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 0xFF2A  #FULLWIDTH LATIN CAPITAL LETTER J
+0x826A 0xFF2B  #FULLWIDTH LATIN CAPITAL LETTER K
+0x826B 0xFF2C  #FULLWIDTH LATIN CAPITAL LETTER L
+0x826C 0xFF2D  #FULLWIDTH LATIN CAPITAL LETTER M
+0x826D 0xFF2E  #FULLWIDTH LATIN CAPITAL LETTER N
+0x826E 0xFF2F  #FULLWIDTH LATIN CAPITAL LETTER O
+0x826F 0xFF30  #FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 0xFF31  #FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 0xFF32  #FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 0xFF33  #FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 0xFF34  #FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 0xFF35  #FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 0xFF36  #FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 0xFF37  #FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 0xFF38  #FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 0xFF39  #FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 0xFF3A  #FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281 0xFF41  #FULLWIDTH LATIN SMALL LETTER A
+0x8282 0xFF42  #FULLWIDTH LATIN SMALL LETTER B
+0x8283 0xFF43  #FULLWIDTH LATIN SMALL LETTER C
+0x8284 0xFF44  #FULLWIDTH LATIN SMALL LETTER D
+0x8285 0xFF45  #FULLWIDTH LATIN SMALL LETTER E
+0x8286 0xFF46  #FULLWIDTH LATIN SMALL LETTER F
+0x8287 0xFF47  #FULLWIDTH LATIN SMALL LETTER G
+0x8288 0xFF48  #FULLWIDTH LATIN SMALL LETTER H
+0x8289 0xFF49  #FULLWIDTH LATIN SMALL LETTER I
+0x828A 0xFF4A  #FULLWIDTH LATIN SMALL LETTER J
+0x828B 0xFF4B  #FULLWIDTH LATIN SMALL LETTER K
+0x828C 0xFF4C  #FULLWIDTH LATIN SMALL LETTER L
+0x828D 0xFF4D  #FULLWIDTH LATIN SMALL LETTER M
+0x828E 0xFF4E  #FULLWIDTH LATIN SMALL LETTER N
+0x828F 0xFF4F  #FULLWIDTH LATIN SMALL LETTER O
+0x8290 0xFF50  #FULLWIDTH LATIN SMALL LETTER P
+0x8291 0xFF51  #FULLWIDTH LATIN SMALL LETTER Q
+0x8292 0xFF52  #FULLWIDTH LATIN SMALL LETTER R
+0x8293 0xFF53  #FULLWIDTH LATIN SMALL LETTER S
+0x8294 0xFF54  #FULLWIDTH LATIN SMALL LETTER T
+0x8295 0xFF55  #FULLWIDTH LATIN SMALL LETTER U
+0x8296 0xFF56  #FULLWIDTH LATIN SMALL LETTER V
+0x8297 0xFF57  #FULLWIDTH LATIN SMALL LETTER W
+0x8298 0xFF58  #FULLWIDTH LATIN SMALL LETTER X
+0x8299 0xFF59  #FULLWIDTH LATIN SMALL LETTER Y
+0x829A 0xFF5A  #FULLWIDTH LATIN SMALL LETTER Z
+0x829F 0x3041  #HIRAGANA LETTER SMALL A
+0x82A0 0x3042  #HIRAGANA LETTER A
+0x82A1 0x3043  #HIRAGANA LETTER SMALL I
+0x82A2 0x3044  #HIRAGANA LETTER I
+0x82A3 0x3045  #HIRAGANA LETTER SMALL U
+0x82A4 0x3046  #HIRAGANA LETTER U
+0x82A5 0x3047  #HIRAGANA LETTER SMALL E
+0x82A6 0x3048  #HIRAGANA LETTER E
+0x82A7 0x3049  #HIRAGANA LETTER SMALL O
+0x82A8 0x304A  #HIRAGANA LETTER O
+0x82A9 0x304B  #HIRAGANA LETTER KA
+0x82AA 0x304C  #HIRAGANA LETTER GA
+0x82AB 0x304D  #HIRAGANA LETTER KI
+0x82AC 0x304E  #HIRAGANA LETTER GI
+0x82AD 0x304F  #HIRAGANA LETTER KU
+0x82AE 0x3050  #HIRAGANA LETTER GU
+0x82AF 0x3051  #HIRAGANA LETTER KE
+0x82B0 0x3052  #HIRAGANA LETTER GE
+0x82B1 0x3053  #HIRAGANA LETTER KO
+0x82B2 0x3054  #HIRAGANA LETTER GO
+0x82B3 0x3055  #HIRAGANA LETTER SA
+0x82B4 0x3056  #HIRAGANA LETTER ZA
+0x82B5 0x3057  #HIRAGANA LETTER SI
+0x82B6 0x3058  #HIRAGANA LETTER ZI
+0x82B7 0x3059  #HIRAGANA LETTER SU
+0x82B8 0x305A  #HIRAGANA LETTER ZU
+0x82B9 0x305B  #HIRAGANA LETTER SE
+0x82BA 0x305C  #HIRAGANA LETTER ZE
+0x82BB 0x305D  #HIRAGANA LETTER SO
+0x82BC 0x305E  #HIRAGANA LETTER ZO
+0x82BD 0x305F  #HIRAGANA LETTER TA
+0x82BE 0x3060  #HIRAGANA LETTER DA
+0x82BF 0x3061  #HIRAGANA LETTER TI
+0x82C0 0x3062  #HIRAGANA LETTER DI
+0x82C1 0x3063  #HIRAGANA LETTER SMALL TU
+0x82C2 0x3064  #HIRAGANA LETTER TU
+0x82C3 0x3065  #HIRAGANA LETTER DU
+0x82C4 0x3066  #HIRAGANA LETTER TE
+0x82C5 0x3067  #HIRAGANA LETTER DE
+0x82C6 0x3068  #HIRAGANA LETTER TO
+0x82C7 0x3069  #HIRAGANA LETTER DO
+0x82C8 0x306A  #HIRAGANA LETTER NA
+0x82C9 0x306B  #HIRAGANA LETTER NI
+0x82CA 0x306C  #HIRAGANA LETTER NU
+0x82CB 0x306D  #HIRAGANA LETTER NE
+0x82CC 0x306E  #HIRAGANA LETTER NO
+0x82CD 0x306F  #HIRAGANA LETTER HA
+0x82CE 0x3070  #HIRAGANA LETTER BA
+0x82CF 0x3071  #HIRAGANA LETTER PA
+0x82D0 0x3072  #HIRAGANA LETTER HI
+0x82D1 0x3073  #HIRAGANA LETTER BI
+0x82D2 0x3074  #HIRAGANA LETTER PI
+0x82D3 0x3075  #HIRAGANA LETTER HU
+0x82D4 0x3076  #HIRAGANA LETTER BU
+0x82D5 0x3077  #HIRAGANA LETTER PU
+0x82D6 0x3078  #HIRAGANA LETTER HE
+0x82D7 0x3079  #HIRAGANA LETTER BE
+0x82D8 0x307A  #HIRAGANA LETTER PE
+0x82D9 0x307B  #HIRAGANA LETTER HO
+0x82DA 0x307C  #HIRAGANA LETTER BO
+0x82DB 0x307D  #HIRAGANA LETTER PO
+0x82DC 0x307E  #HIRAGANA LETTER MA
+0x82DD 0x307F  #HIRAGANA LETTER MI
+0x82DE 0x3080  #HIRAGANA LETTER MU
+0x82DF 0x3081  #HIRAGANA LETTER ME
+0x82E0 0x3082  #HIRAGANA LETTER MO
+0x82E1 0x3083  #HIRAGANA LETTER SMALL YA
+0x82E2 0x3084  #HIRAGANA LETTER YA
+0x82E3 0x3085  #HIRAGANA LETTER SMALL YU
+0x82E4 0x3086  #HIRAGANA LETTER YU
+0x82E5 0x3087  #HIRAGANA LETTER SMALL YO
+0x82E6 0x3088  #HIRAGANA LETTER YO
+0x82E7 0x3089  #HIRAGANA LETTER RA
+0x82E8 0x308A  #HIRAGANA LETTER RI
+0x82E9 0x308B  #HIRAGANA LETTER RU
+0x82EA 0x308C  #HIRAGANA LETTER RE
+0x82EB 0x308D  #HIRAGANA LETTER RO
+0x82EC 0x308E  #HIRAGANA LETTER SMALL WA
+0x82ED 0x308F  #HIRAGANA LETTER WA
+0x82EE 0x3090  #HIRAGANA LETTER WI
+0x82EF 0x3091  #HIRAGANA LETTER WE
+0x82F0 0x3092  #HIRAGANA LETTER WO
+0x82F1 0x3093  #HIRAGANA LETTER N
+0x8340 0x30A1  #KATAKANA LETTER SMALL A
+0x8341 0x30A2  #KATAKANA LETTER A
+0x8342 0x30A3  #KATAKANA LETTER SMALL I
+0x8343 0x30A4  #KATAKANA LETTER I
+0x8344 0x30A5  #KATAKANA LETTER SMALL U
+0x8345 0x30A6  #KATAKANA LETTER U
+0x8346 0x30A7  #KATAKANA LETTER SMALL E
+0x8347 0x30A8  #KATAKANA LETTER E
+0x8348 0x30A9  #KATAKANA LETTER SMALL O
+0x8349 0x30AA  #KATAKANA LETTER O
+0x834A 0x30AB  #KATAKANA LETTER KA
+0x834B 0x30AC  #KATAKANA LETTER GA
+0x834C 0x30AD  #KATAKANA LETTER KI
+0x834D 0x30AE  #KATAKANA LETTER GI
+0x834E 0x30AF  #KATAKANA LETTER KU
+0x834F 0x30B0  #KATAKANA LETTER GU
+0x8350 0x30B1  #KATAKANA LETTER KE
+0x8351 0x30B2  #KATAKANA LETTER GE
+0x8352 0x30B3  #KATAKANA LETTER KO
+0x8353 0x30B4  #KATAKANA LETTER GO
+0x8354 0x30B5  #KATAKANA LETTER SA
+0x8355 0x30B6  #KATAKANA LETTER ZA
+0x8356 0x30B7  #KATAKANA LETTER SI
+0x8357 0x30B8  #KATAKANA LETTER ZI
+0x8358 0x30B9  #KATAKANA LETTER SU
+0x8359 0x30BA  #KATAKANA LETTER ZU
+0x835A 0x30BB  #KATAKANA LETTER SE
+0x835B 0x30BC  #KATAKANA LETTER ZE
+0x835C 0x30BD  #KATAKANA LETTER SO
+0x835D 0x30BE  #KATAKANA LETTER ZO
+0x835E 0x30BF  #KATAKANA LETTER TA
+0x835F 0x30C0  #KATAKANA LETTER DA
+0x8360 0x30C1  #KATAKANA LETTER TI
+0x8361 0x30C2  #KATAKANA LETTER DI
+0x8362 0x30C3  #KATAKANA LETTER SMALL TU
+0x8363 0x30C4  #KATAKANA LETTER TU
+0x8364 0x30C5  #KATAKANA LETTER DU
+0x8365 0x30C6  #KATAKANA LETTER TE
+0x8366 0x30C7  #KATAKANA LETTER DE
+0x8367 0x30C8  #KATAKANA LETTER TO
+0x8368 0x30C9  #KATAKANA LETTER DO
+0x8369 0x30CA  #KATAKANA LETTER NA
+0x836A 0x30CB  #KATAKANA LETTER NI
+0x836B 0x30CC  #KATAKANA LETTER NU
+0x836C 0x30CD  #KATAKANA LETTER NE
+0x836D 0x30CE  #KATAKANA LETTER NO
+0x836E 0x30CF  #KATAKANA LETTER HA
+0x836F 0x30D0  #KATAKANA LETTER BA
+0x8370 0x30D1  #KATAKANA LETTER PA
+0x8371 0x30D2  #KATAKANA LETTER HI
+0x8372 0x30D3  #KATAKANA LETTER BI
+0x8373 0x30D4  #KATAKANA LETTER PI
+0x8374 0x30D5  #KATAKANA LETTER HU
+0x8375 0x30D6  #KATAKANA LETTER BU
+0x8376 0x30D7  #KATAKANA LETTER PU
+0x8377 0x30D8  #KATAKANA LETTER HE
+0x8378 0x30D9  #KATAKANA LETTER BE
+0x8379 0x30DA  #KATAKANA LETTER PE
+0x837A 0x30DB  #KATAKANA LETTER HO
+0x837B 0x30DC  #KATAKANA LETTER BO
+0x837C 0x30DD  #KATAKANA LETTER PO
+0x837D 0x30DE  #KATAKANA LETTER MA
+0x837E 0x30DF  #KATAKANA LETTER MI
+0x8380 0x30E0  #KATAKANA LETTER MU
+0x8381 0x30E1  #KATAKANA LETTER ME
+0x8382 0x30E2  #KATAKANA LETTER MO
+0x8383 0x30E3  #KATAKANA LETTER SMALL YA
+0x8384 0x30E4  #KATAKANA LETTER YA
+0x8385 0x30E5  #KATAKANA LETTER SMALL YU
+0x8386 0x30E6  #KATAKANA LETTER YU
+0x8387 0x30E7  #KATAKANA LETTER SMALL YO
+0x8388 0x30E8  #KATAKANA LETTER YO
+0x8389 0x30E9  #KATAKANA LETTER RA
+0x838A 0x30EA  #KATAKANA LETTER RI
+0x838B 0x30EB  #KATAKANA LETTER RU
+0x838C 0x30EC  #KATAKANA LETTER RE
+0x838D 0x30ED  #KATAKANA LETTER RO
+0x838E 0x30EE  #KATAKANA LETTER SMALL WA
+0x838F 0x30EF  #KATAKANA LETTER WA
+0x8390 0x30F0  #KATAKANA LETTER WI
+0x8391 0x30F1  #KATAKANA LETTER WE
+0x8392 0x30F2  #KATAKANA LETTER WO
+0x8393 0x30F3  #KATAKANA LETTER N
+0x8394 0x30F4  #KATAKANA LETTER VU
+0x8395 0x30F5  #KATAKANA LETTER SMALL KA
+0x8396 0x30F6  #KATAKANA LETTER SMALL KE
+0x839F 0x0391  #GREEK CAPITAL LETTER ALPHA
+0x83A0 0x0392  #GREEK CAPITAL LETTER BETA
+0x83A1 0x0393  #GREEK CAPITAL LETTER GAMMA
+0x83A2 0x0394  #GREEK CAPITAL LETTER DELTA
+0x83A3 0x0395  #GREEK CAPITAL LETTER EPSILON
+0x83A4 0x0396  #GREEK CAPITAL LETTER ZETA
+0x83A5 0x0397  #GREEK CAPITAL LETTER ETA
+0x83A6 0x0398  #GREEK CAPITAL LETTER THETA
+0x83A7 0x0399  #GREEK CAPITAL LETTER IOTA
+0x83A8 0x039A  #GREEK CAPITAL LETTER KAPPA
+0x83A9 0x039B  #GREEK CAPITAL LETTER LAMDA
+0x83AA 0x039C  #GREEK CAPITAL LETTER MU
+0x83AB 0x039D  #GREEK CAPITAL LETTER NU
+0x83AC 0x039E  #GREEK CAPITAL LETTER XI
+0x83AD 0x039F  #GREEK CAPITAL LETTER OMICRON
+0x83AE 0x03A0  #GREEK CAPITAL LETTER PI
+0x83AF 0x03A1  #GREEK CAPITAL LETTER RHO
+0x83B0 0x03A3  #GREEK CAPITAL LETTER SIGMA
+0x83B1 0x03A4  #GREEK CAPITAL LETTER TAU
+0x83B2 0x03A5  #GREEK CAPITAL LETTER UPSILON
+0x83B3 0x03A6  #GREEK CAPITAL LETTER PHI
+0x83B4 0x03A7  #GREEK CAPITAL LETTER CHI
+0x83B5 0x03A8  #GREEK CAPITAL LETTER PSI
+0x83B6 0x03A9  #GREEK CAPITAL LETTER OMEGA
+0x83BF 0x03B1  #GREEK SMALL LETTER ALPHA
+0x83C0 0x03B2  #GREEK SMALL LETTER BETA
+0x83C1 0x03B3  #GREEK SMALL LETTER GAMMA
+0x83C2 0x03B4  #GREEK SMALL LETTER DELTA
+0x83C3 0x03B5  #GREEK SMALL LETTER EPSILON
+0x83C4 0x03B6  #GREEK SMALL LETTER ZETA
+0x83C5 0x03B7  #GREEK SMALL LETTER ETA
+0x83C6 0x03B8  #GREEK SMALL LETTER THETA
+0x83C7 0x03B9  #GREEK SMALL LETTER IOTA
+0x83C8 0x03BA  #GREEK SMALL LETTER KAPPA
+0x83C9 0x03BB  #GREEK SMALL LETTER LAMDA
+0x83CA 0x03BC  #GREEK SMALL LETTER MU
+0x83CB 0x03BD  #GREEK SMALL LETTER NU
+0x83CC 0x03BE  #GREEK SMALL LETTER XI
+0x83CD 0x03BF  #GREEK SMALL LETTER OMICRON
+0x83CE 0x03C0  #GREEK SMALL LETTER PI
+0x83CF 0x03C1  #GREEK SMALL LETTER RHO
+0x83D0 0x03C3  #GREEK SMALL LETTER SIGMA
+0x83D1 0x03C4  #GREEK SMALL LETTER TAU
+0x83D2 0x03C5  #GREEK SMALL LETTER UPSILON
+0x83D3 0x03C6  #GREEK SMALL LETTER PHI
+0x83D4 0x03C7  #GREEK SMALL LETTER CHI
+0x83D5 0x03C8  #GREEK SMALL LETTER PSI
+0x83D6 0x03C9  #GREEK SMALL LETTER OMEGA
+0x8440 0x0410  #CYRILLIC CAPITAL LETTER A
+0x8441 0x0411  #CYRILLIC CAPITAL LETTER BE
+0x8442 0x0412  #CYRILLIC CAPITAL LETTER VE
+0x8443 0x0413  #CYRILLIC CAPITAL LETTER GHE
+0x8444 0x0414  #CYRILLIC CAPITAL LETTER DE
+0x8445 0x0415  #CYRILLIC CAPITAL LETTER IE
+0x8446 0x0401  #CYRILLIC CAPITAL LETTER IO
+0x8447 0x0416  #CYRILLIC CAPITAL LETTER ZHE
+0x8448 0x0417  #CYRILLIC CAPITAL LETTER ZE
+0x8449 0x0418  #CYRILLIC CAPITAL LETTER I
+0x844A 0x0419  #CYRILLIC CAPITAL LETTER SHORT I
+0x844B 0x041A  #CYRILLIC CAPITAL LETTER KA
+0x844C 0x041B  #CYRILLIC CAPITAL LETTER EL
+0x844D 0x041C  #CYRILLIC CAPITAL LETTER EM
+0x844E 0x041D  #CYRILLIC CAPITAL LETTER EN
+0x844F 0x041E  #CYRILLIC CAPITAL LETTER O
+0x8450 0x041F  #CYRILLIC CAPITAL LETTER PE
+0x8451 0x0420  #CYRILLIC CAPITAL LETTER ER
+0x8452 0x0421  #CYRILLIC CAPITAL LETTER ES
+0x8453 0x0422  #CYRILLIC CAPITAL LETTER TE
+0x8454 0x0423  #CYRILLIC CAPITAL LETTER U
+0x8455 0x0424  #CYRILLIC CAPITAL LETTER EF
+0x8456 0x0425  #CYRILLIC CAPITAL LETTER HA
+0x8457 0x0426  #CYRILLIC CAPITAL LETTER TSE
+0x8458 0x0427  #CYRILLIC CAPITAL LETTER CHE
+0x8459 0x0428  #CYRILLIC CAPITAL LETTER SHA
+0x845A 0x0429  #CYRILLIC CAPITAL LETTER SHCHA
+0x845B 0x042A  #CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C 0x042B  #CYRILLIC CAPITAL LETTER YERU
+0x845D 0x042C  #CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E 0x042D  #CYRILLIC CAPITAL LETTER E
+0x845F 0x042E  #CYRILLIC CAPITAL LETTER YU
+0x8460 0x042F  #CYRILLIC CAPITAL LETTER YA
+0x8470 0x0430  #CYRILLIC SMALL LETTER A
+0x8471 0x0431  #CYRILLIC SMALL LETTER BE
+0x8472 0x0432  #CYRILLIC SMALL LETTER VE
+0x8473 0x0433  #CYRILLIC SMALL LETTER GHE
+0x8474 0x0434  #CYRILLIC SMALL LETTER DE
+0x8475 0x0435  #CYRILLIC SMALL LETTER IE
+0x8476 0x0451  #CYRILLIC SMALL LETTER IO
+0x8477 0x0436  #CYRILLIC SMALL LETTER ZHE
+0x8478 0x0437  #CYRILLIC SMALL LETTER ZE
+0x8479 0x0438  #CYRILLIC SMALL LETTER I
+0x847A 0x0439  #CYRILLIC SMALL LETTER SHORT I
+0x847B 0x043A  #CYRILLIC SMALL LETTER KA
+0x847C 0x043B  #CYRILLIC SMALL LETTER EL
+0x847D 0x043C  #CYRILLIC SMALL LETTER EM
+0x847E 0x043D  #CYRILLIC SMALL LETTER EN
+0x8480 0x043E  #CYRILLIC SMALL LETTER O
+0x8481 0x043F  #CYRILLIC SMALL LETTER PE
+0x8482 0x0440  #CYRILLIC SMALL LETTER ER
+0x8483 0x0441  #CYRILLIC SMALL LETTER ES
+0x8484 0x0442  #CYRILLIC SMALL LETTER TE
+0x8485 0x0443  #CYRILLIC SMALL LETTER U
+0x8486 0x0444  #CYRILLIC SMALL LETTER EF
+0x8487 0x0445  #CYRILLIC SMALL LETTER HA
+0x8488 0x0446  #CYRILLIC SMALL LETTER TSE
+0x8489 0x0447  #CYRILLIC SMALL LETTER CHE
+0x848A 0x0448  #CYRILLIC SMALL LETTER SHA
+0x848B 0x0449  #CYRILLIC SMALL LETTER SHCHA
+0x848C 0x044A  #CYRILLIC SMALL LETTER HARD SIGN
+0x848D 0x044B  #CYRILLIC SMALL LETTER YERU
+0x848E 0x044C  #CYRILLIC SMALL LETTER SOFT SIGN
+0x848F 0x044D  #CYRILLIC SMALL LETTER E
+0x8490 0x044E  #CYRILLIC SMALL LETTER YU
+0x8491 0x044F  #CYRILLIC SMALL LETTER YA
+0x849F 0x2500  #BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0 0x2502  #BOX DRAWINGS LIGHT VERTICAL
+0x84A1 0x250C  #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2 0x2510  #BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3 0x2518  #BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4 0x2514  #BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5 0x251C  #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6 0x252C  #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7 0x2524  #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8 0x2534  #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9 0x253C  #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA 0x2501  #BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB 0x2503  #BOX DRAWINGS HEAVY VERTICAL
+0x84AC 0x250F  #BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD 0x2513  #BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE 0x251B  #BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF 0x2517  #BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0 0x2523  #BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1 0x2533  #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2 0x252B  #BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3 0x253B  #BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4 0x254B  #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5 0x2520  #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6 0x252F  #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7 0x2528  #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8 0x2537  #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9 0x253F  #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA 0x251D  #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB 0x2530  #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC 0x2525  #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD 0x2538  #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE 0x2542  #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x8740 0x2460  #CIRCLED DIGIT ONE
+0x8741 0x2461  #CIRCLED DIGIT TWO
+0x8742 0x2462  #CIRCLED DIGIT THREE
+0x8743 0x2463  #CIRCLED DIGIT FOUR
+0x8744 0x2464  #CIRCLED DIGIT FIVE
+0x8745 0x2465  #CIRCLED DIGIT SIX
+0x8746 0x2466  #CIRCLED DIGIT SEVEN
+0x8747 0x2467  #CIRCLED DIGIT EIGHT
+0x8748 0x2468  #CIRCLED DIGIT NINE
+0x8749 0x2469  #CIRCLED NUMBER TEN
+0x874A 0x246A  #CIRCLED NUMBER ELEVEN
+0x874B 0x246B  #CIRCLED NUMBER TWELVE
+0x874C 0x246C  #CIRCLED NUMBER THIRTEEN
+0x874D 0x246D  #CIRCLED NUMBER FOURTEEN
+0x874E 0x246E  #CIRCLED NUMBER FIFTEEN
+0x874F 0x246F  #CIRCLED NUMBER SIXTEEN
+0x8750 0x2470  #CIRCLED NUMBER SEVENTEEN
+0x8751 0x2471  #CIRCLED NUMBER EIGHTEEN
+0x8752 0x2472  #CIRCLED NUMBER NINETEEN
+0x8753 0x2473  #CIRCLED NUMBER TWENTY
+0x8754 0x2160  #ROMAN NUMERAL ONE
+0x8755 0x2161  #ROMAN NUMERAL TWO
+0x8756 0x2162  #ROMAN NUMERAL THREE
+0x8757 0x2163  #ROMAN NUMERAL FOUR
+0x8758 0x2164  #ROMAN NUMERAL FIVE
+0x8759 0x2165  #ROMAN NUMERAL SIX
+0x875A 0x2166  #ROMAN NUMERAL SEVEN
+0x875B 0x2167  #ROMAN NUMERAL EIGHT
+0x875C 0x2168  #ROMAN NUMERAL NINE
+0x875D 0x2169  #ROMAN NUMERAL TEN
+0x875F 0x3349  #SQUARE MIRI
+0x8760 0x3314  #SQUARE KIRO
+0x8761 0x3322  #SQUARE SENTI
+0x8762 0x334D  #SQUARE MEETORU
+0x8763 0x3318  #SQUARE GURAMU
+0x8764 0x3327  #SQUARE TON
+0x8765 0x3303  #SQUARE AARU
+0x8766 0x3336  #SQUARE HEKUTAARU
+0x8767 0x3351  #SQUARE RITTORU
+0x8768 0x3357  #SQUARE WATTO
+0x8769 0x330D  #SQUARE KARORII
+0x876A 0x3326  #SQUARE DORU
+0x876B 0x3323  #SQUARE SENTO
+0x876C 0x332B  #SQUARE PAASENTO
+0x876D 0x334A  #SQUARE MIRIBAARU
+0x876E 0x333B  #SQUARE PEEZI
+0x876F 0x339C  #SQUARE MM
+0x8770 0x339D  #SQUARE CM
+0x8771 0x339E  #SQUARE KM
+0x8772 0x338E  #SQUARE MG
+0x8773 0x338F  #SQUARE KG
+0x8774 0x33C4  #SQUARE CC
+0x8775 0x33A1  #SQUARE M SQUARED
+0x877E 0x337B  #SQUARE ERA NAME HEISEI
+0x8780 0x301D  #REVERSED DOUBLE PRIME QUOTATION MARK
+0x8781 0x301F  #LOW DOUBLE PRIME QUOTATION MARK
+0x8782 0x2116  #NUMERO SIGN
+0x8783 0x33CD  #SQUARE KK
+0x8784 0x2121  #TELEPHONE SIGN
+0x8785 0x32A4  #CIRCLED IDEOGRAPH HIGH
+0x8786 0x32A5  #CIRCLED IDEOGRAPH CENTRE
+0x8787 0x32A6  #CIRCLED IDEOGRAPH LOW
+0x8788 0x32A7  #CIRCLED IDEOGRAPH LEFT
+0x8789 0x32A8  #CIRCLED IDEOGRAPH RIGHT
+0x878A 0x3231  #PARENTHESIZED IDEOGRAPH STOCK
+0x878B 0x3232  #PARENTHESIZED IDEOGRAPH HAVE
+0x878C 0x3239  #PARENTHESIZED IDEOGRAPH REPRESENT
+0x878D 0x337E  #SQUARE ERA NAME MEIZI
+0x878E 0x337D  #SQUARE ERA NAME TAISYOU
+0x878F 0x337C  #SQUARE ERA NAME SYOUWA
+0x8790 0x2252  #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x8791 0x2261  #IDENTICAL TO
+0x8792 0x222B  #INTEGRAL
+0x8793 0x222E  #CONTOUR INTEGRAL
+0x8794 0x2211  #N-ARY SUMMATION
+0x8795 0x221A  #SQUARE ROOT
+0x8796 0x22A5  #UP TACK
+0x8797 0x2220  #ANGLE
+0x8798 0x221F  #RIGHT ANGLE
+0x8799 0x22BF  #RIGHT TRIANGLE
+0x879A 0x2235  #BECAUSE
+0x879B 0x2229  #INTERSECTION
+0x879C 0x222A  #UNION
+0x889F 0x4E9C  #CJK UNIFIED IDEOGRAPH
+0x88A0 0x5516  #CJK UNIFIED IDEOGRAPH
+0x88A1 0x5A03  #CJK UNIFIED IDEOGRAPH
+0x88A2 0x963F  #CJK UNIFIED IDEOGRAPH
+0x88A3 0x54C0  #CJK UNIFIED IDEOGRAPH
+0x88A4 0x611B  #CJK UNIFIED IDEOGRAPH
+0x88A5 0x6328  #CJK UNIFIED IDEOGRAPH
+0x88A6 0x59F6  #CJK UNIFIED IDEOGRAPH
+0x88A7 0x9022  #CJK UNIFIED IDEOGRAPH
+0x88A8 0x8475  #CJK UNIFIED IDEOGRAPH
+0x88A9 0x831C  #CJK UNIFIED IDEOGRAPH
+0x88AA 0x7A50  #CJK UNIFIED IDEOGRAPH
+0x88AB 0x60AA  #CJK UNIFIED IDEOGRAPH
+0x88AC 0x63E1  #CJK UNIFIED IDEOGRAPH
+0x88AD 0x6E25  #CJK UNIFIED IDEOGRAPH
+0x88AE 0x65ED  #CJK UNIFIED IDEOGRAPH
+0x88AF 0x8466  #CJK UNIFIED IDEOGRAPH
+0x88B0 0x82A6  #CJK UNIFIED IDEOGRAPH
+0x88B1 0x9BF5  #CJK UNIFIED IDEOGRAPH
+0x88B2 0x6893  #CJK UNIFIED IDEOGRAPH
+0x88B3 0x5727  #CJK UNIFIED IDEOGRAPH
+0x88B4 0x65A1  #CJK UNIFIED IDEOGRAPH
+0x88B5 0x6271  #CJK UNIFIED IDEOGRAPH
+0x88B6 0x5B9B  #CJK UNIFIED IDEOGRAPH
+0x88B7 0x59D0  #CJK UNIFIED IDEOGRAPH
+0x88B8 0x867B  #CJK UNIFIED IDEOGRAPH
+0x88B9 0x98F4  #CJK UNIFIED IDEOGRAPH
+0x88BA 0x7D62  #CJK UNIFIED IDEOGRAPH
+0x88BB 0x7DBE  #CJK UNIFIED IDEOGRAPH
+0x88BC 0x9B8E  #CJK UNIFIED IDEOGRAPH
+0x88BD 0x6216  #CJK UNIFIED IDEOGRAPH
+0x88BE 0x7C9F  #CJK UNIFIED IDEOGRAPH
+0x88BF 0x88B7  #CJK UNIFIED IDEOGRAPH
+0x88C0 0x5B89  #CJK UNIFIED IDEOGRAPH
+0x88C1 0x5EB5  #CJK UNIFIED IDEOGRAPH
+0x88C2 0x6309  #CJK UNIFIED IDEOGRAPH
+0x88C3 0x6697  #CJK UNIFIED IDEOGRAPH
+0x88C4 0x6848  #CJK UNIFIED IDEOGRAPH
+0x88C5 0x95C7  #CJK UNIFIED IDEOGRAPH
+0x88C6 0x978D  #CJK UNIFIED IDEOGRAPH
+0x88C7 0x674F  #CJK UNIFIED IDEOGRAPH
+0x88C8 0x4EE5  #CJK UNIFIED IDEOGRAPH
+0x88C9 0x4F0A  #CJK UNIFIED IDEOGRAPH
+0x88CA 0x4F4D  #CJK UNIFIED IDEOGRAPH
+0x88CB 0x4F9D  #CJK UNIFIED IDEOGRAPH
+0x88CC 0x5049  #CJK UNIFIED IDEOGRAPH
+0x88CD 0x56F2  #CJK UNIFIED IDEOGRAPH
+0x88CE 0x5937  #CJK UNIFIED IDEOGRAPH
+0x88CF 0x59D4  #CJK UNIFIED IDEOGRAPH
+0x88D0 0x5A01  #CJK UNIFIED IDEOGRAPH
+0x88D1 0x5C09  #CJK UNIFIED IDEOGRAPH
+0x88D2 0x60DF  #CJK UNIFIED IDEOGRAPH
+0x88D3 0x610F  #CJK UNIFIED IDEOGRAPH
+0x88D4 0x6170  #CJK UNIFIED IDEOGRAPH
+0x88D5 0x6613  #CJK UNIFIED IDEOGRAPH
+0x88D6 0x6905  #CJK UNIFIED IDEOGRAPH
+0x88D7 0x70BA  #CJK UNIFIED IDEOGRAPH
+0x88D8 0x754F  #CJK UNIFIED IDEOGRAPH
+0x88D9 0x7570  #CJK UNIFIED IDEOGRAPH
+0x88DA 0x79FB  #CJK UNIFIED IDEOGRAPH
+0x88DB 0x7DAD  #CJK UNIFIED IDEOGRAPH
+0x88DC 0x7DEF  #CJK UNIFIED IDEOGRAPH
+0x88DD 0x80C3  #CJK UNIFIED IDEOGRAPH
+0x88DE 0x840E  #CJK UNIFIED IDEOGRAPH
+0x88DF 0x8863  #CJK UNIFIED IDEOGRAPH
+0x88E0 0x8B02  #CJK UNIFIED IDEOGRAPH
+0x88E1 0x9055  #CJK UNIFIED IDEOGRAPH
+0x88E2 0x907A  #CJK UNIFIED IDEOGRAPH
+0x88E3 0x533B  #CJK UNIFIED IDEOGRAPH
+0x88E4 0x4E95  #CJK UNIFIED IDEOGRAPH
+0x88E5 0x4EA5  #CJK UNIFIED IDEOGRAPH
+0x88E6 0x57DF  #CJK UNIFIED IDEOGRAPH
+0x88E7 0x80B2  #CJK UNIFIED IDEOGRAPH
+0x88E8 0x90C1  #CJK UNIFIED IDEOGRAPH
+0x88E9 0x78EF  #CJK UNIFIED IDEOGRAPH
+0x88EA 0x4E00  #CJK UNIFIED IDEOGRAPH
+0x88EB 0x58F1  #CJK UNIFIED IDEOGRAPH
+0x88EC 0x6EA2  #CJK UNIFIED IDEOGRAPH
+0x88ED 0x9038  #CJK UNIFIED IDEOGRAPH
+0x88EE 0x7A32  #CJK UNIFIED IDEOGRAPH
+0x88EF 0x8328  #CJK UNIFIED IDEOGRAPH
+0x88F0 0x828B  #CJK UNIFIED IDEOGRAPH
+0x88F1 0x9C2F  #CJK UNIFIED IDEOGRAPH
+0x88F2 0x5141  #CJK UNIFIED IDEOGRAPH
+0x88F3 0x5370  #CJK UNIFIED IDEOGRAPH
+0x88F4 0x54BD  #CJK UNIFIED IDEOGRAPH
+0x88F5 0x54E1  #CJK UNIFIED IDEOGRAPH
+0x88F6 0x56E0  #CJK UNIFIED IDEOGRAPH
+0x88F7 0x59FB  #CJK UNIFIED IDEOGRAPH
+0x88F8 0x5F15  #CJK UNIFIED IDEOGRAPH
+0x88F9 0x98F2  #CJK UNIFIED IDEOGRAPH
+0x88FA 0x6DEB  #CJK UNIFIED IDEOGRAPH
+0x88FB 0x80E4  #CJK UNIFIED IDEOGRAPH
+0x88FC 0x852D  #CJK UNIFIED IDEOGRAPH
+0x8940 0x9662  #CJK UNIFIED IDEOGRAPH
+0x8941 0x9670  #CJK UNIFIED IDEOGRAPH
+0x8942 0x96A0  #CJK UNIFIED IDEOGRAPH
+0x8943 0x97FB  #CJK UNIFIED IDEOGRAPH
+0x8944 0x540B  #CJK UNIFIED IDEOGRAPH
+0x8945 0x53F3  #CJK UNIFIED IDEOGRAPH
+0x8946 0x5B87  #CJK UNIFIED IDEOGRAPH
+0x8947 0x70CF  #CJK UNIFIED IDEOGRAPH
+0x8948 0x7FBD  #CJK UNIFIED IDEOGRAPH
+0x8949 0x8FC2  #CJK UNIFIED IDEOGRAPH
+0x894A 0x96E8  #CJK UNIFIED IDEOGRAPH
+0x894B 0x536F  #CJK UNIFIED IDEOGRAPH
+0x894C 0x9D5C  #CJK UNIFIED IDEOGRAPH
+0x894D 0x7ABA  #CJK UNIFIED IDEOGRAPH
+0x894E 0x4E11  #CJK UNIFIED IDEOGRAPH
+0x894F 0x7893  #CJK UNIFIED IDEOGRAPH
+0x8950 0x81FC  #CJK UNIFIED IDEOGRAPH
+0x8951 0x6E26  #CJK UNIFIED IDEOGRAPH
+0x8952 0x5618  #CJK UNIFIED IDEOGRAPH
+0x8953 0x5504  #CJK UNIFIED IDEOGRAPH
+0x8954 0x6B1D  #CJK UNIFIED IDEOGRAPH
+0x8955 0x851A  #CJK UNIFIED IDEOGRAPH
+0x8956 0x9C3B  #CJK UNIFIED IDEOGRAPH
+0x8957 0x59E5  #CJK UNIFIED IDEOGRAPH
+0x8958 0x53A9  #CJK UNIFIED IDEOGRAPH
+0x8959 0x6D66  #CJK UNIFIED IDEOGRAPH
+0x895A 0x74DC  #CJK UNIFIED IDEOGRAPH
+0x895B 0x958F  #CJK UNIFIED IDEOGRAPH
+0x895C 0x5642  #CJK UNIFIED IDEOGRAPH
+0x895D 0x4E91  #CJK UNIFIED IDEOGRAPH
+0x895E 0x904B  #CJK UNIFIED IDEOGRAPH
+0x895F 0x96F2  #CJK UNIFIED IDEOGRAPH
+0x8960 0x834F  #CJK UNIFIED IDEOGRAPH
+0x8961 0x990C  #CJK UNIFIED IDEOGRAPH
+0x8962 0x53E1  #CJK UNIFIED IDEOGRAPH
+0x8963 0x55B6  #CJK UNIFIED IDEOGRAPH
+0x8964 0x5B30  #CJK UNIFIED IDEOGRAPH
+0x8965 0x5F71  #CJK UNIFIED IDEOGRAPH
+0x8966 0x6620  #CJK UNIFIED IDEOGRAPH
+0x8967 0x66F3  #CJK UNIFIED IDEOGRAPH
+0x8968 0x6804  #CJK UNIFIED IDEOGRAPH
+0x8969 0x6C38  #CJK UNIFIED IDEOGRAPH
+0x896A 0x6CF3  #CJK UNIFIED IDEOGRAPH
+0x896B 0x6D29  #CJK UNIFIED IDEOGRAPH
+0x896C 0x745B  #CJK UNIFIED IDEOGRAPH
+0x896D 0x76C8  #CJK UNIFIED IDEOGRAPH
+0x896E 0x7A4E  #CJK UNIFIED IDEOGRAPH
+0x896F 0x9834  #CJK UNIFIED IDEOGRAPH
+0x8970 0x82F1  #CJK UNIFIED IDEOGRAPH
+0x8971 0x885B  #CJK UNIFIED IDEOGRAPH
+0x8972 0x8A60  #CJK UNIFIED IDEOGRAPH
+0x8973 0x92ED  #CJK UNIFIED IDEOGRAPH
+0x8974 0x6DB2  #CJK UNIFIED IDEOGRAPH
+0x8975 0x75AB  #CJK UNIFIED IDEOGRAPH
+0x8976 0x76CA  #CJK UNIFIED IDEOGRAPH
+0x8977 0x99C5  #CJK UNIFIED IDEOGRAPH
+0x8978 0x60A6  #CJK UNIFIED IDEOGRAPH
+0x8979 0x8B01  #CJK UNIFIED IDEOGRAPH
+0x897A 0x8D8A  #CJK UNIFIED IDEOGRAPH
+0x897B 0x95B2  #CJK UNIFIED IDEOGRAPH
+0x897C 0x698E  #CJK UNIFIED IDEOGRAPH
+0x897D 0x53AD  #CJK UNIFIED IDEOGRAPH
+0x897E 0x5186  #CJK UNIFIED IDEOGRAPH
+0x8980 0x5712  #CJK UNIFIED IDEOGRAPH
+0x8981 0x5830  #CJK UNIFIED IDEOGRAPH
+0x8982 0x5944  #CJK UNIFIED IDEOGRAPH
+0x8983 0x5BB4  #CJK UNIFIED IDEOGRAPH
+0x8984 0x5EF6  #CJK UNIFIED IDEOGRAPH
+0x8985 0x6028  #CJK UNIFIED IDEOGRAPH
+0x8986 0x63A9  #CJK UNIFIED IDEOGRAPH
+0x8987 0x63F4  #CJK UNIFIED IDEOGRAPH
+0x8988 0x6CBF  #CJK UNIFIED IDEOGRAPH
+0x8989 0x6F14  #CJK UNIFIED IDEOGRAPH
+0x898A 0x708E  #CJK UNIFIED IDEOGRAPH
+0x898B 0x7114  #CJK UNIFIED IDEOGRAPH
+0x898C 0x7159  #CJK UNIFIED IDEOGRAPH
+0x898D 0x71D5  #CJK UNIFIED IDEOGRAPH
+0x898E 0x733F  #CJK UNIFIED IDEOGRAPH
+0x898F 0x7E01  #CJK UNIFIED IDEOGRAPH
+0x8990 0x8276  #CJK UNIFIED IDEOGRAPH
+0x8991 0x82D1  #CJK UNIFIED IDEOGRAPH
+0x8992 0x8597  #CJK UNIFIED IDEOGRAPH
+0x8993 0x9060  #CJK UNIFIED IDEOGRAPH
+0x8994 0x925B  #CJK UNIFIED IDEOGRAPH
+0x8995 0x9D1B  #CJK UNIFIED IDEOGRAPH
+0x8996 0x5869  #CJK UNIFIED IDEOGRAPH
+0x8997 0x65BC  #CJK UNIFIED IDEOGRAPH
+0x8998 0x6C5A  #CJK UNIFIED IDEOGRAPH
+0x8999 0x7525  #CJK UNIFIED IDEOGRAPH
+0x899A 0x51F9  #CJK UNIFIED IDEOGRAPH
+0x899B 0x592E  #CJK UNIFIED IDEOGRAPH
+0x899C 0x5965  #CJK UNIFIED IDEOGRAPH
+0x899D 0x5F80  #CJK UNIFIED IDEOGRAPH
+0x899E 0x5FDC  #CJK UNIFIED IDEOGRAPH
+0x899F 0x62BC  #CJK UNIFIED IDEOGRAPH
+0x89A0 0x65FA  #CJK UNIFIED IDEOGRAPH
+0x89A1 0x6A2A  #CJK UNIFIED IDEOGRAPH
+0x89A2 0x6B27  #CJK UNIFIED IDEOGRAPH
+0x89A3 0x6BB4  #CJK UNIFIED IDEOGRAPH
+0x89A4 0x738B  #CJK UNIFIED IDEOGRAPH
+0x89A5 0x7FC1  #CJK UNIFIED IDEOGRAPH
+0x89A6 0x8956  #CJK UNIFIED IDEOGRAPH
+0x89A7 0x9D2C  #CJK UNIFIED IDEOGRAPH
+0x89A8 0x9D0E  #CJK UNIFIED IDEOGRAPH
+0x89A9 0x9EC4  #CJK UNIFIED IDEOGRAPH
+0x89AA 0x5CA1  #CJK UNIFIED IDEOGRAPH
+0x89AB 0x6C96  #CJK UNIFIED IDEOGRAPH
+0x89AC 0x837B  #CJK UNIFIED IDEOGRAPH
+0x89AD 0x5104  #CJK UNIFIED IDEOGRAPH
+0x89AE 0x5C4B  #CJK UNIFIED IDEOGRAPH
+0x89AF 0x61B6  #CJK UNIFIED IDEOGRAPH
+0x89B0 0x81C6  #CJK UNIFIED IDEOGRAPH
+0x89B1 0x6876  #CJK UNIFIED IDEOGRAPH
+0x89B2 0x7261  #CJK UNIFIED IDEOGRAPH
+0x89B3 0x4E59  #CJK UNIFIED IDEOGRAPH
+0x89B4 0x4FFA  #CJK UNIFIED IDEOGRAPH
+0x89B5 0x5378  #CJK UNIFIED IDEOGRAPH
+0x89B6 0x6069  #CJK UNIFIED IDEOGRAPH
+0x89B7 0x6E29  #CJK UNIFIED IDEOGRAPH
+0x89B8 0x7A4F  #CJK UNIFIED IDEOGRAPH
+0x89B9 0x97F3  #CJK UNIFIED IDEOGRAPH
+0x89BA 0x4E0B  #CJK UNIFIED IDEOGRAPH
+0x89BB 0x5316  #CJK UNIFIED IDEOGRAPH
+0x89BC 0x4EEE  #CJK UNIFIED IDEOGRAPH
+0x89BD 0x4F55  #CJK UNIFIED IDEOGRAPH
+0x89BE 0x4F3D  #CJK UNIFIED IDEOGRAPH
+0x89BF 0x4FA1  #CJK UNIFIED IDEOGRAPH
+0x89C0 0x4F73  #CJK UNIFIED IDEOGRAPH
+0x89C1 0x52A0  #CJK UNIFIED IDEOGRAPH
+0x89C2 0x53EF  #CJK UNIFIED IDEOGRAPH
+0x89C3 0x5609  #CJK UNIFIED IDEOGRAPH
+0x89C4 0x590F  #CJK UNIFIED IDEOGRAPH
+0x89C5 0x5AC1  #CJK UNIFIED IDEOGRAPH
+0x89C6 0x5BB6  #CJK UNIFIED IDEOGRAPH
+0x89C7 0x5BE1  #CJK UNIFIED IDEOGRAPH
+0x89C8 0x79D1  #CJK UNIFIED IDEOGRAPH
+0x89C9 0x6687  #CJK UNIFIED IDEOGRAPH
+0x89CA 0x679C  #CJK UNIFIED IDEOGRAPH
+0x89CB 0x67B6  #CJK UNIFIED IDEOGRAPH
+0x89CC 0x6B4C  #CJK UNIFIED IDEOGRAPH
+0x89CD 0x6CB3  #CJK UNIFIED IDEOGRAPH
+0x89CE 0x706B  #CJK UNIFIED IDEOGRAPH
+0x89CF 0x73C2  #CJK UNIFIED IDEOGRAPH
+0x89D0 0x798D  #CJK UNIFIED IDEOGRAPH
+0x89D1 0x79BE  #CJK UNIFIED IDEOGRAPH
+0x89D2 0x7A3C  #CJK UNIFIED IDEOGRAPH
+0x89D3 0x7B87  #CJK UNIFIED IDEOGRAPH
+0x89D4 0x82B1  #CJK UNIFIED IDEOGRAPH
+0x89D5 0x82DB  #CJK UNIFIED IDEOGRAPH
+0x89D6 0x8304  #CJK UNIFIED IDEOGRAPH
+0x89D7 0x8377  #CJK UNIFIED IDEOGRAPH
+0x89D8 0x83EF  #CJK UNIFIED IDEOGRAPH
+0x89D9 0x83D3  #CJK UNIFIED IDEOGRAPH
+0x89DA 0x8766  #CJK UNIFIED IDEOGRAPH
+0x89DB 0x8AB2  #CJK UNIFIED IDEOGRAPH
+0x89DC 0x5629  #CJK UNIFIED IDEOGRAPH
+0x89DD 0x8CA8  #CJK UNIFIED IDEOGRAPH
+0x89DE 0x8FE6  #CJK UNIFIED IDEOGRAPH
+0x89DF 0x904E  #CJK UNIFIED IDEOGRAPH
+0x89E0 0x971E  #CJK UNIFIED IDEOGRAPH
+0x89E1 0x868A  #CJK UNIFIED IDEOGRAPH
+0x89E2 0x4FC4  #CJK UNIFIED IDEOGRAPH
+0x89E3 0x5CE8  #CJK UNIFIED IDEOGRAPH
+0x89E4 0x6211  #CJK UNIFIED IDEOGRAPH
+0x89E5 0x7259  #CJK UNIFIED IDEOGRAPH
+0x89E6 0x753B  #CJK UNIFIED IDEOGRAPH
+0x89E7 0x81E5  #CJK UNIFIED IDEOGRAPH
+0x89E8 0x82BD  #CJK UNIFIED IDEOGRAPH
+0x89E9 0x86FE  #CJK UNIFIED IDEOGRAPH
+0x89EA 0x8CC0  #CJK UNIFIED IDEOGRAPH
+0x89EB 0x96C5  #CJK UNIFIED IDEOGRAPH
+0x89EC 0x9913  #CJK UNIFIED IDEOGRAPH
+0x89ED 0x99D5  #CJK UNIFIED IDEOGRAPH
+0x89EE 0x4ECB  #CJK UNIFIED IDEOGRAPH
+0x89EF 0x4F1A  #CJK UNIFIED IDEOGRAPH
+0x89F0 0x89E3  #CJK UNIFIED IDEOGRAPH
+0x89F1 0x56DE  #CJK UNIFIED IDEOGRAPH
+0x89F2 0x584A  #CJK UNIFIED IDEOGRAPH
+0x89F3 0x58CA  #CJK UNIFIED IDEOGRAPH
+0x89F4 0x5EFB  #CJK UNIFIED IDEOGRAPH
+0x89F5 0x5FEB  #CJK UNIFIED IDEOGRAPH
+0x89F6 0x602A  #CJK UNIFIED IDEOGRAPH
+0x89F7 0x6094  #CJK UNIFIED IDEOGRAPH
+0x89F8 0x6062  #CJK UNIFIED IDEOGRAPH
+0x89F9 0x61D0  #CJK UNIFIED IDEOGRAPH
+0x89FA 0x6212  #CJK UNIFIED IDEOGRAPH
+0x89FB 0x62D0  #CJK UNIFIED IDEOGRAPH
+0x89FC 0x6539  #CJK UNIFIED IDEOGRAPH
+0x8A40 0x9B41  #CJK UNIFIED IDEOGRAPH
+0x8A41 0x6666  #CJK UNIFIED IDEOGRAPH
+0x8A42 0x68B0  #CJK UNIFIED IDEOGRAPH
+0x8A43 0x6D77  #CJK UNIFIED IDEOGRAPH
+0x8A44 0x7070  #CJK UNIFIED IDEOGRAPH
+0x8A45 0x754C  #CJK UNIFIED IDEOGRAPH
+0x8A46 0x7686  #CJK UNIFIED IDEOGRAPH
+0x8A47 0x7D75  #CJK UNIFIED IDEOGRAPH
+0x8A48 0x82A5  #CJK UNIFIED IDEOGRAPH
+0x8A49 0x87F9  #CJK UNIFIED IDEOGRAPH
+0x8A4A 0x958B  #CJK UNIFIED IDEOGRAPH
+0x8A4B 0x968E  #CJK UNIFIED IDEOGRAPH
+0x8A4C 0x8C9D  #CJK UNIFIED IDEOGRAPH
+0x8A4D 0x51F1  #CJK UNIFIED IDEOGRAPH
+0x8A4E 0x52BE  #CJK UNIFIED IDEOGRAPH
+0x8A4F 0x5916  #CJK UNIFIED IDEOGRAPH
+0x8A50 0x54B3  #CJK UNIFIED IDEOGRAPH
+0x8A51 0x5BB3  #CJK UNIFIED IDEOGRAPH
+0x8A52 0x5D16  #CJK UNIFIED IDEOGRAPH
+0x8A53 0x6168  #CJK UNIFIED IDEOGRAPH
+0x8A54 0x6982  #CJK UNIFIED IDEOGRAPH
+0x8A55 0x6DAF  #CJK UNIFIED IDEOGRAPH
+0x8A56 0x788D  #CJK UNIFIED IDEOGRAPH
+0x8A57 0x84CB  #CJK UNIFIED IDEOGRAPH
+0x8A58 0x8857  #CJK UNIFIED IDEOGRAPH
+0x8A59 0x8A72  #CJK UNIFIED IDEOGRAPH
+0x8A5A 0x93A7  #CJK UNIFIED IDEOGRAPH
+0x8A5B 0x9AB8  #CJK UNIFIED IDEOGRAPH
+0x8A5C 0x6D6C  #CJK UNIFIED IDEOGRAPH
+0x8A5D 0x99A8  #CJK UNIFIED IDEOGRAPH
+0x8A5E 0x86D9  #CJK UNIFIED IDEOGRAPH
+0x8A5F 0x57A3  #CJK UNIFIED IDEOGRAPH
+0x8A60 0x67FF  #CJK UNIFIED IDEOGRAPH
+0x8A61 0x86CE  #CJK UNIFIED IDEOGRAPH
+0x8A62 0x920E  #CJK UNIFIED IDEOGRAPH
+0x8A63 0x5283  #CJK UNIFIED IDEOGRAPH
+0x8A64 0x5687  #CJK UNIFIED IDEOGRAPH
+0x8A65 0x5404  #CJK UNIFIED IDEOGRAPH
+0x8A66 0x5ED3  #CJK UNIFIED IDEOGRAPH
+0x8A67 0x62E1  #CJK UNIFIED IDEOGRAPH
+0x8A68 0x64B9  #CJK UNIFIED IDEOGRAPH
+0x8A69 0x683C  #CJK UNIFIED IDEOGRAPH
+0x8A6A 0x6838  #CJK UNIFIED IDEOGRAPH
+0x8A6B 0x6BBB  #CJK UNIFIED IDEOGRAPH
+0x8A6C 0x7372  #CJK UNIFIED IDEOGRAPH
+0x8A6D 0x78BA  #CJK UNIFIED IDEOGRAPH
+0x8A6E 0x7A6B  #CJK UNIFIED IDEOGRAPH
+0x8A6F 0x899A  #CJK UNIFIED IDEOGRAPH
+0x8A70 0x89D2  #CJK UNIFIED IDEOGRAPH
+0x8A71 0x8D6B  #CJK UNIFIED IDEOGRAPH
+0x8A72 0x8F03  #CJK UNIFIED IDEOGRAPH
+0x8A73 0x90ED  #CJK UNIFIED IDEOGRAPH
+0x8A74 0x95A3  #CJK UNIFIED IDEOGRAPH
+0x8A75 0x9694  #CJK UNIFIED IDEOGRAPH
+0x8A76 0x9769  #CJK UNIFIED IDEOGRAPH
+0x8A77 0x5B66  #CJK UNIFIED IDEOGRAPH
+0x8A78 0x5CB3  #CJK UNIFIED IDEOGRAPH
+0x8A79 0x697D  #CJK UNIFIED IDEOGRAPH
+0x8A7A 0x984D  #CJK UNIFIED IDEOGRAPH
+0x8A7B 0x984E  #CJK UNIFIED IDEOGRAPH
+0x8A7C 0x639B  #CJK UNIFIED IDEOGRAPH
+0x8A7D 0x7B20  #CJK UNIFIED IDEOGRAPH
+0x8A7E 0x6A2B  #CJK UNIFIED IDEOGRAPH
+0x8A80 0x6A7F  #CJK UNIFIED IDEOGRAPH
+0x8A81 0x68B6  #CJK UNIFIED IDEOGRAPH
+0x8A82 0x9C0D  #CJK UNIFIED IDEOGRAPH
+0x8A83 0x6F5F  #CJK UNIFIED IDEOGRAPH
+0x8A84 0x5272  #CJK UNIFIED IDEOGRAPH
+0x8A85 0x559D  #CJK UNIFIED IDEOGRAPH
+0x8A86 0x6070  #CJK UNIFIED IDEOGRAPH
+0x8A87 0x62EC  #CJK UNIFIED IDEOGRAPH
+0x8A88 0x6D3B  #CJK UNIFIED IDEOGRAPH
+0x8A89 0x6E07  #CJK UNIFIED IDEOGRAPH
+0x8A8A 0x6ED1  #CJK UNIFIED IDEOGRAPH
+0x8A8B 0x845B  #CJK UNIFIED IDEOGRAPH
+0x8A8C 0x8910  #CJK UNIFIED IDEOGRAPH
+0x8A8D 0x8F44  #CJK UNIFIED IDEOGRAPH
+0x8A8E 0x4E14  #CJK UNIFIED IDEOGRAPH
+0x8A8F 0x9C39  #CJK UNIFIED IDEOGRAPH
+0x8A90 0x53F6  #CJK UNIFIED IDEOGRAPH
+0x8A91 0x691B  #CJK UNIFIED IDEOGRAPH
+0x8A92 0x6A3A  #CJK UNIFIED IDEOGRAPH
+0x8A93 0x9784  #CJK UNIFIED IDEOGRAPH
+0x8A94 0x682A  #CJK UNIFIED IDEOGRAPH
+0x8A95 0x515C  #CJK UNIFIED IDEOGRAPH
+0x8A96 0x7AC3  #CJK UNIFIED IDEOGRAPH
+0x8A97 0x84B2  #CJK UNIFIED IDEOGRAPH
+0x8A98 0x91DC  #CJK UNIFIED IDEOGRAPH
+0x8A99 0x938C  #CJK UNIFIED IDEOGRAPH
+0x8A9A 0x565B  #CJK UNIFIED IDEOGRAPH
+0x8A9B 0x9D28  #CJK UNIFIED IDEOGRAPH
+0x8A9C 0x6822  #CJK UNIFIED IDEOGRAPH
+0x8A9D 0x8305  #CJK UNIFIED IDEOGRAPH
+0x8A9E 0x8431  #CJK UNIFIED IDEOGRAPH
+0x8A9F 0x7CA5  #CJK UNIFIED IDEOGRAPH
+0x8AA0 0x5208  #CJK UNIFIED IDEOGRAPH
+0x8AA1 0x82C5  #CJK UNIFIED IDEOGRAPH
+0x8AA2 0x74E6  #CJK UNIFIED IDEOGRAPH
+0x8AA3 0x4E7E  #CJK UNIFIED IDEOGRAPH
+0x8AA4 0x4F83  #CJK UNIFIED IDEOGRAPH
+0x8AA5 0x51A0  #CJK UNIFIED IDEOGRAPH
+0x8AA6 0x5BD2  #CJK UNIFIED IDEOGRAPH
+0x8AA7 0x520A  #CJK UNIFIED IDEOGRAPH
+0x8AA8 0x52D8  #CJK UNIFIED IDEOGRAPH
+0x8AA9 0x52E7  #CJK UNIFIED IDEOGRAPH
+0x8AAA 0x5DFB  #CJK UNIFIED IDEOGRAPH
+0x8AAB 0x559A  #CJK UNIFIED IDEOGRAPH
+0x8AAC 0x582A  #CJK UNIFIED IDEOGRAPH
+0x8AAD 0x59E6  #CJK UNIFIED IDEOGRAPH
+0x8AAE 0x5B8C  #CJK UNIFIED IDEOGRAPH
+0x8AAF 0x5B98  #CJK UNIFIED IDEOGRAPH
+0x8AB0 0x5BDB  #CJK UNIFIED IDEOGRAPH
+0x8AB1 0x5E72  #CJK UNIFIED IDEOGRAPH
+0x8AB2 0x5E79  #CJK UNIFIED IDEOGRAPH
+0x8AB3 0x60A3  #CJK UNIFIED IDEOGRAPH
+0x8AB4 0x611F  #CJK UNIFIED IDEOGRAPH
+0x8AB5 0x6163  #CJK UNIFIED IDEOGRAPH
+0x8AB6 0x61BE  #CJK UNIFIED IDEOGRAPH
+0x8AB7 0x63DB  #CJK UNIFIED IDEOGRAPH
+0x8AB8 0x6562  #CJK UNIFIED IDEOGRAPH
+0x8AB9 0x67D1  #CJK UNIFIED IDEOGRAPH
+0x8ABA 0x6853  #CJK UNIFIED IDEOGRAPH
+0x8ABB 0x68FA  #CJK UNIFIED IDEOGRAPH
+0x8ABC 0x6B3E  #CJK UNIFIED IDEOGRAPH
+0x8ABD 0x6B53  #CJK UNIFIED IDEOGRAPH
+0x8ABE 0x6C57  #CJK UNIFIED IDEOGRAPH
+0x8ABF 0x6F22  #CJK UNIFIED IDEOGRAPH
+0x8AC0 0x6F97  #CJK UNIFIED IDEOGRAPH
+0x8AC1 0x6F45  #CJK UNIFIED IDEOGRAPH
+0x8AC2 0x74B0  #CJK UNIFIED IDEOGRAPH
+0x8AC3 0x7518  #CJK UNIFIED IDEOGRAPH
+0x8AC4 0x76E3  #CJK UNIFIED IDEOGRAPH
+0x8AC5 0x770B  #CJK UNIFIED IDEOGRAPH
+0x8AC6 0x7AFF  #CJK UNIFIED IDEOGRAPH
+0x8AC7 0x7BA1  #CJK UNIFIED IDEOGRAPH
+0x8AC8 0x7C21  #CJK UNIFIED IDEOGRAPH
+0x8AC9 0x7DE9  #CJK UNIFIED IDEOGRAPH
+0x8ACA 0x7F36  #CJK UNIFIED IDEOGRAPH
+0x8ACB 0x7FF0  #CJK UNIFIED IDEOGRAPH
+0x8ACC 0x809D  #CJK UNIFIED IDEOGRAPH
+0x8ACD 0x8266  #CJK UNIFIED IDEOGRAPH
+0x8ACE 0x839E  #CJK UNIFIED IDEOGRAPH
+0x8ACF 0x89B3  #CJK UNIFIED IDEOGRAPH
+0x8AD0 0x8ACC  #CJK UNIFIED IDEOGRAPH
+0x8AD1 0x8CAB  #CJK UNIFIED IDEOGRAPH
+0x8AD2 0x9084  #CJK UNIFIED IDEOGRAPH
+0x8AD3 0x9451  #CJK UNIFIED IDEOGRAPH
+0x8AD4 0x9593  #CJK UNIFIED IDEOGRAPH
+0x8AD5 0x9591  #CJK UNIFIED IDEOGRAPH
+0x8AD6 0x95A2  #CJK UNIFIED IDEOGRAPH
+0x8AD7 0x9665  #CJK UNIFIED IDEOGRAPH
+0x8AD8 0x97D3  #CJK UNIFIED IDEOGRAPH
+0x8AD9 0x9928  #CJK UNIFIED IDEOGRAPH
+0x8ADA 0x8218  #CJK UNIFIED IDEOGRAPH
+0x8ADB 0x4E38  #CJK UNIFIED IDEOGRAPH
+0x8ADC 0x542B  #CJK UNIFIED IDEOGRAPH
+0x8ADD 0x5CB8  #CJK UNIFIED IDEOGRAPH
+0x8ADE 0x5DCC  #CJK UNIFIED IDEOGRAPH
+0x8ADF 0x73A9  #CJK UNIFIED IDEOGRAPH
+0x8AE0 0x764C  #CJK UNIFIED IDEOGRAPH
+0x8AE1 0x773C  #CJK UNIFIED IDEOGRAPH
+0x8AE2 0x5CA9  #CJK UNIFIED IDEOGRAPH
+0x8AE3 0x7FEB  #CJK UNIFIED IDEOGRAPH
+0x8AE4 0x8D0B  #CJK UNIFIED IDEOGRAPH
+0x8AE5 0x96C1  #CJK UNIFIED IDEOGRAPH
+0x8AE6 0x9811  #CJK UNIFIED IDEOGRAPH
+0x8AE7 0x9854  #CJK UNIFIED IDEOGRAPH
+0x8AE8 0x9858  #CJK UNIFIED IDEOGRAPH
+0x8AE9 0x4F01  #CJK UNIFIED IDEOGRAPH
+0x8AEA 0x4F0E  #CJK UNIFIED IDEOGRAPH
+0x8AEB 0x5371  #CJK UNIFIED IDEOGRAPH
+0x8AEC 0x559C  #CJK UNIFIED IDEOGRAPH
+0x8AED 0x5668  #CJK UNIFIED IDEOGRAPH
+0x8AEE 0x57FA  #CJK UNIFIED IDEOGRAPH
+0x8AEF 0x5947  #CJK UNIFIED IDEOGRAPH
+0x8AF0 0x5B09  #CJK UNIFIED IDEOGRAPH
+0x8AF1 0x5BC4  #CJK UNIFIED IDEOGRAPH
+0x8AF2 0x5C90  #CJK UNIFIED IDEOGRAPH
+0x8AF3 0x5E0C  #CJK UNIFIED IDEOGRAPH
+0x8AF4 0x5E7E  #CJK UNIFIED IDEOGRAPH
+0x8AF5 0x5FCC  #CJK UNIFIED IDEOGRAPH
+0x8AF6 0x63EE  #CJK UNIFIED IDEOGRAPH
+0x8AF7 0x673A  #CJK UNIFIED IDEOGRAPH
+0x8AF8 0x65D7  #CJK UNIFIED IDEOGRAPH
+0x8AF9 0x65E2  #CJK UNIFIED IDEOGRAPH
+0x8AFA 0x671F  #CJK UNIFIED IDEOGRAPH
+0x8AFB 0x68CB  #CJK UNIFIED IDEOGRAPH
+0x8AFC 0x68C4  #CJK UNIFIED IDEOGRAPH
+0x8B40 0x6A5F  #CJK UNIFIED IDEOGRAPH
+0x8B41 0x5E30  #CJK UNIFIED IDEOGRAPH
+0x8B42 0x6BC5  #CJK UNIFIED IDEOGRAPH
+0x8B43 0x6C17  #CJK UNIFIED IDEOGRAPH
+0x8B44 0x6C7D  #CJK UNIFIED IDEOGRAPH
+0x8B45 0x757F  #CJK UNIFIED IDEOGRAPH
+0x8B46 0x7948  #CJK UNIFIED IDEOGRAPH
+0x8B47 0x5B63  #CJK UNIFIED IDEOGRAPH
+0x8B48 0x7A00  #CJK UNIFIED IDEOGRAPH
+0x8B49 0x7D00  #CJK UNIFIED IDEOGRAPH
+0x8B4A 0x5FBD  #CJK UNIFIED IDEOGRAPH
+0x8B4B 0x898F  #CJK UNIFIED IDEOGRAPH
+0x8B4C 0x8A18  #CJK UNIFIED IDEOGRAPH
+0x8B4D 0x8CB4  #CJK UNIFIED IDEOGRAPH
+0x8B4E 0x8D77  #CJK UNIFIED IDEOGRAPH
+0x8B4F 0x8ECC  #CJK UNIFIED IDEOGRAPH
+0x8B50 0x8F1D  #CJK UNIFIED IDEOGRAPH
+0x8B51 0x98E2  #CJK UNIFIED IDEOGRAPH
+0x8B52 0x9A0E  #CJK UNIFIED IDEOGRAPH
+0x8B53 0x9B3C  #CJK UNIFIED IDEOGRAPH
+0x8B54 0x4E80  #CJK UNIFIED IDEOGRAPH
+0x8B55 0x507D  #CJK UNIFIED IDEOGRAPH
+0x8B56 0x5100  #CJK UNIFIED IDEOGRAPH
+0x8B57 0x5993  #CJK UNIFIED IDEOGRAPH
+0x8B58 0x5B9C  #CJK UNIFIED IDEOGRAPH
+0x8B59 0x622F  #CJK UNIFIED IDEOGRAPH
+0x8B5A 0x6280  #CJK UNIFIED IDEOGRAPH
+0x8B5B 0x64EC  #CJK UNIFIED IDEOGRAPH
+0x8B5C 0x6B3A  #CJK UNIFIED IDEOGRAPH
+0x8B5D 0x72A0  #CJK UNIFIED IDEOGRAPH
+0x8B5E 0x7591  #CJK UNIFIED IDEOGRAPH
+0x8B5F 0x7947  #CJK UNIFIED IDEOGRAPH
+0x8B60 0x7FA9  #CJK UNIFIED IDEOGRAPH
+0x8B61 0x87FB  #CJK UNIFIED IDEOGRAPH
+0x8B62 0x8ABC  #CJK UNIFIED IDEOGRAPH
+0x8B63 0x8B70  #CJK UNIFIED IDEOGRAPH
+0x8B64 0x63AC  #CJK UNIFIED IDEOGRAPH
+0x8B65 0x83CA  #CJK UNIFIED IDEOGRAPH
+0x8B66 0x97A0  #CJK UNIFIED IDEOGRAPH
+0x8B67 0x5409  #CJK UNIFIED IDEOGRAPH
+0x8B68 0x5403  #CJK UNIFIED IDEOGRAPH
+0x8B69 0x55AB  #CJK UNIFIED IDEOGRAPH
+0x8B6A 0x6854  #CJK UNIFIED IDEOGRAPH
+0x8B6B 0x6A58  #CJK UNIFIED IDEOGRAPH
+0x8B6C 0x8A70  #CJK UNIFIED IDEOGRAPH
+0x8B6D 0x7827  #CJK UNIFIED IDEOGRAPH
+0x8B6E 0x6775  #CJK UNIFIED IDEOGRAPH
+0x8B6F 0x9ECD  #CJK UNIFIED IDEOGRAPH
+0x8B70 0x5374  #CJK UNIFIED IDEOGRAPH
+0x8B71 0x5BA2  #CJK UNIFIED IDEOGRAPH
+0x8B72 0x811A  #CJK UNIFIED IDEOGRAPH
+0x8B73 0x8650  #CJK UNIFIED IDEOGRAPH
+0x8B74 0x9006  #CJK UNIFIED IDEOGRAPH
+0x8B75 0x4E18  #CJK UNIFIED IDEOGRAPH
+0x8B76 0x4E45  #CJK UNIFIED IDEOGRAPH
+0x8B77 0x4EC7  #CJK UNIFIED IDEOGRAPH
+0x8B78 0x4F11  #CJK UNIFIED IDEOGRAPH
+0x8B79 0x53CA  #CJK UNIFIED IDEOGRAPH
+0x8B7A 0x5438  #CJK UNIFIED IDEOGRAPH
+0x8B7B 0x5BAE  #CJK UNIFIED IDEOGRAPH
+0x8B7C 0x5F13  #CJK UNIFIED IDEOGRAPH
+0x8B7D 0x6025  #CJK UNIFIED IDEOGRAPH
+0x8B7E 0x6551  #CJK UNIFIED IDEOGRAPH
+0x8B80 0x673D  #CJK UNIFIED IDEOGRAPH
+0x8B81 0x6C42  #CJK UNIFIED IDEOGRAPH
+0x8B82 0x6C72  #CJK UNIFIED IDEOGRAPH
+0x8B83 0x6CE3  #CJK UNIFIED IDEOGRAPH
+0x8B84 0x7078  #CJK UNIFIED IDEOGRAPH
+0x8B85 0x7403  #CJK UNIFIED IDEOGRAPH
+0x8B86 0x7A76  #CJK UNIFIED IDEOGRAPH
+0x8B87 0x7AAE  #CJK UNIFIED IDEOGRAPH
+0x8B88 0x7B08  #CJK UNIFIED IDEOGRAPH
+0x8B89 0x7D1A  #CJK UNIFIED IDEOGRAPH
+0x8B8A 0x7CFE  #CJK UNIFIED IDEOGRAPH
+0x8B8B 0x7D66  #CJK UNIFIED IDEOGRAPH
+0x8B8C 0x65E7  #CJK UNIFIED IDEOGRAPH
+0x8B8D 0x725B  #CJK UNIFIED IDEOGRAPH
+0x8B8E 0x53BB  #CJK UNIFIED IDEOGRAPH
+0x8B8F 0x5C45  #CJK UNIFIED IDEOGRAPH
+0x8B90 0x5DE8  #CJK UNIFIED IDEOGRAPH
+0x8B91 0x62D2  #CJK UNIFIED IDEOGRAPH
+0x8B92 0x62E0  #CJK UNIFIED IDEOGRAPH
+0x8B93 0x6319  #CJK UNIFIED IDEOGRAPH
+0x8B94 0x6E20  #CJK UNIFIED IDEOGRAPH
+0x8B95 0x865A  #CJK UNIFIED IDEOGRAPH
+0x8B96 0x8A31  #CJK UNIFIED IDEOGRAPH
+0x8B97 0x8DDD  #CJK UNIFIED IDEOGRAPH
+0x8B98 0x92F8  #CJK UNIFIED IDEOGRAPH
+0x8B99 0x6F01  #CJK UNIFIED IDEOGRAPH
+0x8B9A 0x79A6  #CJK UNIFIED IDEOGRAPH
+0x8B9B 0x9B5A  #CJK UNIFIED IDEOGRAPH
+0x8B9C 0x4EA8  #CJK UNIFIED IDEOGRAPH
+0x8B9D 0x4EAB  #CJK UNIFIED IDEOGRAPH
+0x8B9E 0x4EAC  #CJK UNIFIED IDEOGRAPH
+0x8B9F 0x4F9B  #CJK UNIFIED IDEOGRAPH
+0x8BA0 0x4FA0  #CJK UNIFIED IDEOGRAPH
+0x8BA1 0x50D1  #CJK UNIFIED IDEOGRAPH
+0x8BA2 0x5147  #CJK UNIFIED IDEOGRAPH
+0x8BA3 0x7AF6  #CJK UNIFIED IDEOGRAPH
+0x8BA4 0x5171  #CJK UNIFIED IDEOGRAPH
+0x8BA5 0x51F6  #CJK UNIFIED IDEOGRAPH
+0x8BA6 0x5354  #CJK UNIFIED IDEOGRAPH
+0x8BA7 0x5321  #CJK UNIFIED IDEOGRAPH
+0x8BA8 0x537F  #CJK UNIFIED IDEOGRAPH
+0x8BA9 0x53EB  #CJK UNIFIED IDEOGRAPH
+0x8BAA 0x55AC  #CJK UNIFIED IDEOGRAPH
+0x8BAB 0x5883  #CJK UNIFIED IDEOGRAPH
+0x8BAC 0x5CE1  #CJK UNIFIED IDEOGRAPH
+0x8BAD 0x5F37  #CJK UNIFIED IDEOGRAPH
+0x8BAE 0x5F4A  #CJK UNIFIED IDEOGRAPH
+0x8BAF 0x602F  #CJK UNIFIED IDEOGRAPH
+0x8BB0 0x6050  #CJK UNIFIED IDEOGRAPH
+0x8BB1 0x606D  #CJK UNIFIED IDEOGRAPH
+0x8BB2 0x631F  #CJK UNIFIED IDEOGRAPH
+0x8BB3 0x6559  #CJK UNIFIED IDEOGRAPH
+0x8BB4 0x6A4B  #CJK UNIFIED IDEOGRAPH
+0x8BB5 0x6CC1  #CJK UNIFIED IDEOGRAPH
+0x8BB6 0x72C2  #CJK UNIFIED IDEOGRAPH
+0x8BB7 0x72ED  #CJK UNIFIED IDEOGRAPH
+0x8BB8 0x77EF  #CJK UNIFIED IDEOGRAPH
+0x8BB9 0x80F8  #CJK UNIFIED IDEOGRAPH
+0x8BBA 0x8105  #CJK UNIFIED IDEOGRAPH
+0x8BBB 0x8208  #CJK UNIFIED IDEOGRAPH
+0x8BBC 0x854E  #CJK UNIFIED IDEOGRAPH
+0x8BBD 0x90F7  #CJK UNIFIED IDEOGRAPH
+0x8BBE 0x93E1  #CJK UNIFIED IDEOGRAPH
+0x8BBF 0x97FF  #CJK UNIFIED IDEOGRAPH
+0x8BC0 0x9957  #CJK UNIFIED IDEOGRAPH
+0x8BC1 0x9A5A  #CJK UNIFIED IDEOGRAPH
+0x8BC2 0x4EF0  #CJK UNIFIED IDEOGRAPH
+0x8BC3 0x51DD  #CJK UNIFIED IDEOGRAPH
+0x8BC4 0x5C2D  #CJK UNIFIED IDEOGRAPH
+0x8BC5 0x6681  #CJK UNIFIED IDEOGRAPH
+0x8BC6 0x696D  #CJK UNIFIED IDEOGRAPH
+0x8BC7 0x5C40  #CJK UNIFIED IDEOGRAPH
+0x8BC8 0x66F2  #CJK UNIFIED IDEOGRAPH
+0x8BC9 0x6975  #CJK UNIFIED IDEOGRAPH
+0x8BCA 0x7389  #CJK UNIFIED IDEOGRAPH
+0x8BCB 0x6850  #CJK UNIFIED IDEOGRAPH
+0x8BCC 0x7C81  #CJK UNIFIED IDEOGRAPH
+0x8BCD 0x50C5  #CJK UNIFIED IDEOGRAPH
+0x8BCE 0x52E4  #CJK UNIFIED IDEOGRAPH
+0x8BCF 0x5747  #CJK UNIFIED IDEOGRAPH
+0x8BD0 0x5DFE  #CJK UNIFIED IDEOGRAPH
+0x8BD1 0x9326  #CJK UNIFIED IDEOGRAPH
+0x8BD2 0x65A4  #CJK UNIFIED IDEOGRAPH
+0x8BD3 0x6B23  #CJK UNIFIED IDEOGRAPH
+0x8BD4 0x6B3D  #CJK UNIFIED IDEOGRAPH
+0x8BD5 0x7434  #CJK UNIFIED IDEOGRAPH
+0x8BD6 0x7981  #CJK UNIFIED IDEOGRAPH
+0x8BD7 0x79BD  #CJK UNIFIED IDEOGRAPH
+0x8BD8 0x7B4B  #CJK UNIFIED IDEOGRAPH
+0x8BD9 0x7DCA  #CJK UNIFIED IDEOGRAPH
+0x8BDA 0x82B9  #CJK UNIFIED IDEOGRAPH
+0x8BDB 0x83CC  #CJK UNIFIED IDEOGRAPH
+0x8BDC 0x887F  #CJK UNIFIED IDEOGRAPH
+0x8BDD 0x895F  #CJK UNIFIED IDEOGRAPH
+0x8BDE 0x8B39  #CJK UNIFIED IDEOGRAPH
+0x8BDF 0x8FD1  #CJK UNIFIED IDEOGRAPH
+0x8BE0 0x91D1  #CJK UNIFIED IDEOGRAPH
+0x8BE1 0x541F  #CJK UNIFIED IDEOGRAPH
+0x8BE2 0x9280  #CJK UNIFIED IDEOGRAPH
+0x8BE3 0x4E5D  #CJK UNIFIED IDEOGRAPH
+0x8BE4 0x5036  #CJK UNIFIED IDEOGRAPH
+0x8BE5 0x53E5  #CJK UNIFIED IDEOGRAPH
+0x8BE6 0x533A  #CJK UNIFIED IDEOGRAPH
+0x8BE7 0x72D7  #CJK UNIFIED IDEOGRAPH
+0x8BE8 0x7396  #CJK UNIFIED IDEOGRAPH
+0x8BE9 0x77E9  #CJK UNIFIED IDEOGRAPH
+0x8BEA 0x82E6  #CJK UNIFIED IDEOGRAPH
+0x8BEB 0x8EAF  #CJK UNIFIED IDEOGRAPH
+0x8BEC 0x99C6  #CJK UNIFIED IDEOGRAPH
+0x8BED 0x99C8  #CJK UNIFIED IDEOGRAPH
+0x8BEE 0x99D2  #CJK UNIFIED IDEOGRAPH
+0x8BEF 0x5177  #CJK UNIFIED IDEOGRAPH
+0x8BF0 0x611A  #CJK UNIFIED IDEOGRAPH
+0x8BF1 0x865E  #CJK UNIFIED IDEOGRAPH
+0x8BF2 0x55B0  #CJK UNIFIED IDEOGRAPH
+0x8BF3 0x7A7A  #CJK UNIFIED IDEOGRAPH
+0x8BF4 0x5076  #CJK UNIFIED IDEOGRAPH
+0x8BF5 0x5BD3  #CJK UNIFIED IDEOGRAPH
+0x8BF6 0x9047  #CJK UNIFIED IDEOGRAPH
+0x8BF7 0x9685  #CJK UNIFIED IDEOGRAPH
+0x8BF8 0x4E32  #CJK UNIFIED IDEOGRAPH
+0x8BF9 0x6ADB  #CJK UNIFIED IDEOGRAPH
+0x8BFA 0x91E7  #CJK UNIFIED IDEOGRAPH
+0x8BFB 0x5C51  #CJK UNIFIED IDEOGRAPH
+0x8BFC 0x5C48  #CJK UNIFIED IDEOGRAPH
+0x8C40 0x6398  #CJK UNIFIED IDEOGRAPH
+0x8C41 0x7A9F  #CJK UNIFIED IDEOGRAPH
+0x8C42 0x6C93  #CJK UNIFIED IDEOGRAPH
+0x8C43 0x9774  #CJK UNIFIED IDEOGRAPH
+0x8C44 0x8F61  #CJK UNIFIED IDEOGRAPH
+0x8C45 0x7AAA  #CJK UNIFIED IDEOGRAPH
+0x8C46 0x718A  #CJK UNIFIED IDEOGRAPH
+0x8C47 0x9688  #CJK UNIFIED IDEOGRAPH
+0x8C48 0x7C82  #CJK UNIFIED IDEOGRAPH
+0x8C49 0x6817  #CJK UNIFIED IDEOGRAPH
+0x8C4A 0x7E70  #CJK UNIFIED IDEOGRAPH
+0x8C4B 0x6851  #CJK UNIFIED IDEOGRAPH
+0x8C4C 0x936C  #CJK UNIFIED IDEOGRAPH
+0x8C4D 0x52F2  #CJK UNIFIED IDEOGRAPH
+0x8C4E 0x541B  #CJK UNIFIED IDEOGRAPH
+0x8C4F 0x85AB  #CJK UNIFIED IDEOGRAPH
+0x8C50 0x8A13  #CJK UNIFIED IDEOGRAPH
+0x8C51 0x7FA4  #CJK UNIFIED IDEOGRAPH
+0x8C52 0x8ECD  #CJK UNIFIED IDEOGRAPH
+0x8C53 0x90E1  #CJK UNIFIED IDEOGRAPH
+0x8C54 0x5366  #CJK UNIFIED IDEOGRAPH
+0x8C55 0x8888  #CJK UNIFIED IDEOGRAPH
+0x8C56 0x7941  #CJK UNIFIED IDEOGRAPH
+0x8C57 0x4FC2  #CJK UNIFIED IDEOGRAPH
+0x8C58 0x50BE  #CJK UNIFIED IDEOGRAPH
+0x8C59 0x5211  #CJK UNIFIED IDEOGRAPH
+0x8C5A 0x5144  #CJK UNIFIED IDEOGRAPH
+0x8C5B 0x5553  #CJK UNIFIED IDEOGRAPH
+0x8C5C 0x572D  #CJK UNIFIED IDEOGRAPH
+0x8C5D 0x73EA  #CJK UNIFIED IDEOGRAPH
+0x8C5E 0x578B  #CJK UNIFIED IDEOGRAPH
+0x8C5F 0x5951  #CJK UNIFIED IDEOGRAPH
+0x8C60 0x5F62  #CJK UNIFIED IDEOGRAPH
+0x8C61 0x5F84  #CJK UNIFIED IDEOGRAPH
+0x8C62 0x6075  #CJK UNIFIED IDEOGRAPH
+0x8C63 0x6176  #CJK UNIFIED IDEOGRAPH
+0x8C64 0x6167  #CJK UNIFIED IDEOGRAPH
+0x8C65 0x61A9  #CJK UNIFIED IDEOGRAPH
+0x8C66 0x63B2  #CJK UNIFIED IDEOGRAPH
+0x8C67 0x643A  #CJK UNIFIED IDEOGRAPH
+0x8C68 0x656C  #CJK UNIFIED IDEOGRAPH
+0x8C69 0x666F  #CJK UNIFIED IDEOGRAPH
+0x8C6A 0x6842  #CJK UNIFIED IDEOGRAPH
+0x8C6B 0x6E13  #CJK UNIFIED IDEOGRAPH
+0x8C6C 0x7566  #CJK UNIFIED IDEOGRAPH
+0x8C6D 0x7A3D  #CJK UNIFIED IDEOGRAPH
+0x8C6E 0x7CFB  #CJK UNIFIED IDEOGRAPH
+0x8C6F 0x7D4C  #CJK UNIFIED IDEOGRAPH
+0x8C70 0x7D99  #CJK UNIFIED IDEOGRAPH
+0x8C71 0x7E4B  #CJK UNIFIED IDEOGRAPH
+0x8C72 0x7F6B  #CJK UNIFIED IDEOGRAPH
+0x8C73 0x830E  #CJK UNIFIED IDEOGRAPH
+0x8C74 0x834A  #CJK UNIFIED IDEOGRAPH
+0x8C75 0x86CD  #CJK UNIFIED IDEOGRAPH
+0x8C76 0x8A08  #CJK UNIFIED IDEOGRAPH
+0x8C77 0x8A63  #CJK UNIFIED IDEOGRAPH
+0x8C78 0x8B66  #CJK UNIFIED IDEOGRAPH
+0x8C79 0x8EFD  #CJK UNIFIED IDEOGRAPH
+0x8C7A 0x981A  #CJK UNIFIED IDEOGRAPH
+0x8C7B 0x9D8F  #CJK UNIFIED IDEOGRAPH
+0x8C7C 0x82B8  #CJK UNIFIED IDEOGRAPH
+0x8C7D 0x8FCE  #CJK UNIFIED IDEOGRAPH
+0x8C7E 0x9BE8  #CJK UNIFIED IDEOGRAPH
+0x8C80 0x5287  #CJK UNIFIED IDEOGRAPH
+0x8C81 0x621F  #CJK UNIFIED IDEOGRAPH
+0x8C82 0x6483  #CJK UNIFIED IDEOGRAPH
+0x8C83 0x6FC0  #CJK UNIFIED IDEOGRAPH
+0x8C84 0x9699  #CJK UNIFIED IDEOGRAPH
+0x8C85 0x6841  #CJK UNIFIED IDEOGRAPH
+0x8C86 0x5091  #CJK UNIFIED IDEOGRAPH
+0x8C87 0x6B20  #CJK UNIFIED IDEOGRAPH
+0x8C88 0x6C7A  #CJK UNIFIED IDEOGRAPH
+0x8C89 0x6F54  #CJK UNIFIED IDEOGRAPH
+0x8C8A 0x7A74  #CJK UNIFIED IDEOGRAPH
+0x8C8B 0x7D50  #CJK UNIFIED IDEOGRAPH
+0x8C8C 0x8840  #CJK UNIFIED IDEOGRAPH
+0x8C8D 0x8A23  #CJK UNIFIED IDEOGRAPH
+0x8C8E 0x6708  #CJK UNIFIED IDEOGRAPH
+0x8C8F 0x4EF6  #CJK UNIFIED IDEOGRAPH
+0x8C90 0x5039  #CJK UNIFIED IDEOGRAPH
+0x8C91 0x5026  #CJK UNIFIED IDEOGRAPH
+0x8C92 0x5065  #CJK UNIFIED IDEOGRAPH
+0x8C93 0x517C  #CJK UNIFIED IDEOGRAPH
+0x8C94 0x5238  #CJK UNIFIED IDEOGRAPH
+0x8C95 0x5263  #CJK UNIFIED IDEOGRAPH
+0x8C96 0x55A7  #CJK UNIFIED IDEOGRAPH
+0x8C97 0x570F  #CJK UNIFIED IDEOGRAPH
+0x8C98 0x5805  #CJK UNIFIED IDEOGRAPH
+0x8C99 0x5ACC  #CJK UNIFIED IDEOGRAPH
+0x8C9A 0x5EFA  #CJK UNIFIED IDEOGRAPH
+0x8C9B 0x61B2  #CJK UNIFIED IDEOGRAPH
+0x8C9C 0x61F8  #CJK UNIFIED IDEOGRAPH
+0x8C9D 0x62F3  #CJK UNIFIED IDEOGRAPH
+0x8C9E 0x6372  #CJK UNIFIED IDEOGRAPH
+0x8C9F 0x691C  #CJK UNIFIED IDEOGRAPH
+0x8CA0 0x6A29  #CJK UNIFIED IDEOGRAPH
+0x8CA1 0x727D  #CJK UNIFIED IDEOGRAPH
+0x8CA2 0x72AC  #CJK UNIFIED IDEOGRAPH
+0x8CA3 0x732E  #CJK UNIFIED IDEOGRAPH
+0x8CA4 0x7814  #CJK UNIFIED IDEOGRAPH
+0x8CA5 0x786F  #CJK UNIFIED IDEOGRAPH
+0x8CA6 0x7D79  #CJK UNIFIED IDEOGRAPH
+0x8CA7 0x770C  #CJK UNIFIED IDEOGRAPH
+0x8CA8 0x80A9  #CJK UNIFIED IDEOGRAPH
+0x8CA9 0x898B  #CJK UNIFIED IDEOGRAPH
+0x8CAA 0x8B19  #CJK UNIFIED IDEOGRAPH
+0x8CAB 0x8CE2  #CJK UNIFIED IDEOGRAPH
+0x8CAC 0x8ED2  #CJK UNIFIED IDEOGRAPH
+0x8CAD 0x9063  #CJK UNIFIED IDEOGRAPH
+0x8CAE 0x9375  #CJK UNIFIED IDEOGRAPH
+0x8CAF 0x967A  #CJK UNIFIED IDEOGRAPH
+0x8CB0 0x9855  #CJK UNIFIED IDEOGRAPH
+0x8CB1 0x9A13  #CJK UNIFIED IDEOGRAPH
+0x8CB2 0x9E78  #CJK UNIFIED IDEOGRAPH
+0x8CB3 0x5143  #CJK UNIFIED IDEOGRAPH
+0x8CB4 0x539F  #CJK UNIFIED IDEOGRAPH
+0x8CB5 0x53B3  #CJK UNIFIED IDEOGRAPH
+0x8CB6 0x5E7B  #CJK UNIFIED IDEOGRAPH
+0x8CB7 0x5F26  #CJK UNIFIED IDEOGRAPH
+0x8CB8 0x6E1B  #CJK UNIFIED IDEOGRAPH
+0x8CB9 0x6E90  #CJK UNIFIED IDEOGRAPH
+0x8CBA 0x7384  #CJK UNIFIED IDEOGRAPH
+0x8CBB 0x73FE  #CJK UNIFIED IDEOGRAPH
+0x8CBC 0x7D43  #CJK UNIFIED IDEOGRAPH
+0x8CBD 0x8237  #CJK UNIFIED IDEOGRAPH
+0x8CBE 0x8A00  #CJK UNIFIED IDEOGRAPH
+0x8CBF 0x8AFA  #CJK UNIFIED IDEOGRAPH
+0x8CC0 0x9650  #CJK UNIFIED IDEOGRAPH
+0x8CC1 0x4E4E  #CJK UNIFIED IDEOGRAPH
+0x8CC2 0x500B  #CJK UNIFIED IDEOGRAPH
+0x8CC3 0x53E4  #CJK UNIFIED IDEOGRAPH
+0x8CC4 0x547C  #CJK UNIFIED IDEOGRAPH
+0x8CC5 0x56FA  #CJK UNIFIED IDEOGRAPH
+0x8CC6 0x59D1  #CJK UNIFIED IDEOGRAPH
+0x8CC7 0x5B64  #CJK UNIFIED IDEOGRAPH
+0x8CC8 0x5DF1  #CJK UNIFIED IDEOGRAPH
+0x8CC9 0x5EAB  #CJK UNIFIED IDEOGRAPH
+0x8CCA 0x5F27  #CJK UNIFIED IDEOGRAPH
+0x8CCB 0x6238  #CJK UNIFIED IDEOGRAPH
+0x8CCC 0x6545  #CJK UNIFIED IDEOGRAPH
+0x8CCD 0x67AF  #CJK UNIFIED IDEOGRAPH
+0x8CCE 0x6E56  #CJK UNIFIED IDEOGRAPH
+0x8CCF 0x72D0  #CJK UNIFIED IDEOGRAPH
+0x8CD0 0x7CCA  #CJK UNIFIED IDEOGRAPH
+0x8CD1 0x88B4  #CJK UNIFIED IDEOGRAPH
+0x8CD2 0x80A1  #CJK UNIFIED IDEOGRAPH
+0x8CD3 0x80E1  #CJK UNIFIED IDEOGRAPH
+0x8CD4 0x83F0  #CJK UNIFIED IDEOGRAPH
+0x8CD5 0x864E  #CJK UNIFIED IDEOGRAPH
+0x8CD6 0x8A87  #CJK UNIFIED IDEOGRAPH
+0x8CD7 0x8DE8  #CJK UNIFIED IDEOGRAPH
+0x8CD8 0x9237  #CJK UNIFIED IDEOGRAPH
+0x8CD9 0x96C7  #CJK UNIFIED IDEOGRAPH
+0x8CDA 0x9867  #CJK UNIFIED IDEOGRAPH
+0x8CDB 0x9F13  #CJK UNIFIED IDEOGRAPH
+0x8CDC 0x4E94  #CJK UNIFIED IDEOGRAPH
+0x8CDD 0x4E92  #CJK UNIFIED IDEOGRAPH
+0x8CDE 0x4F0D  #CJK UNIFIED IDEOGRAPH
+0x8CDF 0x5348  #CJK UNIFIED IDEOGRAPH
+0x8CE0 0x5449  #CJK UNIFIED IDEOGRAPH
+0x8CE1 0x543E  #CJK UNIFIED IDEOGRAPH
+0x8CE2 0x5A2F  #CJK UNIFIED IDEOGRAPH
+0x8CE3 0x5F8C  #CJK UNIFIED IDEOGRAPH
+0x8CE4 0x5FA1  #CJK UNIFIED IDEOGRAPH
+0x8CE5 0x609F  #CJK UNIFIED IDEOGRAPH
+0x8CE6 0x68A7  #CJK UNIFIED IDEOGRAPH
+0x8CE7 0x6A8E  #CJK UNIFIED IDEOGRAPH
+0x8CE8 0x745A  #CJK UNIFIED IDEOGRAPH
+0x8CE9 0x7881  #CJK UNIFIED IDEOGRAPH
+0x8CEA 0x8A9E  #CJK UNIFIED IDEOGRAPH
+0x8CEB 0x8AA4  #CJK UNIFIED IDEOGRAPH
+0x8CEC 0x8B77  #CJK UNIFIED IDEOGRAPH
+0x8CED 0x9190  #CJK UNIFIED IDEOGRAPH
+0x8CEE 0x4E5E  #CJK UNIFIED IDEOGRAPH
+0x8CEF 0x9BC9  #CJK UNIFIED IDEOGRAPH
+0x8CF0 0x4EA4  #CJK UNIFIED IDEOGRAPH
+0x8CF1 0x4F7C  #CJK UNIFIED IDEOGRAPH
+0x8CF2 0x4FAF  #CJK UNIFIED IDEOGRAPH
+0x8CF3 0x5019  #CJK UNIFIED IDEOGRAPH
+0x8CF4 0x5016  #CJK UNIFIED IDEOGRAPH
+0x8CF5 0x5149  #CJK UNIFIED IDEOGRAPH
+0x8CF6 0x516C  #CJK UNIFIED IDEOGRAPH
+0x8CF7 0x529F  #CJK UNIFIED IDEOGRAPH
+0x8CF8 0x52B9  #CJK UNIFIED IDEOGRAPH
+0x8CF9 0x52FE  #CJK UNIFIED IDEOGRAPH
+0x8CFA 0x539A  #CJK UNIFIED IDEOGRAPH
+0x8CFB 0x53E3  #CJK UNIFIED IDEOGRAPH
+0x8CFC 0x5411  #CJK UNIFIED IDEOGRAPH
+0x8D40 0x540E  #CJK UNIFIED IDEOGRAPH
+0x8D41 0x5589  #CJK UNIFIED IDEOGRAPH
+0x8D42 0x5751  #CJK UNIFIED IDEOGRAPH
+0x8D43 0x57A2  #CJK UNIFIED IDEOGRAPH
+0x8D44 0x597D  #CJK UNIFIED IDEOGRAPH
+0x8D45 0x5B54  #CJK UNIFIED IDEOGRAPH
+0x8D46 0x5B5D  #CJK UNIFIED IDEOGRAPH
+0x8D47 0x5B8F  #CJK UNIFIED IDEOGRAPH
+0x8D48 0x5DE5  #CJK UNIFIED IDEOGRAPH
+0x8D49 0x5DE7  #CJK UNIFIED IDEOGRAPH
+0x8D4A 0x5DF7  #CJK UNIFIED IDEOGRAPH
+0x8D4B 0x5E78  #CJK UNIFIED IDEOGRAPH
+0x8D4C 0x5E83  #CJK UNIFIED IDEOGRAPH
+0x8D4D 0x5E9A  #CJK UNIFIED IDEOGRAPH
+0x8D4E 0x5EB7  #CJK UNIFIED IDEOGRAPH
+0x8D4F 0x5F18  #CJK UNIFIED IDEOGRAPH
+0x8D50 0x6052  #CJK UNIFIED IDEOGRAPH
+0x8D51 0x614C  #CJK UNIFIED IDEOGRAPH
+0x8D52 0x6297  #CJK UNIFIED IDEOGRAPH
+0x8D53 0x62D8  #CJK UNIFIED IDEOGRAPH
+0x8D54 0x63A7  #CJK UNIFIED IDEOGRAPH
+0x8D55 0x653B  #CJK UNIFIED IDEOGRAPH
+0x8D56 0x6602  #CJK UNIFIED IDEOGRAPH
+0x8D57 0x6643  #CJK UNIFIED IDEOGRAPH
+0x8D58 0x66F4  #CJK UNIFIED IDEOGRAPH
+0x8D59 0x676D  #CJK UNIFIED IDEOGRAPH
+0x8D5A 0x6821  #CJK UNIFIED IDEOGRAPH
+0x8D5B 0x6897  #CJK UNIFIED IDEOGRAPH
+0x8D5C 0x69CB  #CJK UNIFIED IDEOGRAPH
+0x8D5D 0x6C5F  #CJK UNIFIED IDEOGRAPH
+0x8D5E 0x6D2A  #CJK UNIFIED IDEOGRAPH
+0x8D5F 0x6D69  #CJK UNIFIED IDEOGRAPH
+0x8D60 0x6E2F  #CJK UNIFIED IDEOGRAPH
+0x8D61 0x6E9D  #CJK UNIFIED IDEOGRAPH
+0x8D62 0x7532  #CJK UNIFIED IDEOGRAPH
+0x8D63 0x7687  #CJK UNIFIED IDEOGRAPH
+0x8D64 0x786C  #CJK UNIFIED IDEOGRAPH
+0x8D65 0x7A3F  #CJK UNIFIED IDEOGRAPH
+0x8D66 0x7CE0  #CJK UNIFIED IDEOGRAPH
+0x8D67 0x7D05  #CJK UNIFIED IDEOGRAPH
+0x8D68 0x7D18  #CJK UNIFIED IDEOGRAPH
+0x8D69 0x7D5E  #CJK UNIFIED IDEOGRAPH
+0x8D6A 0x7DB1  #CJK UNIFIED IDEOGRAPH
+0x8D6B 0x8015  #CJK UNIFIED IDEOGRAPH
+0x8D6C 0x8003  #CJK UNIFIED IDEOGRAPH
+0x8D6D 0x80AF  #CJK UNIFIED IDEOGRAPH
+0x8D6E 0x80B1  #CJK UNIFIED IDEOGRAPH
+0x8D6F 0x8154  #CJK UNIFIED IDEOGRAPH
+0x8D70 0x818F  #CJK UNIFIED IDEOGRAPH
+0x8D71 0x822A  #CJK UNIFIED IDEOGRAPH
+0x8D72 0x8352  #CJK UNIFIED IDEOGRAPH
+0x8D73 0x884C  #CJK UNIFIED IDEOGRAPH
+0x8D74 0x8861  #CJK UNIFIED IDEOGRAPH
+0x8D75 0x8B1B  #CJK UNIFIED IDEOGRAPH
+0x8D76 0x8CA2  #CJK UNIFIED IDEOGRAPH
+0x8D77 0x8CFC  #CJK UNIFIED IDEOGRAPH
+0x8D78 0x90CA  #CJK UNIFIED IDEOGRAPH
+0x8D79 0x9175  #CJK UNIFIED IDEOGRAPH
+0x8D7A 0x9271  #CJK UNIFIED IDEOGRAPH
+0x8D7B 0x783F  #CJK UNIFIED IDEOGRAPH
+0x8D7C 0x92FC  #CJK UNIFIED IDEOGRAPH
+0x8D7D 0x95A4  #CJK UNIFIED IDEOGRAPH
+0x8D7E 0x964D  #CJK UNIFIED IDEOGRAPH
+0x8D80 0x9805  #CJK UNIFIED IDEOGRAPH
+0x8D81 0x9999  #CJK UNIFIED IDEOGRAPH
+0x8D82 0x9AD8  #CJK UNIFIED IDEOGRAPH
+0x8D83 0x9D3B  #CJK UNIFIED IDEOGRAPH
+0x8D84 0x525B  #CJK UNIFIED IDEOGRAPH
+0x8D85 0x52AB  #CJK UNIFIED IDEOGRAPH
+0x8D86 0x53F7  #CJK UNIFIED IDEOGRAPH
+0x8D87 0x5408  #CJK UNIFIED IDEOGRAPH
+0x8D88 0x58D5  #CJK UNIFIED IDEOGRAPH
+0x8D89 0x62F7  #CJK UNIFIED IDEOGRAPH
+0x8D8A 0x6FE0  #CJK UNIFIED IDEOGRAPH
+0x8D8B 0x8C6A  #CJK UNIFIED IDEOGRAPH
+0x8D8C 0x8F5F  #CJK UNIFIED IDEOGRAPH
+0x8D8D 0x9EB9  #CJK UNIFIED IDEOGRAPH
+0x8D8E 0x514B  #CJK UNIFIED IDEOGRAPH
+0x8D8F 0x523B  #CJK UNIFIED IDEOGRAPH
+0x8D90 0x544A  #CJK UNIFIED IDEOGRAPH
+0x8D91 0x56FD  #CJK UNIFIED IDEOGRAPH
+0x8D92 0x7A40  #CJK UNIFIED IDEOGRAPH
+0x8D93 0x9177  #CJK UNIFIED IDEOGRAPH
+0x8D94 0x9D60  #CJK UNIFIED IDEOGRAPH
+0x8D95 0x9ED2  #CJK UNIFIED IDEOGRAPH
+0x8D96 0x7344  #CJK UNIFIED IDEOGRAPH
+0x8D97 0x6F09  #CJK UNIFIED IDEOGRAPH
+0x8D98 0x8170  #CJK UNIFIED IDEOGRAPH
+0x8D99 0x7511  #CJK UNIFIED IDEOGRAPH
+0x8D9A 0x5FFD  #CJK UNIFIED IDEOGRAPH
+0x8D9B 0x60DA  #CJK UNIFIED IDEOGRAPH
+0x8D9C 0x9AA8  #CJK UNIFIED IDEOGRAPH
+0x8D9D 0x72DB  #CJK UNIFIED IDEOGRAPH
+0x8D9E 0x8FBC  #CJK UNIFIED IDEOGRAPH
+0x8D9F 0x6B64  #CJK UNIFIED IDEOGRAPH
+0x8DA0 0x9803  #CJK UNIFIED IDEOGRAPH
+0x8DA1 0x4ECA  #CJK UNIFIED IDEOGRAPH
+0x8DA2 0x56F0  #CJK UNIFIED IDEOGRAPH
+0x8DA3 0x5764  #CJK UNIFIED IDEOGRAPH
+0x8DA4 0x58BE  #CJK UNIFIED IDEOGRAPH
+0x8DA5 0x5A5A  #CJK UNIFIED IDEOGRAPH
+0x8DA6 0x6068  #CJK UNIFIED IDEOGRAPH
+0x8DA7 0x61C7  #CJK UNIFIED IDEOGRAPH
+0x8DA8 0x660F  #CJK UNIFIED IDEOGRAPH
+0x8DA9 0x6606  #CJK UNIFIED IDEOGRAPH
+0x8DAA 0x6839  #CJK UNIFIED IDEOGRAPH
+0x8DAB 0x68B1  #CJK UNIFIED IDEOGRAPH
+0x8DAC 0x6DF7  #CJK UNIFIED IDEOGRAPH
+0x8DAD 0x75D5  #CJK UNIFIED IDEOGRAPH
+0x8DAE 0x7D3A  #CJK UNIFIED IDEOGRAPH
+0x8DAF 0x826E  #CJK UNIFIED IDEOGRAPH
+0x8DB0 0x9B42  #CJK UNIFIED IDEOGRAPH
+0x8DB1 0x4E9B  #CJK UNIFIED IDEOGRAPH
+0x8DB2 0x4F50  #CJK UNIFIED IDEOGRAPH
+0x8DB3 0x53C9  #CJK UNIFIED IDEOGRAPH
+0x8DB4 0x5506  #CJK UNIFIED IDEOGRAPH
+0x8DB5 0x5D6F  #CJK UNIFIED IDEOGRAPH
+0x8DB6 0x5DE6  #CJK UNIFIED IDEOGRAPH
+0x8DB7 0x5DEE  #CJK UNIFIED IDEOGRAPH
+0x8DB8 0x67FB  #CJK UNIFIED IDEOGRAPH
+0x8DB9 0x6C99  #CJK UNIFIED IDEOGRAPH
+0x8DBA 0x7473  #CJK UNIFIED IDEOGRAPH
+0x8DBB 0x7802  #CJK UNIFIED IDEOGRAPH
+0x8DBC 0x8A50  #CJK UNIFIED IDEOGRAPH
+0x8DBD 0x9396  #CJK UNIFIED IDEOGRAPH
+0x8DBE 0x88DF  #CJK UNIFIED IDEOGRAPH
+0x8DBF 0x5750  #CJK UNIFIED IDEOGRAPH
+0x8DC0 0x5EA7  #CJK UNIFIED IDEOGRAPH
+0x8DC1 0x632B  #CJK UNIFIED IDEOGRAPH
+0x8DC2 0x50B5  #CJK UNIFIED IDEOGRAPH
+0x8DC3 0x50AC  #CJK UNIFIED IDEOGRAPH
+0x8DC4 0x518D  #CJK UNIFIED IDEOGRAPH
+0x8DC5 0x6700  #CJK UNIFIED IDEOGRAPH
+0x8DC6 0x54C9  #CJK UNIFIED IDEOGRAPH
+0x8DC7 0x585E  #CJK UNIFIED IDEOGRAPH
+0x8DC8 0x59BB  #CJK UNIFIED IDEOGRAPH
+0x8DC9 0x5BB0  #CJK UNIFIED IDEOGRAPH
+0x8DCA 0x5F69  #CJK UNIFIED IDEOGRAPH
+0x8DCB 0x624D  #CJK UNIFIED IDEOGRAPH
+0x8DCC 0x63A1  #CJK UNIFIED IDEOGRAPH
+0x8DCD 0x683D  #CJK UNIFIED IDEOGRAPH
+0x8DCE 0x6B73  #CJK UNIFIED IDEOGRAPH
+0x8DCF 0x6E08  #CJK UNIFIED IDEOGRAPH
+0x8DD0 0x707D  #CJK UNIFIED IDEOGRAPH
+0x8DD1 0x91C7  #CJK UNIFIED IDEOGRAPH
+0x8DD2 0x7280  #CJK UNIFIED IDEOGRAPH
+0x8DD3 0x7815  #CJK UNIFIED IDEOGRAPH
+0x8DD4 0x7826  #CJK UNIFIED IDEOGRAPH
+0x8DD5 0x796D  #CJK UNIFIED IDEOGRAPH
+0x8DD6 0x658E  #CJK UNIFIED IDEOGRAPH
+0x8DD7 0x7D30  #CJK UNIFIED IDEOGRAPH
+0x8DD8 0x83DC  #CJK UNIFIED IDEOGRAPH
+0x8DD9 0x88C1  #CJK UNIFIED IDEOGRAPH
+0x8DDA 0x8F09  #CJK UNIFIED IDEOGRAPH
+0x8DDB 0x969B  #CJK UNIFIED IDEOGRAPH
+0x8DDC 0x5264  #CJK UNIFIED IDEOGRAPH
+0x8DDD 0x5728  #CJK UNIFIED IDEOGRAPH
+0x8DDE 0x6750  #CJK UNIFIED IDEOGRAPH
+0x8DDF 0x7F6A  #CJK UNIFIED IDEOGRAPH
+0x8DE0 0x8CA1  #CJK UNIFIED IDEOGRAPH
+0x8DE1 0x51B4  #CJK UNIFIED IDEOGRAPH
+0x8DE2 0x5742  #CJK UNIFIED IDEOGRAPH
+0x8DE3 0x962A  #CJK UNIFIED IDEOGRAPH
+0x8DE4 0x583A  #CJK UNIFIED IDEOGRAPH
+0x8DE5 0x698A  #CJK UNIFIED IDEOGRAPH
+0x8DE6 0x80B4  #CJK UNIFIED IDEOGRAPH
+0x8DE7 0x54B2  #CJK UNIFIED IDEOGRAPH
+0x8DE8 0x5D0E  #CJK UNIFIED IDEOGRAPH
+0x8DE9 0x57FC  #CJK UNIFIED IDEOGRAPH
+0x8DEA 0x7895  #CJK UNIFIED IDEOGRAPH
+0x8DEB 0x9DFA  #CJK UNIFIED IDEOGRAPH
+0x8DEC 0x4F5C  #CJK UNIFIED IDEOGRAPH
+0x8DED 0x524A  #CJK UNIFIED IDEOGRAPH
+0x8DEE 0x548B  #CJK UNIFIED IDEOGRAPH
+0x8DEF 0x643E  #CJK UNIFIED IDEOGRAPH
+0x8DF0 0x6628  #CJK UNIFIED IDEOGRAPH
+0x8DF1 0x6714  #CJK UNIFIED IDEOGRAPH
+0x8DF2 0x67F5  #CJK UNIFIED IDEOGRAPH
+0x8DF3 0x7A84  #CJK UNIFIED IDEOGRAPH
+0x8DF4 0x7B56  #CJK UNIFIED IDEOGRAPH
+0x8DF5 0x7D22  #CJK UNIFIED IDEOGRAPH
+0x8DF6 0x932F  #CJK UNIFIED IDEOGRAPH
+0x8DF7 0x685C  #CJK UNIFIED IDEOGRAPH
+0x8DF8 0x9BAD  #CJK UNIFIED IDEOGRAPH
+0x8DF9 0x7B39  #CJK UNIFIED IDEOGRAPH
+0x8DFA 0x5319  #CJK UNIFIED IDEOGRAPH
+0x8DFB 0x518A  #CJK UNIFIED IDEOGRAPH
+0x8DFC 0x5237  #CJK UNIFIED IDEOGRAPH
+0x8E40 0x5BDF  #CJK UNIFIED IDEOGRAPH
+0x8E41 0x62F6  #CJK UNIFIED IDEOGRAPH
+0x8E42 0x64AE  #CJK UNIFIED IDEOGRAPH
+0x8E43 0x64E6  #CJK UNIFIED IDEOGRAPH
+0x8E44 0x672D  #CJK UNIFIED IDEOGRAPH
+0x8E45 0x6BBA  #CJK UNIFIED IDEOGRAPH
+0x8E46 0x85A9  #CJK UNIFIED IDEOGRAPH
+0x8E47 0x96D1  #CJK UNIFIED IDEOGRAPH
+0x8E48 0x7690  #CJK UNIFIED IDEOGRAPH
+0x8E49 0x9BD6  #CJK UNIFIED IDEOGRAPH
+0x8E4A 0x634C  #CJK UNIFIED IDEOGRAPH
+0x8E4B 0x9306  #CJK UNIFIED IDEOGRAPH
+0x8E4C 0x9BAB  #CJK UNIFIED IDEOGRAPH
+0x8E4D 0x76BF  #CJK UNIFIED IDEOGRAPH
+0x8E4E 0x6652  #CJK UNIFIED IDEOGRAPH
+0x8E4F 0x4E09  #CJK UNIFIED IDEOGRAPH
+0x8E50 0x5098  #CJK UNIFIED IDEOGRAPH
+0x8E51 0x53C2  #CJK UNIFIED IDEOGRAPH
+0x8E52 0x5C71  #CJK UNIFIED IDEOGRAPH
+0x8E53 0x60E8  #CJK UNIFIED IDEOGRAPH
+0x8E54 0x6492  #CJK UNIFIED IDEOGRAPH
+0x8E55 0x6563  #CJK UNIFIED IDEOGRAPH
+0x8E56 0x685F  #CJK UNIFIED IDEOGRAPH
+0x8E57 0x71E6  #CJK UNIFIED IDEOGRAPH
+0x8E58 0x73CA  #CJK UNIFIED IDEOGRAPH
+0x8E59 0x7523  #CJK UNIFIED IDEOGRAPH
+0x8E5A 0x7B97  #CJK UNIFIED IDEOGRAPH
+0x8E5B 0x7E82  #CJK UNIFIED IDEOGRAPH
+0x8E5C 0x8695  #CJK UNIFIED IDEOGRAPH
+0x8E5D 0x8B83  #CJK UNIFIED IDEOGRAPH
+0x8E5E 0x8CDB  #CJK UNIFIED IDEOGRAPH
+0x8E5F 0x9178  #CJK UNIFIED IDEOGRAPH
+0x8E60 0x9910  #CJK UNIFIED IDEOGRAPH
+0x8E61 0x65AC  #CJK UNIFIED IDEOGRAPH
+0x8E62 0x66AB  #CJK UNIFIED IDEOGRAPH
+0x8E63 0x6B8B  #CJK UNIFIED IDEOGRAPH
+0x8E64 0x4ED5  #CJK UNIFIED IDEOGRAPH
+0x8E65 0x4ED4  #CJK UNIFIED IDEOGRAPH
+0x8E66 0x4F3A  #CJK UNIFIED IDEOGRAPH
+0x8E67 0x4F7F  #CJK UNIFIED IDEOGRAPH
+0x8E68 0x523A  #CJK UNIFIED IDEOGRAPH
+0x8E69 0x53F8  #CJK UNIFIED IDEOGRAPH
+0x8E6A 0x53F2  #CJK UNIFIED IDEOGRAPH
+0x8E6B 0x55E3  #CJK UNIFIED IDEOGRAPH
+0x8E6C 0x56DB  #CJK UNIFIED IDEOGRAPH
+0x8E6D 0x58EB  #CJK UNIFIED IDEOGRAPH
+0x8E6E 0x59CB  #CJK UNIFIED IDEOGRAPH
+0x8E6F 0x59C9  #CJK UNIFIED IDEOGRAPH
+0x8E70 0x59FF  #CJK UNIFIED IDEOGRAPH
+0x8E71 0x5B50  #CJK UNIFIED IDEOGRAPH
+0x8E72 0x5C4D  #CJK UNIFIED IDEOGRAPH
+0x8E73 0x5E02  #CJK UNIFIED IDEOGRAPH
+0x8E74 0x5E2B  #CJK UNIFIED IDEOGRAPH
+0x8E75 0x5FD7  #CJK UNIFIED IDEOGRAPH
+0x8E76 0x601D  #CJK UNIFIED IDEOGRAPH
+0x8E77 0x6307  #CJK UNIFIED IDEOGRAPH
+0x8E78 0x652F  #CJK UNIFIED IDEOGRAPH
+0x8E79 0x5B5C  #CJK UNIFIED IDEOGRAPH
+0x8E7A 0x65AF  #CJK UNIFIED IDEOGRAPH
+0x8E7B 0x65BD  #CJK UNIFIED IDEOGRAPH
+0x8E7C 0x65E8  #CJK UNIFIED IDEOGRAPH
+0x8E7D 0x679D  #CJK UNIFIED IDEOGRAPH
+0x8E7E 0x6B62  #CJK UNIFIED IDEOGRAPH
+0x8E80 0x6B7B  #CJK UNIFIED IDEOGRAPH
+0x8E81 0x6C0F  #CJK UNIFIED IDEOGRAPH
+0x8E82 0x7345  #CJK UNIFIED IDEOGRAPH
+0x8E83 0x7949  #CJK UNIFIED IDEOGRAPH
+0x8E84 0x79C1  #CJK UNIFIED IDEOGRAPH
+0x8E85 0x7CF8  #CJK UNIFIED IDEOGRAPH
+0x8E86 0x7D19  #CJK UNIFIED IDEOGRAPH
+0x8E87 0x7D2B  #CJK UNIFIED IDEOGRAPH
+0x8E88 0x80A2  #CJK UNIFIED IDEOGRAPH
+0x8E89 0x8102  #CJK UNIFIED IDEOGRAPH
+0x8E8A 0x81F3  #CJK UNIFIED IDEOGRAPH
+0x8E8B 0x8996  #CJK UNIFIED IDEOGRAPH
+0x8E8C 0x8A5E  #CJK UNIFIED IDEOGRAPH
+0x8E8D 0x8A69  #CJK UNIFIED IDEOGRAPH
+0x8E8E 0x8A66  #CJK UNIFIED IDEOGRAPH
+0x8E8F 0x8A8C  #CJK UNIFIED IDEOGRAPH
+0x8E90 0x8AEE  #CJK UNIFIED IDEOGRAPH
+0x8E91 0x8CC7  #CJK UNIFIED IDEOGRAPH
+0x8E92 0x8CDC  #CJK UNIFIED IDEOGRAPH
+0x8E93 0x96CC  #CJK UNIFIED IDEOGRAPH
+0x8E94 0x98FC  #CJK UNIFIED IDEOGRAPH
+0x8E95 0x6B6F  #CJK UNIFIED IDEOGRAPH
+0x8E96 0x4E8B  #CJK UNIFIED IDEOGRAPH
+0x8E97 0x4F3C  #CJK UNIFIED IDEOGRAPH
+0x8E98 0x4F8D  #CJK UNIFIED IDEOGRAPH
+0x8E99 0x5150  #CJK UNIFIED IDEOGRAPH
+0x8E9A 0x5B57  #CJK UNIFIED IDEOGRAPH
+0x8E9B 0x5BFA  #CJK UNIFIED IDEOGRAPH
+0x8E9C 0x6148  #CJK UNIFIED IDEOGRAPH
+0x8E9D 0x6301  #CJK UNIFIED IDEOGRAPH
+0x8E9E 0x6642  #CJK UNIFIED IDEOGRAPH
+0x8E9F 0x6B21  #CJK UNIFIED IDEOGRAPH
+0x8EA0 0x6ECB  #CJK UNIFIED IDEOGRAPH
+0x8EA1 0x6CBB  #CJK UNIFIED IDEOGRAPH
+0x8EA2 0x723E  #CJK UNIFIED IDEOGRAPH
+0x8EA3 0x74BD  #CJK UNIFIED IDEOGRAPH
+0x8EA4 0x75D4  #CJK UNIFIED IDEOGRAPH
+0x8EA5 0x78C1  #CJK UNIFIED IDEOGRAPH
+0x8EA6 0x793A  #CJK UNIFIED IDEOGRAPH
+0x8EA7 0x800C  #CJK UNIFIED IDEOGRAPH
+0x8EA8 0x8033  #CJK UNIFIED IDEOGRAPH
+0x8EA9 0x81EA  #CJK UNIFIED IDEOGRAPH
+0x8EAA 0x8494  #CJK UNIFIED IDEOGRAPH
+0x8EAB 0x8F9E  #CJK UNIFIED IDEOGRAPH
+0x8EAC 0x6C50  #CJK UNIFIED IDEOGRAPH
+0x8EAD 0x9E7F  #CJK UNIFIED IDEOGRAPH
+0x8EAE 0x5F0F  #CJK UNIFIED IDEOGRAPH
+0x8EAF 0x8B58  #CJK UNIFIED IDEOGRAPH
+0x8EB0 0x9D2B  #CJK UNIFIED IDEOGRAPH
+0x8EB1 0x7AFA  #CJK UNIFIED IDEOGRAPH
+0x8EB2 0x8EF8  #CJK UNIFIED IDEOGRAPH
+0x8EB3 0x5B8D  #CJK UNIFIED IDEOGRAPH
+0x8EB4 0x96EB  #CJK UNIFIED IDEOGRAPH
+0x8EB5 0x4E03  #CJK UNIFIED IDEOGRAPH
+0x8EB6 0x53F1  #CJK UNIFIED IDEOGRAPH
+0x8EB7 0x57F7  #CJK UNIFIED IDEOGRAPH
+0x8EB8 0x5931  #CJK UNIFIED IDEOGRAPH
+0x8EB9 0x5AC9  #CJK UNIFIED IDEOGRAPH
+0x8EBA 0x5BA4  #CJK UNIFIED IDEOGRAPH
+0x8EBB 0x6089  #CJK UNIFIED IDEOGRAPH
+0x8EBC 0x6E7F  #CJK UNIFIED IDEOGRAPH
+0x8EBD 0x6F06  #CJK UNIFIED IDEOGRAPH
+0x8EBE 0x75BE  #CJK UNIFIED IDEOGRAPH
+0x8EBF 0x8CEA  #CJK UNIFIED IDEOGRAPH
+0x8EC0 0x5B9F  #CJK UNIFIED IDEOGRAPH
+0x8EC1 0x8500  #CJK UNIFIED IDEOGRAPH
+0x8EC2 0x7BE0  #CJK UNIFIED IDEOGRAPH
+0x8EC3 0x5072  #CJK UNIFIED IDEOGRAPH
+0x8EC4 0x67F4  #CJK UNIFIED IDEOGRAPH
+0x8EC5 0x829D  #CJK UNIFIED IDEOGRAPH
+0x8EC6 0x5C61  #CJK UNIFIED IDEOGRAPH
+0x8EC7 0x854A  #CJK UNIFIED IDEOGRAPH
+0x8EC8 0x7E1E  #CJK UNIFIED IDEOGRAPH
+0x8EC9 0x820E  #CJK UNIFIED IDEOGRAPH
+0x8ECA 0x5199  #CJK UNIFIED IDEOGRAPH
+0x8ECB 0x5C04  #CJK UNIFIED IDEOGRAPH
+0x8ECC 0x6368  #CJK UNIFIED IDEOGRAPH
+0x8ECD 0x8D66  #CJK UNIFIED IDEOGRAPH
+0x8ECE 0x659C  #CJK UNIFIED IDEOGRAPH
+0x8ECF 0x716E  #CJK UNIFIED IDEOGRAPH
+0x8ED0 0x793E  #CJK UNIFIED IDEOGRAPH
+0x8ED1 0x7D17  #CJK UNIFIED IDEOGRAPH
+0x8ED2 0x8005  #CJK UNIFIED IDEOGRAPH
+0x8ED3 0x8B1D  #CJK UNIFIED IDEOGRAPH
+0x8ED4 0x8ECA  #CJK UNIFIED IDEOGRAPH
+0x8ED5 0x906E  #CJK UNIFIED IDEOGRAPH
+0x8ED6 0x86C7  #CJK UNIFIED IDEOGRAPH
+0x8ED7 0x90AA  #CJK UNIFIED IDEOGRAPH
+0x8ED8 0x501F  #CJK UNIFIED IDEOGRAPH
+0x8ED9 0x52FA  #CJK UNIFIED IDEOGRAPH
+0x8EDA 0x5C3A  #CJK UNIFIED IDEOGRAPH
+0x8EDB 0x6753  #CJK UNIFIED IDEOGRAPH
+0x8EDC 0x707C  #CJK UNIFIED IDEOGRAPH
+0x8EDD 0x7235  #CJK UNIFIED IDEOGRAPH
+0x8EDE 0x914C  #CJK UNIFIED IDEOGRAPH
+0x8EDF 0x91C8  #CJK UNIFIED IDEOGRAPH
+0x8EE0 0x932B  #CJK UNIFIED IDEOGRAPH
+0x8EE1 0x82E5  #CJK UNIFIED IDEOGRAPH
+0x8EE2 0x5BC2  #CJK UNIFIED IDEOGRAPH
+0x8EE3 0x5F31  #CJK UNIFIED IDEOGRAPH
+0x8EE4 0x60F9  #CJK UNIFIED IDEOGRAPH
+0x8EE5 0x4E3B  #CJK UNIFIED IDEOGRAPH
+0x8EE6 0x53D6  #CJK UNIFIED IDEOGRAPH
+0x8EE7 0x5B88  #CJK UNIFIED IDEOGRAPH
+0x8EE8 0x624B  #CJK UNIFIED IDEOGRAPH
+0x8EE9 0x6731  #CJK UNIFIED IDEOGRAPH
+0x8EEA 0x6B8A  #CJK UNIFIED IDEOGRAPH
+0x8EEB 0x72E9  #CJK UNIFIED IDEOGRAPH
+0x8EEC 0x73E0  #CJK UNIFIED IDEOGRAPH
+0x8EED 0x7A2E  #CJK UNIFIED IDEOGRAPH
+0x8EEE 0x816B  #CJK UNIFIED IDEOGRAPH
+0x8EEF 0x8DA3  #CJK UNIFIED IDEOGRAPH
+0x8EF0 0x9152  #CJK UNIFIED IDEOGRAPH
+0x8EF1 0x9996  #CJK UNIFIED IDEOGRAPH
+0x8EF2 0x5112  #CJK UNIFIED IDEOGRAPH
+0x8EF3 0x53D7  #CJK UNIFIED IDEOGRAPH
+0x8EF4 0x546A  #CJK UNIFIED IDEOGRAPH
+0x8EF5 0x5BFF  #CJK UNIFIED IDEOGRAPH
+0x8EF6 0x6388  #CJK UNIFIED IDEOGRAPH
+0x8EF7 0x6A39  #CJK UNIFIED IDEOGRAPH
+0x8EF8 0x7DAC  #CJK UNIFIED IDEOGRAPH
+0x8EF9 0x9700  #CJK UNIFIED IDEOGRAPH
+0x8EFA 0x56DA  #CJK UNIFIED IDEOGRAPH
+0x8EFB 0x53CE  #CJK UNIFIED IDEOGRAPH
+0x8EFC 0x5468  #CJK UNIFIED IDEOGRAPH
+0x8F40 0x5B97  #CJK UNIFIED IDEOGRAPH
+0x8F41 0x5C31  #CJK UNIFIED IDEOGRAPH
+0x8F42 0x5DDE  #CJK UNIFIED IDEOGRAPH
+0x8F43 0x4FEE  #CJK UNIFIED IDEOGRAPH
+0x8F44 0x6101  #CJK UNIFIED IDEOGRAPH
+0x8F45 0x62FE  #CJK UNIFIED IDEOGRAPH
+0x8F46 0x6D32  #CJK UNIFIED IDEOGRAPH
+0x8F47 0x79C0  #CJK UNIFIED IDEOGRAPH
+0x8F48 0x79CB  #CJK UNIFIED IDEOGRAPH
+0x8F49 0x7D42  #CJK UNIFIED IDEOGRAPH
+0x8F4A 0x7E4D  #CJK UNIFIED IDEOGRAPH
+0x8F4B 0x7FD2  #CJK UNIFIED IDEOGRAPH
+0x8F4C 0x81ED  #CJK UNIFIED IDEOGRAPH
+0x8F4D 0x821F  #CJK UNIFIED IDEOGRAPH
+0x8F4E 0x8490  #CJK UNIFIED IDEOGRAPH
+0x8F4F 0x8846  #CJK UNIFIED IDEOGRAPH
+0x8F50 0x8972  #CJK UNIFIED IDEOGRAPH
+0x8F51 0x8B90  #CJK UNIFIED IDEOGRAPH
+0x8F52 0x8E74  #CJK UNIFIED IDEOGRAPH
+0x8F53 0x8F2F  #CJK UNIFIED IDEOGRAPH
+0x8F54 0x9031  #CJK UNIFIED IDEOGRAPH
+0x8F55 0x914B  #CJK UNIFIED IDEOGRAPH
+0x8F56 0x916C  #CJK UNIFIED IDEOGRAPH
+0x8F57 0x96C6  #CJK UNIFIED IDEOGRAPH
+0x8F58 0x919C  #CJK UNIFIED IDEOGRAPH
+0x8F59 0x4EC0  #CJK UNIFIED IDEOGRAPH
+0x8F5A 0x4F4F  #CJK UNIFIED IDEOGRAPH
+0x8F5B 0x5145  #CJK UNIFIED IDEOGRAPH
+0x8F5C 0x5341  #CJK UNIFIED IDEOGRAPH
+0x8F5D 0x5F93  #CJK UNIFIED IDEOGRAPH
+0x8F5E 0x620E  #CJK UNIFIED IDEOGRAPH
+0x8F5F 0x67D4  #CJK UNIFIED IDEOGRAPH
+0x8F60 0x6C41  #CJK UNIFIED IDEOGRAPH
+0x8F61 0x6E0B  #CJK UNIFIED IDEOGRAPH
+0x8F62 0x7363  #CJK UNIFIED IDEOGRAPH
+0x8F63 0x7E26  #CJK UNIFIED IDEOGRAPH
+0x8F64 0x91CD  #CJK UNIFIED IDEOGRAPH
+0x8F65 0x9283  #CJK UNIFIED IDEOGRAPH
+0x8F66 0x53D4  #CJK UNIFIED IDEOGRAPH
+0x8F67 0x5919  #CJK UNIFIED IDEOGRAPH
+0x8F68 0x5BBF  #CJK UNIFIED IDEOGRAPH
+0x8F69 0x6DD1  #CJK UNIFIED IDEOGRAPH
+0x8F6A 0x795D  #CJK UNIFIED IDEOGRAPH
+0x8F6B 0x7E2E  #CJK UNIFIED IDEOGRAPH
+0x8F6C 0x7C9B  #CJK UNIFIED IDEOGRAPH
+0x8F6D 0x587E  #CJK UNIFIED IDEOGRAPH
+0x8F6E 0x719F  #CJK UNIFIED IDEOGRAPH
+0x8F6F 0x51FA  #CJK UNIFIED IDEOGRAPH
+0x8F70 0x8853  #CJK UNIFIED IDEOGRAPH
+0x8F71 0x8FF0  #CJK UNIFIED IDEOGRAPH
+0x8F72 0x4FCA  #CJK UNIFIED IDEOGRAPH
+0x8F73 0x5CFB  #CJK UNIFIED IDEOGRAPH
+0x8F74 0x6625  #CJK UNIFIED IDEOGRAPH
+0x8F75 0x77AC  #CJK UNIFIED IDEOGRAPH
+0x8F76 0x7AE3  #CJK UNIFIED IDEOGRAPH
+0x8F77 0x821C  #CJK UNIFIED IDEOGRAPH
+0x8F78 0x99FF  #CJK UNIFIED IDEOGRAPH
+0x8F79 0x51C6  #CJK UNIFIED IDEOGRAPH
+0x8F7A 0x5FAA  #CJK UNIFIED IDEOGRAPH
+0x8F7B 0x65EC  #CJK UNIFIED IDEOGRAPH
+0x8F7C 0x696F  #CJK UNIFIED IDEOGRAPH
+0x8F7D 0x6B89  #CJK UNIFIED IDEOGRAPH
+0x8F7E 0x6DF3  #CJK UNIFIED IDEOGRAPH
+0x8F80 0x6E96  #CJK UNIFIED IDEOGRAPH
+0x8F81 0x6F64  #CJK UNIFIED IDEOGRAPH
+0x8F82 0x76FE  #CJK UNIFIED IDEOGRAPH
+0x8F83 0x7D14  #CJK UNIFIED IDEOGRAPH
+0x8F84 0x5DE1  #CJK UNIFIED IDEOGRAPH
+0x8F85 0x9075  #CJK UNIFIED IDEOGRAPH
+0x8F86 0x9187  #CJK UNIFIED IDEOGRAPH
+0x8F87 0x9806  #CJK UNIFIED IDEOGRAPH
+0x8F88 0x51E6  #CJK UNIFIED IDEOGRAPH
+0x8F89 0x521D  #CJK UNIFIED IDEOGRAPH
+0x8F8A 0x6240  #CJK UNIFIED IDEOGRAPH
+0x8F8B 0x6691  #CJK UNIFIED IDEOGRAPH
+0x8F8C 0x66D9  #CJK UNIFIED IDEOGRAPH
+0x8F8D 0x6E1A  #CJK UNIFIED IDEOGRAPH
+0x8F8E 0x5EB6  #CJK UNIFIED IDEOGRAPH
+0x8F8F 0x7DD2  #CJK UNIFIED IDEOGRAPH
+0x8F90 0x7F72  #CJK UNIFIED IDEOGRAPH
+0x8F91 0x66F8  #CJK UNIFIED IDEOGRAPH
+0x8F92 0x85AF  #CJK UNIFIED IDEOGRAPH
+0x8F93 0x85F7  #CJK UNIFIED IDEOGRAPH
+0x8F94 0x8AF8  #CJK UNIFIED IDEOGRAPH
+0x8F95 0x52A9  #CJK UNIFIED IDEOGRAPH
+0x8F96 0x53D9  #CJK UNIFIED IDEOGRAPH
+0x8F97 0x5973  #CJK UNIFIED IDEOGRAPH
+0x8F98 0x5E8F  #CJK UNIFIED IDEOGRAPH
+0x8F99 0x5F90  #CJK UNIFIED IDEOGRAPH
+0x8F9A 0x6055  #CJK UNIFIED IDEOGRAPH
+0x8F9B 0x92E4  #CJK UNIFIED IDEOGRAPH
+0x8F9C 0x9664  #CJK UNIFIED IDEOGRAPH
+0x8F9D 0x50B7  #CJK UNIFIED IDEOGRAPH
+0x8F9E 0x511F  #CJK UNIFIED IDEOGRAPH
+0x8F9F 0x52DD  #CJK UNIFIED IDEOGRAPH
+0x8FA0 0x5320  #CJK UNIFIED IDEOGRAPH
+0x8FA1 0x5347  #CJK UNIFIED IDEOGRAPH
+0x8FA2 0x53EC  #CJK UNIFIED IDEOGRAPH
+0x8FA3 0x54E8  #CJK UNIFIED IDEOGRAPH
+0x8FA4 0x5546  #CJK UNIFIED IDEOGRAPH
+0x8FA5 0x5531  #CJK UNIFIED IDEOGRAPH
+0x8FA6 0x5617  #CJK UNIFIED IDEOGRAPH
+0x8FA7 0x5968  #CJK UNIFIED IDEOGRAPH
+0x8FA8 0x59BE  #CJK UNIFIED IDEOGRAPH
+0x8FA9 0x5A3C  #CJK UNIFIED IDEOGRAPH
+0x8FAA 0x5BB5  #CJK UNIFIED IDEOGRAPH
+0x8FAB 0x5C06  #CJK UNIFIED IDEOGRAPH
+0x8FAC 0x5C0F  #CJK UNIFIED IDEOGRAPH
+0x8FAD 0x5C11  #CJK UNIFIED IDEOGRAPH
+0x8FAE 0x5C1A  #CJK UNIFIED IDEOGRAPH
+0x8FAF 0x5E84  #CJK UNIFIED IDEOGRAPH
+0x8FB0 0x5E8A  #CJK UNIFIED IDEOGRAPH
+0x8FB1 0x5EE0  #CJK UNIFIED IDEOGRAPH
+0x8FB2 0x5F70  #CJK UNIFIED IDEOGRAPH
+0x8FB3 0x627F  #CJK UNIFIED IDEOGRAPH
+0x8FB4 0x6284  #CJK UNIFIED IDEOGRAPH
+0x8FB5 0x62DB  #CJK UNIFIED IDEOGRAPH
+0x8FB6 0x638C  #CJK UNIFIED IDEOGRAPH
+0x8FB7 0x6377  #CJK UNIFIED IDEOGRAPH
+0x8FB8 0x6607  #CJK UNIFIED IDEOGRAPH
+0x8FB9 0x660C  #CJK UNIFIED IDEOGRAPH
+0x8FBA 0x662D  #CJK UNIFIED IDEOGRAPH
+0x8FBB 0x6676  #CJK UNIFIED IDEOGRAPH
+0x8FBC 0x677E  #CJK UNIFIED IDEOGRAPH
+0x8FBD 0x68A2  #CJK UNIFIED IDEOGRAPH
+0x8FBE 0x6A1F  #CJK UNIFIED IDEOGRAPH
+0x8FBF 0x6A35  #CJK UNIFIED IDEOGRAPH
+0x8FC0 0x6CBC  #CJK UNIFIED IDEOGRAPH
+0x8FC1 0x6D88  #CJK UNIFIED IDEOGRAPH
+0x8FC2 0x6E09  #CJK UNIFIED IDEOGRAPH
+0x8FC3 0x6E58  #CJK UNIFIED IDEOGRAPH
+0x8FC4 0x713C  #CJK UNIFIED IDEOGRAPH
+0x8FC5 0x7126  #CJK UNIFIED IDEOGRAPH
+0x8FC6 0x7167  #CJK UNIFIED IDEOGRAPH
+0x8FC7 0x75C7  #CJK UNIFIED IDEOGRAPH
+0x8FC8 0x7701  #CJK UNIFIED IDEOGRAPH
+0x8FC9 0x785D  #CJK UNIFIED IDEOGRAPH
+0x8FCA 0x7901  #CJK UNIFIED IDEOGRAPH
+0x8FCB 0x7965  #CJK UNIFIED IDEOGRAPH
+0x8FCC 0x79F0  #CJK UNIFIED IDEOGRAPH
+0x8FCD 0x7AE0  #CJK UNIFIED IDEOGRAPH
+0x8FCE 0x7B11  #CJK UNIFIED IDEOGRAPH
+0x8FCF 0x7CA7  #CJK UNIFIED IDEOGRAPH
+0x8FD0 0x7D39  #CJK UNIFIED IDEOGRAPH
+0x8FD1 0x8096  #CJK UNIFIED IDEOGRAPH
+0x8FD2 0x83D6  #CJK UNIFIED IDEOGRAPH
+0x8FD3 0x848B  #CJK UNIFIED IDEOGRAPH
+0x8FD4 0x8549  #CJK UNIFIED IDEOGRAPH
+0x8FD5 0x885D  #CJK UNIFIED IDEOGRAPH
+0x8FD6 0x88F3  #CJK UNIFIED IDEOGRAPH
+0x8FD7 0x8A1F  #CJK UNIFIED IDEOGRAPH
+0x8FD8 0x8A3C  #CJK UNIFIED IDEOGRAPH
+0x8FD9 0x8A54  #CJK UNIFIED IDEOGRAPH
+0x8FDA 0x8A73  #CJK UNIFIED IDEOGRAPH
+0x8FDB 0x8C61  #CJK UNIFIED IDEOGRAPH
+0x8FDC 0x8CDE  #CJK UNIFIED IDEOGRAPH
+0x8FDD 0x91A4  #CJK UNIFIED IDEOGRAPH
+0x8FDE 0x9266  #CJK UNIFIED IDEOGRAPH
+0x8FDF 0x937E  #CJK UNIFIED IDEOGRAPH
+0x8FE0 0x9418  #CJK UNIFIED IDEOGRAPH
+0x8FE1 0x969C  #CJK UNIFIED IDEOGRAPH
+0x8FE2 0x9798  #CJK UNIFIED IDEOGRAPH
+0x8FE3 0x4E0A  #CJK UNIFIED IDEOGRAPH
+0x8FE4 0x4E08  #CJK UNIFIED IDEOGRAPH
+0x8FE5 0x4E1E  #CJK UNIFIED IDEOGRAPH
+0x8FE6 0x4E57  #CJK UNIFIED IDEOGRAPH
+0x8FE7 0x5197  #CJK UNIFIED IDEOGRAPH
+0x8FE8 0x5270  #CJK UNIFIED IDEOGRAPH
+0x8FE9 0x57CE  #CJK UNIFIED IDEOGRAPH
+0x8FEA 0x5834  #CJK UNIFIED IDEOGRAPH
+0x8FEB 0x58CC  #CJK UNIFIED IDEOGRAPH
+0x8FEC 0x5B22  #CJK UNIFIED IDEOGRAPH
+0x8FED 0x5E38  #CJK UNIFIED IDEOGRAPH
+0x8FEE 0x60C5  #CJK UNIFIED IDEOGRAPH
+0x8FEF 0x64FE  #CJK UNIFIED IDEOGRAPH
+0x8FF0 0x6761  #CJK UNIFIED IDEOGRAPH
+0x8FF1 0x6756  #CJK UNIFIED IDEOGRAPH
+0x8FF2 0x6D44  #CJK UNIFIED IDEOGRAPH
+0x8FF3 0x72B6  #CJK UNIFIED IDEOGRAPH
+0x8FF4 0x7573  #CJK UNIFIED IDEOGRAPH
+0x8FF5 0x7A63  #CJK UNIFIED IDEOGRAPH
+0x8FF6 0x84B8  #CJK UNIFIED IDEOGRAPH
+0x8FF7 0x8B72  #CJK UNIFIED IDEOGRAPH
+0x8FF8 0x91B8  #CJK UNIFIED IDEOGRAPH
+0x8FF9 0x9320  #CJK UNIFIED IDEOGRAPH
+0x8FFA 0x5631  #CJK UNIFIED IDEOGRAPH
+0x8FFB 0x57F4  #CJK UNIFIED IDEOGRAPH
+0x8FFC 0x98FE  #CJK UNIFIED IDEOGRAPH
+0x9040 0x62ED  #CJK UNIFIED IDEOGRAPH
+0x9041 0x690D  #CJK UNIFIED IDEOGRAPH
+0x9042 0x6B96  #CJK UNIFIED IDEOGRAPH
+0x9043 0x71ED  #CJK UNIFIED IDEOGRAPH
+0x9044 0x7E54  #CJK UNIFIED IDEOGRAPH
+0x9045 0x8077  #CJK UNIFIED IDEOGRAPH
+0x9046 0x8272  #CJK UNIFIED IDEOGRAPH
+0x9047 0x89E6  #CJK UNIFIED IDEOGRAPH
+0x9048 0x98DF  #CJK UNIFIED IDEOGRAPH
+0x9049 0x8755  #CJK UNIFIED IDEOGRAPH
+0x904A 0x8FB1  #CJK UNIFIED IDEOGRAPH
+0x904B 0x5C3B  #CJK UNIFIED IDEOGRAPH
+0x904C 0x4F38  #CJK UNIFIED IDEOGRAPH
+0x904D 0x4FE1  #CJK UNIFIED IDEOGRAPH
+0x904E 0x4FB5  #CJK UNIFIED IDEOGRAPH
+0x904F 0x5507  #CJK UNIFIED IDEOGRAPH
+0x9050 0x5A20  #CJK UNIFIED IDEOGRAPH
+0x9051 0x5BDD  #CJK UNIFIED IDEOGRAPH
+0x9052 0x5BE9  #CJK UNIFIED IDEOGRAPH
+0x9053 0x5FC3  #CJK UNIFIED IDEOGRAPH
+0x9054 0x614E  #CJK UNIFIED IDEOGRAPH
+0x9055 0x632F  #CJK UNIFIED IDEOGRAPH
+0x9056 0x65B0  #CJK UNIFIED IDEOGRAPH
+0x9057 0x664B  #CJK UNIFIED IDEOGRAPH
+0x9058 0x68EE  #CJK UNIFIED IDEOGRAPH
+0x9059 0x699B  #CJK UNIFIED IDEOGRAPH
+0x905A 0x6D78  #CJK UNIFIED IDEOGRAPH
+0x905B 0x6DF1  #CJK UNIFIED IDEOGRAPH
+0x905C 0x7533  #CJK UNIFIED IDEOGRAPH
+0x905D 0x75B9  #CJK UNIFIED IDEOGRAPH
+0x905E 0x771F  #CJK UNIFIED IDEOGRAPH
+0x905F 0x795E  #CJK UNIFIED IDEOGRAPH
+0x9060 0x79E6  #CJK UNIFIED IDEOGRAPH
+0x9061 0x7D33  #CJK UNIFIED IDEOGRAPH
+0x9062 0x81E3  #CJK UNIFIED IDEOGRAPH
+0x9063 0x82AF  #CJK UNIFIED IDEOGRAPH
+0x9064 0x85AA  #CJK UNIFIED IDEOGRAPH
+0x9065 0x89AA  #CJK UNIFIED IDEOGRAPH
+0x9066 0x8A3A  #CJK UNIFIED IDEOGRAPH
+0x9067 0x8EAB  #CJK UNIFIED IDEOGRAPH
+0x9068 0x8F9B  #CJK UNIFIED IDEOGRAPH
+0x9069 0x9032  #CJK UNIFIED IDEOGRAPH
+0x906A 0x91DD  #CJK UNIFIED IDEOGRAPH
+0x906B 0x9707  #CJK UNIFIED IDEOGRAPH
+0x906C 0x4EBA  #CJK UNIFIED IDEOGRAPH
+0x906D 0x4EC1  #CJK UNIFIED IDEOGRAPH
+0x906E 0x5203  #CJK UNIFIED IDEOGRAPH
+0x906F 0x5875  #CJK UNIFIED IDEOGRAPH
+0x9070 0x58EC  #CJK UNIFIED IDEOGRAPH
+0x9071 0x5C0B  #CJK UNIFIED IDEOGRAPH
+0x9072 0x751A  #CJK UNIFIED IDEOGRAPH
+0x9073 0x5C3D  #CJK UNIFIED IDEOGRAPH
+0x9074 0x814E  #CJK UNIFIED IDEOGRAPH
+0x9075 0x8A0A  #CJK UNIFIED IDEOGRAPH
+0x9076 0x8FC5  #CJK UNIFIED IDEOGRAPH
+0x9077 0x9663  #CJK UNIFIED IDEOGRAPH
+0x9078 0x976D  #CJK UNIFIED IDEOGRAPH
+0x9079 0x7B25  #CJK UNIFIED IDEOGRAPH
+0x907A 0x8ACF  #CJK UNIFIED IDEOGRAPH
+0x907B 0x9808  #CJK UNIFIED IDEOGRAPH
+0x907C 0x9162  #CJK UNIFIED IDEOGRAPH
+0x907D 0x56F3  #CJK UNIFIED IDEOGRAPH
+0x907E 0x53A8  #CJK UNIFIED IDEOGRAPH
+0x9080 0x9017  #CJK UNIFIED IDEOGRAPH
+0x9081 0x5439  #CJK UNIFIED IDEOGRAPH
+0x9082 0x5782  #CJK UNIFIED IDEOGRAPH
+0x9083 0x5E25  #CJK UNIFIED IDEOGRAPH
+0x9084 0x63A8  #CJK UNIFIED IDEOGRAPH
+0x9085 0x6C34  #CJK UNIFIED IDEOGRAPH
+0x9086 0x708A  #CJK UNIFIED IDEOGRAPH
+0x9087 0x7761  #CJK UNIFIED IDEOGRAPH
+0x9088 0x7C8B  #CJK UNIFIED IDEOGRAPH
+0x9089 0x7FE0  #CJK UNIFIED IDEOGRAPH
+0x908A 0x8870  #CJK UNIFIED IDEOGRAPH
+0x908B 0x9042  #CJK UNIFIED IDEOGRAPH
+0x908C 0x9154  #CJK UNIFIED IDEOGRAPH
+0x908D 0x9310  #CJK UNIFIED IDEOGRAPH
+0x908E 0x9318  #CJK UNIFIED IDEOGRAPH
+0x908F 0x968F  #CJK UNIFIED IDEOGRAPH
+0x9090 0x745E  #CJK UNIFIED IDEOGRAPH
+0x9091 0x9AC4  #CJK UNIFIED IDEOGRAPH
+0x9092 0x5D07  #CJK UNIFIED IDEOGRAPH
+0x9093 0x5D69  #CJK UNIFIED IDEOGRAPH
+0x9094 0x6570  #CJK UNIFIED IDEOGRAPH
+0x9095 0x67A2  #CJK UNIFIED IDEOGRAPH
+0x9096 0x8DA8  #CJK UNIFIED IDEOGRAPH
+0x9097 0x96DB  #CJK UNIFIED IDEOGRAPH
+0x9098 0x636E  #CJK UNIFIED IDEOGRAPH
+0x9099 0x6749  #CJK UNIFIED IDEOGRAPH
+0x909A 0x6919  #CJK UNIFIED IDEOGRAPH
+0x909B 0x83C5  #CJK UNIFIED IDEOGRAPH
+0x909C 0x9817  #CJK UNIFIED IDEOGRAPH
+0x909D 0x96C0  #CJK UNIFIED IDEOGRAPH
+0x909E 0x88FE  #CJK UNIFIED IDEOGRAPH
+0x909F 0x6F84  #CJK UNIFIED IDEOGRAPH
+0x90A0 0x647A  #CJK UNIFIED IDEOGRAPH
+0x90A1 0x5BF8  #CJK UNIFIED IDEOGRAPH
+0x90A2 0x4E16  #CJK UNIFIED IDEOGRAPH
+0x90A3 0x702C  #CJK UNIFIED IDEOGRAPH
+0x90A4 0x755D  #CJK UNIFIED IDEOGRAPH
+0x90A5 0x662F  #CJK UNIFIED IDEOGRAPH
+0x90A6 0x51C4  #CJK UNIFIED IDEOGRAPH
+0x90A7 0x5236  #CJK UNIFIED IDEOGRAPH
+0x90A8 0x52E2  #CJK UNIFIED IDEOGRAPH
+0x90A9 0x59D3  #CJK UNIFIED IDEOGRAPH
+0x90AA 0x5F81  #CJK UNIFIED IDEOGRAPH
+0x90AB 0x6027  #CJK UNIFIED IDEOGRAPH
+0x90AC 0x6210  #CJK UNIFIED IDEOGRAPH
+0x90AD 0x653F  #CJK UNIFIED IDEOGRAPH
+0x90AE 0x6574  #CJK UNIFIED IDEOGRAPH
+0x90AF 0x661F  #CJK UNIFIED IDEOGRAPH
+0x90B0 0x6674  #CJK UNIFIED IDEOGRAPH
+0x90B1 0x68F2  #CJK UNIFIED IDEOGRAPH
+0x90B2 0x6816  #CJK UNIFIED IDEOGRAPH
+0x90B3 0x6B63  #CJK UNIFIED IDEOGRAPH
+0x90B4 0x6E05  #CJK UNIFIED IDEOGRAPH
+0x90B5 0x7272  #CJK UNIFIED IDEOGRAPH
+0x90B6 0x751F  #CJK UNIFIED IDEOGRAPH
+0x90B7 0x76DB  #CJK UNIFIED IDEOGRAPH
+0x90B8 0x7CBE  #CJK UNIFIED IDEOGRAPH
+0x90B9 0x8056  #CJK UNIFIED IDEOGRAPH
+0x90BA 0x58F0  #CJK UNIFIED IDEOGRAPH
+0x90BB 0x88FD  #CJK UNIFIED IDEOGRAPH
+0x90BC 0x897F  #CJK UNIFIED IDEOGRAPH
+0x90BD 0x8AA0  #CJK UNIFIED IDEOGRAPH
+0x90BE 0x8A93  #CJK UNIFIED IDEOGRAPH
+0x90BF 0x8ACB  #CJK UNIFIED IDEOGRAPH
+0x90C0 0x901D  #CJK UNIFIED IDEOGRAPH
+0x90C1 0x9192  #CJK UNIFIED IDEOGRAPH
+0x90C2 0x9752  #CJK UNIFIED IDEOGRAPH
+0x90C3 0x9759  #CJK UNIFIED IDEOGRAPH
+0x90C4 0x6589  #CJK UNIFIED IDEOGRAPH
+0x90C5 0x7A0E  #CJK UNIFIED IDEOGRAPH
+0x90C6 0x8106  #CJK UNIFIED IDEOGRAPH
+0x90C7 0x96BB  #CJK UNIFIED IDEOGRAPH
+0x90C8 0x5E2D  #CJK UNIFIED IDEOGRAPH
+0x90C9 0x60DC  #CJK UNIFIED IDEOGRAPH
+0x90CA 0x621A  #CJK UNIFIED IDEOGRAPH
+0x90CB 0x65A5  #CJK UNIFIED IDEOGRAPH
+0x90CC 0x6614  #CJK UNIFIED IDEOGRAPH
+0x90CD 0x6790  #CJK UNIFIED IDEOGRAPH
+0x90CE 0x77F3  #CJK UNIFIED IDEOGRAPH
+0x90CF 0x7A4D  #CJK UNIFIED IDEOGRAPH
+0x90D0 0x7C4D  #CJK UNIFIED IDEOGRAPH
+0x90D1 0x7E3E  #CJK UNIFIED IDEOGRAPH
+0x90D2 0x810A  #CJK UNIFIED IDEOGRAPH
+0x90D3 0x8CAC  #CJK UNIFIED IDEOGRAPH
+0x90D4 0x8D64  #CJK UNIFIED IDEOGRAPH
+0x90D5 0x8DE1  #CJK UNIFIED IDEOGRAPH
+0x90D6 0x8E5F  #CJK UNIFIED IDEOGRAPH
+0x90D7 0x78A9  #CJK UNIFIED IDEOGRAPH
+0x90D8 0x5207  #CJK UNIFIED IDEOGRAPH
+0x90D9 0x62D9  #CJK UNIFIED IDEOGRAPH
+0x90DA 0x63A5  #CJK UNIFIED IDEOGRAPH
+0x90DB 0x6442  #CJK UNIFIED IDEOGRAPH
+0x90DC 0x6298  #CJK UNIFIED IDEOGRAPH
+0x90DD 0x8A2D  #CJK UNIFIED IDEOGRAPH
+0x90DE 0x7A83  #CJK UNIFIED IDEOGRAPH
+0x90DF 0x7BC0  #CJK UNIFIED IDEOGRAPH
+0x90E0 0x8AAC  #CJK UNIFIED IDEOGRAPH
+0x90E1 0x96EA  #CJK UNIFIED IDEOGRAPH
+0x90E2 0x7D76  #CJK UNIFIED IDEOGRAPH
+0x90E3 0x820C  #CJK UNIFIED IDEOGRAPH
+0x90E4 0x8749  #CJK UNIFIED IDEOGRAPH
+0x90E5 0x4ED9  #CJK UNIFIED IDEOGRAPH
+0x90E6 0x5148  #CJK UNIFIED IDEOGRAPH
+0x90E7 0x5343  #CJK UNIFIED IDEOGRAPH
+0x90E8 0x5360  #CJK UNIFIED IDEOGRAPH
+0x90E9 0x5BA3  #CJK UNIFIED IDEOGRAPH
+0x90EA 0x5C02  #CJK UNIFIED IDEOGRAPH
+0x90EB 0x5C16  #CJK UNIFIED IDEOGRAPH
+0x90EC 0x5DDD  #CJK UNIFIED IDEOGRAPH
+0x90ED 0x6226  #CJK UNIFIED IDEOGRAPH
+0x90EE 0x6247  #CJK UNIFIED IDEOGRAPH
+0x90EF 0x64B0  #CJK UNIFIED IDEOGRAPH
+0x90F0 0x6813  #CJK UNIFIED IDEOGRAPH
+0x90F1 0x6834  #CJK UNIFIED IDEOGRAPH
+0x90F2 0x6CC9  #CJK UNIFIED IDEOGRAPH
+0x90F3 0x6D45  #CJK UNIFIED IDEOGRAPH
+0x90F4 0x6D17  #CJK UNIFIED IDEOGRAPH
+0x90F5 0x67D3  #CJK UNIFIED IDEOGRAPH
+0x90F6 0x6F5C  #CJK UNIFIED IDEOGRAPH
+0x90F7 0x714E  #CJK UNIFIED IDEOGRAPH
+0x90F8 0x717D  #CJK UNIFIED IDEOGRAPH
+0x90F9 0x65CB  #CJK UNIFIED IDEOGRAPH
+0x90FA 0x7A7F  #CJK UNIFIED IDEOGRAPH
+0x90FB 0x7BAD  #CJK UNIFIED IDEOGRAPH
+0x90FC 0x7DDA  #CJK UNIFIED IDEOGRAPH
+0x9140 0x7E4A  #CJK UNIFIED IDEOGRAPH
+0x9141 0x7FA8  #CJK UNIFIED IDEOGRAPH
+0x9142 0x817A  #CJK UNIFIED IDEOGRAPH
+0x9143 0x821B  #CJK UNIFIED IDEOGRAPH
+0x9144 0x8239  #CJK UNIFIED IDEOGRAPH
+0x9145 0x85A6  #CJK UNIFIED IDEOGRAPH
+0x9146 0x8A6E  #CJK UNIFIED IDEOGRAPH
+0x9147 0x8CCE  #CJK UNIFIED IDEOGRAPH
+0x9148 0x8DF5  #CJK UNIFIED IDEOGRAPH
+0x9149 0x9078  #CJK UNIFIED IDEOGRAPH
+0x914A 0x9077  #CJK UNIFIED IDEOGRAPH
+0x914B 0x92AD  #CJK UNIFIED IDEOGRAPH
+0x914C 0x9291  #CJK UNIFIED IDEOGRAPH
+0x914D 0x9583  #CJK UNIFIED IDEOGRAPH
+0x914E 0x9BAE  #CJK UNIFIED IDEOGRAPH
+0x914F 0x524D  #CJK UNIFIED IDEOGRAPH
+0x9150 0x5584  #CJK UNIFIED IDEOGRAPH
+0x9151 0x6F38  #CJK UNIFIED IDEOGRAPH
+0x9152 0x7136  #CJK UNIFIED IDEOGRAPH
+0x9153 0x5168  #CJK UNIFIED IDEOGRAPH
+0x9154 0x7985  #CJK UNIFIED IDEOGRAPH
+0x9155 0x7E55  #CJK UNIFIED IDEOGRAPH
+0x9156 0x81B3  #CJK UNIFIED IDEOGRAPH
+0x9157 0x7CCE  #CJK UNIFIED IDEOGRAPH
+0x9158 0x564C  #CJK UNIFIED IDEOGRAPH
+0x9159 0x5851  #CJK UNIFIED IDEOGRAPH
+0x915A 0x5CA8  #CJK UNIFIED IDEOGRAPH
+0x915B 0x63AA  #CJK UNIFIED IDEOGRAPH
+0x915C 0x66FE  #CJK UNIFIED IDEOGRAPH
+0x915D 0x66FD  #CJK UNIFIED IDEOGRAPH
+0x915E 0x695A  #CJK UNIFIED IDEOGRAPH
+0x915F 0x72D9  #CJK UNIFIED IDEOGRAPH
+0x9160 0x758F  #CJK UNIFIED IDEOGRAPH
+0x9161 0x758E  #CJK UNIFIED IDEOGRAPH
+0x9162 0x790E  #CJK UNIFIED IDEOGRAPH
+0x9163 0x7956  #CJK UNIFIED IDEOGRAPH
+0x9164 0x79DF  #CJK UNIFIED IDEOGRAPH
+0x9165 0x7C97  #CJK UNIFIED IDEOGRAPH
+0x9166 0x7D20  #CJK UNIFIED IDEOGRAPH
+0x9167 0x7D44  #CJK UNIFIED IDEOGRAPH
+0x9168 0x8607  #CJK UNIFIED IDEOGRAPH
+0x9169 0x8A34  #CJK UNIFIED IDEOGRAPH
+0x916A 0x963B  #CJK UNIFIED IDEOGRAPH
+0x916B 0x9061  #CJK UNIFIED IDEOGRAPH
+0x916C 0x9F20  #CJK UNIFIED IDEOGRAPH
+0x916D 0x50E7  #CJK UNIFIED IDEOGRAPH
+0x916E 0x5275  #CJK UNIFIED IDEOGRAPH
+0x916F 0x53CC  #CJK UNIFIED IDEOGRAPH
+0x9170 0x53E2  #CJK UNIFIED IDEOGRAPH
+0x9171 0x5009  #CJK UNIFIED IDEOGRAPH
+0x9172 0x55AA  #CJK UNIFIED IDEOGRAPH
+0x9173 0x58EE  #CJK UNIFIED IDEOGRAPH
+0x9174 0x594F  #CJK UNIFIED IDEOGRAPH
+0x9175 0x723D  #CJK UNIFIED IDEOGRAPH
+0x9176 0x5B8B  #CJK UNIFIED IDEOGRAPH
+0x9177 0x5C64  #CJK UNIFIED IDEOGRAPH
+0x9178 0x531D  #CJK UNIFIED IDEOGRAPH
+0x9179 0x60E3  #CJK UNIFIED IDEOGRAPH
+0x917A 0x60F3  #CJK UNIFIED IDEOGRAPH
+0x917B 0x635C  #CJK UNIFIED IDEOGRAPH
+0x917C 0x6383  #CJK UNIFIED IDEOGRAPH
+0x917D 0x633F  #CJK UNIFIED IDEOGRAPH
+0x917E 0x63BB  #CJK UNIFIED IDEOGRAPH
+0x9180 0x64CD  #CJK UNIFIED IDEOGRAPH
+0x9181 0x65E9  #CJK UNIFIED IDEOGRAPH
+0x9182 0x66F9  #CJK UNIFIED IDEOGRAPH
+0x9183 0x5DE3  #CJK UNIFIED IDEOGRAPH
+0x9184 0x69CD  #CJK UNIFIED IDEOGRAPH
+0x9185 0x69FD  #CJK UNIFIED IDEOGRAPH
+0x9186 0x6F15  #CJK UNIFIED IDEOGRAPH
+0x9187 0x71E5  #CJK UNIFIED IDEOGRAPH
+0x9188 0x4E89  #CJK UNIFIED IDEOGRAPH
+0x9189 0x75E9  #CJK UNIFIED IDEOGRAPH
+0x918A 0x76F8  #CJK UNIFIED IDEOGRAPH
+0x918B 0x7A93  #CJK UNIFIED IDEOGRAPH
+0x918C 0x7CDF  #CJK UNIFIED IDEOGRAPH
+0x918D 0x7DCF  #CJK UNIFIED IDEOGRAPH
+0x918E 0x7D9C  #CJK UNIFIED IDEOGRAPH
+0x918F 0x8061  #CJK UNIFIED IDEOGRAPH
+0x9190 0x8349  #CJK UNIFIED IDEOGRAPH
+0x9191 0x8358  #CJK UNIFIED IDEOGRAPH
+0x9192 0x846C  #CJK UNIFIED IDEOGRAPH
+0x9193 0x84BC  #CJK UNIFIED IDEOGRAPH
+0x9194 0x85FB  #CJK UNIFIED IDEOGRAPH
+0x9195 0x88C5  #CJK UNIFIED IDEOGRAPH
+0x9196 0x8D70  #CJK UNIFIED IDEOGRAPH
+0x9197 0x9001  #CJK UNIFIED IDEOGRAPH
+0x9198 0x906D  #CJK UNIFIED IDEOGRAPH
+0x9199 0x9397  #CJK UNIFIED IDEOGRAPH
+0x919A 0x971C  #CJK UNIFIED IDEOGRAPH
+0x919B 0x9A12  #CJK UNIFIED IDEOGRAPH
+0x919C 0x50CF  #CJK UNIFIED IDEOGRAPH
+0x919D 0x5897  #CJK UNIFIED IDEOGRAPH
+0x919E 0x618E  #CJK UNIFIED IDEOGRAPH
+0x919F 0x81D3  #CJK UNIFIED IDEOGRAPH
+0x91A0 0x8535  #CJK UNIFIED IDEOGRAPH
+0x91A1 0x8D08  #CJK UNIFIED IDEOGRAPH
+0x91A2 0x9020  #CJK UNIFIED IDEOGRAPH
+0x91A3 0x4FC3  #CJK UNIFIED IDEOGRAPH
+0x91A4 0x5074  #CJK UNIFIED IDEOGRAPH
+0x91A5 0x5247  #CJK UNIFIED IDEOGRAPH
+0x91A6 0x5373  #CJK UNIFIED IDEOGRAPH
+0x91A7 0x606F  #CJK UNIFIED IDEOGRAPH
+0x91A8 0x6349  #CJK UNIFIED IDEOGRAPH
+0x91A9 0x675F  #CJK UNIFIED IDEOGRAPH
+0x91AA 0x6E2C  #CJK UNIFIED IDEOGRAPH
+0x91AB 0x8DB3  #CJK UNIFIED IDEOGRAPH
+0x91AC 0x901F  #CJK UNIFIED IDEOGRAPH
+0x91AD 0x4FD7  #CJK UNIFIED IDEOGRAPH
+0x91AE 0x5C5E  #CJK UNIFIED IDEOGRAPH
+0x91AF 0x8CCA  #CJK UNIFIED IDEOGRAPH
+0x91B0 0x65CF  #CJK UNIFIED IDEOGRAPH
+0x91B1 0x7D9A  #CJK UNIFIED IDEOGRAPH
+0x91B2 0x5352  #CJK UNIFIED IDEOGRAPH
+0x91B3 0x8896  #CJK UNIFIED IDEOGRAPH
+0x91B4 0x5176  #CJK UNIFIED IDEOGRAPH
+0x91B5 0x63C3  #CJK UNIFIED IDEOGRAPH
+0x91B6 0x5B58  #CJK UNIFIED IDEOGRAPH
+0x91B7 0x5B6B  #CJK UNIFIED IDEOGRAPH
+0x91B8 0x5C0A  #CJK UNIFIED IDEOGRAPH
+0x91B9 0x640D  #CJK UNIFIED IDEOGRAPH
+0x91BA 0x6751  #CJK UNIFIED IDEOGRAPH
+0x91BB 0x905C  #CJK UNIFIED IDEOGRAPH
+0x91BC 0x4ED6  #CJK UNIFIED IDEOGRAPH
+0x91BD 0x591A  #CJK UNIFIED IDEOGRAPH
+0x91BE 0x592A  #CJK UNIFIED IDEOGRAPH
+0x91BF 0x6C70  #CJK UNIFIED IDEOGRAPH
+0x91C0 0x8A51  #CJK UNIFIED IDEOGRAPH
+0x91C1 0x553E  #CJK UNIFIED IDEOGRAPH
+0x91C2 0x5815  #CJK UNIFIED IDEOGRAPH
+0x91C3 0x59A5  #CJK UNIFIED IDEOGRAPH
+0x91C4 0x60F0  #CJK UNIFIED IDEOGRAPH
+0x91C5 0x6253  #CJK UNIFIED IDEOGRAPH
+0x91C6 0x67C1  #CJK UNIFIED IDEOGRAPH
+0x91C7 0x8235  #CJK UNIFIED IDEOGRAPH
+0x91C8 0x6955  #CJK UNIFIED IDEOGRAPH
+0x91C9 0x9640  #CJK UNIFIED IDEOGRAPH
+0x91CA 0x99C4  #CJK UNIFIED IDEOGRAPH
+0x91CB 0x9A28  #CJK UNIFIED IDEOGRAPH
+0x91CC 0x4F53  #CJK UNIFIED IDEOGRAPH
+0x91CD 0x5806  #CJK UNIFIED IDEOGRAPH
+0x91CE 0x5BFE  #CJK UNIFIED IDEOGRAPH
+0x91CF 0x8010  #CJK UNIFIED IDEOGRAPH
+0x91D0 0x5CB1  #CJK UNIFIED IDEOGRAPH
+0x91D1 0x5E2F  #CJK UNIFIED IDEOGRAPH
+0x91D2 0x5F85  #CJK UNIFIED IDEOGRAPH
+0x91D3 0x6020  #CJK UNIFIED IDEOGRAPH
+0x91D4 0x614B  #CJK UNIFIED IDEOGRAPH
+0x91D5 0x6234  #CJK UNIFIED IDEOGRAPH
+0x91D6 0x66FF  #CJK UNIFIED IDEOGRAPH
+0x91D7 0x6CF0  #CJK UNIFIED IDEOGRAPH
+0x91D8 0x6EDE  #CJK UNIFIED IDEOGRAPH
+0x91D9 0x80CE  #CJK UNIFIED IDEOGRAPH
+0x91DA 0x817F  #CJK UNIFIED IDEOGRAPH
+0x91DB 0x82D4  #CJK UNIFIED IDEOGRAPH
+0x91DC 0x888B  #CJK UNIFIED IDEOGRAPH
+0x91DD 0x8CB8  #CJK UNIFIED IDEOGRAPH
+0x91DE 0x9000  #CJK UNIFIED IDEOGRAPH
+0x91DF 0x902E  #CJK UNIFIED IDEOGRAPH
+0x91E0 0x968A  #CJK UNIFIED IDEOGRAPH
+0x91E1 0x9EDB  #CJK UNIFIED IDEOGRAPH
+0x91E2 0x9BDB  #CJK UNIFIED IDEOGRAPH
+0x91E3 0x4EE3  #CJK UNIFIED IDEOGRAPH
+0x91E4 0x53F0  #CJK UNIFIED IDEOGRAPH
+0x91E5 0x5927  #CJK UNIFIED IDEOGRAPH
+0x91E6 0x7B2C  #CJK UNIFIED IDEOGRAPH
+0x91E7 0x918D  #CJK UNIFIED IDEOGRAPH
+0x91E8 0x984C  #CJK UNIFIED IDEOGRAPH
+0x91E9 0x9DF9  #CJK UNIFIED IDEOGRAPH
+0x91EA 0x6EDD  #CJK UNIFIED IDEOGRAPH
+0x91EB 0x7027  #CJK UNIFIED IDEOGRAPH
+0x91EC 0x5353  #CJK UNIFIED IDEOGRAPH
+0x91ED 0x5544  #CJK UNIFIED IDEOGRAPH
+0x91EE 0x5B85  #CJK UNIFIED IDEOGRAPH
+0x91EF 0x6258  #CJK UNIFIED IDEOGRAPH
+0x91F0 0x629E  #CJK UNIFIED IDEOGRAPH
+0x91F1 0x62D3  #CJK UNIFIED IDEOGRAPH
+0x91F2 0x6CA2  #CJK UNIFIED IDEOGRAPH
+0x91F3 0x6FEF  #CJK UNIFIED IDEOGRAPH
+0x91F4 0x7422  #CJK UNIFIED IDEOGRAPH
+0x91F5 0x8A17  #CJK UNIFIED IDEOGRAPH
+0x91F6 0x9438  #CJK UNIFIED IDEOGRAPH
+0x91F7 0x6FC1  #CJK UNIFIED IDEOGRAPH
+0x91F8 0x8AFE  #CJK UNIFIED IDEOGRAPH
+0x91F9 0x8338  #CJK UNIFIED IDEOGRAPH
+0x91FA 0x51E7  #CJK UNIFIED IDEOGRAPH
+0x91FB 0x86F8  #CJK UNIFIED IDEOGRAPH
+0x91FC 0x53EA  #CJK UNIFIED IDEOGRAPH
+0x9240 0x53E9  #CJK UNIFIED IDEOGRAPH
+0x9241 0x4F46  #CJK UNIFIED IDEOGRAPH
+0x9242 0x9054  #CJK UNIFIED IDEOGRAPH
+0x9243 0x8FB0  #CJK UNIFIED IDEOGRAPH
+0x9244 0x596A  #CJK UNIFIED IDEOGRAPH
+0x9245 0x8131  #CJK UNIFIED IDEOGRAPH
+0x9246 0x5DFD  #CJK UNIFIED IDEOGRAPH
+0x9247 0x7AEA  #CJK UNIFIED IDEOGRAPH
+0x9248 0x8FBF  #CJK UNIFIED IDEOGRAPH
+0x9249 0x68DA  #CJK UNIFIED IDEOGRAPH
+0x924A 0x8C37  #CJK UNIFIED IDEOGRAPH
+0x924B 0x72F8  #CJK UNIFIED IDEOGRAPH
+0x924C 0x9C48  #CJK UNIFIED IDEOGRAPH
+0x924D 0x6A3D  #CJK UNIFIED IDEOGRAPH
+0x924E 0x8AB0  #CJK UNIFIED IDEOGRAPH
+0x924F 0x4E39  #CJK UNIFIED IDEOGRAPH
+0x9250 0x5358  #CJK UNIFIED IDEOGRAPH
+0x9251 0x5606  #CJK UNIFIED IDEOGRAPH
+0x9252 0x5766  #CJK UNIFIED IDEOGRAPH
+0x9253 0x62C5  #CJK UNIFIED IDEOGRAPH
+0x9254 0x63A2  #CJK UNIFIED IDEOGRAPH
+0x9255 0x65E6  #CJK UNIFIED IDEOGRAPH
+0x9256 0x6B4E  #CJK UNIFIED IDEOGRAPH
+0x9257 0x6DE1  #CJK UNIFIED IDEOGRAPH
+0x9258 0x6E5B  #CJK UNIFIED IDEOGRAPH
+0x9259 0x70AD  #CJK UNIFIED IDEOGRAPH
+0x925A 0x77ED  #CJK UNIFIED IDEOGRAPH
+0x925B 0x7AEF  #CJK UNIFIED IDEOGRAPH
+0x925C 0x7BAA  #CJK UNIFIED IDEOGRAPH
+0x925D 0x7DBB  #CJK UNIFIED IDEOGRAPH
+0x925E 0x803D  #CJK UNIFIED IDEOGRAPH
+0x925F 0x80C6  #CJK UNIFIED IDEOGRAPH
+0x9260 0x86CB  #CJK UNIFIED IDEOGRAPH
+0x9261 0x8A95  #CJK UNIFIED IDEOGRAPH
+0x9262 0x935B  #CJK UNIFIED IDEOGRAPH
+0x9263 0x56E3  #CJK UNIFIED IDEOGRAPH
+0x9264 0x58C7  #CJK UNIFIED IDEOGRAPH
+0x9265 0x5F3E  #CJK UNIFIED IDEOGRAPH
+0x9266 0x65AD  #CJK UNIFIED IDEOGRAPH
+0x9267 0x6696  #CJK UNIFIED IDEOGRAPH
+0x9268 0x6A80  #CJK UNIFIED IDEOGRAPH
+0x9269 0x6BB5  #CJK UNIFIED IDEOGRAPH
+0x926A 0x7537  #CJK UNIFIED IDEOGRAPH
+0x926B 0x8AC7  #CJK UNIFIED IDEOGRAPH
+0x926C 0x5024  #CJK UNIFIED IDEOGRAPH
+0x926D 0x77E5  #CJK UNIFIED IDEOGRAPH
+0x926E 0x5730  #CJK UNIFIED IDEOGRAPH
+0x926F 0x5F1B  #CJK UNIFIED IDEOGRAPH
+0x9270 0x6065  #CJK UNIFIED IDEOGRAPH
+0x9271 0x667A  #CJK UNIFIED IDEOGRAPH
+0x9272 0x6C60  #CJK UNIFIED IDEOGRAPH
+0x9273 0x75F4  #CJK UNIFIED IDEOGRAPH
+0x9274 0x7A1A  #CJK UNIFIED IDEOGRAPH
+0x9275 0x7F6E  #CJK UNIFIED IDEOGRAPH
+0x9276 0x81F4  #CJK UNIFIED IDEOGRAPH
+0x9277 0x8718  #CJK UNIFIED IDEOGRAPH
+0x9278 0x9045  #CJK UNIFIED IDEOGRAPH
+0x9279 0x99B3  #CJK UNIFIED IDEOGRAPH
+0x927A 0x7BC9  #CJK UNIFIED IDEOGRAPH
+0x927B 0x755C  #CJK UNIFIED IDEOGRAPH
+0x927C 0x7AF9  #CJK UNIFIED IDEOGRAPH
+0x927D 0x7B51  #CJK UNIFIED IDEOGRAPH
+0x927E 0x84C4  #CJK UNIFIED IDEOGRAPH
+0x9280 0x9010  #CJK UNIFIED IDEOGRAPH
+0x9281 0x79E9  #CJK UNIFIED IDEOGRAPH
+0x9282 0x7A92  #CJK UNIFIED IDEOGRAPH
+0x9283 0x8336  #CJK UNIFIED IDEOGRAPH
+0x9284 0x5AE1  #CJK UNIFIED IDEOGRAPH
+0x9285 0x7740  #CJK UNIFIED IDEOGRAPH
+0x9286 0x4E2D  #CJK UNIFIED IDEOGRAPH
+0x9287 0x4EF2  #CJK UNIFIED IDEOGRAPH
+0x9288 0x5B99  #CJK UNIFIED IDEOGRAPH
+0x9289 0x5FE0  #CJK UNIFIED IDEOGRAPH
+0x928A 0x62BD  #CJK UNIFIED IDEOGRAPH
+0x928B 0x663C  #CJK UNIFIED IDEOGRAPH
+0x928C 0x67F1  #CJK UNIFIED IDEOGRAPH
+0x928D 0x6CE8  #CJK UNIFIED IDEOGRAPH
+0x928E 0x866B  #CJK UNIFIED IDEOGRAPH
+0x928F 0x8877  #CJK UNIFIED IDEOGRAPH
+0x9290 0x8A3B  #CJK UNIFIED IDEOGRAPH
+0x9291 0x914E  #CJK UNIFIED IDEOGRAPH
+0x9292 0x92F3  #CJK UNIFIED IDEOGRAPH
+0x9293 0x99D0  #CJK UNIFIED IDEOGRAPH
+0x9294 0x6A17  #CJK UNIFIED IDEOGRAPH
+0x9295 0x7026  #CJK UNIFIED IDEOGRAPH
+0x9296 0x732A  #CJK UNIFIED IDEOGRAPH
+0x9297 0x82E7  #CJK UNIFIED IDEOGRAPH
+0x9298 0x8457  #CJK UNIFIED IDEOGRAPH
+0x9299 0x8CAF  #CJK UNIFIED IDEOGRAPH
+0x929A 0x4E01  #CJK UNIFIED IDEOGRAPH
+0x929B 0x5146  #CJK UNIFIED IDEOGRAPH
+0x929C 0x51CB  #CJK UNIFIED IDEOGRAPH
+0x929D 0x558B  #CJK UNIFIED IDEOGRAPH
+0x929E 0x5BF5  #CJK UNIFIED IDEOGRAPH
+0x929F 0x5E16  #CJK UNIFIED IDEOGRAPH
+0x92A0 0x5E33  #CJK UNIFIED IDEOGRAPH
+0x92A1 0x5E81  #CJK UNIFIED IDEOGRAPH
+0x92A2 0x5F14  #CJK UNIFIED IDEOGRAPH
+0x92A3 0x5F35  #CJK UNIFIED IDEOGRAPH
+0x92A4 0x5F6B  #CJK UNIFIED IDEOGRAPH
+0x92A5 0x5FB4  #CJK UNIFIED IDEOGRAPH
+0x92A6 0x61F2  #CJK UNIFIED IDEOGRAPH
+0x92A7 0x6311  #CJK UNIFIED IDEOGRAPH
+0x92A8 0x66A2  #CJK UNIFIED IDEOGRAPH
+0x92A9 0x671D  #CJK UNIFIED IDEOGRAPH
+0x92AA 0x6F6E  #CJK UNIFIED IDEOGRAPH
+0x92AB 0x7252  #CJK UNIFIED IDEOGRAPH
+0x92AC 0x753A  #CJK UNIFIED IDEOGRAPH
+0x92AD 0x773A  #CJK UNIFIED IDEOGRAPH
+0x92AE 0x8074  #CJK UNIFIED IDEOGRAPH
+0x92AF 0x8139  #CJK UNIFIED IDEOGRAPH
+0x92B0 0x8178  #CJK UNIFIED IDEOGRAPH
+0x92B1 0x8776  #CJK UNIFIED IDEOGRAPH
+0x92B2 0x8ABF  #CJK UNIFIED IDEOGRAPH
+0x92B3 0x8ADC  #CJK UNIFIED IDEOGRAPH
+0x92B4 0x8D85  #CJK UNIFIED IDEOGRAPH
+0x92B5 0x8DF3  #CJK UNIFIED IDEOGRAPH
+0x92B6 0x929A  #CJK UNIFIED IDEOGRAPH
+0x92B7 0x9577  #CJK UNIFIED IDEOGRAPH
+0x92B8 0x9802  #CJK UNIFIED IDEOGRAPH
+0x92B9 0x9CE5  #CJK UNIFIED IDEOGRAPH
+0x92BA 0x52C5  #CJK UNIFIED IDEOGRAPH
+0x92BB 0x6357  #CJK UNIFIED IDEOGRAPH
+0x92BC 0x76F4  #CJK UNIFIED IDEOGRAPH
+0x92BD 0x6715  #CJK UNIFIED IDEOGRAPH
+0x92BE 0x6C88  #CJK UNIFIED IDEOGRAPH
+0x92BF 0x73CD  #CJK UNIFIED IDEOGRAPH
+0x92C0 0x8CC3  #CJK UNIFIED IDEOGRAPH
+0x92C1 0x93AE  #CJK UNIFIED IDEOGRAPH
+0x92C2 0x9673  #CJK UNIFIED IDEOGRAPH
+0x92C3 0x6D25  #CJK UNIFIED IDEOGRAPH
+0x92C4 0x589C  #CJK UNIFIED IDEOGRAPH
+0x92C5 0x690E  #CJK UNIFIED IDEOGRAPH
+0x92C6 0x69CC  #CJK UNIFIED IDEOGRAPH
+0x92C7 0x8FFD  #CJK UNIFIED IDEOGRAPH
+0x92C8 0x939A  #CJK UNIFIED IDEOGRAPH
+0x92C9 0x75DB  #CJK UNIFIED IDEOGRAPH
+0x92CA 0x901A  #CJK UNIFIED IDEOGRAPH
+0x92CB 0x585A  #CJK UNIFIED IDEOGRAPH
+0x92CC 0x6802  #CJK UNIFIED IDEOGRAPH
+0x92CD 0x63B4  #CJK UNIFIED IDEOGRAPH
+0x92CE 0x69FB  #CJK UNIFIED IDEOGRAPH
+0x92CF 0x4F43  #CJK UNIFIED IDEOGRAPH
+0x92D0 0x6F2C  #CJK UNIFIED IDEOGRAPH
+0x92D1 0x67D8  #CJK UNIFIED IDEOGRAPH
+0x92D2 0x8FBB  #CJK UNIFIED IDEOGRAPH
+0x92D3 0x8526  #CJK UNIFIED IDEOGRAPH
+0x92D4 0x7DB4  #CJK UNIFIED IDEOGRAPH
+0x92D5 0x9354  #CJK UNIFIED IDEOGRAPH
+0x92D6 0x693F  #CJK UNIFIED IDEOGRAPH
+0x92D7 0x6F70  #CJK UNIFIED IDEOGRAPH
+0x92D8 0x576A  #CJK UNIFIED IDEOGRAPH
+0x92D9 0x58F7  #CJK UNIFIED IDEOGRAPH
+0x92DA 0x5B2C  #CJK UNIFIED IDEOGRAPH
+0x92DB 0x7D2C  #CJK UNIFIED IDEOGRAPH
+0x92DC 0x722A  #CJK UNIFIED IDEOGRAPH
+0x92DD 0x540A  #CJK UNIFIED IDEOGRAPH
+0x92DE 0x91E3  #CJK UNIFIED IDEOGRAPH
+0x92DF 0x9DB4  #CJK UNIFIED IDEOGRAPH
+0x92E0 0x4EAD  #CJK UNIFIED IDEOGRAPH
+0x92E1 0x4F4E  #CJK UNIFIED IDEOGRAPH
+0x92E2 0x505C  #CJK UNIFIED IDEOGRAPH
+0x92E3 0x5075  #CJK UNIFIED IDEOGRAPH
+0x92E4 0x5243  #CJK UNIFIED IDEOGRAPH
+0x92E5 0x8C9E  #CJK UNIFIED IDEOGRAPH
+0x92E6 0x5448  #CJK UNIFIED IDEOGRAPH
+0x92E7 0x5824  #CJK UNIFIED IDEOGRAPH
+0x92E8 0x5B9A  #CJK UNIFIED IDEOGRAPH
+0x92E9 0x5E1D  #CJK UNIFIED IDEOGRAPH
+0x92EA 0x5E95  #CJK UNIFIED IDEOGRAPH
+0x92EB 0x5EAD  #CJK UNIFIED IDEOGRAPH
+0x92EC 0x5EF7  #CJK UNIFIED IDEOGRAPH
+0x92ED 0x5F1F  #CJK UNIFIED IDEOGRAPH
+0x92EE 0x608C  #CJK UNIFIED IDEOGRAPH
+0x92EF 0x62B5  #CJK UNIFIED IDEOGRAPH
+0x92F0 0x633A  #CJK UNIFIED IDEOGRAPH
+0x92F1 0x63D0  #CJK UNIFIED IDEOGRAPH
+0x92F2 0x68AF  #CJK UNIFIED IDEOGRAPH
+0x92F3 0x6C40  #CJK UNIFIED IDEOGRAPH
+0x92F4 0x7887  #CJK UNIFIED IDEOGRAPH
+0x92F5 0x798E  #CJK UNIFIED IDEOGRAPH
+0x92F6 0x7A0B  #CJK UNIFIED IDEOGRAPH
+0x92F7 0x7DE0  #CJK UNIFIED IDEOGRAPH
+0x92F8 0x8247  #CJK UNIFIED IDEOGRAPH
+0x92F9 0x8A02  #CJK UNIFIED IDEOGRAPH
+0x92FA 0x8AE6  #CJK UNIFIED IDEOGRAPH
+0x92FB 0x8E44  #CJK UNIFIED IDEOGRAPH
+0x92FC 0x9013  #CJK UNIFIED IDEOGRAPH
+0x9340 0x90B8  #CJK UNIFIED IDEOGRAPH
+0x9341 0x912D  #CJK UNIFIED IDEOGRAPH
+0x9342 0x91D8  #CJK UNIFIED IDEOGRAPH
+0x9343 0x9F0E  #CJK UNIFIED IDEOGRAPH
+0x9344 0x6CE5  #CJK UNIFIED IDEOGRAPH
+0x9345 0x6458  #CJK UNIFIED IDEOGRAPH
+0x9346 0x64E2  #CJK UNIFIED IDEOGRAPH
+0x9347 0x6575  #CJK UNIFIED IDEOGRAPH
+0x9348 0x6EF4  #CJK UNIFIED IDEOGRAPH
+0x9349 0x7684  #CJK UNIFIED IDEOGRAPH
+0x934A 0x7B1B  #CJK UNIFIED IDEOGRAPH
+0x934B 0x9069  #CJK UNIFIED IDEOGRAPH
+0x934C 0x93D1  #CJK UNIFIED IDEOGRAPH
+0x934D 0x6EBA  #CJK UNIFIED IDEOGRAPH
+0x934E 0x54F2  #CJK UNIFIED IDEOGRAPH
+0x934F 0x5FB9  #CJK UNIFIED IDEOGRAPH
+0x9350 0x64A4  #CJK UNIFIED IDEOGRAPH
+0x9351 0x8F4D  #CJK UNIFIED IDEOGRAPH
+0x9352 0x8FED  #CJK UNIFIED IDEOGRAPH
+0x9353 0x9244  #CJK UNIFIED IDEOGRAPH
+0x9354 0x5178  #CJK UNIFIED IDEOGRAPH
+0x9355 0x586B  #CJK UNIFIED IDEOGRAPH
+0x9356 0x5929  #CJK UNIFIED IDEOGRAPH
+0x9357 0x5C55  #CJK UNIFIED IDEOGRAPH
+0x9358 0x5E97  #CJK UNIFIED IDEOGRAPH
+0x9359 0x6DFB  #CJK UNIFIED IDEOGRAPH
+0x935A 0x7E8F  #CJK UNIFIED IDEOGRAPH
+0x935B 0x751C  #CJK UNIFIED IDEOGRAPH
+0x935C 0x8CBC  #CJK UNIFIED IDEOGRAPH
+0x935D 0x8EE2  #CJK UNIFIED IDEOGRAPH
+0x935E 0x985B  #CJK UNIFIED IDEOGRAPH
+0x935F 0x70B9  #CJK UNIFIED IDEOGRAPH
+0x9360 0x4F1D  #CJK UNIFIED IDEOGRAPH
+0x9361 0x6BBF  #CJK UNIFIED IDEOGRAPH
+0x9362 0x6FB1  #CJK UNIFIED IDEOGRAPH
+0x9363 0x7530  #CJK UNIFIED IDEOGRAPH
+0x9364 0x96FB  #CJK UNIFIED IDEOGRAPH
+0x9365 0x514E  #CJK UNIFIED IDEOGRAPH
+0x9366 0x5410  #CJK UNIFIED IDEOGRAPH
+0x9367 0x5835  #CJK UNIFIED IDEOGRAPH
+0x9368 0x5857  #CJK UNIFIED IDEOGRAPH
+0x9369 0x59AC  #CJK UNIFIED IDEOGRAPH
+0x936A 0x5C60  #CJK UNIFIED IDEOGRAPH
+0x936B 0x5F92  #CJK UNIFIED IDEOGRAPH
+0x936C 0x6597  #CJK UNIFIED IDEOGRAPH
+0x936D 0x675C  #CJK UNIFIED IDEOGRAPH
+0x936E 0x6E21  #CJK UNIFIED IDEOGRAPH
+0x936F 0x767B  #CJK UNIFIED IDEOGRAPH
+0x9370 0x83DF  #CJK UNIFIED IDEOGRAPH
+0x9371 0x8CED  #CJK UNIFIED IDEOGRAPH
+0x9372 0x9014  #CJK UNIFIED IDEOGRAPH
+0x9373 0x90FD  #CJK UNIFIED IDEOGRAPH
+0x9374 0x934D  #CJK UNIFIED IDEOGRAPH
+0x9375 0x7825  #CJK UNIFIED IDEOGRAPH
+0x9376 0x783A  #CJK UNIFIED IDEOGRAPH
+0x9377 0x52AA  #CJK UNIFIED IDEOGRAPH
+0x9378 0x5EA6  #CJK UNIFIED IDEOGRAPH
+0x9379 0x571F  #CJK UNIFIED IDEOGRAPH
+0x937A 0x5974  #CJK UNIFIED IDEOGRAPH
+0x937B 0x6012  #CJK UNIFIED IDEOGRAPH
+0x937C 0x5012  #CJK UNIFIED IDEOGRAPH
+0x937D 0x515A  #CJK UNIFIED IDEOGRAPH
+0x937E 0x51AC  #CJK UNIFIED IDEOGRAPH
+0x9380 0x51CD  #CJK UNIFIED IDEOGRAPH
+0x9381 0x5200  #CJK UNIFIED IDEOGRAPH
+0x9382 0x5510  #CJK UNIFIED IDEOGRAPH
+0x9383 0x5854  #CJK UNIFIED IDEOGRAPH
+0x9384 0x5858  #CJK UNIFIED IDEOGRAPH
+0x9385 0x5957  #CJK UNIFIED IDEOGRAPH
+0x9386 0x5B95  #CJK UNIFIED IDEOGRAPH
+0x9387 0x5CF6  #CJK UNIFIED IDEOGRAPH
+0x9388 0x5D8B  #CJK UNIFIED IDEOGRAPH
+0x9389 0x60BC  #CJK UNIFIED IDEOGRAPH
+0x938A 0x6295  #CJK UNIFIED IDEOGRAPH
+0x938B 0x642D  #CJK UNIFIED IDEOGRAPH
+0x938C 0x6771  #CJK UNIFIED IDEOGRAPH
+0x938D 0x6843  #CJK UNIFIED IDEOGRAPH
+0x938E 0x68BC  #CJK UNIFIED IDEOGRAPH
+0x938F 0x68DF  #CJK UNIFIED IDEOGRAPH
+0x9390 0x76D7  #CJK UNIFIED IDEOGRAPH
+0x9391 0x6DD8  #CJK UNIFIED IDEOGRAPH
+0x9392 0x6E6F  #CJK UNIFIED IDEOGRAPH
+0x9393 0x6D9B  #CJK UNIFIED IDEOGRAPH
+0x9394 0x706F  #CJK UNIFIED IDEOGRAPH
+0x9395 0x71C8  #CJK UNIFIED IDEOGRAPH
+0x9396 0x5F53  #CJK UNIFIED IDEOGRAPH
+0x9397 0x75D8  #CJK UNIFIED IDEOGRAPH
+0x9398 0x7977  #CJK UNIFIED IDEOGRAPH
+0x9399 0x7B49  #CJK UNIFIED IDEOGRAPH
+0x939A 0x7B54  #CJK UNIFIED IDEOGRAPH
+0x939B 0x7B52  #CJK UNIFIED IDEOGRAPH
+0x939C 0x7CD6  #CJK UNIFIED IDEOGRAPH
+0x939D 0x7D71  #CJK UNIFIED IDEOGRAPH
+0x939E 0x5230  #CJK UNIFIED IDEOGRAPH
+0x939F 0x8463  #CJK UNIFIED IDEOGRAPH
+0x93A0 0x8569  #CJK UNIFIED IDEOGRAPH
+0x93A1 0x85E4  #CJK UNIFIED IDEOGRAPH
+0x93A2 0x8A0E  #CJK UNIFIED IDEOGRAPH
+0x93A3 0x8B04  #CJK UNIFIED IDEOGRAPH
+0x93A4 0x8C46  #CJK UNIFIED IDEOGRAPH
+0x93A5 0x8E0F  #CJK UNIFIED IDEOGRAPH
+0x93A6 0x9003  #CJK UNIFIED IDEOGRAPH
+0x93A7 0x900F  #CJK UNIFIED IDEOGRAPH
+0x93A8 0x9419  #CJK UNIFIED IDEOGRAPH
+0x93A9 0x9676  #CJK UNIFIED IDEOGRAPH
+0x93AA 0x982D  #CJK UNIFIED IDEOGRAPH
+0x93AB 0x9A30  #CJK UNIFIED IDEOGRAPH
+0x93AC 0x95D8  #CJK UNIFIED IDEOGRAPH
+0x93AD 0x50CD  #CJK UNIFIED IDEOGRAPH
+0x93AE 0x52D5  #CJK UNIFIED IDEOGRAPH
+0x93AF 0x540C  #CJK UNIFIED IDEOGRAPH
+0x93B0 0x5802  #CJK UNIFIED IDEOGRAPH
+0x93B1 0x5C0E  #CJK UNIFIED IDEOGRAPH
+0x93B2 0x61A7  #CJK UNIFIED IDEOGRAPH
+0x93B3 0x649E  #CJK UNIFIED IDEOGRAPH
+0x93B4 0x6D1E  #CJK UNIFIED IDEOGRAPH
+0x93B5 0x77B3  #CJK UNIFIED IDEOGRAPH
+0x93B6 0x7AE5  #CJK UNIFIED IDEOGRAPH
+0x93B7 0x80F4  #CJK UNIFIED IDEOGRAPH
+0x93B8 0x8404  #CJK UNIFIED IDEOGRAPH
+0x93B9 0x9053  #CJK UNIFIED IDEOGRAPH
+0x93BA 0x9285  #CJK UNIFIED IDEOGRAPH
+0x93BB 0x5CE0  #CJK UNIFIED IDEOGRAPH
+0x93BC 0x9D07  #CJK UNIFIED IDEOGRAPH
+0x93BD 0x533F  #CJK UNIFIED IDEOGRAPH
+0x93BE 0x5F97  #CJK UNIFIED IDEOGRAPH
+0x93BF 0x5FB3  #CJK UNIFIED IDEOGRAPH
+0x93C0 0x6D9C  #CJK UNIFIED IDEOGRAPH
+0x93C1 0x7279  #CJK UNIFIED IDEOGRAPH
+0x93C2 0x7763  #CJK UNIFIED IDEOGRAPH
+0x93C3 0x79BF  #CJK UNIFIED IDEOGRAPH
+0x93C4 0x7BE4  #CJK UNIFIED IDEOGRAPH
+0x93C5 0x6BD2  #CJK UNIFIED IDEOGRAPH
+0x93C6 0x72EC  #CJK UNIFIED IDEOGRAPH
+0x93C7 0x8AAD  #CJK UNIFIED IDEOGRAPH
+0x93C8 0x6803  #CJK UNIFIED IDEOGRAPH
+0x93C9 0x6A61  #CJK UNIFIED IDEOGRAPH
+0x93CA 0x51F8  #CJK UNIFIED IDEOGRAPH
+0x93CB 0x7A81  #CJK UNIFIED IDEOGRAPH
+0x93CC 0x6934  #CJK UNIFIED IDEOGRAPH
+0x93CD 0x5C4A  #CJK UNIFIED IDEOGRAPH
+0x93CE 0x9CF6  #CJK UNIFIED IDEOGRAPH
+0x93CF 0x82EB  #CJK UNIFIED IDEOGRAPH
+0x93D0 0x5BC5  #CJK UNIFIED IDEOGRAPH
+0x93D1 0x9149  #CJK UNIFIED IDEOGRAPH
+0x93D2 0x701E  #CJK UNIFIED IDEOGRAPH
+0x93D3 0x5678  #CJK UNIFIED IDEOGRAPH
+0x93D4 0x5C6F  #CJK UNIFIED IDEOGRAPH
+0x93D5 0x60C7  #CJK UNIFIED IDEOGRAPH
+0x93D6 0x6566  #CJK UNIFIED IDEOGRAPH
+0x93D7 0x6C8C  #CJK UNIFIED IDEOGRAPH
+0x93D8 0x8C5A  #CJK UNIFIED IDEOGRAPH
+0x93D9 0x9041  #CJK UNIFIED IDEOGRAPH
+0x93DA 0x9813  #CJK UNIFIED IDEOGRAPH
+0x93DB 0x5451  #CJK UNIFIED IDEOGRAPH
+0x93DC 0x66C7  #CJK UNIFIED IDEOGRAPH
+0x93DD 0x920D  #CJK UNIFIED IDEOGRAPH
+0x93DE 0x5948  #CJK UNIFIED IDEOGRAPH
+0x93DF 0x90A3  #CJK UNIFIED IDEOGRAPH
+0x93E0 0x5185  #CJK UNIFIED IDEOGRAPH
+0x93E1 0x4E4D  #CJK UNIFIED IDEOGRAPH
+0x93E2 0x51EA  #CJK UNIFIED IDEOGRAPH
+0x93E3 0x8599  #CJK UNIFIED IDEOGRAPH
+0x93E4 0x8B0E  #CJK UNIFIED IDEOGRAPH
+0x93E5 0x7058  #CJK UNIFIED IDEOGRAPH
+0x93E6 0x637A  #CJK UNIFIED IDEOGRAPH
+0x93E7 0x934B  #CJK UNIFIED IDEOGRAPH
+0x93E8 0x6962  #CJK UNIFIED IDEOGRAPH
+0x93E9 0x99B4  #CJK UNIFIED IDEOGRAPH
+0x93EA 0x7E04  #CJK UNIFIED IDEOGRAPH
+0x93EB 0x7577  #CJK UNIFIED IDEOGRAPH
+0x93EC 0x5357  #CJK UNIFIED IDEOGRAPH
+0x93ED 0x6960  #CJK UNIFIED IDEOGRAPH
+0x93EE 0x8EDF  #CJK UNIFIED IDEOGRAPH
+0x93EF 0x96E3  #CJK UNIFIED IDEOGRAPH
+0x93F0 0x6C5D  #CJK UNIFIED IDEOGRAPH
+0x93F1 0x4E8C  #CJK UNIFIED IDEOGRAPH
+0x93F2 0x5C3C  #CJK UNIFIED IDEOGRAPH
+0x93F3 0x5F10  #CJK UNIFIED IDEOGRAPH
+0x93F4 0x8FE9  #CJK UNIFIED IDEOGRAPH
+0x93F5 0x5302  #CJK UNIFIED IDEOGRAPH
+0x93F6 0x8CD1  #CJK UNIFIED IDEOGRAPH
+0x93F7 0x8089  #CJK UNIFIED IDEOGRAPH
+0x93F8 0x8679  #CJK UNIFIED IDEOGRAPH
+0x93F9 0x5EFF  #CJK UNIFIED IDEOGRAPH
+0x93FA 0x65E5  #CJK UNIFIED IDEOGRAPH
+0x93FB 0x4E73  #CJK UNIFIED IDEOGRAPH
+0x93FC 0x5165  #CJK UNIFIED IDEOGRAPH
+0x9440 0x5982  #CJK UNIFIED IDEOGRAPH
+0x9441 0x5C3F  #CJK UNIFIED IDEOGRAPH
+0x9442 0x97EE  #CJK UNIFIED IDEOGRAPH
+0x9443 0x4EFB  #CJK UNIFIED IDEOGRAPH
+0x9444 0x598A  #CJK UNIFIED IDEOGRAPH
+0x9445 0x5FCD  #CJK UNIFIED IDEOGRAPH
+0x9446 0x8A8D  #CJK UNIFIED IDEOGRAPH
+0x9447 0x6FE1  #CJK UNIFIED IDEOGRAPH
+0x9448 0x79B0  #CJK UNIFIED IDEOGRAPH
+0x9449 0x7962  #CJK UNIFIED IDEOGRAPH
+0x944A 0x5BE7  #CJK UNIFIED IDEOGRAPH
+0x944B 0x8471  #CJK UNIFIED IDEOGRAPH
+0x944C 0x732B  #CJK UNIFIED IDEOGRAPH
+0x944D 0x71B1  #CJK UNIFIED IDEOGRAPH
+0x944E 0x5E74  #CJK UNIFIED IDEOGRAPH
+0x944F 0x5FF5  #CJK UNIFIED IDEOGRAPH
+0x9450 0x637B  #CJK UNIFIED IDEOGRAPH
+0x9451 0x649A  #CJK UNIFIED IDEOGRAPH
+0x9452 0x71C3  #CJK UNIFIED IDEOGRAPH
+0x9453 0x7C98  #CJK UNIFIED IDEOGRAPH
+0x9454 0x4E43  #CJK UNIFIED IDEOGRAPH
+0x9455 0x5EFC  #CJK UNIFIED IDEOGRAPH
+0x9456 0x4E4B  #CJK UNIFIED IDEOGRAPH
+0x9457 0x57DC  #CJK UNIFIED IDEOGRAPH
+0x9458 0x56A2  #CJK UNIFIED IDEOGRAPH
+0x9459 0x60A9  #CJK UNIFIED IDEOGRAPH
+0x945A 0x6FC3  #CJK UNIFIED IDEOGRAPH
+0x945B 0x7D0D  #CJK UNIFIED IDEOGRAPH
+0x945C 0x80FD  #CJK UNIFIED IDEOGRAPH
+0x945D 0x8133  #CJK UNIFIED IDEOGRAPH
+0x945E 0x81BF  #CJK UNIFIED IDEOGRAPH
+0x945F 0x8FB2  #CJK UNIFIED IDEOGRAPH
+0x9460 0x8997  #CJK UNIFIED IDEOGRAPH
+0x9461 0x86A4  #CJK UNIFIED IDEOGRAPH
+0x9462 0x5DF4  #CJK UNIFIED IDEOGRAPH
+0x9463 0x628A  #CJK UNIFIED IDEOGRAPH
+0x9464 0x64AD  #CJK UNIFIED IDEOGRAPH
+0x9465 0x8987  #CJK UNIFIED IDEOGRAPH
+0x9466 0x6777  #CJK UNIFIED IDEOGRAPH
+0x9467 0x6CE2  #CJK UNIFIED IDEOGRAPH
+0x9468 0x6D3E  #CJK UNIFIED IDEOGRAPH
+0x9469 0x7436  #CJK UNIFIED IDEOGRAPH
+0x946A 0x7834  #CJK UNIFIED IDEOGRAPH
+0x946B 0x5A46  #CJK UNIFIED IDEOGRAPH
+0x946C 0x7F75  #CJK UNIFIED IDEOGRAPH
+0x946D 0x82AD  #CJK UNIFIED IDEOGRAPH
+0x946E 0x99AC  #CJK UNIFIED IDEOGRAPH
+0x946F 0x4FF3  #CJK UNIFIED IDEOGRAPH
+0x9470 0x5EC3  #CJK UNIFIED IDEOGRAPH
+0x9471 0x62DD  #CJK UNIFIED IDEOGRAPH
+0x9472 0x6392  #CJK UNIFIED IDEOGRAPH
+0x9473 0x6557  #CJK UNIFIED IDEOGRAPH
+0x9474 0x676F  #CJK UNIFIED IDEOGRAPH
+0x9475 0x76C3  #CJK UNIFIED IDEOGRAPH
+0x9476 0x724C  #CJK UNIFIED IDEOGRAPH
+0x9477 0x80CC  #CJK UNIFIED IDEOGRAPH
+0x9478 0x80BA  #CJK UNIFIED IDEOGRAPH
+0x9479 0x8F29  #CJK UNIFIED IDEOGRAPH
+0x947A 0x914D  #CJK UNIFIED IDEOGRAPH
+0x947B 0x500D  #CJK UNIFIED IDEOGRAPH
+0x947C 0x57F9  #CJK UNIFIED IDEOGRAPH
+0x947D 0x5A92  #CJK UNIFIED IDEOGRAPH
+0x947E 0x6885  #CJK UNIFIED IDEOGRAPH
+0x9480 0x6973  #CJK UNIFIED IDEOGRAPH
+0x9481 0x7164  #CJK UNIFIED IDEOGRAPH
+0x9482 0x72FD  #CJK UNIFIED IDEOGRAPH
+0x9483 0x8CB7  #CJK UNIFIED IDEOGRAPH
+0x9484 0x58F2  #CJK UNIFIED IDEOGRAPH
+0x9485 0x8CE0  #CJK UNIFIED IDEOGRAPH
+0x9486 0x966A  #CJK UNIFIED IDEOGRAPH
+0x9487 0x9019  #CJK UNIFIED IDEOGRAPH
+0x9488 0x877F  #CJK UNIFIED IDEOGRAPH
+0x9489 0x79E4  #CJK UNIFIED IDEOGRAPH
+0x948A 0x77E7  #CJK UNIFIED IDEOGRAPH
+0x948B 0x8429  #CJK UNIFIED IDEOGRAPH
+0x948C 0x4F2F  #CJK UNIFIED IDEOGRAPH
+0x948D 0x5265  #CJK UNIFIED IDEOGRAPH
+0x948E 0x535A  #CJK UNIFIED IDEOGRAPH
+0x948F 0x62CD  #CJK UNIFIED IDEOGRAPH
+0x9490 0x67CF  #CJK UNIFIED IDEOGRAPH
+0x9491 0x6CCA  #CJK UNIFIED IDEOGRAPH
+0x9492 0x767D  #CJK UNIFIED IDEOGRAPH
+0x9493 0x7B94  #CJK UNIFIED IDEOGRAPH
+0x9494 0x7C95  #CJK UNIFIED IDEOGRAPH
+0x9495 0x8236  #CJK UNIFIED IDEOGRAPH
+0x9496 0x8584  #CJK UNIFIED IDEOGRAPH
+0x9497 0x8FEB  #CJK UNIFIED IDEOGRAPH
+0x9498 0x66DD  #CJK UNIFIED IDEOGRAPH
+0x9499 0x6F20  #CJK UNIFIED IDEOGRAPH
+0x949A 0x7206  #CJK UNIFIED IDEOGRAPH
+0x949B 0x7E1B  #CJK UNIFIED IDEOGRAPH
+0x949C 0x83AB  #CJK UNIFIED IDEOGRAPH
+0x949D 0x99C1  #CJK UNIFIED IDEOGRAPH
+0x949E 0x9EA6  #CJK UNIFIED IDEOGRAPH
+0x949F 0x51FD  #CJK UNIFIED IDEOGRAPH
+0x94A0 0x7BB1  #CJK UNIFIED IDEOGRAPH
+0x94A1 0x7872  #CJK UNIFIED IDEOGRAPH
+0x94A2 0x7BB8  #CJK UNIFIED IDEOGRAPH
+0x94A3 0x8087  #CJK UNIFIED IDEOGRAPH
+0x94A4 0x7B48  #CJK UNIFIED IDEOGRAPH
+0x94A5 0x6AE8  #CJK UNIFIED IDEOGRAPH
+0x94A6 0x5E61  #CJK UNIFIED IDEOGRAPH
+0x94A7 0x808C  #CJK UNIFIED IDEOGRAPH
+0x94A8 0x7551  #CJK UNIFIED IDEOGRAPH
+0x94A9 0x7560  #CJK UNIFIED IDEOGRAPH
+0x94AA 0x516B  #CJK UNIFIED IDEOGRAPH
+0x94AB 0x9262  #CJK UNIFIED IDEOGRAPH
+0x94AC 0x6E8C  #CJK UNIFIED IDEOGRAPH
+0x94AD 0x767A  #CJK UNIFIED IDEOGRAPH
+0x94AE 0x9197  #CJK UNIFIED IDEOGRAPH
+0x94AF 0x9AEA  #CJK UNIFIED IDEOGRAPH
+0x94B0 0x4F10  #CJK UNIFIED IDEOGRAPH
+0x94B1 0x7F70  #CJK UNIFIED IDEOGRAPH
+0x94B2 0x629C  #CJK UNIFIED IDEOGRAPH
+0x94B3 0x7B4F  #CJK UNIFIED IDEOGRAPH
+0x94B4 0x95A5  #CJK UNIFIED IDEOGRAPH
+0x94B5 0x9CE9  #CJK UNIFIED IDEOGRAPH
+0x94B6 0x567A  #CJK UNIFIED IDEOGRAPH
+0x94B7 0x5859  #CJK UNIFIED IDEOGRAPH
+0x94B8 0x86E4  #CJK UNIFIED IDEOGRAPH
+0x94B9 0x96BC  #CJK UNIFIED IDEOGRAPH
+0x94BA 0x4F34  #CJK UNIFIED IDEOGRAPH
+0x94BB 0x5224  #CJK UNIFIED IDEOGRAPH
+0x94BC 0x534A  #CJK UNIFIED IDEOGRAPH
+0x94BD 0x53CD  #CJK UNIFIED IDEOGRAPH
+0x94BE 0x53DB  #CJK UNIFIED IDEOGRAPH
+0x94BF 0x5E06  #CJK UNIFIED IDEOGRAPH
+0x94C0 0x642C  #CJK UNIFIED IDEOGRAPH
+0x94C1 0x6591  #CJK UNIFIED IDEOGRAPH
+0x94C2 0x677F  #CJK UNIFIED IDEOGRAPH
+0x94C3 0x6C3E  #CJK UNIFIED IDEOGRAPH
+0x94C4 0x6C4E  #CJK UNIFIED IDEOGRAPH
+0x94C5 0x7248  #CJK UNIFIED IDEOGRAPH
+0x94C6 0x72AF  #CJK UNIFIED IDEOGRAPH
+0x94C7 0x73ED  #CJK UNIFIED IDEOGRAPH
+0x94C8 0x7554  #CJK UNIFIED IDEOGRAPH
+0x94C9 0x7E41  #CJK UNIFIED IDEOGRAPH
+0x94CA 0x822C  #CJK UNIFIED IDEOGRAPH
+0x94CB 0x85E9  #CJK UNIFIED IDEOGRAPH
+0x94CC 0x8CA9  #CJK UNIFIED IDEOGRAPH
+0x94CD 0x7BC4  #CJK UNIFIED IDEOGRAPH
+0x94CE 0x91C6  #CJK UNIFIED IDEOGRAPH
+0x94CF 0x7169  #CJK UNIFIED IDEOGRAPH
+0x94D0 0x9812  #CJK UNIFIED IDEOGRAPH
+0x94D1 0x98EF  #CJK UNIFIED IDEOGRAPH
+0x94D2 0x633D  #CJK UNIFIED IDEOGRAPH
+0x94D3 0x6669  #CJK UNIFIED IDEOGRAPH
+0x94D4 0x756A  #CJK UNIFIED IDEOGRAPH
+0x94D5 0x76E4  #CJK UNIFIED IDEOGRAPH
+0x94D6 0x78D0  #CJK UNIFIED IDEOGRAPH
+0x94D7 0x8543  #CJK UNIFIED IDEOGRAPH
+0x94D8 0x86EE  #CJK UNIFIED IDEOGRAPH
+0x94D9 0x532A  #CJK UNIFIED IDEOGRAPH
+0x94DA 0x5351  #CJK UNIFIED IDEOGRAPH
+0x94DB 0x5426  #CJK UNIFIED IDEOGRAPH
+0x94DC 0x5983  #CJK UNIFIED IDEOGRAPH
+0x94DD 0x5E87  #CJK UNIFIED IDEOGRAPH
+0x94DE 0x5F7C  #CJK UNIFIED IDEOGRAPH
+0x94DF 0x60B2  #CJK UNIFIED IDEOGRAPH
+0x94E0 0x6249  #CJK UNIFIED IDEOGRAPH
+0x94E1 0x6279  #CJK UNIFIED IDEOGRAPH
+0x94E2 0x62AB  #CJK UNIFIED IDEOGRAPH
+0x94E3 0x6590  #CJK UNIFIED IDEOGRAPH
+0x94E4 0x6BD4  #CJK UNIFIED IDEOGRAPH
+0x94E5 0x6CCC  #CJK UNIFIED IDEOGRAPH
+0x94E6 0x75B2  #CJK UNIFIED IDEOGRAPH
+0x94E7 0x76AE  #CJK UNIFIED IDEOGRAPH
+0x94E8 0x7891  #CJK UNIFIED IDEOGRAPH
+0x94E9 0x79D8  #CJK UNIFIED IDEOGRAPH
+0x94EA 0x7DCB  #CJK UNIFIED IDEOGRAPH
+0x94EB 0x7F77  #CJK UNIFIED IDEOGRAPH
+0x94EC 0x80A5  #CJK UNIFIED IDEOGRAPH
+0x94ED 0x88AB  #CJK UNIFIED IDEOGRAPH
+0x94EE 0x8AB9  #CJK UNIFIED IDEOGRAPH
+0x94EF 0x8CBB  #CJK UNIFIED IDEOGRAPH
+0x94F0 0x907F  #CJK UNIFIED IDEOGRAPH
+0x94F1 0x975E  #CJK UNIFIED IDEOGRAPH
+0x94F2 0x98DB  #CJK UNIFIED IDEOGRAPH
+0x94F3 0x6A0B  #CJK UNIFIED IDEOGRAPH
+0x94F4 0x7C38  #CJK UNIFIED IDEOGRAPH
+0x94F5 0x5099  #CJK UNIFIED IDEOGRAPH
+0x94F6 0x5C3E  #CJK UNIFIED IDEOGRAPH
+0x94F7 0x5FAE  #CJK UNIFIED IDEOGRAPH
+0x94F8 0x6787  #CJK UNIFIED IDEOGRAPH
+0x94F9 0x6BD8  #CJK UNIFIED IDEOGRAPH
+0x94FA 0x7435  #CJK UNIFIED IDEOGRAPH
+0x94FB 0x7709  #CJK UNIFIED IDEOGRAPH
+0x94FC 0x7F8E  #CJK UNIFIED IDEOGRAPH
+0x9540 0x9F3B  #CJK UNIFIED IDEOGRAPH
+0x9541 0x67CA  #CJK UNIFIED IDEOGRAPH
+0x9542 0x7A17  #CJK UNIFIED IDEOGRAPH
+0x9543 0x5339  #CJK UNIFIED IDEOGRAPH
+0x9544 0x758B  #CJK UNIFIED IDEOGRAPH
+0x9545 0x9AED  #CJK UNIFIED IDEOGRAPH
+0x9546 0x5F66  #CJK UNIFIED IDEOGRAPH
+0x9547 0x819D  #CJK UNIFIED IDEOGRAPH
+0x9548 0x83F1  #CJK UNIFIED IDEOGRAPH
+0x9549 0x8098  #CJK UNIFIED IDEOGRAPH
+0x954A 0x5F3C  #CJK UNIFIED IDEOGRAPH
+0x954B 0x5FC5  #CJK UNIFIED IDEOGRAPH
+0x954C 0x7562  #CJK UNIFIED IDEOGRAPH
+0x954D 0x7B46  #CJK UNIFIED IDEOGRAPH
+0x954E 0x903C  #CJK UNIFIED IDEOGRAPH
+0x954F 0x6867  #CJK UNIFIED IDEOGRAPH
+0x9550 0x59EB  #CJK UNIFIED IDEOGRAPH
+0x9551 0x5A9B  #CJK UNIFIED IDEOGRAPH
+0x9552 0x7D10  #CJK UNIFIED IDEOGRAPH
+0x9553 0x767E  #CJK UNIFIED IDEOGRAPH
+0x9554 0x8B2C  #CJK UNIFIED IDEOGRAPH
+0x9555 0x4FF5  #CJK UNIFIED IDEOGRAPH
+0x9556 0x5F6A  #CJK UNIFIED IDEOGRAPH
+0x9557 0x6A19  #CJK UNIFIED IDEOGRAPH
+0x9558 0x6C37  #CJK UNIFIED IDEOGRAPH
+0x9559 0x6F02  #CJK UNIFIED IDEOGRAPH
+0x955A 0x74E2  #CJK UNIFIED IDEOGRAPH
+0x955B 0x7968  #CJK UNIFIED IDEOGRAPH
+0x955C 0x8868  #CJK UNIFIED IDEOGRAPH
+0x955D 0x8A55  #CJK UNIFIED IDEOGRAPH
+0x955E 0x8C79  #CJK UNIFIED IDEOGRAPH
+0x955F 0x5EDF  #CJK UNIFIED IDEOGRAPH
+0x9560 0x63CF  #CJK UNIFIED IDEOGRAPH
+0x9561 0x75C5  #CJK UNIFIED IDEOGRAPH
+0x9562 0x79D2  #CJK UNIFIED IDEOGRAPH
+0x9563 0x82D7  #CJK UNIFIED IDEOGRAPH
+0x9564 0x9328  #CJK UNIFIED IDEOGRAPH
+0x9565 0x92F2  #CJK UNIFIED IDEOGRAPH
+0x9566 0x849C  #CJK UNIFIED IDEOGRAPH
+0x9567 0x86ED  #CJK UNIFIED IDEOGRAPH
+0x9568 0x9C2D  #CJK UNIFIED IDEOGRAPH
+0x9569 0x54C1  #CJK UNIFIED IDEOGRAPH
+0x956A 0x5F6C  #CJK UNIFIED IDEOGRAPH
+0x956B 0x658C  #CJK UNIFIED IDEOGRAPH
+0x956C 0x6D5C  #CJK UNIFIED IDEOGRAPH
+0x956D 0x7015  #CJK UNIFIED IDEOGRAPH
+0x956E 0x8CA7  #CJK UNIFIED IDEOGRAPH
+0x956F 0x8CD3  #CJK UNIFIED IDEOGRAPH
+0x9570 0x983B  #CJK UNIFIED IDEOGRAPH
+0x9571 0x654F  #CJK UNIFIED IDEOGRAPH
+0x9572 0x74F6  #CJK UNIFIED IDEOGRAPH
+0x9573 0x4E0D  #CJK UNIFIED IDEOGRAPH
+0x9574 0x4ED8  #CJK UNIFIED IDEOGRAPH
+0x9575 0x57E0  #CJK UNIFIED IDEOGRAPH
+0x9576 0x592B  #CJK UNIFIED IDEOGRAPH
+0x9577 0x5A66  #CJK UNIFIED IDEOGRAPH
+0x9578 0x5BCC  #CJK UNIFIED IDEOGRAPH
+0x9579 0x51A8  #CJK UNIFIED IDEOGRAPH
+0x957A 0x5E03  #CJK UNIFIED IDEOGRAPH
+0x957B 0x5E9C  #CJK UNIFIED IDEOGRAPH
+0x957C 0x6016  #CJK UNIFIED IDEOGRAPH
+0x957D 0x6276  #CJK UNIFIED IDEOGRAPH
+0x957E 0x6577  #CJK UNIFIED IDEOGRAPH
+0x9580 0x65A7  #CJK UNIFIED IDEOGRAPH
+0x9581 0x666E  #CJK UNIFIED IDEOGRAPH
+0x9582 0x6D6E  #CJK UNIFIED IDEOGRAPH
+0x9583 0x7236  #CJK UNIFIED IDEOGRAPH
+0x9584 0x7B26  #CJK UNIFIED IDEOGRAPH
+0x9585 0x8150  #CJK UNIFIED IDEOGRAPH
+0x9586 0x819A  #CJK UNIFIED IDEOGRAPH
+0x9587 0x8299  #CJK UNIFIED IDEOGRAPH
+0x9588 0x8B5C  #CJK UNIFIED IDEOGRAPH
+0x9589 0x8CA0  #CJK UNIFIED IDEOGRAPH
+0x958A 0x8CE6  #CJK UNIFIED IDEOGRAPH
+0x958B 0x8D74  #CJK UNIFIED IDEOGRAPH
+0x958C 0x961C  #CJK UNIFIED IDEOGRAPH
+0x958D 0x9644  #CJK UNIFIED IDEOGRAPH
+0x958E 0x4FAE  #CJK UNIFIED IDEOGRAPH
+0x958F 0x64AB  #CJK UNIFIED IDEOGRAPH
+0x9590 0x6B66  #CJK UNIFIED IDEOGRAPH
+0x9591 0x821E  #CJK UNIFIED IDEOGRAPH
+0x9592 0x8461  #CJK UNIFIED IDEOGRAPH
+0x9593 0x856A  #CJK UNIFIED IDEOGRAPH
+0x9594 0x90E8  #CJK UNIFIED IDEOGRAPH
+0x9595 0x5C01  #CJK UNIFIED IDEOGRAPH
+0x9596 0x6953  #CJK UNIFIED IDEOGRAPH
+0x9597 0x98A8  #CJK UNIFIED IDEOGRAPH
+0x9598 0x847A  #CJK UNIFIED IDEOGRAPH
+0x9599 0x8557  #CJK UNIFIED IDEOGRAPH
+0x959A 0x4F0F  #CJK UNIFIED IDEOGRAPH
+0x959B 0x526F  #CJK UNIFIED IDEOGRAPH
+0x959C 0x5FA9  #CJK UNIFIED IDEOGRAPH
+0x959D 0x5E45  #CJK UNIFIED IDEOGRAPH
+0x959E 0x670D  #CJK UNIFIED IDEOGRAPH
+0x959F 0x798F  #CJK UNIFIED IDEOGRAPH
+0x95A0 0x8179  #CJK UNIFIED IDEOGRAPH
+0x95A1 0x8907  #CJK UNIFIED IDEOGRAPH
+0x95A2 0x8986  #CJK UNIFIED IDEOGRAPH
+0x95A3 0x6DF5  #CJK UNIFIED IDEOGRAPH
+0x95A4 0x5F17  #CJK UNIFIED IDEOGRAPH
+0x95A5 0x6255  #CJK UNIFIED IDEOGRAPH
+0x95A6 0x6CB8  #CJK UNIFIED IDEOGRAPH
+0x95A7 0x4ECF  #CJK UNIFIED IDEOGRAPH
+0x95A8 0x7269  #CJK UNIFIED IDEOGRAPH
+0x95A9 0x9B92  #CJK UNIFIED IDEOGRAPH
+0x95AA 0x5206  #CJK UNIFIED IDEOGRAPH
+0x95AB 0x543B  #CJK UNIFIED IDEOGRAPH
+0x95AC 0x5674  #CJK UNIFIED IDEOGRAPH
+0x95AD 0x58B3  #CJK UNIFIED IDEOGRAPH
+0x95AE 0x61A4  #CJK UNIFIED IDEOGRAPH
+0x95AF 0x626E  #CJK UNIFIED IDEOGRAPH
+0x95B0 0x711A  #CJK UNIFIED IDEOGRAPH
+0x95B1 0x596E  #CJK UNIFIED IDEOGRAPH
+0x95B2 0x7C89  #CJK UNIFIED IDEOGRAPH
+0x95B3 0x7CDE  #CJK UNIFIED IDEOGRAPH
+0x95B4 0x7D1B  #CJK UNIFIED IDEOGRAPH
+0x95B5 0x96F0  #CJK UNIFIED IDEOGRAPH
+0x95B6 0x6587  #CJK UNIFIED IDEOGRAPH
+0x95B7 0x805E  #CJK UNIFIED IDEOGRAPH
+0x95B8 0x4E19  #CJK UNIFIED IDEOGRAPH
+0x95B9 0x4F75  #CJK UNIFIED IDEOGRAPH
+0x95BA 0x5175  #CJK UNIFIED IDEOGRAPH
+0x95BB 0x5840  #CJK UNIFIED IDEOGRAPH
+0x95BC 0x5E63  #CJK UNIFIED IDEOGRAPH
+0x95BD 0x5E73  #CJK UNIFIED IDEOGRAPH
+0x95BE 0x5F0A  #CJK UNIFIED IDEOGRAPH
+0x95BF 0x67C4  #CJK UNIFIED IDEOGRAPH
+0x95C0 0x4E26  #CJK UNIFIED IDEOGRAPH
+0x95C1 0x853D  #CJK UNIFIED IDEOGRAPH
+0x95C2 0x9589  #CJK UNIFIED IDEOGRAPH
+0x95C3 0x965B  #CJK UNIFIED IDEOGRAPH
+0x95C4 0x7C73  #CJK UNIFIED IDEOGRAPH
+0x95C5 0x9801  #CJK UNIFIED IDEOGRAPH
+0x95C6 0x50FB  #CJK UNIFIED IDEOGRAPH
+0x95C7 0x58C1  #CJK UNIFIED IDEOGRAPH
+0x95C8 0x7656  #CJK UNIFIED IDEOGRAPH
+0x95C9 0x78A7  #CJK UNIFIED IDEOGRAPH
+0x95CA 0x5225  #CJK UNIFIED IDEOGRAPH
+0x95CB 0x77A5  #CJK UNIFIED IDEOGRAPH
+0x95CC 0x8511  #CJK UNIFIED IDEOGRAPH
+0x95CD 0x7B86  #CJK UNIFIED IDEOGRAPH
+0x95CE 0x504F  #CJK UNIFIED IDEOGRAPH
+0x95CF 0x5909  #CJK UNIFIED IDEOGRAPH
+0x95D0 0x7247  #CJK UNIFIED IDEOGRAPH
+0x95D1 0x7BC7  #CJK UNIFIED IDEOGRAPH
+0x95D2 0x7DE8  #CJK UNIFIED IDEOGRAPH
+0x95D3 0x8FBA  #CJK UNIFIED IDEOGRAPH
+0x95D4 0x8FD4  #CJK UNIFIED IDEOGRAPH
+0x95D5 0x904D  #CJK UNIFIED IDEOGRAPH
+0x95D6 0x4FBF  #CJK UNIFIED IDEOGRAPH
+0x95D7 0x52C9  #CJK UNIFIED IDEOGRAPH
+0x95D8 0x5A29  #CJK UNIFIED IDEOGRAPH
+0x95D9 0x5F01  #CJK UNIFIED IDEOGRAPH
+0x95DA 0x97AD  #CJK UNIFIED IDEOGRAPH
+0x95DB 0x4FDD  #CJK UNIFIED IDEOGRAPH
+0x95DC 0x8217  #CJK UNIFIED IDEOGRAPH
+0x95DD 0x92EA  #CJK UNIFIED IDEOGRAPH
+0x95DE 0x5703  #CJK UNIFIED IDEOGRAPH
+0x95DF 0x6355  #CJK UNIFIED IDEOGRAPH
+0x95E0 0x6B69  #CJK UNIFIED IDEOGRAPH
+0x95E1 0x752B  #CJK UNIFIED IDEOGRAPH
+0x95E2 0x88DC  #CJK UNIFIED IDEOGRAPH
+0x95E3 0x8F14  #CJK UNIFIED IDEOGRAPH
+0x95E4 0x7A42  #CJK UNIFIED IDEOGRAPH
+0x95E5 0x52DF  #CJK UNIFIED IDEOGRAPH
+0x95E6 0x5893  #CJK UNIFIED IDEOGRAPH
+0x95E7 0x6155  #CJK UNIFIED IDEOGRAPH
+0x95E8 0x620A  #CJK UNIFIED IDEOGRAPH
+0x95E9 0x66AE  #CJK UNIFIED IDEOGRAPH
+0x95EA 0x6BCD  #CJK UNIFIED IDEOGRAPH
+0x95EB 0x7C3F  #CJK UNIFIED IDEOGRAPH
+0x95EC 0x83E9  #CJK UNIFIED IDEOGRAPH
+0x95ED 0x5023  #CJK UNIFIED IDEOGRAPH
+0x95EE 0x4FF8  #CJK UNIFIED IDEOGRAPH
+0x95EF 0x5305  #CJK UNIFIED IDEOGRAPH
+0x95F0 0x5446  #CJK UNIFIED IDEOGRAPH
+0x95F1 0x5831  #CJK UNIFIED IDEOGRAPH
+0x95F2 0x5949  #CJK UNIFIED IDEOGRAPH
+0x95F3 0x5B9D  #CJK UNIFIED IDEOGRAPH
+0x95F4 0x5CF0  #CJK UNIFIED IDEOGRAPH
+0x95F5 0x5CEF  #CJK UNIFIED IDEOGRAPH
+0x95F6 0x5D29  #CJK UNIFIED IDEOGRAPH
+0x95F7 0x5E96  #CJK UNIFIED IDEOGRAPH
+0x95F8 0x62B1  #CJK UNIFIED IDEOGRAPH
+0x95F9 0x6367  #CJK UNIFIED IDEOGRAPH
+0x95FA 0x653E  #CJK UNIFIED IDEOGRAPH
+0x95FB 0x65B9  #CJK UNIFIED IDEOGRAPH
+0x95FC 0x670B  #CJK UNIFIED IDEOGRAPH
+0x9640 0x6CD5  #CJK UNIFIED IDEOGRAPH
+0x9641 0x6CE1  #CJK UNIFIED IDEOGRAPH
+0x9642 0x70F9  #CJK UNIFIED IDEOGRAPH
+0x9643 0x7832  #CJK UNIFIED IDEOGRAPH
+0x9644 0x7E2B  #CJK UNIFIED IDEOGRAPH
+0x9645 0x80DE  #CJK UNIFIED IDEOGRAPH
+0x9646 0x82B3  #CJK UNIFIED IDEOGRAPH
+0x9647 0x840C  #CJK UNIFIED IDEOGRAPH
+0x9648 0x84EC  #CJK UNIFIED IDEOGRAPH
+0x9649 0x8702  #CJK UNIFIED IDEOGRAPH
+0x964A 0x8912  #CJK UNIFIED IDEOGRAPH
+0x964B 0x8A2A  #CJK UNIFIED IDEOGRAPH
+0x964C 0x8C4A  #CJK UNIFIED IDEOGRAPH
+0x964D 0x90A6  #CJK UNIFIED IDEOGRAPH
+0x964E 0x92D2  #CJK UNIFIED IDEOGRAPH
+0x964F 0x98FD  #CJK UNIFIED IDEOGRAPH
+0x9650 0x9CF3  #CJK UNIFIED IDEOGRAPH
+0x9651 0x9D6C  #CJK UNIFIED IDEOGRAPH
+0x9652 0x4E4F  #CJK UNIFIED IDEOGRAPH
+0x9653 0x4EA1  #CJK UNIFIED IDEOGRAPH
+0x9654 0x508D  #CJK UNIFIED IDEOGRAPH
+0x9655 0x5256  #CJK UNIFIED IDEOGRAPH
+0x9656 0x574A  #CJK UNIFIED IDEOGRAPH
+0x9657 0x59A8  #CJK UNIFIED IDEOGRAPH
+0x9658 0x5E3D  #CJK UNIFIED IDEOGRAPH
+0x9659 0x5FD8  #CJK UNIFIED IDEOGRAPH
+0x965A 0x5FD9  #CJK UNIFIED IDEOGRAPH
+0x965B 0x623F  #CJK UNIFIED IDEOGRAPH
+0x965C 0x66B4  #CJK UNIFIED IDEOGRAPH
+0x965D 0x671B  #CJK UNIFIED IDEOGRAPH
+0x965E 0x67D0  #CJK UNIFIED IDEOGRAPH
+0x965F 0x68D2  #CJK UNIFIED IDEOGRAPH
+0x9660 0x5192  #CJK UNIFIED IDEOGRAPH
+0x9661 0x7D21  #CJK UNIFIED IDEOGRAPH
+0x9662 0x80AA  #CJK UNIFIED IDEOGRAPH
+0x9663 0x81A8  #CJK UNIFIED IDEOGRAPH
+0x9664 0x8B00  #CJK UNIFIED IDEOGRAPH
+0x9665 0x8C8C  #CJK UNIFIED IDEOGRAPH
+0x9666 0x8CBF  #CJK UNIFIED IDEOGRAPH
+0x9667 0x927E  #CJK UNIFIED IDEOGRAPH
+0x9668 0x9632  #CJK UNIFIED IDEOGRAPH
+0x9669 0x5420  #CJK UNIFIED IDEOGRAPH
+0x966A 0x982C  #CJK UNIFIED IDEOGRAPH
+0x966B 0x5317  #CJK UNIFIED IDEOGRAPH
+0x966C 0x50D5  #CJK UNIFIED IDEOGRAPH
+0x966D 0x535C  #CJK UNIFIED IDEOGRAPH
+0x966E 0x58A8  #CJK UNIFIED IDEOGRAPH
+0x966F 0x64B2  #CJK UNIFIED IDEOGRAPH
+0x9670 0x6734  #CJK UNIFIED IDEOGRAPH
+0x9671 0x7267  #CJK UNIFIED IDEOGRAPH
+0x9672 0x7766  #CJK UNIFIED IDEOGRAPH
+0x9673 0x7A46  #CJK UNIFIED IDEOGRAPH
+0x9674 0x91E6  #CJK UNIFIED IDEOGRAPH
+0x9675 0x52C3  #CJK UNIFIED IDEOGRAPH
+0x9676 0x6CA1  #CJK UNIFIED IDEOGRAPH
+0x9677 0x6B86  #CJK UNIFIED IDEOGRAPH
+0x9678 0x5800  #CJK UNIFIED IDEOGRAPH
+0x9679 0x5E4C  #CJK UNIFIED IDEOGRAPH
+0x967A 0x5954  #CJK UNIFIED IDEOGRAPH
+0x967B 0x672C  #CJK UNIFIED IDEOGRAPH
+0x967C 0x7FFB  #CJK UNIFIED IDEOGRAPH
+0x967D 0x51E1  #CJK UNIFIED IDEOGRAPH
+0x967E 0x76C6  #CJK UNIFIED IDEOGRAPH
+0x9680 0x6469  #CJK UNIFIED IDEOGRAPH
+0x9681 0x78E8  #CJK UNIFIED IDEOGRAPH
+0x9682 0x9B54  #CJK UNIFIED IDEOGRAPH
+0x9683 0x9EBB  #CJK UNIFIED IDEOGRAPH
+0x9684 0x57CB  #CJK UNIFIED IDEOGRAPH
+0x9685 0x59B9  #CJK UNIFIED IDEOGRAPH
+0x9686 0x6627  #CJK UNIFIED IDEOGRAPH
+0x9687 0x679A  #CJK UNIFIED IDEOGRAPH
+0x9688 0x6BCE  #CJK UNIFIED IDEOGRAPH
+0x9689 0x54E9  #CJK UNIFIED IDEOGRAPH
+0x968A 0x69D9  #CJK UNIFIED IDEOGRAPH
+0x968B 0x5E55  #CJK UNIFIED IDEOGRAPH
+0x968C 0x819C  #CJK UNIFIED IDEOGRAPH
+0x968D 0x6795  #CJK UNIFIED IDEOGRAPH
+0x968E 0x9BAA  #CJK UNIFIED IDEOGRAPH
+0x968F 0x67FE  #CJK UNIFIED IDEOGRAPH
+0x9690 0x9C52  #CJK UNIFIED IDEOGRAPH
+0x9691 0x685D  #CJK UNIFIED IDEOGRAPH
+0x9692 0x4EA6  #CJK UNIFIED IDEOGRAPH
+0x9693 0x4FE3  #CJK UNIFIED IDEOGRAPH
+0x9694 0x53C8  #CJK UNIFIED IDEOGRAPH
+0x9695 0x62B9  #CJK UNIFIED IDEOGRAPH
+0x9696 0x672B  #CJK UNIFIED IDEOGRAPH
+0x9697 0x6CAB  #CJK UNIFIED IDEOGRAPH
+0x9698 0x8FC4  #CJK UNIFIED IDEOGRAPH
+0x9699 0x4FAD  #CJK UNIFIED IDEOGRAPH
+0x969A 0x7E6D  #CJK UNIFIED IDEOGRAPH
+0x969B 0x9EBF  #CJK UNIFIED IDEOGRAPH
+0x969C 0x4E07  #CJK UNIFIED IDEOGRAPH
+0x969D 0x6162  #CJK UNIFIED IDEOGRAPH
+0x969E 0x6E80  #CJK UNIFIED IDEOGRAPH
+0x969F 0x6F2B  #CJK UNIFIED IDEOGRAPH
+0x96A0 0x8513  #CJK UNIFIED IDEOGRAPH
+0x96A1 0x5473  #CJK UNIFIED IDEOGRAPH
+0x96A2 0x672A  #CJK UNIFIED IDEOGRAPH
+0x96A3 0x9B45  #CJK UNIFIED IDEOGRAPH
+0x96A4 0x5DF3  #CJK UNIFIED IDEOGRAPH
+0x96A5 0x7B95  #CJK UNIFIED IDEOGRAPH
+0x96A6 0x5CAC  #CJK UNIFIED IDEOGRAPH
+0x96A7 0x5BC6  #CJK UNIFIED IDEOGRAPH
+0x96A8 0x871C  #CJK UNIFIED IDEOGRAPH
+0x96A9 0x6E4A  #CJK UNIFIED IDEOGRAPH
+0x96AA 0x84D1  #CJK UNIFIED IDEOGRAPH
+0x96AB 0x7A14  #CJK UNIFIED IDEOGRAPH
+0x96AC 0x8108  #CJK UNIFIED IDEOGRAPH
+0x96AD 0x5999  #CJK UNIFIED IDEOGRAPH
+0x96AE 0x7C8D  #CJK UNIFIED IDEOGRAPH
+0x96AF 0x6C11  #CJK UNIFIED IDEOGRAPH
+0x96B0 0x7720  #CJK UNIFIED IDEOGRAPH
+0x96B1 0x52D9  #CJK UNIFIED IDEOGRAPH
+0x96B2 0x5922  #CJK UNIFIED IDEOGRAPH
+0x96B3 0x7121  #CJK UNIFIED IDEOGRAPH
+0x96B4 0x725F  #CJK UNIFIED IDEOGRAPH
+0x96B5 0x77DB  #CJK UNIFIED IDEOGRAPH
+0x96B6 0x9727  #CJK UNIFIED IDEOGRAPH
+0x96B7 0x9D61  #CJK UNIFIED IDEOGRAPH
+0x96B8 0x690B  #CJK UNIFIED IDEOGRAPH
+0x96B9 0x5A7F  #CJK UNIFIED IDEOGRAPH
+0x96BA 0x5A18  #CJK UNIFIED IDEOGRAPH
+0x96BB 0x51A5  #CJK UNIFIED IDEOGRAPH
+0x96BC 0x540D  #CJK UNIFIED IDEOGRAPH
+0x96BD 0x547D  #CJK UNIFIED IDEOGRAPH
+0x96BE 0x660E  #CJK UNIFIED IDEOGRAPH
+0x96BF 0x76DF  #CJK UNIFIED IDEOGRAPH
+0x96C0 0x8FF7  #CJK UNIFIED IDEOGRAPH
+0x96C1 0x9298  #CJK UNIFIED IDEOGRAPH
+0x96C2 0x9CF4  #CJK UNIFIED IDEOGRAPH
+0x96C3 0x59EA  #CJK UNIFIED IDEOGRAPH
+0x96C4 0x725D  #CJK UNIFIED IDEOGRAPH
+0x96C5 0x6EC5  #CJK UNIFIED IDEOGRAPH
+0x96C6 0x514D  #CJK UNIFIED IDEOGRAPH
+0x96C7 0x68C9  #CJK UNIFIED IDEOGRAPH
+0x96C8 0x7DBF  #CJK UNIFIED IDEOGRAPH
+0x96C9 0x7DEC  #CJK UNIFIED IDEOGRAPH
+0x96CA 0x9762  #CJK UNIFIED IDEOGRAPH
+0x96CB 0x9EBA  #CJK UNIFIED IDEOGRAPH
+0x96CC 0x6478  #CJK UNIFIED IDEOGRAPH
+0x96CD 0x6A21  #CJK UNIFIED IDEOGRAPH
+0x96CE 0x8302  #CJK UNIFIED IDEOGRAPH
+0x96CF 0x5984  #CJK UNIFIED IDEOGRAPH
+0x96D0 0x5B5F  #CJK UNIFIED IDEOGRAPH
+0x96D1 0x6BDB  #CJK UNIFIED IDEOGRAPH
+0x96D2 0x731B  #CJK UNIFIED IDEOGRAPH
+0x96D3 0x76F2  #CJK UNIFIED IDEOGRAPH
+0x96D4 0x7DB2  #CJK UNIFIED IDEOGRAPH
+0x96D5 0x8017  #CJK UNIFIED IDEOGRAPH
+0x96D6 0x8499  #CJK UNIFIED IDEOGRAPH
+0x96D7 0x5132  #CJK UNIFIED IDEOGRAPH
+0x96D8 0x6728  #CJK UNIFIED IDEOGRAPH
+0x96D9 0x9ED9  #CJK UNIFIED IDEOGRAPH
+0x96DA 0x76EE  #CJK UNIFIED IDEOGRAPH
+0x96DB 0x6762  #CJK UNIFIED IDEOGRAPH
+0x96DC 0x52FF  #CJK UNIFIED IDEOGRAPH
+0x96DD 0x9905  #CJK UNIFIED IDEOGRAPH
+0x96DE 0x5C24  #CJK UNIFIED IDEOGRAPH
+0x96DF 0x623B  #CJK UNIFIED IDEOGRAPH
+0x96E0 0x7C7E  #CJK UNIFIED IDEOGRAPH
+0x96E1 0x8CB0  #CJK UNIFIED IDEOGRAPH
+0x96E2 0x554F  #CJK UNIFIED IDEOGRAPH
+0x96E3 0x60B6  #CJK UNIFIED IDEOGRAPH
+0x96E4 0x7D0B  #CJK UNIFIED IDEOGRAPH
+0x96E5 0x9580  #CJK UNIFIED IDEOGRAPH
+0x96E6 0x5301  #CJK UNIFIED IDEOGRAPH
+0x96E7 0x4E5F  #CJK UNIFIED IDEOGRAPH
+0x96E8 0x51B6  #CJK UNIFIED IDEOGRAPH
+0x96E9 0x591C  #CJK UNIFIED IDEOGRAPH
+0x96EA 0x723A  #CJK UNIFIED IDEOGRAPH
+0x96EB 0x8036  #CJK UNIFIED IDEOGRAPH
+0x96EC 0x91CE  #CJK UNIFIED IDEOGRAPH
+0x96ED 0x5F25  #CJK UNIFIED IDEOGRAPH
+0x96EE 0x77E2  #CJK UNIFIED IDEOGRAPH
+0x96EF 0x5384  #CJK UNIFIED IDEOGRAPH
+0x96F0 0x5F79  #CJK UNIFIED IDEOGRAPH
+0x96F1 0x7D04  #CJK UNIFIED IDEOGRAPH
+0x96F2 0x85AC  #CJK UNIFIED IDEOGRAPH
+0x96F3 0x8A33  #CJK UNIFIED IDEOGRAPH
+0x96F4 0x8E8D  #CJK UNIFIED IDEOGRAPH
+0x96F5 0x9756  #CJK UNIFIED IDEOGRAPH
+0x96F6 0x67F3  #CJK UNIFIED IDEOGRAPH
+0x96F7 0x85AE  #CJK UNIFIED IDEOGRAPH
+0x96F8 0x9453  #CJK UNIFIED IDEOGRAPH
+0x96F9 0x6109  #CJK UNIFIED IDEOGRAPH
+0x96FA 0x6108  #CJK UNIFIED IDEOGRAPH
+0x96FB 0x6CB9  #CJK UNIFIED IDEOGRAPH
+0x96FC 0x7652  #CJK UNIFIED IDEOGRAPH
+0x9740 0x8AED  #CJK UNIFIED IDEOGRAPH
+0x9741 0x8F38  #CJK UNIFIED IDEOGRAPH
+0x9742 0x552F  #CJK UNIFIED IDEOGRAPH
+0x9743 0x4F51  #CJK UNIFIED IDEOGRAPH
+0x9744 0x512A  #CJK UNIFIED IDEOGRAPH
+0x9745 0x52C7  #CJK UNIFIED IDEOGRAPH
+0x9746 0x53CB  #CJK UNIFIED IDEOGRAPH
+0x9747 0x5BA5  #CJK UNIFIED IDEOGRAPH
+0x9748 0x5E7D  #CJK UNIFIED IDEOGRAPH
+0x9749 0x60A0  #CJK UNIFIED IDEOGRAPH
+0x974A 0x6182  #CJK UNIFIED IDEOGRAPH
+0x974B 0x63D6  #CJK UNIFIED IDEOGRAPH
+0x974C 0x6709  #CJK UNIFIED IDEOGRAPH
+0x974D 0x67DA  #CJK UNIFIED IDEOGRAPH
+0x974E 0x6E67  #CJK UNIFIED IDEOGRAPH
+0x974F 0x6D8C  #CJK UNIFIED IDEOGRAPH
+0x9750 0x7336  #CJK UNIFIED IDEOGRAPH
+0x9751 0x7337  #CJK UNIFIED IDEOGRAPH
+0x9752 0x7531  #CJK UNIFIED IDEOGRAPH
+0x9753 0x7950  #CJK UNIFIED IDEOGRAPH
+0x9754 0x88D5  #CJK UNIFIED IDEOGRAPH
+0x9755 0x8A98  #CJK UNIFIED IDEOGRAPH
+0x9756 0x904A  #CJK UNIFIED IDEOGRAPH
+0x9757 0x9091  #CJK UNIFIED IDEOGRAPH
+0x9758 0x90F5  #CJK UNIFIED IDEOGRAPH
+0x9759 0x96C4  #CJK UNIFIED IDEOGRAPH
+0x975A 0x878D  #CJK UNIFIED IDEOGRAPH
+0x975B 0x5915  #CJK UNIFIED IDEOGRAPH
+0x975C 0x4E88  #CJK UNIFIED IDEOGRAPH
+0x975D 0x4F59  #CJK UNIFIED IDEOGRAPH
+0x975E 0x4E0E  #CJK UNIFIED IDEOGRAPH
+0x975F 0x8A89  #CJK UNIFIED IDEOGRAPH
+0x9760 0x8F3F  #CJK UNIFIED IDEOGRAPH
+0x9761 0x9810  #CJK UNIFIED IDEOGRAPH
+0x9762 0x50AD  #CJK UNIFIED IDEOGRAPH
+0x9763 0x5E7C  #CJK UNIFIED IDEOGRAPH
+0x9764 0x5996  #CJK UNIFIED IDEOGRAPH
+0x9765 0x5BB9  #CJK UNIFIED IDEOGRAPH
+0x9766 0x5EB8  #CJK UNIFIED IDEOGRAPH
+0x9767 0x63DA  #CJK UNIFIED IDEOGRAPH
+0x9768 0x63FA  #CJK UNIFIED IDEOGRAPH
+0x9769 0x64C1  #CJK UNIFIED IDEOGRAPH
+0x976A 0x66DC  #CJK UNIFIED IDEOGRAPH
+0x976B 0x694A  #CJK UNIFIED IDEOGRAPH
+0x976C 0x69D8  #CJK UNIFIED IDEOGRAPH
+0x976D 0x6D0B  #CJK UNIFIED IDEOGRAPH
+0x976E 0x6EB6  #CJK UNIFIED IDEOGRAPH
+0x976F 0x7194  #CJK UNIFIED IDEOGRAPH
+0x9770 0x7528  #CJK UNIFIED IDEOGRAPH
+0x9771 0x7AAF  #CJK UNIFIED IDEOGRAPH
+0x9772 0x7F8A  #CJK UNIFIED IDEOGRAPH
+0x9773 0x8000  #CJK UNIFIED IDEOGRAPH
+0x9774 0x8449  #CJK UNIFIED IDEOGRAPH
+0x9775 0x84C9  #CJK UNIFIED IDEOGRAPH
+0x9776 0x8981  #CJK UNIFIED IDEOGRAPH
+0x9777 0x8B21  #CJK UNIFIED IDEOGRAPH
+0x9778 0x8E0A  #CJK UNIFIED IDEOGRAPH
+0x9779 0x9065  #CJK UNIFIED IDEOGRAPH
+0x977A 0x967D  #CJK UNIFIED IDEOGRAPH
+0x977B 0x990A  #CJK UNIFIED IDEOGRAPH
+0x977C 0x617E  #CJK UNIFIED IDEOGRAPH
+0x977D 0x6291  #CJK UNIFIED IDEOGRAPH
+0x977E 0x6B32  #CJK UNIFIED IDEOGRAPH
+0x9780 0x6C83  #CJK UNIFIED IDEOGRAPH
+0x9781 0x6D74  #CJK UNIFIED IDEOGRAPH
+0x9782 0x7FCC  #CJK UNIFIED IDEOGRAPH
+0x9783 0x7FFC  #CJK UNIFIED IDEOGRAPH
+0x9784 0x6DC0  #CJK UNIFIED IDEOGRAPH
+0x9785 0x7F85  #CJK UNIFIED IDEOGRAPH
+0x9786 0x87BA  #CJK UNIFIED IDEOGRAPH
+0x9787 0x88F8  #CJK UNIFIED IDEOGRAPH
+0x9788 0x6765  #CJK UNIFIED IDEOGRAPH
+0x9789 0x83B1  #CJK UNIFIED IDEOGRAPH
+0x978A 0x983C  #CJK UNIFIED IDEOGRAPH
+0x978B 0x96F7  #CJK UNIFIED IDEOGRAPH
+0x978C 0x6D1B  #CJK UNIFIED IDEOGRAPH
+0x978D 0x7D61  #CJK UNIFIED IDEOGRAPH
+0x978E 0x843D  #CJK UNIFIED IDEOGRAPH
+0x978F 0x916A  #CJK UNIFIED IDEOGRAPH
+0x9790 0x4E71  #CJK UNIFIED IDEOGRAPH
+0x9791 0x5375  #CJK UNIFIED IDEOGRAPH
+0x9792 0x5D50  #CJK UNIFIED IDEOGRAPH
+0x9793 0x6B04  #CJK UNIFIED IDEOGRAPH
+0x9794 0x6FEB  #CJK UNIFIED IDEOGRAPH
+0x9795 0x85CD  #CJK UNIFIED IDEOGRAPH
+0x9796 0x862D  #CJK UNIFIED IDEOGRAPH
+0x9797 0x89A7  #CJK UNIFIED IDEOGRAPH
+0x9798 0x5229  #CJK UNIFIED IDEOGRAPH
+0x9799 0x540F  #CJK UNIFIED IDEOGRAPH
+0x979A 0x5C65  #CJK UNIFIED IDEOGRAPH
+0x979B 0x674E  #CJK UNIFIED IDEOGRAPH
+0x979C 0x68A8  #CJK UNIFIED IDEOGRAPH
+0x979D 0x7406  #CJK UNIFIED IDEOGRAPH
+0x979E 0x7483  #CJK UNIFIED IDEOGRAPH
+0x979F 0x75E2  #CJK UNIFIED IDEOGRAPH
+0x97A0 0x88CF  #CJK UNIFIED IDEOGRAPH
+0x97A1 0x88E1  #CJK UNIFIED IDEOGRAPH
+0x97A2 0x91CC  #CJK UNIFIED IDEOGRAPH
+0x97A3 0x96E2  #CJK UNIFIED IDEOGRAPH
+0x97A4 0x9678  #CJK UNIFIED IDEOGRAPH
+0x97A5 0x5F8B  #CJK UNIFIED IDEOGRAPH
+0x97A6 0x7387  #CJK UNIFIED IDEOGRAPH
+0x97A7 0x7ACB  #CJK UNIFIED IDEOGRAPH
+0x97A8 0x844E  #CJK UNIFIED IDEOGRAPH
+0x97A9 0x63A0  #CJK UNIFIED IDEOGRAPH
+0x97AA 0x7565  #CJK UNIFIED IDEOGRAPH
+0x97AB 0x5289  #CJK UNIFIED IDEOGRAPH
+0x97AC 0x6D41  #CJK UNIFIED IDEOGRAPH
+0x97AD 0x6E9C  #CJK UNIFIED IDEOGRAPH
+0x97AE 0x7409  #CJK UNIFIED IDEOGRAPH
+0x97AF 0x7559  #CJK UNIFIED IDEOGRAPH
+0x97B0 0x786B  #CJK UNIFIED IDEOGRAPH
+0x97B1 0x7C92  #CJK UNIFIED IDEOGRAPH
+0x97B2 0x9686  #CJK UNIFIED IDEOGRAPH
+0x97B3 0x7ADC  #CJK UNIFIED IDEOGRAPH
+0x97B4 0x9F8D  #CJK UNIFIED IDEOGRAPH
+0x97B5 0x4FB6  #CJK UNIFIED IDEOGRAPH
+0x97B6 0x616E  #CJK UNIFIED IDEOGRAPH
+0x97B7 0x65C5  #CJK UNIFIED IDEOGRAPH
+0x97B8 0x865C  #CJK UNIFIED IDEOGRAPH
+0x97B9 0x4E86  #CJK UNIFIED IDEOGRAPH
+0x97BA 0x4EAE  #CJK UNIFIED IDEOGRAPH
+0x97BB 0x50DA  #CJK UNIFIED IDEOGRAPH
+0x97BC 0x4E21  #CJK UNIFIED IDEOGRAPH
+0x97BD 0x51CC  #CJK UNIFIED IDEOGRAPH
+0x97BE 0x5BEE  #CJK UNIFIED IDEOGRAPH
+0x97BF 0x6599  #CJK UNIFIED IDEOGRAPH
+0x97C0 0x6881  #CJK UNIFIED IDEOGRAPH
+0x97C1 0x6DBC  #CJK UNIFIED IDEOGRAPH
+0x97C2 0x731F  #CJK UNIFIED IDEOGRAPH
+0x97C3 0x7642  #CJK UNIFIED IDEOGRAPH
+0x97C4 0x77AD  #CJK UNIFIED IDEOGRAPH
+0x97C5 0x7A1C  #CJK UNIFIED IDEOGRAPH
+0x97C6 0x7CE7  #CJK UNIFIED IDEOGRAPH
+0x97C7 0x826F  #CJK UNIFIED IDEOGRAPH
+0x97C8 0x8AD2  #CJK UNIFIED IDEOGRAPH
+0x97C9 0x907C  #CJK UNIFIED IDEOGRAPH
+0x97CA 0x91CF  #CJK UNIFIED IDEOGRAPH
+0x97CB 0x9675  #CJK UNIFIED IDEOGRAPH
+0x97CC 0x9818  #CJK UNIFIED IDEOGRAPH
+0x97CD 0x529B  #CJK UNIFIED IDEOGRAPH
+0x97CE 0x7DD1  #CJK UNIFIED IDEOGRAPH
+0x97CF 0x502B  #CJK UNIFIED IDEOGRAPH
+0x97D0 0x5398  #CJK UNIFIED IDEOGRAPH
+0x97D1 0x6797  #CJK UNIFIED IDEOGRAPH
+0x97D2 0x6DCB  #CJK UNIFIED IDEOGRAPH
+0x97D3 0x71D0  #CJK UNIFIED IDEOGRAPH
+0x97D4 0x7433  #CJK UNIFIED IDEOGRAPH
+0x97D5 0x81E8  #CJK UNIFIED IDEOGRAPH
+0x97D6 0x8F2A  #CJK UNIFIED IDEOGRAPH
+0x97D7 0x96A3  #CJK UNIFIED IDEOGRAPH
+0x97D8 0x9C57  #CJK UNIFIED IDEOGRAPH
+0x97D9 0x9E9F  #CJK UNIFIED IDEOGRAPH
+0x97DA 0x7460  #CJK UNIFIED IDEOGRAPH
+0x97DB 0x5841  #CJK UNIFIED IDEOGRAPH
+0x97DC 0x6D99  #CJK UNIFIED IDEOGRAPH
+0x97DD 0x7D2F  #CJK UNIFIED IDEOGRAPH
+0x97DE 0x985E  #CJK UNIFIED IDEOGRAPH
+0x97DF 0x4EE4  #CJK UNIFIED IDEOGRAPH
+0x97E0 0x4F36  #CJK UNIFIED IDEOGRAPH
+0x97E1 0x4F8B  #CJK UNIFIED IDEOGRAPH
+0x97E2 0x51B7  #CJK UNIFIED IDEOGRAPH
+0x97E3 0x52B1  #CJK UNIFIED IDEOGRAPH
+0x97E4 0x5DBA  #CJK UNIFIED IDEOGRAPH
+0x97E5 0x601C  #CJK UNIFIED IDEOGRAPH
+0x97E6 0x73B2  #CJK UNIFIED IDEOGRAPH
+0x97E7 0x793C  #CJK UNIFIED IDEOGRAPH
+0x97E8 0x82D3  #CJK UNIFIED IDEOGRAPH
+0x97E9 0x9234  #CJK UNIFIED IDEOGRAPH
+0x97EA 0x96B7  #CJK UNIFIED IDEOGRAPH
+0x97EB 0x96F6  #CJK UNIFIED IDEOGRAPH
+0x97EC 0x970A  #CJK UNIFIED IDEOGRAPH
+0x97ED 0x9E97  #CJK UNIFIED IDEOGRAPH
+0x97EE 0x9F62  #CJK UNIFIED IDEOGRAPH
+0x97EF 0x66A6  #CJK UNIFIED IDEOGRAPH
+0x97F0 0x6B74  #CJK UNIFIED IDEOGRAPH
+0x97F1 0x5217  #CJK UNIFIED IDEOGRAPH
+0x97F2 0x52A3  #CJK UNIFIED IDEOGRAPH
+0x97F3 0x70C8  #CJK UNIFIED IDEOGRAPH
+0x97F4 0x88C2  #CJK UNIFIED IDEOGRAPH
+0x97F5 0x5EC9  #CJK UNIFIED IDEOGRAPH
+0x97F6 0x604B  #CJK UNIFIED IDEOGRAPH
+0x97F7 0x6190  #CJK UNIFIED IDEOGRAPH
+0x97F8 0x6F23  #CJK UNIFIED IDEOGRAPH
+0x97F9 0x7149  #CJK UNIFIED IDEOGRAPH
+0x97FA 0x7C3E  #CJK UNIFIED IDEOGRAPH
+0x97FB 0x7DF4  #CJK UNIFIED IDEOGRAPH
+0x97FC 0x806F  #CJK UNIFIED IDEOGRAPH
+0x9840 0x84EE  #CJK UNIFIED IDEOGRAPH
+0x9841 0x9023  #CJK UNIFIED IDEOGRAPH
+0x9842 0x932C  #CJK UNIFIED IDEOGRAPH
+0x9843 0x5442  #CJK UNIFIED IDEOGRAPH
+0x9844 0x9B6F  #CJK UNIFIED IDEOGRAPH
+0x9845 0x6AD3  #CJK UNIFIED IDEOGRAPH
+0x9846 0x7089  #CJK UNIFIED IDEOGRAPH
+0x9847 0x8CC2  #CJK UNIFIED IDEOGRAPH
+0x9848 0x8DEF  #CJK UNIFIED IDEOGRAPH
+0x9849 0x9732  #CJK UNIFIED IDEOGRAPH
+0x984A 0x52B4  #CJK UNIFIED IDEOGRAPH
+0x984B 0x5A41  #CJK UNIFIED IDEOGRAPH
+0x984C 0x5ECA  #CJK UNIFIED IDEOGRAPH
+0x984D 0x5F04  #CJK UNIFIED IDEOGRAPH
+0x984E 0x6717  #CJK UNIFIED IDEOGRAPH
+0x984F 0x697C  #CJK UNIFIED IDEOGRAPH
+0x9850 0x6994  #CJK UNIFIED IDEOGRAPH
+0x9851 0x6D6A  #CJK UNIFIED IDEOGRAPH
+0x9852 0x6F0F  #CJK UNIFIED IDEOGRAPH
+0x9853 0x7262  #CJK UNIFIED IDEOGRAPH
+0x9854 0x72FC  #CJK UNIFIED IDEOGRAPH
+0x9855 0x7BED  #CJK UNIFIED IDEOGRAPH
+0x9856 0x8001  #CJK UNIFIED IDEOGRAPH
+0x9857 0x807E  #CJK UNIFIED IDEOGRAPH
+0x9858 0x874B  #CJK UNIFIED IDEOGRAPH
+0x9859 0x90CE  #CJK UNIFIED IDEOGRAPH
+0x985A 0x516D  #CJK UNIFIED IDEOGRAPH
+0x985B 0x9E93  #CJK UNIFIED IDEOGRAPH
+0x985C 0x7984  #CJK UNIFIED IDEOGRAPH
+0x985D 0x808B  #CJK UNIFIED IDEOGRAPH
+0x985E 0x9332  #CJK UNIFIED IDEOGRAPH
+0x985F 0x8AD6  #CJK UNIFIED IDEOGRAPH
+0x9860 0x502D  #CJK UNIFIED IDEOGRAPH
+0x9861 0x548C  #CJK UNIFIED IDEOGRAPH
+0x9862 0x8A71  #CJK UNIFIED IDEOGRAPH
+0x9863 0x6B6A  #CJK UNIFIED IDEOGRAPH
+0x9864 0x8CC4  #CJK UNIFIED IDEOGRAPH
+0x9865 0x8107  #CJK UNIFIED IDEOGRAPH
+0x9866 0x60D1  #CJK UNIFIED IDEOGRAPH
+0x9867 0x67A0  #CJK UNIFIED IDEOGRAPH
+0x9868 0x9DF2  #CJK UNIFIED IDEOGRAPH
+0x9869 0x4E99  #CJK UNIFIED IDEOGRAPH
+0x986A 0x4E98  #CJK UNIFIED IDEOGRAPH
+0x986B 0x9C10  #CJK UNIFIED IDEOGRAPH
+0x986C 0x8A6B  #CJK UNIFIED IDEOGRAPH
+0x986D 0x85C1  #CJK UNIFIED IDEOGRAPH
+0x986E 0x8568  #CJK UNIFIED IDEOGRAPH
+0x986F 0x6900  #CJK UNIFIED IDEOGRAPH
+0x9870 0x6E7E  #CJK UNIFIED IDEOGRAPH
+0x9871 0x7897  #CJK UNIFIED IDEOGRAPH
+0x9872 0x8155  #CJK UNIFIED IDEOGRAPH
+0x989F 0x5F0C  #CJK UNIFIED IDEOGRAPH
+0x98A0 0x4E10  #CJK UNIFIED IDEOGRAPH
+0x98A1 0x4E15  #CJK UNIFIED IDEOGRAPH
+0x98A2 0x4E2A  #CJK UNIFIED IDEOGRAPH
+0x98A3 0x4E31  #CJK UNIFIED IDEOGRAPH
+0x98A4 0x4E36  #CJK UNIFIED IDEOGRAPH
+0x98A5 0x4E3C  #CJK UNIFIED IDEOGRAPH
+0x98A6 0x4E3F  #CJK UNIFIED IDEOGRAPH
+0x98A7 0x4E42  #CJK UNIFIED IDEOGRAPH
+0x98A8 0x4E56  #CJK UNIFIED IDEOGRAPH
+0x98A9 0x4E58  #CJK UNIFIED IDEOGRAPH
+0x98AA 0x4E82  #CJK UNIFIED IDEOGRAPH
+0x98AB 0x4E85  #CJK UNIFIED IDEOGRAPH
+0x98AC 0x8C6B  #CJK UNIFIED IDEOGRAPH
+0x98AD 0x4E8A  #CJK UNIFIED IDEOGRAPH
+0x98AE 0x8212  #CJK UNIFIED IDEOGRAPH
+0x98AF 0x5F0D  #CJK UNIFIED IDEOGRAPH
+0x98B0 0x4E8E  #CJK UNIFIED IDEOGRAPH
+0x98B1 0x4E9E  #CJK UNIFIED IDEOGRAPH
+0x98B2 0x4E9F  #CJK UNIFIED IDEOGRAPH
+0x98B3 0x4EA0  #CJK UNIFIED IDEOGRAPH
+0x98B4 0x4EA2  #CJK UNIFIED IDEOGRAPH
+0x98B5 0x4EB0  #CJK UNIFIED IDEOGRAPH
+0x98B6 0x4EB3  #CJK UNIFIED IDEOGRAPH
+0x98B7 0x4EB6  #CJK UNIFIED IDEOGRAPH
+0x98B8 0x4ECE  #CJK UNIFIED IDEOGRAPH
+0x98B9 0x4ECD  #CJK UNIFIED IDEOGRAPH
+0x98BA 0x4EC4  #CJK UNIFIED IDEOGRAPH
+0x98BB 0x4EC6  #CJK UNIFIED IDEOGRAPH
+0x98BC 0x4EC2  #CJK UNIFIED IDEOGRAPH
+0x98BD 0x4ED7  #CJK UNIFIED IDEOGRAPH
+0x98BE 0x4EDE  #CJK UNIFIED IDEOGRAPH
+0x98BF 0x4EED  #CJK UNIFIED IDEOGRAPH
+0x98C0 0x4EDF  #CJK UNIFIED IDEOGRAPH
+0x98C1 0x4EF7  #CJK UNIFIED IDEOGRAPH
+0x98C2 0x4F09  #CJK UNIFIED IDEOGRAPH
+0x98C3 0x4F5A  #CJK UNIFIED IDEOGRAPH
+0x98C4 0x4F30  #CJK UNIFIED IDEOGRAPH
+0x98C5 0x4F5B  #CJK UNIFIED IDEOGRAPH
+0x98C6 0x4F5D  #CJK UNIFIED IDEOGRAPH
+0x98C7 0x4F57  #CJK UNIFIED IDEOGRAPH
+0x98C8 0x4F47  #CJK UNIFIED IDEOGRAPH
+0x98C9 0x4F76  #CJK UNIFIED IDEOGRAPH
+0x98CA 0x4F88  #CJK UNIFIED IDEOGRAPH
+0x98CB 0x4F8F  #CJK UNIFIED IDEOGRAPH
+0x98CC 0x4F98  #CJK UNIFIED IDEOGRAPH
+0x98CD 0x4F7B  #CJK UNIFIED IDEOGRAPH
+0x98CE 0x4F69  #CJK UNIFIED IDEOGRAPH
+0x98CF 0x4F70  #CJK UNIFIED IDEOGRAPH
+0x98D0 0x4F91  #CJK UNIFIED IDEOGRAPH
+0x98D1 0x4F6F  #CJK UNIFIED IDEOGRAPH
+0x98D2 0x4F86  #CJK UNIFIED IDEOGRAPH
+0x98D3 0x4F96  #CJK UNIFIED IDEOGRAPH
+0x98D4 0x5118  #CJK UNIFIED IDEOGRAPH
+0x98D5 0x4FD4  #CJK UNIFIED IDEOGRAPH
+0x98D6 0x4FDF  #CJK UNIFIED IDEOGRAPH
+0x98D7 0x4FCE  #CJK UNIFIED IDEOGRAPH
+0x98D8 0x4FD8  #CJK UNIFIED IDEOGRAPH
+0x98D9 0x4FDB  #CJK UNIFIED IDEOGRAPH
+0x98DA 0x4FD1  #CJK UNIFIED IDEOGRAPH
+0x98DB 0x4FDA  #CJK UNIFIED IDEOGRAPH
+0x98DC 0x4FD0  #CJK UNIFIED IDEOGRAPH
+0x98DD 0x4FE4  #CJK UNIFIED IDEOGRAPH
+0x98DE 0x4FE5  #CJK UNIFIED IDEOGRAPH
+0x98DF 0x501A  #CJK UNIFIED IDEOGRAPH
+0x98E0 0x5028  #CJK UNIFIED IDEOGRAPH
+0x98E1 0x5014  #CJK UNIFIED IDEOGRAPH
+0x98E2 0x502A  #CJK UNIFIED IDEOGRAPH
+0x98E3 0x5025  #CJK UNIFIED IDEOGRAPH
+0x98E4 0x5005  #CJK UNIFIED IDEOGRAPH
+0x98E5 0x4F1C  #CJK UNIFIED IDEOGRAPH
+0x98E6 0x4FF6  #CJK UNIFIED IDEOGRAPH
+0x98E7 0x5021  #CJK UNIFIED IDEOGRAPH
+0x98E8 0x5029  #CJK UNIFIED IDEOGRAPH
+0x98E9 0x502C  #CJK UNIFIED IDEOGRAPH
+0x98EA 0x4FFE  #CJK UNIFIED IDEOGRAPH
+0x98EB 0x4FEF  #CJK UNIFIED IDEOGRAPH
+0x98EC 0x5011  #CJK UNIFIED IDEOGRAPH
+0x98ED 0x5006  #CJK UNIFIED IDEOGRAPH
+0x98EE 0x5043  #CJK UNIFIED IDEOGRAPH
+0x98EF 0x5047  #CJK UNIFIED IDEOGRAPH
+0x98F0 0x6703  #CJK UNIFIED IDEOGRAPH
+0x98F1 0x5055  #CJK UNIFIED IDEOGRAPH
+0x98F2 0x5050  #CJK UNIFIED IDEOGRAPH
+0x98F3 0x5048  #CJK UNIFIED IDEOGRAPH
+0x98F4 0x505A  #CJK UNIFIED IDEOGRAPH
+0x98F5 0x5056  #CJK UNIFIED IDEOGRAPH
+0x98F6 0x506C  #CJK UNIFIED IDEOGRAPH
+0x98F7 0x5078  #CJK UNIFIED IDEOGRAPH
+0x98F8 0x5080  #CJK UNIFIED IDEOGRAPH
+0x98F9 0x509A  #CJK UNIFIED IDEOGRAPH
+0x98FA 0x5085  #CJK UNIFIED IDEOGRAPH
+0x98FB 0x50B4  #CJK UNIFIED IDEOGRAPH
+0x98FC 0x50B2  #CJK UNIFIED IDEOGRAPH
+0x9940 0x50C9  #CJK UNIFIED IDEOGRAPH
+0x9941 0x50CA  #CJK UNIFIED IDEOGRAPH
+0x9942 0x50B3  #CJK UNIFIED IDEOGRAPH
+0x9943 0x50C2  #CJK UNIFIED IDEOGRAPH
+0x9944 0x50D6  #CJK UNIFIED IDEOGRAPH
+0x9945 0x50DE  #CJK UNIFIED IDEOGRAPH
+0x9946 0x50E5  #CJK UNIFIED IDEOGRAPH
+0x9947 0x50ED  #CJK UNIFIED IDEOGRAPH
+0x9948 0x50E3  #CJK UNIFIED IDEOGRAPH
+0x9949 0x50EE  #CJK UNIFIED IDEOGRAPH
+0x994A 0x50F9  #CJK UNIFIED IDEOGRAPH
+0x994B 0x50F5  #CJK UNIFIED IDEOGRAPH
+0x994C 0x5109  #CJK UNIFIED IDEOGRAPH
+0x994D 0x5101  #CJK UNIFIED IDEOGRAPH
+0x994E 0x5102  #CJK UNIFIED IDEOGRAPH
+0x994F 0x5116  #CJK UNIFIED IDEOGRAPH
+0x9950 0x5115  #CJK UNIFIED IDEOGRAPH
+0x9951 0x5114  #CJK UNIFIED IDEOGRAPH
+0x9952 0x511A  #CJK UNIFIED IDEOGRAPH
+0x9953 0x5121  #CJK UNIFIED IDEOGRAPH
+0x9954 0x513A  #CJK UNIFIED IDEOGRAPH
+0x9955 0x5137  #CJK UNIFIED IDEOGRAPH
+0x9956 0x513C  #CJK UNIFIED IDEOGRAPH
+0x9957 0x513B  #CJK UNIFIED IDEOGRAPH
+0x9958 0x513F  #CJK UNIFIED IDEOGRAPH
+0x9959 0x5140  #CJK UNIFIED IDEOGRAPH
+0x995A 0x5152  #CJK UNIFIED IDEOGRAPH
+0x995B 0x514C  #CJK UNIFIED IDEOGRAPH
+0x995C 0x5154  #CJK UNIFIED IDEOGRAPH
+0x995D 0x5162  #CJK UNIFIED IDEOGRAPH
+0x995E 0x7AF8  #CJK UNIFIED IDEOGRAPH
+0x995F 0x5169  #CJK UNIFIED IDEOGRAPH
+0x9960 0x516A  #CJK UNIFIED IDEOGRAPH
+0x9961 0x516E  #CJK UNIFIED IDEOGRAPH
+0x9962 0x5180  #CJK UNIFIED IDEOGRAPH
+0x9963 0x5182  #CJK UNIFIED IDEOGRAPH
+0x9964 0x56D8  #CJK UNIFIED IDEOGRAPH
+0x9965 0x518C  #CJK UNIFIED IDEOGRAPH
+0x9966 0x5189  #CJK UNIFIED IDEOGRAPH
+0x9967 0x518F  #CJK UNIFIED IDEOGRAPH
+0x9968 0x5191  #CJK UNIFIED IDEOGRAPH
+0x9969 0x5193  #CJK UNIFIED IDEOGRAPH
+0x996A 0x5195  #CJK UNIFIED IDEOGRAPH
+0x996B 0x5196  #CJK UNIFIED IDEOGRAPH
+0x996C 0x51A4  #CJK UNIFIED IDEOGRAPH
+0x996D 0x51A6  #CJK UNIFIED IDEOGRAPH
+0x996E 0x51A2  #CJK UNIFIED IDEOGRAPH
+0x996F 0x51A9  #CJK UNIFIED IDEOGRAPH
+0x9970 0x51AA  #CJK UNIFIED IDEOGRAPH
+0x9971 0x51AB  #CJK UNIFIED IDEOGRAPH
+0x9972 0x51B3  #CJK UNIFIED IDEOGRAPH
+0x9973 0x51B1  #CJK UNIFIED IDEOGRAPH
+0x9974 0x51B2  #CJK UNIFIED IDEOGRAPH
+0x9975 0x51B0  #CJK UNIFIED IDEOGRAPH
+0x9976 0x51B5  #CJK UNIFIED IDEOGRAPH
+0x9977 0x51BD  #CJK UNIFIED IDEOGRAPH
+0x9978 0x51C5  #CJK UNIFIED IDEOGRAPH
+0x9979 0x51C9  #CJK UNIFIED IDEOGRAPH
+0x997A 0x51DB  #CJK UNIFIED IDEOGRAPH
+0x997B 0x51E0  #CJK UNIFIED IDEOGRAPH
+0x997C 0x8655  #CJK UNIFIED IDEOGRAPH
+0x997D 0x51E9  #CJK UNIFIED IDEOGRAPH
+0x997E 0x51ED  #CJK UNIFIED IDEOGRAPH
+0x9980 0x51F0  #CJK UNIFIED IDEOGRAPH
+0x9981 0x51F5  #CJK UNIFIED IDEOGRAPH
+0x9982 0x51FE  #CJK UNIFIED IDEOGRAPH
+0x9983 0x5204  #CJK UNIFIED IDEOGRAPH
+0x9984 0x520B  #CJK UNIFIED IDEOGRAPH
+0x9985 0x5214  #CJK UNIFIED IDEOGRAPH
+0x9986 0x520E  #CJK UNIFIED IDEOGRAPH
+0x9987 0x5227  #CJK UNIFIED IDEOGRAPH
+0x9988 0x522A  #CJK UNIFIED IDEOGRAPH
+0x9989 0x522E  #CJK UNIFIED IDEOGRAPH
+0x998A 0x5233  #CJK UNIFIED IDEOGRAPH
+0x998B 0x5239  #CJK UNIFIED IDEOGRAPH
+0x998C 0x524F  #CJK UNIFIED IDEOGRAPH
+0x998D 0x5244  #CJK UNIFIED IDEOGRAPH
+0x998E 0x524B  #CJK UNIFIED IDEOGRAPH
+0x998F 0x524C  #CJK UNIFIED IDEOGRAPH
+0x9990 0x525E  #CJK UNIFIED IDEOGRAPH
+0x9991 0x5254  #CJK UNIFIED IDEOGRAPH
+0x9992 0x526A  #CJK UNIFIED IDEOGRAPH
+0x9993 0x5274  #CJK UNIFIED IDEOGRAPH
+0x9994 0x5269  #CJK UNIFIED IDEOGRAPH
+0x9995 0x5273  #CJK UNIFIED IDEOGRAPH
+0x9996 0x527F  #CJK UNIFIED IDEOGRAPH
+0x9997 0x527D  #CJK UNIFIED IDEOGRAPH
+0x9998 0x528D  #CJK UNIFIED IDEOGRAPH
+0x9999 0x5294  #CJK UNIFIED IDEOGRAPH
+0x999A 0x5292  #CJK UNIFIED IDEOGRAPH
+0x999B 0x5271  #CJK UNIFIED IDEOGRAPH
+0x999C 0x5288  #CJK UNIFIED IDEOGRAPH
+0x999D 0x5291  #CJK UNIFIED IDEOGRAPH
+0x999E 0x8FA8  #CJK UNIFIED IDEOGRAPH
+0x999F 0x8FA7  #CJK UNIFIED IDEOGRAPH
+0x99A0 0x52AC  #CJK UNIFIED IDEOGRAPH
+0x99A1 0x52AD  #CJK UNIFIED IDEOGRAPH
+0x99A2 0x52BC  #CJK UNIFIED IDEOGRAPH
+0x99A3 0x52B5  #CJK UNIFIED IDEOGRAPH
+0x99A4 0x52C1  #CJK UNIFIED IDEOGRAPH
+0x99A5 0x52CD  #CJK UNIFIED IDEOGRAPH
+0x99A6 0x52D7  #CJK UNIFIED IDEOGRAPH
+0x99A7 0x52DE  #CJK UNIFIED IDEOGRAPH
+0x99A8 0x52E3  #CJK UNIFIED IDEOGRAPH
+0x99A9 0x52E6  #CJK UNIFIED IDEOGRAPH
+0x99AA 0x98ED  #CJK UNIFIED IDEOGRAPH
+0x99AB 0x52E0  #CJK UNIFIED IDEOGRAPH
+0x99AC 0x52F3  #CJK UNIFIED IDEOGRAPH
+0x99AD 0x52F5  #CJK UNIFIED IDEOGRAPH
+0x99AE 0x52F8  #CJK UNIFIED IDEOGRAPH
+0x99AF 0x52F9  #CJK UNIFIED IDEOGRAPH
+0x99B0 0x5306  #CJK UNIFIED IDEOGRAPH
+0x99B1 0x5308  #CJK UNIFIED IDEOGRAPH
+0x99B2 0x7538  #CJK UNIFIED IDEOGRAPH
+0x99B3 0x530D  #CJK UNIFIED IDEOGRAPH
+0x99B4 0x5310  #CJK UNIFIED IDEOGRAPH
+0x99B5 0x530F  #CJK UNIFIED IDEOGRAPH
+0x99B6 0x5315  #CJK UNIFIED IDEOGRAPH
+0x99B7 0x531A  #CJK UNIFIED IDEOGRAPH
+0x99B8 0x5323  #CJK UNIFIED IDEOGRAPH
+0x99B9 0x532F  #CJK UNIFIED IDEOGRAPH
+0x99BA 0x5331  #CJK UNIFIED IDEOGRAPH
+0x99BB 0x5333  #CJK UNIFIED IDEOGRAPH
+0x99BC 0x5338  #CJK UNIFIED IDEOGRAPH
+0x99BD 0x5340  #CJK UNIFIED IDEOGRAPH
+0x99BE 0x5346  #CJK UNIFIED IDEOGRAPH
+0x99BF 0x5345  #CJK UNIFIED IDEOGRAPH
+0x99C0 0x4E17  #CJK UNIFIED IDEOGRAPH
+0x99C1 0x5349  #CJK UNIFIED IDEOGRAPH
+0x99C2 0x534D  #CJK UNIFIED IDEOGRAPH
+0x99C3 0x51D6  #CJK UNIFIED IDEOGRAPH
+0x99C4 0x535E  #CJK UNIFIED IDEOGRAPH
+0x99C5 0x5369  #CJK UNIFIED IDEOGRAPH
+0x99C6 0x536E  #CJK UNIFIED IDEOGRAPH
+0x99C7 0x5918  #CJK UNIFIED IDEOGRAPH
+0x99C8 0x537B  #CJK UNIFIED IDEOGRAPH
+0x99C9 0x5377  #CJK UNIFIED IDEOGRAPH
+0x99CA 0x5382  #CJK UNIFIED IDEOGRAPH
+0x99CB 0x5396  #CJK UNIFIED IDEOGRAPH
+0x99CC 0x53A0  #CJK UNIFIED IDEOGRAPH
+0x99CD 0x53A6  #CJK UNIFIED IDEOGRAPH
+0x99CE 0x53A5  #CJK UNIFIED IDEOGRAPH
+0x99CF 0x53AE  #CJK UNIFIED IDEOGRAPH
+0x99D0 0x53B0  #CJK UNIFIED IDEOGRAPH
+0x99D1 0x53B6  #CJK UNIFIED IDEOGRAPH
+0x99D2 0x53C3  #CJK UNIFIED IDEOGRAPH
+0x99D3 0x7C12  #CJK UNIFIED IDEOGRAPH
+0x99D4 0x96D9  #CJK UNIFIED IDEOGRAPH
+0x99D5 0x53DF  #CJK UNIFIED IDEOGRAPH
+0x99D6 0x66FC  #CJK UNIFIED IDEOGRAPH
+0x99D7 0x71EE  #CJK UNIFIED IDEOGRAPH
+0x99D8 0x53EE  #CJK UNIFIED IDEOGRAPH
+0x99D9 0x53E8  #CJK UNIFIED IDEOGRAPH
+0x99DA 0x53ED  #CJK UNIFIED IDEOGRAPH
+0x99DB 0x53FA  #CJK UNIFIED IDEOGRAPH
+0x99DC 0x5401  #CJK UNIFIED IDEOGRAPH
+0x99DD 0x543D  #CJK UNIFIED IDEOGRAPH
+0x99DE 0x5440  #CJK UNIFIED IDEOGRAPH
+0x99DF 0x542C  #CJK UNIFIED IDEOGRAPH
+0x99E0 0x542D  #CJK UNIFIED IDEOGRAPH
+0x99E1 0x543C  #CJK UNIFIED IDEOGRAPH
+0x99E2 0x542E  #CJK UNIFIED IDEOGRAPH
+0x99E3 0x5436  #CJK UNIFIED IDEOGRAPH
+0x99E4 0x5429  #CJK UNIFIED IDEOGRAPH
+0x99E5 0x541D  #CJK UNIFIED IDEOGRAPH
+0x99E6 0x544E  #CJK UNIFIED IDEOGRAPH
+0x99E7 0x548F  #CJK UNIFIED IDEOGRAPH
+0x99E8 0x5475  #CJK UNIFIED IDEOGRAPH
+0x99E9 0x548E  #CJK UNIFIED IDEOGRAPH
+0x99EA 0x545F  #CJK UNIFIED IDEOGRAPH
+0x99EB 0x5471  #CJK UNIFIED IDEOGRAPH
+0x99EC 0x5477  #CJK UNIFIED IDEOGRAPH
+0x99ED 0x5470  #CJK UNIFIED IDEOGRAPH
+0x99EE 0x5492  #CJK UNIFIED IDEOGRAPH
+0x99EF 0x547B  #CJK UNIFIED IDEOGRAPH
+0x99F0 0x5480  #CJK UNIFIED IDEOGRAPH
+0x99F1 0x5476  #CJK UNIFIED IDEOGRAPH
+0x99F2 0x5484  #CJK UNIFIED IDEOGRAPH
+0x99F3 0x5490  #CJK UNIFIED IDEOGRAPH
+0x99F4 0x5486  #CJK UNIFIED IDEOGRAPH
+0x99F5 0x54C7  #CJK UNIFIED IDEOGRAPH
+0x99F6 0x54A2  #CJK UNIFIED IDEOGRAPH
+0x99F7 0x54B8  #CJK UNIFIED IDEOGRAPH
+0x99F8 0x54A5  #CJK UNIFIED IDEOGRAPH
+0x99F9 0x54AC  #CJK UNIFIED IDEOGRAPH
+0x99FA 0x54C4  #CJK UNIFIED IDEOGRAPH
+0x99FB 0x54C8  #CJK UNIFIED IDEOGRAPH
+0x99FC 0x54A8  #CJK UNIFIED IDEOGRAPH
+0x9A40 0x54AB  #CJK UNIFIED IDEOGRAPH
+0x9A41 0x54C2  #CJK UNIFIED IDEOGRAPH
+0x9A42 0x54A4  #CJK UNIFIED IDEOGRAPH
+0x9A43 0x54BE  #CJK UNIFIED IDEOGRAPH
+0x9A44 0x54BC  #CJK UNIFIED IDEOGRAPH
+0x9A45 0x54D8  #CJK UNIFIED IDEOGRAPH
+0x9A46 0x54E5  #CJK UNIFIED IDEOGRAPH
+0x9A47 0x54E6  #CJK UNIFIED IDEOGRAPH
+0x9A48 0x550F  #CJK UNIFIED IDEOGRAPH
+0x9A49 0x5514  #CJK UNIFIED IDEOGRAPH
+0x9A4A 0x54FD  #CJK UNIFIED IDEOGRAPH
+0x9A4B 0x54EE  #CJK UNIFIED IDEOGRAPH
+0x9A4C 0x54ED  #CJK UNIFIED IDEOGRAPH
+0x9A4D 0x54FA  #CJK UNIFIED IDEOGRAPH
+0x9A4E 0x54E2  #CJK UNIFIED IDEOGRAPH
+0x9A4F 0x5539  #CJK UNIFIED IDEOGRAPH
+0x9A50 0x5540  #CJK UNIFIED IDEOGRAPH
+0x9A51 0x5563  #CJK UNIFIED IDEOGRAPH
+0x9A52 0x554C  #CJK UNIFIED IDEOGRAPH
+0x9A53 0x552E  #CJK UNIFIED IDEOGRAPH
+0x9A54 0x555C  #CJK UNIFIED IDEOGRAPH
+0x9A55 0x5545  #CJK UNIFIED IDEOGRAPH
+0x9A56 0x5556  #CJK UNIFIED IDEOGRAPH
+0x9A57 0x5557  #CJK UNIFIED IDEOGRAPH
+0x9A58 0x5538  #CJK UNIFIED IDEOGRAPH
+0x9A59 0x5533  #CJK UNIFIED IDEOGRAPH
+0x9A5A 0x555D  #CJK UNIFIED IDEOGRAPH
+0x9A5B 0x5599  #CJK UNIFIED IDEOGRAPH
+0x9A5C 0x5580  #CJK UNIFIED IDEOGRAPH
+0x9A5D 0x54AF  #CJK UNIFIED IDEOGRAPH
+0x9A5E 0x558A  #CJK UNIFIED IDEOGRAPH
+0x9A5F 0x559F  #CJK UNIFIED IDEOGRAPH
+0x9A60 0x557B  #CJK UNIFIED IDEOGRAPH
+0x9A61 0x557E  #CJK UNIFIED IDEOGRAPH
+0x9A62 0x5598  #CJK UNIFIED IDEOGRAPH
+0x9A63 0x559E  #CJK UNIFIED IDEOGRAPH
+0x9A64 0x55AE  #CJK UNIFIED IDEOGRAPH
+0x9A65 0x557C  #CJK UNIFIED IDEOGRAPH
+0x9A66 0x5583  #CJK UNIFIED IDEOGRAPH
+0x9A67 0x55A9  #CJK UNIFIED IDEOGRAPH
+0x9A68 0x5587  #CJK UNIFIED IDEOGRAPH
+0x9A69 0x55A8  #CJK UNIFIED IDEOGRAPH
+0x9A6A 0x55DA  #CJK UNIFIED IDEOGRAPH
+0x9A6B 0x55C5  #CJK UNIFIED IDEOGRAPH
+0x9A6C 0x55DF  #CJK UNIFIED IDEOGRAPH
+0x9A6D 0x55C4  #CJK UNIFIED IDEOGRAPH
+0x9A6E 0x55DC  #CJK UNIFIED IDEOGRAPH
+0x9A6F 0x55E4  #CJK UNIFIED IDEOGRAPH
+0x9A70 0x55D4  #CJK UNIFIED IDEOGRAPH
+0x9A71 0x5614  #CJK UNIFIED IDEOGRAPH
+0x9A72 0x55F7  #CJK UNIFIED IDEOGRAPH
+0x9A73 0x5616  #CJK UNIFIED IDEOGRAPH
+0x9A74 0x55FE  #CJK UNIFIED IDEOGRAPH
+0x9A75 0x55FD  #CJK UNIFIED IDEOGRAPH
+0x9A76 0x561B  #CJK UNIFIED IDEOGRAPH
+0x9A77 0x55F9  #CJK UNIFIED IDEOGRAPH
+0x9A78 0x564E  #CJK UNIFIED IDEOGRAPH
+0x9A79 0x5650  #CJK UNIFIED IDEOGRAPH
+0x9A7A 0x71DF  #CJK UNIFIED IDEOGRAPH
+0x9A7B 0x5634  #CJK UNIFIED IDEOGRAPH
+0x9A7C 0x5636  #CJK UNIFIED IDEOGRAPH
+0x9A7D 0x5632  #CJK UNIFIED IDEOGRAPH
+0x9A7E 0x5638  #CJK UNIFIED IDEOGRAPH
+0x9A80 0x566B  #CJK UNIFIED IDEOGRAPH
+0x9A81 0x5664  #CJK UNIFIED IDEOGRAPH
+0x9A82 0x562F  #CJK UNIFIED IDEOGRAPH
+0x9A83 0x566C  #CJK UNIFIED IDEOGRAPH
+0x9A84 0x566A  #CJK UNIFIED IDEOGRAPH
+0x9A85 0x5686  #CJK UNIFIED IDEOGRAPH
+0x9A86 0x5680  #CJK UNIFIED IDEOGRAPH
+0x9A87 0x568A  #CJK UNIFIED IDEOGRAPH
+0x9A88 0x56A0  #CJK UNIFIED IDEOGRAPH
+0x9A89 0x5694  #CJK UNIFIED IDEOGRAPH
+0x9A8A 0x568F  #CJK UNIFIED IDEOGRAPH
+0x9A8B 0x56A5  #CJK UNIFIED IDEOGRAPH
+0x9A8C 0x56AE  #CJK UNIFIED IDEOGRAPH
+0x9A8D 0x56B6  #CJK UNIFIED IDEOGRAPH
+0x9A8E 0x56B4  #CJK UNIFIED IDEOGRAPH
+0x9A8F 0x56C2  #CJK UNIFIED IDEOGRAPH
+0x9A90 0x56BC  #CJK UNIFIED IDEOGRAPH
+0x9A91 0x56C1  #CJK UNIFIED IDEOGRAPH
+0x9A92 0x56C3  #CJK UNIFIED IDEOGRAPH
+0x9A93 0x56C0  #CJK UNIFIED IDEOGRAPH
+0x9A94 0x56C8  #CJK UNIFIED IDEOGRAPH
+0x9A95 0x56CE  #CJK UNIFIED IDEOGRAPH
+0x9A96 0x56D1  #CJK UNIFIED IDEOGRAPH
+0x9A97 0x56D3  #CJK UNIFIED IDEOGRAPH
+0x9A98 0x56D7  #CJK UNIFIED IDEOGRAPH
+0x9A99 0x56EE  #CJK UNIFIED IDEOGRAPH
+0x9A9A 0x56F9  #CJK UNIFIED IDEOGRAPH
+0x9A9B 0x5700  #CJK UNIFIED IDEOGRAPH
+0x9A9C 0x56FF  #CJK UNIFIED IDEOGRAPH
+0x9A9D 0x5704  #CJK UNIFIED IDEOGRAPH
+0x9A9E 0x5709  #CJK UNIFIED IDEOGRAPH
+0x9A9F 0x5708  #CJK UNIFIED IDEOGRAPH
+0x9AA0 0x570B  #CJK UNIFIED IDEOGRAPH
+0x9AA1 0x570D  #CJK UNIFIED IDEOGRAPH
+0x9AA2 0x5713  #CJK UNIFIED IDEOGRAPH
+0x9AA3 0x5718  #CJK UNIFIED IDEOGRAPH
+0x9AA4 0x5716  #CJK UNIFIED IDEOGRAPH
+0x9AA5 0x55C7  #CJK UNIFIED IDEOGRAPH
+0x9AA6 0x571C  #CJK UNIFIED IDEOGRAPH
+0x9AA7 0x5726  #CJK UNIFIED IDEOGRAPH
+0x9AA8 0x5737  #CJK UNIFIED IDEOGRAPH
+0x9AA9 0x5738  #CJK UNIFIED IDEOGRAPH
+0x9AAA 0x574E  #CJK UNIFIED IDEOGRAPH
+0x9AAB 0x573B  #CJK UNIFIED IDEOGRAPH
+0x9AAC 0x5740  #CJK UNIFIED IDEOGRAPH
+0x9AAD 0x574F  #CJK UNIFIED IDEOGRAPH
+0x9AAE 0x5769  #CJK UNIFIED IDEOGRAPH
+0x9AAF 0x57C0  #CJK UNIFIED IDEOGRAPH
+0x9AB0 0x5788  #CJK UNIFIED IDEOGRAPH
+0x9AB1 0x5761  #CJK UNIFIED IDEOGRAPH
+0x9AB2 0x577F  #CJK UNIFIED IDEOGRAPH
+0x9AB3 0x5789  #CJK UNIFIED IDEOGRAPH
+0x9AB4 0x5793  #CJK UNIFIED IDEOGRAPH
+0x9AB5 0x57A0  #CJK UNIFIED IDEOGRAPH
+0x9AB6 0x57B3  #CJK UNIFIED IDEOGRAPH
+0x9AB7 0x57A4  #CJK UNIFIED IDEOGRAPH
+0x9AB8 0x57AA  #CJK UNIFIED IDEOGRAPH
+0x9AB9 0x57B0  #CJK UNIFIED IDEOGRAPH
+0x9ABA 0x57C3  #CJK UNIFIED IDEOGRAPH
+0x9ABB 0x57C6  #CJK UNIFIED IDEOGRAPH
+0x9ABC 0x57D4  #CJK UNIFIED IDEOGRAPH
+0x9ABD 0x57D2  #CJK UNIFIED IDEOGRAPH
+0x9ABE 0x57D3  #CJK UNIFIED IDEOGRAPH
+0x9ABF 0x580A  #CJK UNIFIED IDEOGRAPH
+0x9AC0 0x57D6  #CJK UNIFIED IDEOGRAPH
+0x9AC1 0x57E3  #CJK UNIFIED IDEOGRAPH
+0x9AC2 0x580B  #CJK UNIFIED IDEOGRAPH
+0x9AC3 0x5819  #CJK UNIFIED IDEOGRAPH
+0x9AC4 0x581D  #CJK UNIFIED IDEOGRAPH
+0x9AC5 0x5872  #CJK UNIFIED IDEOGRAPH
+0x9AC6 0x5821  #CJK UNIFIED IDEOGRAPH
+0x9AC7 0x5862  #CJK UNIFIED IDEOGRAPH
+0x9AC8 0x584B  #CJK UNIFIED IDEOGRAPH
+0x9AC9 0x5870  #CJK UNIFIED IDEOGRAPH
+0x9ACA 0x6BC0  #CJK UNIFIED IDEOGRAPH
+0x9ACB 0x5852  #CJK UNIFIED IDEOGRAPH
+0x9ACC 0x583D  #CJK UNIFIED IDEOGRAPH
+0x9ACD 0x5879  #CJK UNIFIED IDEOGRAPH
+0x9ACE 0x5885  #CJK UNIFIED IDEOGRAPH
+0x9ACF 0x58B9  #CJK UNIFIED IDEOGRAPH
+0x9AD0 0x589F  #CJK UNIFIED IDEOGRAPH
+0x9AD1 0x58AB  #CJK UNIFIED IDEOGRAPH
+0x9AD2 0x58BA  #CJK UNIFIED IDEOGRAPH
+0x9AD3 0x58DE  #CJK UNIFIED IDEOGRAPH
+0x9AD4 0x58BB  #CJK UNIFIED IDEOGRAPH
+0x9AD5 0x58B8  #CJK UNIFIED IDEOGRAPH
+0x9AD6 0x58AE  #CJK UNIFIED IDEOGRAPH
+0x9AD7 0x58C5  #CJK UNIFIED IDEOGRAPH
+0x9AD8 0x58D3  #CJK UNIFIED IDEOGRAPH
+0x9AD9 0x58D1  #CJK UNIFIED IDEOGRAPH
+0x9ADA 0x58D7  #CJK UNIFIED IDEOGRAPH
+0x9ADB 0x58D9  #CJK UNIFIED IDEOGRAPH
+0x9ADC 0x58D8  #CJK UNIFIED IDEOGRAPH
+0x9ADD 0x58E5  #CJK UNIFIED IDEOGRAPH
+0x9ADE 0x58DC  #CJK UNIFIED IDEOGRAPH
+0x9ADF 0x58E4  #CJK UNIFIED IDEOGRAPH
+0x9AE0 0x58DF  #CJK UNIFIED IDEOGRAPH
+0x9AE1 0x58EF  #CJK UNIFIED IDEOGRAPH
+0x9AE2 0x58FA  #CJK UNIFIED IDEOGRAPH
+0x9AE3 0x58F9  #CJK UNIFIED IDEOGRAPH
+0x9AE4 0x58FB  #CJK UNIFIED IDEOGRAPH
+0x9AE5 0x58FC  #CJK UNIFIED IDEOGRAPH
+0x9AE6 0x58FD  #CJK UNIFIED IDEOGRAPH
+0x9AE7 0x5902  #CJK UNIFIED IDEOGRAPH
+0x9AE8 0x590A  #CJK UNIFIED IDEOGRAPH
+0x9AE9 0x5910  #CJK UNIFIED IDEOGRAPH
+0x9AEA 0x591B  #CJK UNIFIED IDEOGRAPH
+0x9AEB 0x68A6  #CJK UNIFIED IDEOGRAPH
+0x9AEC 0x5925  #CJK UNIFIED IDEOGRAPH
+0x9AED 0x592C  #CJK UNIFIED IDEOGRAPH
+0x9AEE 0x592D  #CJK UNIFIED IDEOGRAPH
+0x9AEF 0x5932  #CJK UNIFIED IDEOGRAPH
+0x9AF0 0x5938  #CJK UNIFIED IDEOGRAPH
+0x9AF1 0x593E  #CJK UNIFIED IDEOGRAPH
+0x9AF2 0x7AD2  #CJK UNIFIED IDEOGRAPH
+0x9AF3 0x5955  #CJK UNIFIED IDEOGRAPH
+0x9AF4 0x5950  #CJK UNIFIED IDEOGRAPH
+0x9AF5 0x594E  #CJK UNIFIED IDEOGRAPH
+0x9AF6 0x595A  #CJK UNIFIED IDEOGRAPH
+0x9AF7 0x5958  #CJK UNIFIED IDEOGRAPH
+0x9AF8 0x5962  #CJK UNIFIED IDEOGRAPH
+0x9AF9 0x5960  #CJK UNIFIED IDEOGRAPH
+0x9AFA 0x5967  #CJK UNIFIED IDEOGRAPH
+0x9AFB 0x596C  #CJK UNIFIED IDEOGRAPH
+0x9AFC 0x5969  #CJK UNIFIED IDEOGRAPH
+0x9B40 0x5978  #CJK UNIFIED IDEOGRAPH
+0x9B41 0x5981  #CJK UNIFIED IDEOGRAPH
+0x9B42 0x599D  #CJK UNIFIED IDEOGRAPH
+0x9B43 0x4F5E  #CJK UNIFIED IDEOGRAPH
+0x9B44 0x4FAB  #CJK UNIFIED IDEOGRAPH
+0x9B45 0x59A3  #CJK UNIFIED IDEOGRAPH
+0x9B46 0x59B2  #CJK UNIFIED IDEOGRAPH
+0x9B47 0x59C6  #CJK UNIFIED IDEOGRAPH
+0x9B48 0x59E8  #CJK UNIFIED IDEOGRAPH
+0x9B49 0x59DC  #CJK UNIFIED IDEOGRAPH
+0x9B4A 0x598D  #CJK UNIFIED IDEOGRAPH
+0x9B4B 0x59D9  #CJK UNIFIED IDEOGRAPH
+0x9B4C 0x59DA  #CJK UNIFIED IDEOGRAPH
+0x9B4D 0x5A25  #CJK UNIFIED IDEOGRAPH
+0x9B4E 0x5A1F  #CJK UNIFIED IDEOGRAPH
+0x9B4F 0x5A11  #CJK UNIFIED IDEOGRAPH
+0x9B50 0x5A1C  #CJK UNIFIED IDEOGRAPH
+0x9B51 0x5A09  #CJK UNIFIED IDEOGRAPH
+0x9B52 0x5A1A  #CJK UNIFIED IDEOGRAPH
+0x9B53 0x5A40  #CJK UNIFIED IDEOGRAPH
+0x9B54 0x5A6C  #CJK UNIFIED IDEOGRAPH
+0x9B55 0x5A49  #CJK UNIFIED IDEOGRAPH
+0x9B56 0x5A35  #CJK UNIFIED IDEOGRAPH
+0x9B57 0x5A36  #CJK UNIFIED IDEOGRAPH
+0x9B58 0x5A62  #CJK UNIFIED IDEOGRAPH
+0x9B59 0x5A6A  #CJK UNIFIED IDEOGRAPH
+0x9B5A 0x5A9A  #CJK UNIFIED IDEOGRAPH
+0x9B5B 0x5ABC  #CJK UNIFIED IDEOGRAPH
+0x9B5C 0x5ABE  #CJK UNIFIED IDEOGRAPH
+0x9B5D 0x5ACB  #CJK UNIFIED IDEOGRAPH
+0x9B5E 0x5AC2  #CJK UNIFIED IDEOGRAPH
+0x9B5F 0x5ABD  #CJK UNIFIED IDEOGRAPH
+0x9B60 0x5AE3  #CJK UNIFIED IDEOGRAPH
+0x9B61 0x5AD7  #CJK UNIFIED IDEOGRAPH
+0x9B62 0x5AE6  #CJK UNIFIED IDEOGRAPH
+0x9B63 0x5AE9  #CJK UNIFIED IDEOGRAPH
+0x9B64 0x5AD6  #CJK UNIFIED IDEOGRAPH
+0x9B65 0x5AFA  #CJK UNIFIED IDEOGRAPH
+0x9B66 0x5AFB  #CJK UNIFIED IDEOGRAPH
+0x9B67 0x5B0C  #CJK UNIFIED IDEOGRAPH
+0x9B68 0x5B0B  #CJK UNIFIED IDEOGRAPH
+0x9B69 0x5B16  #CJK UNIFIED IDEOGRAPH
+0x9B6A 0x5B32  #CJK UNIFIED IDEOGRAPH
+0x9B6B 0x5AD0  #CJK UNIFIED IDEOGRAPH
+0x9B6C 0x5B2A  #CJK UNIFIED IDEOGRAPH
+0x9B6D 0x5B36  #CJK UNIFIED IDEOGRAPH
+0x9B6E 0x5B3E  #CJK UNIFIED IDEOGRAPH
+0x9B6F 0x5B43  #CJK UNIFIED IDEOGRAPH
+0x9B70 0x5B45  #CJK UNIFIED IDEOGRAPH
+0x9B71 0x5B40  #CJK UNIFIED IDEOGRAPH
+0x9B72 0x5B51  #CJK UNIFIED IDEOGRAPH
+0x9B73 0x5B55  #CJK UNIFIED IDEOGRAPH
+0x9B74 0x5B5A  #CJK UNIFIED IDEOGRAPH
+0x9B75 0x5B5B  #CJK UNIFIED IDEOGRAPH
+0x9B76 0x5B65  #CJK UNIFIED IDEOGRAPH
+0x9B77 0x5B69  #CJK UNIFIED IDEOGRAPH
+0x9B78 0x5B70  #CJK UNIFIED IDEOGRAPH
+0x9B79 0x5B73  #CJK UNIFIED IDEOGRAPH
+0x9B7A 0x5B75  #CJK UNIFIED IDEOGRAPH
+0x9B7B 0x5B78  #CJK UNIFIED IDEOGRAPH
+0x9B7C 0x6588  #CJK UNIFIED IDEOGRAPH
+0x9B7D 0x5B7A  #CJK UNIFIED IDEOGRAPH
+0x9B7E 0x5B80  #CJK UNIFIED IDEOGRAPH
+0x9B80 0x5B83  #CJK UNIFIED IDEOGRAPH
+0x9B81 0x5BA6  #CJK UNIFIED IDEOGRAPH
+0x9B82 0x5BB8  #CJK UNIFIED IDEOGRAPH
+0x9B83 0x5BC3  #CJK UNIFIED IDEOGRAPH
+0x9B84 0x5BC7  #CJK UNIFIED IDEOGRAPH
+0x9B85 0x5BC9  #CJK UNIFIED IDEOGRAPH
+0x9B86 0x5BD4  #CJK UNIFIED IDEOGRAPH
+0x9B87 0x5BD0  #CJK UNIFIED IDEOGRAPH
+0x9B88 0x5BE4  #CJK UNIFIED IDEOGRAPH
+0x9B89 0x5BE6  #CJK UNIFIED IDEOGRAPH
+0x9B8A 0x5BE2  #CJK UNIFIED IDEOGRAPH
+0x9B8B 0x5BDE  #CJK UNIFIED IDEOGRAPH
+0x9B8C 0x5BE5  #CJK UNIFIED IDEOGRAPH
+0x9B8D 0x5BEB  #CJK UNIFIED IDEOGRAPH
+0x9B8E 0x5BF0  #CJK UNIFIED IDEOGRAPH
+0x9B8F 0x5BF6  #CJK UNIFIED IDEOGRAPH
+0x9B90 0x5BF3  #CJK UNIFIED IDEOGRAPH
+0x9B91 0x5C05  #CJK UNIFIED IDEOGRAPH
+0x9B92 0x5C07  #CJK UNIFIED IDEOGRAPH
+0x9B93 0x5C08  #CJK UNIFIED IDEOGRAPH
+0x9B94 0x5C0D  #CJK UNIFIED IDEOGRAPH
+0x9B95 0x5C13  #CJK UNIFIED IDEOGRAPH
+0x9B96 0x5C20  #CJK UNIFIED IDEOGRAPH
+0x9B97 0x5C22  #CJK UNIFIED IDEOGRAPH
+0x9B98 0x5C28  #CJK UNIFIED IDEOGRAPH
+0x9B99 0x5C38  #CJK UNIFIED IDEOGRAPH
+0x9B9A 0x5C39  #CJK UNIFIED IDEOGRAPH
+0x9B9B 0x5C41  #CJK UNIFIED IDEOGRAPH
+0x9B9C 0x5C46  #CJK UNIFIED IDEOGRAPH
+0x9B9D 0x5C4E  #CJK UNIFIED IDEOGRAPH
+0x9B9E 0x5C53  #CJK UNIFIED IDEOGRAPH
+0x9B9F 0x5C50  #CJK UNIFIED IDEOGRAPH
+0x9BA0 0x5C4F  #CJK UNIFIED IDEOGRAPH
+0x9BA1 0x5B71  #CJK UNIFIED IDEOGRAPH
+0x9BA2 0x5C6C  #CJK UNIFIED IDEOGRAPH
+0x9BA3 0x5C6E  #CJK UNIFIED IDEOGRAPH
+0x9BA4 0x4E62  #CJK UNIFIED IDEOGRAPH
+0x9BA5 0x5C76  #CJK UNIFIED IDEOGRAPH
+0x9BA6 0x5C79  #CJK UNIFIED IDEOGRAPH
+0x9BA7 0x5C8C  #CJK UNIFIED IDEOGRAPH
+0x9BA8 0x5C91  #CJK UNIFIED IDEOGRAPH
+0x9BA9 0x5C94  #CJK UNIFIED IDEOGRAPH
+0x9BAA 0x599B  #CJK UNIFIED IDEOGRAPH
+0x9BAB 0x5CAB  #CJK UNIFIED IDEOGRAPH
+0x9BAC 0x5CBB  #CJK UNIFIED IDEOGRAPH
+0x9BAD 0x5CB6  #CJK UNIFIED IDEOGRAPH
+0x9BAE 0x5CBC  #CJK UNIFIED IDEOGRAPH
+0x9BAF 0x5CB7  #CJK UNIFIED IDEOGRAPH
+0x9BB0 0x5CC5  #CJK UNIFIED IDEOGRAPH
+0x9BB1 0x5CBE  #CJK UNIFIED IDEOGRAPH
+0x9BB2 0x5CC7  #CJK UNIFIED IDEOGRAPH
+0x9BB3 0x5CD9  #CJK UNIFIED IDEOGRAPH
+0x9BB4 0x5CE9  #CJK UNIFIED IDEOGRAPH
+0x9BB5 0x5CFD  #CJK UNIFIED IDEOGRAPH
+0x9BB6 0x5CFA  #CJK UNIFIED IDEOGRAPH
+0x9BB7 0x5CED  #CJK UNIFIED IDEOGRAPH
+0x9BB8 0x5D8C  #CJK UNIFIED IDEOGRAPH
+0x9BB9 0x5CEA  #CJK UNIFIED IDEOGRAPH
+0x9BBA 0x5D0B  #CJK UNIFIED IDEOGRAPH
+0x9BBB 0x5D15  #CJK UNIFIED IDEOGRAPH
+0x9BBC 0x5D17  #CJK UNIFIED IDEOGRAPH
+0x9BBD 0x5D5C  #CJK UNIFIED IDEOGRAPH
+0x9BBE 0x5D1F  #CJK UNIFIED IDEOGRAPH
+0x9BBF 0x5D1B  #CJK UNIFIED IDEOGRAPH
+0x9BC0 0x5D11  #CJK UNIFIED IDEOGRAPH
+0x9BC1 0x5D14  #CJK UNIFIED IDEOGRAPH
+0x9BC2 0x5D22  #CJK UNIFIED IDEOGRAPH
+0x9BC3 0x5D1A  #CJK UNIFIED IDEOGRAPH
+0x9BC4 0x5D19  #CJK UNIFIED IDEOGRAPH
+0x9BC5 0x5D18  #CJK UNIFIED IDEOGRAPH
+0x9BC6 0x5D4C  #CJK UNIFIED IDEOGRAPH
+0x9BC7 0x5D52  #CJK UNIFIED IDEOGRAPH
+0x9BC8 0x5D4E  #CJK UNIFIED IDEOGRAPH
+0x9BC9 0x5D4B  #CJK UNIFIED IDEOGRAPH
+0x9BCA 0x5D6C  #CJK UNIFIED IDEOGRAPH
+0x9BCB 0x5D73  #CJK UNIFIED IDEOGRAPH
+0x9BCC 0x5D76  #CJK UNIFIED IDEOGRAPH
+0x9BCD 0x5D87  #CJK UNIFIED IDEOGRAPH
+0x9BCE 0x5D84  #CJK UNIFIED IDEOGRAPH
+0x9BCF 0x5D82  #CJK UNIFIED IDEOGRAPH
+0x9BD0 0x5DA2  #CJK UNIFIED IDEOGRAPH
+0x9BD1 0x5D9D  #CJK UNIFIED IDEOGRAPH
+0x9BD2 0x5DAC  #CJK UNIFIED IDEOGRAPH
+0x9BD3 0x5DAE  #CJK UNIFIED IDEOGRAPH
+0x9BD4 0x5DBD  #CJK UNIFIED IDEOGRAPH
+0x9BD5 0x5D90  #CJK UNIFIED IDEOGRAPH
+0x9BD6 0x5DB7  #CJK UNIFIED IDEOGRAPH
+0x9BD7 0x5DBC  #CJK UNIFIED IDEOGRAPH
+0x9BD8 0x5DC9  #CJK UNIFIED IDEOGRAPH
+0x9BD9 0x5DCD  #CJK UNIFIED IDEOGRAPH
+0x9BDA 0x5DD3  #CJK UNIFIED IDEOGRAPH
+0x9BDB 0x5DD2  #CJK UNIFIED IDEOGRAPH
+0x9BDC 0x5DD6  #CJK UNIFIED IDEOGRAPH
+0x9BDD 0x5DDB  #CJK UNIFIED IDEOGRAPH
+0x9BDE 0x5DEB  #CJK UNIFIED IDEOGRAPH
+0x9BDF 0x5DF2  #CJK UNIFIED IDEOGRAPH
+0x9BE0 0x5DF5  #CJK UNIFIED IDEOGRAPH
+0x9BE1 0x5E0B  #CJK UNIFIED IDEOGRAPH
+0x9BE2 0x5E1A  #CJK UNIFIED IDEOGRAPH
+0x9BE3 0x5E19  #CJK UNIFIED IDEOGRAPH
+0x9BE4 0x5E11  #CJK UNIFIED IDEOGRAPH
+0x9BE5 0x5E1B  #CJK UNIFIED IDEOGRAPH
+0x9BE6 0x5E36  #CJK UNIFIED IDEOGRAPH
+0x9BE7 0x5E37  #CJK UNIFIED IDEOGRAPH
+0x9BE8 0x5E44  #CJK UNIFIED IDEOGRAPH
+0x9BE9 0x5E43  #CJK UNIFIED IDEOGRAPH
+0x9BEA 0x5E40  #CJK UNIFIED IDEOGRAPH
+0x9BEB 0x5E4E  #CJK UNIFIED IDEOGRAPH
+0x9BEC 0x5E57  #CJK UNIFIED IDEOGRAPH
+0x9BED 0x5E54  #CJK UNIFIED IDEOGRAPH
+0x9BEE 0x5E5F  #CJK UNIFIED IDEOGRAPH
+0x9BEF 0x5E62  #CJK UNIFIED IDEOGRAPH
+0x9BF0 0x5E64  #CJK UNIFIED IDEOGRAPH
+0x9BF1 0x5E47  #CJK UNIFIED IDEOGRAPH
+0x9BF2 0x5E75  #CJK UNIFIED IDEOGRAPH
+0x9BF3 0x5E76  #CJK UNIFIED IDEOGRAPH
+0x9BF4 0x5E7A  #CJK UNIFIED IDEOGRAPH
+0x9BF5 0x9EBC  #CJK UNIFIED IDEOGRAPH
+0x9BF6 0x5E7F  #CJK UNIFIED IDEOGRAPH
+0x9BF7 0x5EA0  #CJK UNIFIED IDEOGRAPH
+0x9BF8 0x5EC1  #CJK UNIFIED IDEOGRAPH
+0x9BF9 0x5EC2  #CJK UNIFIED IDEOGRAPH
+0x9BFA 0x5EC8  #CJK UNIFIED IDEOGRAPH
+0x9BFB 0x5ED0  #CJK UNIFIED IDEOGRAPH
+0x9BFC 0x5ECF  #CJK UNIFIED IDEOGRAPH
+0x9C40 0x5ED6  #CJK UNIFIED IDEOGRAPH
+0x9C41 0x5EE3  #CJK UNIFIED IDEOGRAPH
+0x9C42 0x5EDD  #CJK UNIFIED IDEOGRAPH
+0x9C43 0x5EDA  #CJK UNIFIED IDEOGRAPH
+0x9C44 0x5EDB  #CJK UNIFIED IDEOGRAPH
+0x9C45 0x5EE2  #CJK UNIFIED IDEOGRAPH
+0x9C46 0x5EE1  #CJK UNIFIED IDEOGRAPH
+0x9C47 0x5EE8  #CJK UNIFIED IDEOGRAPH
+0x9C48 0x5EE9  #CJK UNIFIED IDEOGRAPH
+0x9C49 0x5EEC  #CJK UNIFIED IDEOGRAPH
+0x9C4A 0x5EF1  #CJK UNIFIED IDEOGRAPH
+0x9C4B 0x5EF3  #CJK UNIFIED IDEOGRAPH
+0x9C4C 0x5EF0  #CJK UNIFIED IDEOGRAPH
+0x9C4D 0x5EF4  #CJK UNIFIED IDEOGRAPH
+0x9C4E 0x5EF8  #CJK UNIFIED IDEOGRAPH
+0x9C4F 0x5EFE  #CJK UNIFIED IDEOGRAPH
+0x9C50 0x5F03  #CJK UNIFIED IDEOGRAPH
+0x9C51 0x5F09  #CJK UNIFIED IDEOGRAPH
+0x9C52 0x5F5D  #CJK UNIFIED IDEOGRAPH
+0x9C53 0x5F5C  #CJK UNIFIED IDEOGRAPH
+0x9C54 0x5F0B  #CJK UNIFIED IDEOGRAPH
+0x9C55 0x5F11  #CJK UNIFIED IDEOGRAPH
+0x9C56 0x5F16  #CJK UNIFIED IDEOGRAPH
+0x9C57 0x5F29  #CJK UNIFIED IDEOGRAPH
+0x9C58 0x5F2D  #CJK UNIFIED IDEOGRAPH
+0x9C59 0x5F38  #CJK UNIFIED IDEOGRAPH
+0x9C5A 0x5F41  #CJK UNIFIED IDEOGRAPH
+0x9C5B 0x5F48  #CJK UNIFIED IDEOGRAPH
+0x9C5C 0x5F4C  #CJK UNIFIED IDEOGRAPH
+0x9C5D 0x5F4E  #CJK UNIFIED IDEOGRAPH
+0x9C5E 0x5F2F  #CJK UNIFIED IDEOGRAPH
+0x9C5F 0x5F51  #CJK UNIFIED IDEOGRAPH
+0x9C60 0x5F56  #CJK UNIFIED IDEOGRAPH
+0x9C61 0x5F57  #CJK UNIFIED IDEOGRAPH
+0x9C62 0x5F59  #CJK UNIFIED IDEOGRAPH
+0x9C63 0x5F61  #CJK UNIFIED IDEOGRAPH
+0x9C64 0x5F6D  #CJK UNIFIED IDEOGRAPH
+0x9C65 0x5F73  #CJK UNIFIED IDEOGRAPH
+0x9C66 0x5F77  #CJK UNIFIED IDEOGRAPH
+0x9C67 0x5F83  #CJK UNIFIED IDEOGRAPH
+0x9C68 0x5F82  #CJK UNIFIED IDEOGRAPH
+0x9C69 0x5F7F  #CJK UNIFIED IDEOGRAPH
+0x9C6A 0x5F8A  #CJK UNIFIED IDEOGRAPH
+0x9C6B 0x5F88  #CJK UNIFIED IDEOGRAPH
+0x9C6C 0x5F91  #CJK UNIFIED IDEOGRAPH
+0x9C6D 0x5F87  #CJK UNIFIED IDEOGRAPH
+0x9C6E 0x5F9E  #CJK UNIFIED IDEOGRAPH
+0x9C6F 0x5F99  #CJK UNIFIED IDEOGRAPH
+0x9C70 0x5F98  #CJK UNIFIED IDEOGRAPH
+0x9C71 0x5FA0  #CJK UNIFIED IDEOGRAPH
+0x9C72 0x5FA8  #CJK UNIFIED IDEOGRAPH
+0x9C73 0x5FAD  #CJK UNIFIED IDEOGRAPH
+0x9C74 0x5FBC  #CJK UNIFIED IDEOGRAPH
+0x9C75 0x5FD6  #CJK UNIFIED IDEOGRAPH
+0x9C76 0x5FFB  #CJK UNIFIED IDEOGRAPH
+0x9C77 0x5FE4  #CJK UNIFIED IDEOGRAPH
+0x9C78 0x5FF8  #CJK UNIFIED IDEOGRAPH
+0x9C79 0x5FF1  #CJK UNIFIED IDEOGRAPH
+0x9C7A 0x5FDD  #CJK UNIFIED IDEOGRAPH
+0x9C7B 0x60B3  #CJK UNIFIED IDEOGRAPH
+0x9C7C 0x5FFF  #CJK UNIFIED IDEOGRAPH
+0x9C7D 0x6021  #CJK UNIFIED IDEOGRAPH
+0x9C7E 0x6060  #CJK UNIFIED IDEOGRAPH
+0x9C80 0x6019  #CJK UNIFIED IDEOGRAPH
+0x9C81 0x6010  #CJK UNIFIED IDEOGRAPH
+0x9C82 0x6029  #CJK UNIFIED IDEOGRAPH
+0x9C83 0x600E  #CJK UNIFIED IDEOGRAPH
+0x9C84 0x6031  #CJK UNIFIED IDEOGRAPH
+0x9C85 0x601B  #CJK UNIFIED IDEOGRAPH
+0x9C86 0x6015  #CJK UNIFIED IDEOGRAPH
+0x9C87 0x602B  #CJK UNIFIED IDEOGRAPH
+0x9C88 0x6026  #CJK UNIFIED IDEOGRAPH
+0x9C89 0x600F  #CJK UNIFIED IDEOGRAPH
+0x9C8A 0x603A  #CJK UNIFIED IDEOGRAPH
+0x9C8B 0x605A  #CJK UNIFIED IDEOGRAPH
+0x9C8C 0x6041  #CJK UNIFIED IDEOGRAPH
+0x9C8D 0x606A  #CJK UNIFIED IDEOGRAPH
+0x9C8E 0x6077  #CJK UNIFIED IDEOGRAPH
+0x9C8F 0x605F  #CJK UNIFIED IDEOGRAPH
+0x9C90 0x604A  #CJK UNIFIED IDEOGRAPH
+0x9C91 0x6046  #CJK UNIFIED IDEOGRAPH
+0x9C92 0x604D  #CJK UNIFIED IDEOGRAPH
+0x9C93 0x6063  #CJK UNIFIED IDEOGRAPH
+0x9C94 0x6043  #CJK UNIFIED IDEOGRAPH
+0x9C95 0x6064  #CJK UNIFIED IDEOGRAPH
+0x9C96 0x6042  #CJK UNIFIED IDEOGRAPH
+0x9C97 0x606C  #CJK UNIFIED IDEOGRAPH
+0x9C98 0x606B  #CJK UNIFIED IDEOGRAPH
+0x9C99 0x6059  #CJK UNIFIED IDEOGRAPH
+0x9C9A 0x6081  #CJK UNIFIED IDEOGRAPH
+0x9C9B 0x608D  #CJK UNIFIED IDEOGRAPH
+0x9C9C 0x60E7  #CJK UNIFIED IDEOGRAPH
+0x9C9D 0x6083  #CJK UNIFIED IDEOGRAPH
+0x9C9E 0x609A  #CJK UNIFIED IDEOGRAPH
+0x9C9F 0x6084  #CJK UNIFIED IDEOGRAPH
+0x9CA0 0x609B  #CJK UNIFIED IDEOGRAPH
+0x9CA1 0x6096  #CJK UNIFIED IDEOGRAPH
+0x9CA2 0x6097  #CJK UNIFIED IDEOGRAPH
+0x9CA3 0x6092  #CJK UNIFIED IDEOGRAPH
+0x9CA4 0x60A7  #CJK UNIFIED IDEOGRAPH
+0x9CA5 0x608B  #CJK UNIFIED IDEOGRAPH
+0x9CA6 0x60E1  #CJK UNIFIED IDEOGRAPH
+0x9CA7 0x60B8  #CJK UNIFIED IDEOGRAPH
+0x9CA8 0x60E0  #CJK UNIFIED IDEOGRAPH
+0x9CA9 0x60D3  #CJK UNIFIED IDEOGRAPH
+0x9CAA 0x60B4  #CJK UNIFIED IDEOGRAPH
+0x9CAB 0x5FF0  #CJK UNIFIED IDEOGRAPH
+0x9CAC 0x60BD  #CJK UNIFIED IDEOGRAPH
+0x9CAD 0x60C6  #CJK UNIFIED IDEOGRAPH
+0x9CAE 0x60B5  #CJK UNIFIED IDEOGRAPH
+0x9CAF 0x60D8  #CJK UNIFIED IDEOGRAPH
+0x9CB0 0x614D  #CJK UNIFIED IDEOGRAPH
+0x9CB1 0x6115  #CJK UNIFIED IDEOGRAPH
+0x9CB2 0x6106  #CJK UNIFIED IDEOGRAPH
+0x9CB3 0x60F6  #CJK UNIFIED IDEOGRAPH
+0x9CB4 0x60F7  #CJK UNIFIED IDEOGRAPH
+0x9CB5 0x6100  #CJK UNIFIED IDEOGRAPH
+0x9CB6 0x60F4  #CJK UNIFIED IDEOGRAPH
+0x9CB7 0x60FA  #CJK UNIFIED IDEOGRAPH
+0x9CB8 0x6103  #CJK UNIFIED IDEOGRAPH
+0x9CB9 0x6121  #CJK UNIFIED IDEOGRAPH
+0x9CBA 0x60FB  #CJK UNIFIED IDEOGRAPH
+0x9CBB 0x60F1  #CJK UNIFIED IDEOGRAPH
+0x9CBC 0x610D  #CJK UNIFIED IDEOGRAPH
+0x9CBD 0x610E  #CJK UNIFIED IDEOGRAPH
+0x9CBE 0x6147  #CJK UNIFIED IDEOGRAPH
+0x9CBF 0x613E  #CJK UNIFIED IDEOGRAPH
+0x9CC0 0x6128  #CJK UNIFIED IDEOGRAPH
+0x9CC1 0x6127  #CJK UNIFIED IDEOGRAPH
+0x9CC2 0x614A  #CJK UNIFIED IDEOGRAPH
+0x9CC3 0x613F  #CJK UNIFIED IDEOGRAPH
+0x9CC4 0x613C  #CJK UNIFIED IDEOGRAPH
+0x9CC5 0x612C  #CJK UNIFIED IDEOGRAPH
+0x9CC6 0x6134  #CJK UNIFIED IDEOGRAPH
+0x9CC7 0x613D  #CJK UNIFIED IDEOGRAPH
+0x9CC8 0x6142  #CJK UNIFIED IDEOGRAPH
+0x9CC9 0x6144  #CJK UNIFIED IDEOGRAPH
+0x9CCA 0x6173  #CJK UNIFIED IDEOGRAPH
+0x9CCB 0x6177  #CJK UNIFIED IDEOGRAPH
+0x9CCC 0x6158  #CJK UNIFIED IDEOGRAPH
+0x9CCD 0x6159  #CJK UNIFIED IDEOGRAPH
+0x9CCE 0x615A  #CJK UNIFIED IDEOGRAPH
+0x9CCF 0x616B  #CJK UNIFIED IDEOGRAPH
+0x9CD0 0x6174  #CJK UNIFIED IDEOGRAPH
+0x9CD1 0x616F  #CJK UNIFIED IDEOGRAPH
+0x9CD2 0x6165  #CJK UNIFIED IDEOGRAPH
+0x9CD3 0x6171  #CJK UNIFIED IDEOGRAPH
+0x9CD4 0x615F  #CJK UNIFIED IDEOGRAPH
+0x9CD5 0x615D  #CJK UNIFIED IDEOGRAPH
+0x9CD6 0x6153  #CJK UNIFIED IDEOGRAPH
+0x9CD7 0x6175  #CJK UNIFIED IDEOGRAPH
+0x9CD8 0x6199  #CJK UNIFIED IDEOGRAPH
+0x9CD9 0x6196  #CJK UNIFIED IDEOGRAPH
+0x9CDA 0x6187  #CJK UNIFIED IDEOGRAPH
+0x9CDB 0x61AC  #CJK UNIFIED IDEOGRAPH
+0x9CDC 0x6194  #CJK UNIFIED IDEOGRAPH
+0x9CDD 0x619A  #CJK UNIFIED IDEOGRAPH
+0x9CDE 0x618A  #CJK UNIFIED IDEOGRAPH
+0x9CDF 0x6191  #CJK UNIFIED IDEOGRAPH
+0x9CE0 0x61AB  #CJK UNIFIED IDEOGRAPH
+0x9CE1 0x61AE  #CJK UNIFIED IDEOGRAPH
+0x9CE2 0x61CC  #CJK UNIFIED IDEOGRAPH
+0x9CE3 0x61CA  #CJK UNIFIED IDEOGRAPH
+0x9CE4 0x61C9  #CJK UNIFIED IDEOGRAPH
+0x9CE5 0x61F7  #CJK UNIFIED IDEOGRAPH
+0x9CE6 0x61C8  #CJK UNIFIED IDEOGRAPH
+0x9CE7 0x61C3  #CJK UNIFIED IDEOGRAPH
+0x9CE8 0x61C6  #CJK UNIFIED IDEOGRAPH
+0x9CE9 0x61BA  #CJK UNIFIED IDEOGRAPH
+0x9CEA 0x61CB  #CJK UNIFIED IDEOGRAPH
+0x9CEB 0x7F79  #CJK UNIFIED IDEOGRAPH
+0x9CEC 0x61CD  #CJK UNIFIED IDEOGRAPH
+0x9CED 0x61E6  #CJK UNIFIED IDEOGRAPH
+0x9CEE 0x61E3  #CJK UNIFIED IDEOGRAPH
+0x9CEF 0x61F6  #CJK UNIFIED IDEOGRAPH
+0x9CF0 0x61FA  #CJK UNIFIED IDEOGRAPH
+0x9CF1 0x61F4  #CJK UNIFIED IDEOGRAPH
+0x9CF2 0x61FF  #CJK UNIFIED IDEOGRAPH
+0x9CF3 0x61FD  #CJK UNIFIED IDEOGRAPH
+0x9CF4 0x61FC  #CJK UNIFIED IDEOGRAPH
+0x9CF5 0x61FE  #CJK UNIFIED IDEOGRAPH
+0x9CF6 0x6200  #CJK UNIFIED IDEOGRAPH
+0x9CF7 0x6208  #CJK UNIFIED IDEOGRAPH
+0x9CF8 0x6209  #CJK UNIFIED IDEOGRAPH
+0x9CF9 0x620D  #CJK UNIFIED IDEOGRAPH
+0x9CFA 0x620C  #CJK UNIFIED IDEOGRAPH
+0x9CFB 0x6214  #CJK UNIFIED IDEOGRAPH
+0x9CFC 0x621B  #CJK UNIFIED IDEOGRAPH
+0x9D40 0x621E  #CJK UNIFIED IDEOGRAPH
+0x9D41 0x6221  #CJK UNIFIED IDEOGRAPH
+0x9D42 0x622A  #CJK UNIFIED IDEOGRAPH
+0x9D43 0x622E  #CJK UNIFIED IDEOGRAPH
+0x9D44 0x6230  #CJK UNIFIED IDEOGRAPH
+0x9D45 0x6232  #CJK UNIFIED IDEOGRAPH
+0x9D46 0x6233  #CJK UNIFIED IDEOGRAPH
+0x9D47 0x6241  #CJK UNIFIED IDEOGRAPH
+0x9D48 0x624E  #CJK UNIFIED IDEOGRAPH
+0x9D49 0x625E  #CJK UNIFIED IDEOGRAPH
+0x9D4A 0x6263  #CJK UNIFIED IDEOGRAPH
+0x9D4B 0x625B  #CJK UNIFIED IDEOGRAPH
+0x9D4C 0x6260  #CJK UNIFIED IDEOGRAPH
+0x9D4D 0x6268  #CJK UNIFIED IDEOGRAPH
+0x9D4E 0x627C  #CJK UNIFIED IDEOGRAPH
+0x9D4F 0x6282  #CJK UNIFIED IDEOGRAPH
+0x9D50 0x6289  #CJK UNIFIED IDEOGRAPH
+0x9D51 0x627E  #CJK UNIFIED IDEOGRAPH
+0x9D52 0x6292  #CJK UNIFIED IDEOGRAPH
+0x9D53 0x6293  #CJK UNIFIED IDEOGRAPH
+0x9D54 0x6296  #CJK UNIFIED IDEOGRAPH
+0x9D55 0x62D4  #CJK UNIFIED IDEOGRAPH
+0x9D56 0x6283  #CJK UNIFIED IDEOGRAPH
+0x9D57 0x6294  #CJK UNIFIED IDEOGRAPH
+0x9D58 0x62D7  #CJK UNIFIED IDEOGRAPH
+0x9D59 0x62D1  #CJK UNIFIED IDEOGRAPH
+0x9D5A 0x62BB  #CJK UNIFIED IDEOGRAPH
+0x9D5B 0x62CF  #CJK UNIFIED IDEOGRAPH
+0x9D5C 0x62FF  #CJK UNIFIED IDEOGRAPH
+0x9D5D 0x62C6  #CJK UNIFIED IDEOGRAPH
+0x9D5E 0x64D4  #CJK UNIFIED IDEOGRAPH
+0x9D5F 0x62C8  #CJK UNIFIED IDEOGRAPH
+0x9D60 0x62DC  #CJK UNIFIED IDEOGRAPH
+0x9D61 0x62CC  #CJK UNIFIED IDEOGRAPH
+0x9D62 0x62CA  #CJK UNIFIED IDEOGRAPH
+0x9D63 0x62C2  #CJK UNIFIED IDEOGRAPH
+0x9D64 0x62C7  #CJK UNIFIED IDEOGRAPH
+0x9D65 0x629B  #CJK UNIFIED IDEOGRAPH
+0x9D66 0x62C9  #CJK UNIFIED IDEOGRAPH
+0x9D67 0x630C  #CJK UNIFIED IDEOGRAPH
+0x9D68 0x62EE  #CJK UNIFIED IDEOGRAPH
+0x9D69 0x62F1  #CJK UNIFIED IDEOGRAPH
+0x9D6A 0x6327  #CJK UNIFIED IDEOGRAPH
+0x9D6B 0x6302  #CJK UNIFIED IDEOGRAPH
+0x9D6C 0x6308  #CJK UNIFIED IDEOGRAPH
+0x9D6D 0x62EF  #CJK UNIFIED IDEOGRAPH
+0x9D6E 0x62F5  #CJK UNIFIED IDEOGRAPH
+0x9D6F 0x6350  #CJK UNIFIED IDEOGRAPH
+0x9D70 0x633E  #CJK UNIFIED IDEOGRAPH
+0x9D71 0x634D  #CJK UNIFIED IDEOGRAPH
+0x9D72 0x641C  #CJK UNIFIED IDEOGRAPH
+0x9D73 0x634F  #CJK UNIFIED IDEOGRAPH
+0x9D74 0x6396  #CJK UNIFIED IDEOGRAPH
+0x9D75 0x638E  #CJK UNIFIED IDEOGRAPH
+0x9D76 0x6380  #CJK UNIFIED IDEOGRAPH
+0x9D77 0x63AB  #CJK UNIFIED IDEOGRAPH
+0x9D78 0x6376  #CJK UNIFIED IDEOGRAPH
+0x9D79 0x63A3  #CJK UNIFIED IDEOGRAPH
+0x9D7A 0x638F  #CJK UNIFIED IDEOGRAPH
+0x9D7B 0x6389  #CJK UNIFIED IDEOGRAPH
+0x9D7C 0x639F  #CJK UNIFIED IDEOGRAPH
+0x9D7D 0x63B5  #CJK UNIFIED IDEOGRAPH
+0x9D7E 0x636B  #CJK UNIFIED IDEOGRAPH
+0x9D80 0x6369  #CJK UNIFIED IDEOGRAPH
+0x9D81 0x63BE  #CJK UNIFIED IDEOGRAPH
+0x9D82 0x63E9  #CJK UNIFIED IDEOGRAPH
+0x9D83 0x63C0  #CJK UNIFIED IDEOGRAPH
+0x9D84 0x63C6  #CJK UNIFIED IDEOGRAPH
+0x9D85 0x63E3  #CJK UNIFIED IDEOGRAPH
+0x9D86 0x63C9  #CJK UNIFIED IDEOGRAPH
+0x9D87 0x63D2  #CJK UNIFIED IDEOGRAPH
+0x9D88 0x63F6  #CJK UNIFIED IDEOGRAPH
+0x9D89 0x63C4  #CJK UNIFIED IDEOGRAPH
+0x9D8A 0x6416  #CJK UNIFIED IDEOGRAPH
+0x9D8B 0x6434  #CJK UNIFIED IDEOGRAPH
+0x9D8C 0x6406  #CJK UNIFIED IDEOGRAPH
+0x9D8D 0x6413  #CJK UNIFIED IDEOGRAPH
+0x9D8E 0x6426  #CJK UNIFIED IDEOGRAPH
+0x9D8F 0x6436  #CJK UNIFIED IDEOGRAPH
+0x9D90 0x651D  #CJK UNIFIED IDEOGRAPH
+0x9D91 0x6417  #CJK UNIFIED IDEOGRAPH
+0x9D92 0x6428  #CJK UNIFIED IDEOGRAPH
+0x9D93 0x640F  #CJK UNIFIED IDEOGRAPH
+0x9D94 0x6467  #CJK UNIFIED IDEOGRAPH
+0x9D95 0x646F  #CJK UNIFIED IDEOGRAPH
+0x9D96 0x6476  #CJK UNIFIED IDEOGRAPH
+0x9D97 0x644E  #CJK UNIFIED IDEOGRAPH
+0x9D98 0x652A  #CJK UNIFIED IDEOGRAPH
+0x9D99 0x6495  #CJK UNIFIED IDEOGRAPH
+0x9D9A 0x6493  #CJK UNIFIED IDEOGRAPH
+0x9D9B 0x64A5  #CJK UNIFIED IDEOGRAPH
+0x9D9C 0x64A9  #CJK UNIFIED IDEOGRAPH
+0x9D9D 0x6488  #CJK UNIFIED IDEOGRAPH
+0x9D9E 0x64BC  #CJK UNIFIED IDEOGRAPH
+0x9D9F 0x64DA  #CJK UNIFIED IDEOGRAPH
+0x9DA0 0x64D2  #CJK UNIFIED IDEOGRAPH
+0x9DA1 0x64C5  #CJK UNIFIED IDEOGRAPH
+0x9DA2 0x64C7  #CJK UNIFIED IDEOGRAPH
+0x9DA3 0x64BB  #CJK UNIFIED IDEOGRAPH
+0x9DA4 0x64D8  #CJK UNIFIED IDEOGRAPH
+0x9DA5 0x64C2  #CJK UNIFIED IDEOGRAPH
+0x9DA6 0x64F1  #CJK UNIFIED IDEOGRAPH
+0x9DA7 0x64E7  #CJK UNIFIED IDEOGRAPH
+0x9DA8 0x8209  #CJK UNIFIED IDEOGRAPH
+0x9DA9 0x64E0  #CJK UNIFIED IDEOGRAPH
+0x9DAA 0x64E1  #CJK UNIFIED IDEOGRAPH
+0x9DAB 0x62AC  #CJK UNIFIED IDEOGRAPH
+0x9DAC 0x64E3  #CJK UNIFIED IDEOGRAPH
+0x9DAD 0x64EF  #CJK UNIFIED IDEOGRAPH
+0x9DAE 0x652C  #CJK UNIFIED IDEOGRAPH
+0x9DAF 0x64F6  #CJK UNIFIED IDEOGRAPH
+0x9DB0 0x64F4  #CJK UNIFIED IDEOGRAPH
+0x9DB1 0x64F2  #CJK UNIFIED IDEOGRAPH
+0x9DB2 0x64FA  #CJK UNIFIED IDEOGRAPH
+0x9DB3 0x6500  #CJK UNIFIED IDEOGRAPH
+0x9DB4 0x64FD  #CJK UNIFIED IDEOGRAPH
+0x9DB5 0x6518  #CJK UNIFIED IDEOGRAPH
+0x9DB6 0x651C  #CJK UNIFIED IDEOGRAPH
+0x9DB7 0x6505  #CJK UNIFIED IDEOGRAPH
+0x9DB8 0x6524  #CJK UNIFIED IDEOGRAPH
+0x9DB9 0x6523  #CJK UNIFIED IDEOGRAPH
+0x9DBA 0x652B  #CJK UNIFIED IDEOGRAPH
+0x9DBB 0x6534  #CJK UNIFIED IDEOGRAPH
+0x9DBC 0x6535  #CJK UNIFIED IDEOGRAPH
+0x9DBD 0x6537  #CJK UNIFIED IDEOGRAPH
+0x9DBE 0x6536  #CJK UNIFIED IDEOGRAPH
+0x9DBF 0x6538  #CJK UNIFIED IDEOGRAPH
+0x9DC0 0x754B  #CJK UNIFIED IDEOGRAPH
+0x9DC1 0x6548  #CJK UNIFIED IDEOGRAPH
+0x9DC2 0x6556  #CJK UNIFIED IDEOGRAPH
+0x9DC3 0x6555  #CJK UNIFIED IDEOGRAPH
+0x9DC4 0x654D  #CJK UNIFIED IDEOGRAPH
+0x9DC5 0x6558  #CJK UNIFIED IDEOGRAPH
+0x9DC6 0x655E  #CJK UNIFIED IDEOGRAPH
+0x9DC7 0x655D  #CJK UNIFIED IDEOGRAPH
+0x9DC8 0x6572  #CJK UNIFIED IDEOGRAPH
+0x9DC9 0x6578  #CJK UNIFIED IDEOGRAPH
+0x9DCA 0x6582  #CJK UNIFIED IDEOGRAPH
+0x9DCB 0x6583  #CJK UNIFIED IDEOGRAPH
+0x9DCC 0x8B8A  #CJK UNIFIED IDEOGRAPH
+0x9DCD 0x659B  #CJK UNIFIED IDEOGRAPH
+0x9DCE 0x659F  #CJK UNIFIED IDEOGRAPH
+0x9DCF 0x65AB  #CJK UNIFIED IDEOGRAPH
+0x9DD0 0x65B7  #CJK UNIFIED IDEOGRAPH
+0x9DD1 0x65C3  #CJK UNIFIED IDEOGRAPH
+0x9DD2 0x65C6  #CJK UNIFIED IDEOGRAPH
+0x9DD3 0x65C1  #CJK UNIFIED IDEOGRAPH
+0x9DD4 0x65C4  #CJK UNIFIED IDEOGRAPH
+0x9DD5 0x65CC  #CJK UNIFIED IDEOGRAPH
+0x9DD6 0x65D2  #CJK UNIFIED IDEOGRAPH
+0x9DD7 0x65DB  #CJK UNIFIED IDEOGRAPH
+0x9DD8 0x65D9  #CJK UNIFIED IDEOGRAPH
+0x9DD9 0x65E0  #CJK UNIFIED IDEOGRAPH
+0x9DDA 0x65E1  #CJK UNIFIED IDEOGRAPH
+0x9DDB 0x65F1  #CJK UNIFIED IDEOGRAPH
+0x9DDC 0x6772  #CJK UNIFIED IDEOGRAPH
+0x9DDD 0x660A  #CJK UNIFIED IDEOGRAPH
+0x9DDE 0x6603  #CJK UNIFIED IDEOGRAPH
+0x9DDF 0x65FB  #CJK UNIFIED IDEOGRAPH
+0x9DE0 0x6773  #CJK UNIFIED IDEOGRAPH
+0x9DE1 0x6635  #CJK UNIFIED IDEOGRAPH
+0x9DE2 0x6636  #CJK UNIFIED IDEOGRAPH
+0x9DE3 0x6634  #CJK UNIFIED IDEOGRAPH
+0x9DE4 0x661C  #CJK UNIFIED IDEOGRAPH
+0x9DE5 0x664F  #CJK UNIFIED IDEOGRAPH
+0x9DE6 0x6644  #CJK UNIFIED IDEOGRAPH
+0x9DE7 0x6649  #CJK UNIFIED IDEOGRAPH
+0x9DE8 0x6641  #CJK UNIFIED IDEOGRAPH
+0x9DE9 0x665E  #CJK UNIFIED IDEOGRAPH
+0x9DEA 0x665D  #CJK UNIFIED IDEOGRAPH
+0x9DEB 0x6664  #CJK UNIFIED IDEOGRAPH
+0x9DEC 0x6667  #CJK UNIFIED IDEOGRAPH
+0x9DED 0x6668  #CJK UNIFIED IDEOGRAPH
+0x9DEE 0x665F  #CJK UNIFIED IDEOGRAPH
+0x9DEF 0x6662  #CJK UNIFIED IDEOGRAPH
+0x9DF0 0x6670  #CJK UNIFIED IDEOGRAPH
+0x9DF1 0x6683  #CJK UNIFIED IDEOGRAPH
+0x9DF2 0x6688  #CJK UNIFIED IDEOGRAPH
+0x9DF3 0x668E  #CJK UNIFIED IDEOGRAPH
+0x9DF4 0x6689  #CJK UNIFIED IDEOGRAPH
+0x9DF5 0x6684  #CJK UNIFIED IDEOGRAPH
+0x9DF6 0x6698  #CJK UNIFIED IDEOGRAPH
+0x9DF7 0x669D  #CJK UNIFIED IDEOGRAPH
+0x9DF8 0x66C1  #CJK UNIFIED IDEOGRAPH
+0x9DF9 0x66B9  #CJK UNIFIED IDEOGRAPH
+0x9DFA 0x66C9  #CJK UNIFIED IDEOGRAPH
+0x9DFB 0x66BE  #CJK UNIFIED IDEOGRAPH
+0x9DFC 0x66BC  #CJK UNIFIED IDEOGRAPH
+0x9E40 0x66C4  #CJK UNIFIED IDEOGRAPH
+0x9E41 0x66B8  #CJK UNIFIED IDEOGRAPH
+0x9E42 0x66D6  #CJK UNIFIED IDEOGRAPH
+0x9E43 0x66DA  #CJK UNIFIED IDEOGRAPH
+0x9E44 0x66E0  #CJK UNIFIED IDEOGRAPH
+0x9E45 0x663F  #CJK UNIFIED IDEOGRAPH
+0x9E46 0x66E6  #CJK UNIFIED IDEOGRAPH
+0x9E47 0x66E9  #CJK UNIFIED IDEOGRAPH
+0x9E48 0x66F0  #CJK UNIFIED IDEOGRAPH
+0x9E49 0x66F5  #CJK UNIFIED IDEOGRAPH
+0x9E4A 0x66F7  #CJK UNIFIED IDEOGRAPH
+0x9E4B 0x670F  #CJK UNIFIED IDEOGRAPH
+0x9E4C 0x6716  #CJK UNIFIED IDEOGRAPH
+0x9E4D 0x671E  #CJK UNIFIED IDEOGRAPH
+0x9E4E 0x6726  #CJK UNIFIED IDEOGRAPH
+0x9E4F 0x6727  #CJK UNIFIED IDEOGRAPH
+0x9E50 0x9738  #CJK UNIFIED IDEOGRAPH
+0x9E51 0x672E  #CJK UNIFIED IDEOGRAPH
+0x9E52 0x673F  #CJK UNIFIED IDEOGRAPH
+0x9E53 0x6736  #CJK UNIFIED IDEOGRAPH
+0x9E54 0x6741  #CJK UNIFIED IDEOGRAPH
+0x9E55 0x6738  #CJK UNIFIED IDEOGRAPH
+0x9E56 0x6737  #CJK UNIFIED IDEOGRAPH
+0x9E57 0x6746  #CJK UNIFIED IDEOGRAPH
+0x9E58 0x675E  #CJK UNIFIED IDEOGRAPH
+0x9E59 0x6760  #CJK UNIFIED IDEOGRAPH
+0x9E5A 0x6759  #CJK UNIFIED IDEOGRAPH
+0x9E5B 0x6763  #CJK UNIFIED IDEOGRAPH
+0x9E5C 0x6764  #CJK UNIFIED IDEOGRAPH
+0x9E5D 0x6789  #CJK UNIFIED IDEOGRAPH
+0x9E5E 0x6770  #CJK UNIFIED IDEOGRAPH
+0x9E5F 0x67A9  #CJK UNIFIED IDEOGRAPH
+0x9E60 0x677C  #CJK UNIFIED IDEOGRAPH
+0x9E61 0x676A  #CJK UNIFIED IDEOGRAPH
+0x9E62 0x678C  #CJK UNIFIED IDEOGRAPH
+0x9E63 0x678B  #CJK UNIFIED IDEOGRAPH
+0x9E64 0x67A6  #CJK UNIFIED IDEOGRAPH
+0x9E65 0x67A1  #CJK UNIFIED IDEOGRAPH
+0x9E66 0x6785  #CJK UNIFIED IDEOGRAPH
+0x9E67 0x67B7  #CJK UNIFIED IDEOGRAPH
+0x9E68 0x67EF  #CJK UNIFIED IDEOGRAPH
+0x9E69 0x67B4  #CJK UNIFIED IDEOGRAPH
+0x9E6A 0x67EC  #CJK UNIFIED IDEOGRAPH
+0x9E6B 0x67B3  #CJK UNIFIED IDEOGRAPH
+0x9E6C 0x67E9  #CJK UNIFIED IDEOGRAPH
+0x9E6D 0x67B8  #CJK UNIFIED IDEOGRAPH
+0x9E6E 0x67E4  #CJK UNIFIED IDEOGRAPH
+0x9E6F 0x67DE  #CJK UNIFIED IDEOGRAPH
+0x9E70 0x67DD  #CJK UNIFIED IDEOGRAPH
+0x9E71 0x67E2  #CJK UNIFIED IDEOGRAPH
+0x9E72 0x67EE  #CJK UNIFIED IDEOGRAPH
+0x9E73 0x67B9  #CJK UNIFIED IDEOGRAPH
+0x9E74 0x67CE  #CJK UNIFIED IDEOGRAPH
+0x9E75 0x67C6  #CJK UNIFIED IDEOGRAPH
+0x9E76 0x67E7  #CJK UNIFIED IDEOGRAPH
+0x9E77 0x6A9C  #CJK UNIFIED IDEOGRAPH
+0x9E78 0x681E  #CJK UNIFIED IDEOGRAPH
+0x9E79 0x6846  #CJK UNIFIED IDEOGRAPH
+0x9E7A 0x6829  #CJK UNIFIED IDEOGRAPH
+0x9E7B 0x6840  #CJK UNIFIED IDEOGRAPH
+0x9E7C 0x684D  #CJK UNIFIED IDEOGRAPH
+0x9E7D 0x6832  #CJK UNIFIED IDEOGRAPH
+0x9E7E 0x684E  #CJK UNIFIED IDEOGRAPH
+0x9E80 0x68B3  #CJK UNIFIED IDEOGRAPH
+0x9E81 0x682B  #CJK UNIFIED IDEOGRAPH
+0x9E82 0x6859  #CJK UNIFIED IDEOGRAPH
+0x9E83 0x6863  #CJK UNIFIED IDEOGRAPH
+0x9E84 0x6877  #CJK UNIFIED IDEOGRAPH
+0x9E85 0x687F  #CJK UNIFIED IDEOGRAPH
+0x9E86 0x689F  #CJK UNIFIED IDEOGRAPH
+0x9E87 0x688F  #CJK UNIFIED IDEOGRAPH
+0x9E88 0x68AD  #CJK UNIFIED IDEOGRAPH
+0x9E89 0x6894  #CJK UNIFIED IDEOGRAPH
+0x9E8A 0x689D  #CJK UNIFIED IDEOGRAPH
+0x9E8B 0x689B  #CJK UNIFIED IDEOGRAPH
+0x9E8C 0x6883  #CJK UNIFIED IDEOGRAPH
+0x9E8D 0x6AAE  #CJK UNIFIED IDEOGRAPH
+0x9E8E 0x68B9  #CJK UNIFIED IDEOGRAPH
+0x9E8F 0x6874  #CJK UNIFIED IDEOGRAPH
+0x9E90 0x68B5  #CJK UNIFIED IDEOGRAPH
+0x9E91 0x68A0  #CJK UNIFIED IDEOGRAPH
+0x9E92 0x68BA  #CJK UNIFIED IDEOGRAPH
+0x9E93 0x690F  #CJK UNIFIED IDEOGRAPH
+0x9E94 0x688D  #CJK UNIFIED IDEOGRAPH
+0x9E95 0x687E  #CJK UNIFIED IDEOGRAPH
+0x9E96 0x6901  #CJK UNIFIED IDEOGRAPH
+0x9E97 0x68CA  #CJK UNIFIED IDEOGRAPH
+0x9E98 0x6908  #CJK UNIFIED IDEOGRAPH
+0x9E99 0x68D8  #CJK UNIFIED IDEOGRAPH
+0x9E9A 0x6922  #CJK UNIFIED IDEOGRAPH
+0x9E9B 0x6926  #CJK UNIFIED IDEOGRAPH
+0x9E9C 0x68E1  #CJK UNIFIED IDEOGRAPH
+0x9E9D 0x690C  #CJK UNIFIED IDEOGRAPH
+0x9E9E 0x68CD  #CJK UNIFIED IDEOGRAPH
+0x9E9F 0x68D4  #CJK UNIFIED IDEOGRAPH
+0x9EA0 0x68E7  #CJK UNIFIED IDEOGRAPH
+0x9EA1 0x68D5  #CJK UNIFIED IDEOGRAPH
+0x9EA2 0x6936  #CJK UNIFIED IDEOGRAPH
+0x9EA3 0x6912  #CJK UNIFIED IDEOGRAPH
+0x9EA4 0x6904  #CJK UNIFIED IDEOGRAPH
+0x9EA5 0x68D7  #CJK UNIFIED IDEOGRAPH
+0x9EA6 0x68E3  #CJK UNIFIED IDEOGRAPH
+0x9EA7 0x6925  #CJK UNIFIED IDEOGRAPH
+0x9EA8 0x68F9  #CJK UNIFIED IDEOGRAPH
+0x9EA9 0x68E0  #CJK UNIFIED IDEOGRAPH
+0x9EAA 0x68EF  #CJK UNIFIED IDEOGRAPH
+0x9EAB 0x6928  #CJK UNIFIED IDEOGRAPH
+0x9EAC 0x692A  #CJK UNIFIED IDEOGRAPH
+0x9EAD 0x691A  #CJK UNIFIED IDEOGRAPH
+0x9EAE 0x6923  #CJK UNIFIED IDEOGRAPH
+0x9EAF 0x6921  #CJK UNIFIED IDEOGRAPH
+0x9EB0 0x68C6  #CJK UNIFIED IDEOGRAPH
+0x9EB1 0x6979  #CJK UNIFIED IDEOGRAPH
+0x9EB2 0x6977  #CJK UNIFIED IDEOGRAPH
+0x9EB3 0x695C  #CJK UNIFIED IDEOGRAPH
+0x9EB4 0x6978  #CJK UNIFIED IDEOGRAPH
+0x9EB5 0x696B  #CJK UNIFIED IDEOGRAPH
+0x9EB6 0x6954  #CJK UNIFIED IDEOGRAPH
+0x9EB7 0x697E  #CJK UNIFIED IDEOGRAPH
+0x9EB8 0x696E  #CJK UNIFIED IDEOGRAPH
+0x9EB9 0x6939  #CJK UNIFIED IDEOGRAPH
+0x9EBA 0x6974  #CJK UNIFIED IDEOGRAPH
+0x9EBB 0x693D  #CJK UNIFIED IDEOGRAPH
+0x9EBC 0x6959  #CJK UNIFIED IDEOGRAPH
+0x9EBD 0x6930  #CJK UNIFIED IDEOGRAPH
+0x9EBE 0x6961  #CJK UNIFIED IDEOGRAPH
+0x9EBF 0x695E  #CJK UNIFIED IDEOGRAPH
+0x9EC0 0x695D  #CJK UNIFIED IDEOGRAPH
+0x9EC1 0x6981  #CJK UNIFIED IDEOGRAPH
+0x9EC2 0x696A  #CJK UNIFIED IDEOGRAPH
+0x9EC3 0x69B2  #CJK UNIFIED IDEOGRAPH
+0x9EC4 0x69AE  #CJK UNIFIED IDEOGRAPH
+0x9EC5 0x69D0  #CJK UNIFIED IDEOGRAPH
+0x9EC6 0x69BF  #CJK UNIFIED IDEOGRAPH
+0x9EC7 0x69C1  #CJK UNIFIED IDEOGRAPH
+0x9EC8 0x69D3  #CJK UNIFIED IDEOGRAPH
+0x9EC9 0x69BE  #CJK UNIFIED IDEOGRAPH
+0x9ECA 0x69CE  #CJK UNIFIED IDEOGRAPH
+0x9ECB 0x5BE8  #CJK UNIFIED IDEOGRAPH
+0x9ECC 0x69CA  #CJK UNIFIED IDEOGRAPH
+0x9ECD 0x69DD  #CJK UNIFIED IDEOGRAPH
+0x9ECE 0x69BB  #CJK UNIFIED IDEOGRAPH
+0x9ECF 0x69C3  #CJK UNIFIED IDEOGRAPH
+0x9ED0 0x69A7  #CJK UNIFIED IDEOGRAPH
+0x9ED1 0x6A2E  #CJK UNIFIED IDEOGRAPH
+0x9ED2 0x6991  #CJK UNIFIED IDEOGRAPH
+0x9ED3 0x69A0  #CJK UNIFIED IDEOGRAPH
+0x9ED4 0x699C  #CJK UNIFIED IDEOGRAPH
+0x9ED5 0x6995  #CJK UNIFIED IDEOGRAPH
+0x9ED6 0x69B4  #CJK UNIFIED IDEOGRAPH
+0x9ED7 0x69DE  #CJK UNIFIED IDEOGRAPH
+0x9ED8 0x69E8  #CJK UNIFIED IDEOGRAPH
+0x9ED9 0x6A02  #CJK UNIFIED IDEOGRAPH
+0x9EDA 0x6A1B  #CJK UNIFIED IDEOGRAPH
+0x9EDB 0x69FF  #CJK UNIFIED IDEOGRAPH
+0x9EDC 0x6B0A  #CJK UNIFIED IDEOGRAPH
+0x9EDD 0x69F9  #CJK UNIFIED IDEOGRAPH
+0x9EDE 0x69F2  #CJK UNIFIED IDEOGRAPH
+0x9EDF 0x69E7  #CJK UNIFIED IDEOGRAPH
+0x9EE0 0x6A05  #CJK UNIFIED IDEOGRAPH
+0x9EE1 0x69B1  #CJK UNIFIED IDEOGRAPH
+0x9EE2 0x6A1E  #CJK UNIFIED IDEOGRAPH
+0x9EE3 0x69ED  #CJK UNIFIED IDEOGRAPH
+0x9EE4 0x6A14  #CJK UNIFIED IDEOGRAPH
+0x9EE5 0x69EB  #CJK UNIFIED IDEOGRAPH
+0x9EE6 0x6A0A  #CJK UNIFIED IDEOGRAPH
+0x9EE7 0x6A12  #CJK UNIFIED IDEOGRAPH
+0x9EE8 0x6AC1  #CJK UNIFIED IDEOGRAPH
+0x9EE9 0x6A23  #CJK UNIFIED IDEOGRAPH
+0x9EEA 0x6A13  #CJK UNIFIED IDEOGRAPH
+0x9EEB 0x6A44  #CJK UNIFIED IDEOGRAPH
+0x9EEC 0x6A0C  #CJK UNIFIED IDEOGRAPH
+0x9EED 0x6A72  #CJK UNIFIED IDEOGRAPH
+0x9EEE 0x6A36  #CJK UNIFIED IDEOGRAPH
+0x9EEF 0x6A78  #CJK UNIFIED IDEOGRAPH
+0x9EF0 0x6A47  #CJK UNIFIED IDEOGRAPH
+0x9EF1 0x6A62  #CJK UNIFIED IDEOGRAPH
+0x9EF2 0x6A59  #CJK UNIFIED IDEOGRAPH
+0x9EF3 0x6A66  #CJK UNIFIED IDEOGRAPH
+0x9EF4 0x6A48  #CJK UNIFIED IDEOGRAPH
+0x9EF5 0x6A38  #CJK UNIFIED IDEOGRAPH
+0x9EF6 0x6A22  #CJK UNIFIED IDEOGRAPH
+0x9EF7 0x6A90  #CJK UNIFIED IDEOGRAPH
+0x9EF8 0x6A8D  #CJK UNIFIED IDEOGRAPH
+0x9EF9 0x6AA0  #CJK UNIFIED IDEOGRAPH
+0x9EFA 0x6A84  #CJK UNIFIED IDEOGRAPH
+0x9EFB 0x6AA2  #CJK UNIFIED IDEOGRAPH
+0x9EFC 0x6AA3  #CJK UNIFIED IDEOGRAPH
+0x9F40 0x6A97  #CJK UNIFIED IDEOGRAPH
+0x9F41 0x8617  #CJK UNIFIED IDEOGRAPH
+0x9F42 0x6ABB  #CJK UNIFIED IDEOGRAPH
+0x9F43 0x6AC3  #CJK UNIFIED IDEOGRAPH
+0x9F44 0x6AC2  #CJK UNIFIED IDEOGRAPH
+0x9F45 0x6AB8  #CJK UNIFIED IDEOGRAPH
+0x9F46 0x6AB3  #CJK UNIFIED IDEOGRAPH
+0x9F47 0x6AAC  #CJK UNIFIED IDEOGRAPH
+0x9F48 0x6ADE  #CJK UNIFIED IDEOGRAPH
+0x9F49 0x6AD1  #CJK UNIFIED IDEOGRAPH
+0x9F4A 0x6ADF  #CJK UNIFIED IDEOGRAPH
+0x9F4B 0x6AAA  #CJK UNIFIED IDEOGRAPH
+0x9F4C 0x6ADA  #CJK UNIFIED IDEOGRAPH
+0x9F4D 0x6AEA  #CJK UNIFIED IDEOGRAPH
+0x9F4E 0x6AFB  #CJK UNIFIED IDEOGRAPH
+0x9F4F 0x6B05  #CJK UNIFIED IDEOGRAPH
+0x9F50 0x8616  #CJK UNIFIED IDEOGRAPH
+0x9F51 0x6AFA  #CJK UNIFIED IDEOGRAPH
+0x9F52 0x6B12  #CJK UNIFIED IDEOGRAPH
+0x9F53 0x6B16  #CJK UNIFIED IDEOGRAPH
+0x9F54 0x9B31  #CJK UNIFIED IDEOGRAPH
+0x9F55 0x6B1F  #CJK UNIFIED IDEOGRAPH
+0x9F56 0x6B38  #CJK UNIFIED IDEOGRAPH
+0x9F57 0x6B37  #CJK UNIFIED IDEOGRAPH
+0x9F58 0x76DC  #CJK UNIFIED IDEOGRAPH
+0x9F59 0x6B39  #CJK UNIFIED IDEOGRAPH
+0x9F5A 0x98EE  #CJK UNIFIED IDEOGRAPH
+0x9F5B 0x6B47  #CJK UNIFIED IDEOGRAPH
+0x9F5C 0x6B43  #CJK UNIFIED IDEOGRAPH
+0x9F5D 0x6B49  #CJK UNIFIED IDEOGRAPH
+0x9F5E 0x6B50  #CJK UNIFIED IDEOGRAPH
+0x9F5F 0x6B59  #CJK UNIFIED IDEOGRAPH
+0x9F60 0x6B54  #CJK UNIFIED IDEOGRAPH
+0x9F61 0x6B5B  #CJK UNIFIED IDEOGRAPH
+0x9F62 0x6B5F  #CJK UNIFIED IDEOGRAPH
+0x9F63 0x6B61  #CJK UNIFIED IDEOGRAPH
+0x9F64 0x6B78  #CJK UNIFIED IDEOGRAPH
+0x9F65 0x6B79  #CJK UNIFIED IDEOGRAPH
+0x9F66 0x6B7F  #CJK UNIFIED IDEOGRAPH
+0x9F67 0x6B80  #CJK UNIFIED IDEOGRAPH
+0x9F68 0x6B84  #CJK UNIFIED IDEOGRAPH
+0x9F69 0x6B83  #CJK UNIFIED IDEOGRAPH
+0x9F6A 0x6B8D  #CJK UNIFIED IDEOGRAPH
+0x9F6B 0x6B98  #CJK UNIFIED IDEOGRAPH
+0x9F6C 0x6B95  #CJK UNIFIED IDEOGRAPH
+0x9F6D 0x6B9E  #CJK UNIFIED IDEOGRAPH
+0x9F6E 0x6BA4  #CJK UNIFIED IDEOGRAPH
+0x9F6F 0x6BAA  #CJK UNIFIED IDEOGRAPH
+0x9F70 0x6BAB  #CJK UNIFIED IDEOGRAPH
+0x9F71 0x6BAF  #CJK UNIFIED IDEOGRAPH
+0x9F72 0x6BB2  #CJK UNIFIED IDEOGRAPH
+0x9F73 0x6BB1  #CJK UNIFIED IDEOGRAPH
+0x9F74 0x6BB3  #CJK UNIFIED IDEOGRAPH
+0x9F75 0x6BB7  #CJK UNIFIED IDEOGRAPH
+0x9F76 0x6BBC  #CJK UNIFIED IDEOGRAPH
+0x9F77 0x6BC6  #CJK UNIFIED IDEOGRAPH
+0x9F78 0x6BCB  #CJK UNIFIED IDEOGRAPH
+0x9F79 0x6BD3  #CJK UNIFIED IDEOGRAPH
+0x9F7A 0x6BDF  #CJK UNIFIED IDEOGRAPH
+0x9F7B 0x6BEC  #CJK UNIFIED IDEOGRAPH
+0x9F7C 0x6BEB  #CJK UNIFIED IDEOGRAPH
+0x9F7D 0x6BF3  #CJK UNIFIED IDEOGRAPH
+0x9F7E 0x6BEF  #CJK UNIFIED IDEOGRAPH
+0x9F80 0x9EBE  #CJK UNIFIED IDEOGRAPH
+0x9F81 0x6C08  #CJK UNIFIED IDEOGRAPH
+0x9F82 0x6C13  #CJK UNIFIED IDEOGRAPH
+0x9F83 0x6C14  #CJK UNIFIED IDEOGRAPH
+0x9F84 0x6C1B  #CJK UNIFIED IDEOGRAPH
+0x9F85 0x6C24  #CJK UNIFIED IDEOGRAPH
+0x9F86 0x6C23  #CJK UNIFIED IDEOGRAPH
+0x9F87 0x6C5E  #CJK UNIFIED IDEOGRAPH
+0x9F88 0x6C55  #CJK UNIFIED IDEOGRAPH
+0x9F89 0x6C62  #CJK UNIFIED IDEOGRAPH
+0x9F8A 0x6C6A  #CJK UNIFIED IDEOGRAPH
+0x9F8B 0x6C82  #CJK UNIFIED IDEOGRAPH
+0x9F8C 0x6C8D  #CJK UNIFIED IDEOGRAPH
+0x9F8D 0x6C9A  #CJK UNIFIED IDEOGRAPH
+0x9F8E 0x6C81  #CJK UNIFIED IDEOGRAPH
+0x9F8F 0x6C9B  #CJK UNIFIED IDEOGRAPH
+0x9F90 0x6C7E  #CJK UNIFIED IDEOGRAPH
+0x9F91 0x6C68  #CJK UNIFIED IDEOGRAPH
+0x9F92 0x6C73  #CJK UNIFIED IDEOGRAPH
+0x9F93 0x6C92  #CJK UNIFIED IDEOGRAPH
+0x9F94 0x6C90  #CJK UNIFIED IDEOGRAPH
+0x9F95 0x6CC4  #CJK UNIFIED IDEOGRAPH
+0x9F96 0x6CF1  #CJK UNIFIED IDEOGRAPH
+0x9F97 0x6CD3  #CJK UNIFIED IDEOGRAPH
+0x9F98 0x6CBD  #CJK UNIFIED IDEOGRAPH
+0x9F99 0x6CD7  #CJK UNIFIED IDEOGRAPH
+0x9F9A 0x6CC5  #CJK UNIFIED IDEOGRAPH
+0x9F9B 0x6CDD  #CJK UNIFIED IDEOGRAPH
+0x9F9C 0x6CAE  #CJK UNIFIED IDEOGRAPH
+0x9F9D 0x6CB1  #CJK UNIFIED IDEOGRAPH
+0x9F9E 0x6CBE  #CJK UNIFIED IDEOGRAPH
+0x9F9F 0x6CBA  #CJK UNIFIED IDEOGRAPH
+0x9FA0 0x6CDB  #CJK UNIFIED IDEOGRAPH
+0x9FA1 0x6CEF  #CJK UNIFIED IDEOGRAPH
+0x9FA2 0x6CD9  #CJK UNIFIED IDEOGRAPH
+0x9FA3 0x6CEA  #CJK UNIFIED IDEOGRAPH
+0x9FA4 0x6D1F  #CJK UNIFIED IDEOGRAPH
+0x9FA5 0x884D  #CJK UNIFIED IDEOGRAPH
+0x9FA6 0x6D36  #CJK UNIFIED IDEOGRAPH
+0x9FA7 0x6D2B  #CJK UNIFIED IDEOGRAPH
+0x9FA8 0x6D3D  #CJK UNIFIED IDEOGRAPH
+0x9FA9 0x6D38  #CJK UNIFIED IDEOGRAPH
+0x9FAA 0x6D19  #CJK UNIFIED IDEOGRAPH
+0x9FAB 0x6D35  #CJK UNIFIED IDEOGRAPH
+0x9FAC 0x6D33  #CJK UNIFIED IDEOGRAPH
+0x9FAD 0x6D12  #CJK UNIFIED IDEOGRAPH
+0x9FAE 0x6D0C  #CJK UNIFIED IDEOGRAPH
+0x9FAF 0x6D63  #CJK UNIFIED IDEOGRAPH
+0x9FB0 0x6D93  #CJK UNIFIED IDEOGRAPH
+0x9FB1 0x6D64  #CJK UNIFIED IDEOGRAPH
+0x9FB2 0x6D5A  #CJK UNIFIED IDEOGRAPH
+0x9FB3 0x6D79  #CJK UNIFIED IDEOGRAPH
+0x9FB4 0x6D59  #CJK UNIFIED IDEOGRAPH
+0x9FB5 0x6D8E  #CJK UNIFIED IDEOGRAPH
+0x9FB6 0x6D95  #CJK UNIFIED IDEOGRAPH
+0x9FB7 0x6FE4  #CJK UNIFIED IDEOGRAPH
+0x9FB8 0x6D85  #CJK UNIFIED IDEOGRAPH
+0x9FB9 0x6DF9  #CJK UNIFIED IDEOGRAPH
+0x9FBA 0x6E15  #CJK UNIFIED IDEOGRAPH
+0x9FBB 0x6E0A  #CJK UNIFIED IDEOGRAPH
+0x9FBC 0x6DB5  #CJK UNIFIED IDEOGRAPH
+0x9FBD 0x6DC7  #CJK UNIFIED IDEOGRAPH
+0x9FBE 0x6DE6  #CJK UNIFIED IDEOGRAPH
+0x9FBF 0x6DB8  #CJK UNIFIED IDEOGRAPH
+0x9FC0 0x6DC6  #CJK UNIFIED IDEOGRAPH
+0x9FC1 0x6DEC  #CJK UNIFIED IDEOGRAPH
+0x9FC2 0x6DDE  #CJK UNIFIED IDEOGRAPH
+0x9FC3 0x6DCC  #CJK UNIFIED IDEOGRAPH
+0x9FC4 0x6DE8  #CJK UNIFIED IDEOGRAPH
+0x9FC5 0x6DD2  #CJK UNIFIED IDEOGRAPH
+0x9FC6 0x6DC5  #CJK UNIFIED IDEOGRAPH
+0x9FC7 0x6DFA  #CJK UNIFIED IDEOGRAPH
+0x9FC8 0x6DD9  #CJK UNIFIED IDEOGRAPH
+0x9FC9 0x6DE4  #CJK UNIFIED IDEOGRAPH
+0x9FCA 0x6DD5  #CJK UNIFIED IDEOGRAPH
+0x9FCB 0x6DEA  #CJK UNIFIED IDEOGRAPH
+0x9FCC 0x6DEE  #CJK UNIFIED IDEOGRAPH
+0x9FCD 0x6E2D  #CJK UNIFIED IDEOGRAPH
+0x9FCE 0x6E6E  #CJK UNIFIED IDEOGRAPH
+0x9FCF 0x6E2E  #CJK UNIFIED IDEOGRAPH
+0x9FD0 0x6E19  #CJK UNIFIED IDEOGRAPH
+0x9FD1 0x6E72  #CJK UNIFIED IDEOGRAPH
+0x9FD2 0x6E5F  #CJK UNIFIED IDEOGRAPH
+0x9FD3 0x6E3E  #CJK UNIFIED IDEOGRAPH
+0x9FD4 0x6E23  #CJK UNIFIED IDEOGRAPH
+0x9FD5 0x6E6B  #CJK UNIFIED IDEOGRAPH
+0x9FD6 0x6E2B  #CJK UNIFIED IDEOGRAPH
+0x9FD7 0x6E76  #CJK UNIFIED IDEOGRAPH
+0x9FD8 0x6E4D  #CJK UNIFIED IDEOGRAPH
+0x9FD9 0x6E1F  #CJK UNIFIED IDEOGRAPH
+0x9FDA 0x6E43  #CJK UNIFIED IDEOGRAPH
+0x9FDB 0x6E3A  #CJK UNIFIED IDEOGRAPH
+0x9FDC 0x6E4E  #CJK UNIFIED IDEOGRAPH
+0x9FDD 0x6E24  #CJK UNIFIED IDEOGRAPH
+0x9FDE 0x6EFF  #CJK UNIFIED IDEOGRAPH
+0x9FDF 0x6E1D  #CJK UNIFIED IDEOGRAPH
+0x9FE0 0x6E38  #CJK UNIFIED IDEOGRAPH
+0x9FE1 0x6E82  #CJK UNIFIED IDEOGRAPH
+0x9FE2 0x6EAA  #CJK UNIFIED IDEOGRAPH
+0x9FE3 0x6E98  #CJK UNIFIED IDEOGRAPH
+0x9FE4 0x6EC9  #CJK UNIFIED IDEOGRAPH
+0x9FE5 0x6EB7  #CJK UNIFIED IDEOGRAPH
+0x9FE6 0x6ED3  #CJK UNIFIED IDEOGRAPH
+0x9FE7 0x6EBD  #CJK UNIFIED IDEOGRAPH
+0x9FE8 0x6EAF  #CJK UNIFIED IDEOGRAPH
+0x9FE9 0x6EC4  #CJK UNIFIED IDEOGRAPH
+0x9FEA 0x6EB2  #CJK UNIFIED IDEOGRAPH
+0x9FEB 0x6ED4  #CJK UNIFIED IDEOGRAPH
+0x9FEC 0x6ED5  #CJK UNIFIED IDEOGRAPH
+0x9FED 0x6E8F  #CJK UNIFIED IDEOGRAPH
+0x9FEE 0x6EA5  #CJK UNIFIED IDEOGRAPH
+0x9FEF 0x6EC2  #CJK UNIFIED IDEOGRAPH
+0x9FF0 0x6E9F  #CJK UNIFIED IDEOGRAPH
+0x9FF1 0x6F41  #CJK UNIFIED IDEOGRAPH
+0x9FF2 0x6F11  #CJK UNIFIED IDEOGRAPH
+0x9FF3 0x704C  #CJK UNIFIED IDEOGRAPH
+0x9FF4 0x6EEC  #CJK UNIFIED IDEOGRAPH
+0x9FF5 0x6EF8  #CJK UNIFIED IDEOGRAPH
+0x9FF6 0x6EFE  #CJK UNIFIED IDEOGRAPH
+0x9FF7 0x6F3F  #CJK UNIFIED IDEOGRAPH
+0x9FF8 0x6EF2  #CJK UNIFIED IDEOGRAPH
+0x9FF9 0x6F31  #CJK UNIFIED IDEOGRAPH
+0x9FFA 0x6EEF  #CJK UNIFIED IDEOGRAPH
+0x9FFB 0x6F32  #CJK UNIFIED IDEOGRAPH
+0x9FFC 0x6ECC  #CJK UNIFIED IDEOGRAPH
+0xE040 0x6F3E  #CJK UNIFIED IDEOGRAPH
+0xE041 0x6F13  #CJK UNIFIED IDEOGRAPH
+0xE042 0x6EF7  #CJK UNIFIED IDEOGRAPH
+0xE043 0x6F86  #CJK UNIFIED IDEOGRAPH
+0xE044 0x6F7A  #CJK UNIFIED IDEOGRAPH
+0xE045 0x6F78  #CJK UNIFIED IDEOGRAPH
+0xE046 0x6F81  #CJK UNIFIED IDEOGRAPH
+0xE047 0x6F80  #CJK UNIFIED IDEOGRAPH
+0xE048 0x6F6F  #CJK UNIFIED IDEOGRAPH
+0xE049 0x6F5B  #CJK UNIFIED IDEOGRAPH
+0xE04A 0x6FF3  #CJK UNIFIED IDEOGRAPH
+0xE04B 0x6F6D  #CJK UNIFIED IDEOGRAPH
+0xE04C 0x6F82  #CJK UNIFIED IDEOGRAPH
+0xE04D 0x6F7C  #CJK UNIFIED IDEOGRAPH
+0xE04E 0x6F58  #CJK UNIFIED IDEOGRAPH
+0xE04F 0x6F8E  #CJK UNIFIED IDEOGRAPH
+0xE050 0x6F91  #CJK UNIFIED IDEOGRAPH
+0xE051 0x6FC2  #CJK UNIFIED IDEOGRAPH
+0xE052 0x6F66  #CJK UNIFIED IDEOGRAPH
+0xE053 0x6FB3  #CJK UNIFIED IDEOGRAPH
+0xE054 0x6FA3  #CJK UNIFIED IDEOGRAPH
+0xE055 0x6FA1  #CJK UNIFIED IDEOGRAPH
+0xE056 0x6FA4  #CJK UNIFIED IDEOGRAPH
+0xE057 0x6FB9  #CJK UNIFIED IDEOGRAPH
+0xE058 0x6FC6  #CJK UNIFIED IDEOGRAPH
+0xE059 0x6FAA  #CJK UNIFIED IDEOGRAPH
+0xE05A 0x6FDF  #CJK UNIFIED IDEOGRAPH
+0xE05B 0x6FD5  #CJK UNIFIED IDEOGRAPH
+0xE05C 0x6FEC  #CJK UNIFIED IDEOGRAPH
+0xE05D 0x6FD4  #CJK UNIFIED IDEOGRAPH
+0xE05E 0x6FD8  #CJK UNIFIED IDEOGRAPH
+0xE05F 0x6FF1  #CJK UNIFIED IDEOGRAPH
+0xE060 0x6FEE  #CJK UNIFIED IDEOGRAPH
+0xE061 0x6FDB  #CJK UNIFIED IDEOGRAPH
+0xE062 0x7009  #CJK UNIFIED IDEOGRAPH
+0xE063 0x700B  #CJK UNIFIED IDEOGRAPH
+0xE064 0x6FFA  #CJK UNIFIED IDEOGRAPH
+0xE065 0x7011  #CJK UNIFIED IDEOGRAPH
+0xE066 0x7001  #CJK UNIFIED IDEOGRAPH
+0xE067 0x700F  #CJK UNIFIED IDEOGRAPH
+0xE068 0x6FFE  #CJK UNIFIED IDEOGRAPH
+0xE069 0x701B  #CJK UNIFIED IDEOGRAPH
+0xE06A 0x701A  #CJK UNIFIED IDEOGRAPH
+0xE06B 0x6F74  #CJK UNIFIED IDEOGRAPH
+0xE06C 0x701D  #CJK UNIFIED IDEOGRAPH
+0xE06D 0x7018  #CJK UNIFIED IDEOGRAPH
+0xE06E 0x701F  #CJK UNIFIED IDEOGRAPH
+0xE06F 0x7030  #CJK UNIFIED IDEOGRAPH
+0xE070 0x703E  #CJK UNIFIED IDEOGRAPH
+0xE071 0x7032  #CJK UNIFIED IDEOGRAPH
+0xE072 0x7051  #CJK UNIFIED IDEOGRAPH
+0xE073 0x7063  #CJK UNIFIED IDEOGRAPH
+0xE074 0x7099  #CJK UNIFIED IDEOGRAPH
+0xE075 0x7092  #CJK UNIFIED IDEOGRAPH
+0xE076 0x70AF  #CJK UNIFIED IDEOGRAPH
+0xE077 0x70F1  #CJK UNIFIED IDEOGRAPH
+0xE078 0x70AC  #CJK UNIFIED IDEOGRAPH
+0xE079 0x70B8  #CJK UNIFIED IDEOGRAPH
+0xE07A 0x70B3  #CJK UNIFIED IDEOGRAPH
+0xE07B 0x70AE  #CJK UNIFIED IDEOGRAPH
+0xE07C 0x70DF  #CJK UNIFIED IDEOGRAPH
+0xE07D 0x70CB  #CJK UNIFIED IDEOGRAPH
+0xE07E 0x70DD  #CJK UNIFIED IDEOGRAPH
+0xE080 0x70D9  #CJK UNIFIED IDEOGRAPH
+0xE081 0x7109  #CJK UNIFIED IDEOGRAPH
+0xE082 0x70FD  #CJK UNIFIED IDEOGRAPH
+0xE083 0x711C  #CJK UNIFIED IDEOGRAPH
+0xE084 0x7119  #CJK UNIFIED IDEOGRAPH
+0xE085 0x7165  #CJK UNIFIED IDEOGRAPH
+0xE086 0x7155  #CJK UNIFIED IDEOGRAPH
+0xE087 0x7188  #CJK UNIFIED IDEOGRAPH
+0xE088 0x7166  #CJK UNIFIED IDEOGRAPH
+0xE089 0x7162  #CJK UNIFIED IDEOGRAPH
+0xE08A 0x714C  #CJK UNIFIED IDEOGRAPH
+0xE08B 0x7156  #CJK UNIFIED IDEOGRAPH
+0xE08C 0x716C  #CJK UNIFIED IDEOGRAPH
+0xE08D 0x718F  #CJK UNIFIED IDEOGRAPH
+0xE08E 0x71FB  #CJK UNIFIED IDEOGRAPH
+0xE08F 0x7184  #CJK UNIFIED IDEOGRAPH
+0xE090 0x7195  #CJK UNIFIED IDEOGRAPH
+0xE091 0x71A8  #CJK UNIFIED IDEOGRAPH
+0xE092 0x71AC  #CJK UNIFIED IDEOGRAPH
+0xE093 0x71D7  #CJK UNIFIED IDEOGRAPH
+0xE094 0x71B9  #CJK UNIFIED IDEOGRAPH
+0xE095 0x71BE  #CJK UNIFIED IDEOGRAPH
+0xE096 0x71D2  #CJK UNIFIED IDEOGRAPH
+0xE097 0x71C9  #CJK UNIFIED IDEOGRAPH
+0xE098 0x71D4  #CJK UNIFIED IDEOGRAPH
+0xE099 0x71CE  #CJK UNIFIED IDEOGRAPH
+0xE09A 0x71E0  #CJK UNIFIED IDEOGRAPH
+0xE09B 0x71EC  #CJK UNIFIED IDEOGRAPH
+0xE09C 0x71E7  #CJK UNIFIED IDEOGRAPH
+0xE09D 0x71F5  #CJK UNIFIED IDEOGRAPH
+0xE09E 0x71FC  #CJK UNIFIED IDEOGRAPH
+0xE09F 0x71F9  #CJK UNIFIED IDEOGRAPH
+0xE0A0 0x71FF  #CJK UNIFIED IDEOGRAPH
+0xE0A1 0x720D  #CJK UNIFIED IDEOGRAPH
+0xE0A2 0x7210  #CJK UNIFIED IDEOGRAPH
+0xE0A3 0x721B  #CJK UNIFIED IDEOGRAPH
+0xE0A4 0x7228  #CJK UNIFIED IDEOGRAPH
+0xE0A5 0x722D  #CJK UNIFIED IDEOGRAPH
+0xE0A6 0x722C  #CJK UNIFIED IDEOGRAPH
+0xE0A7 0x7230  #CJK UNIFIED IDEOGRAPH
+0xE0A8 0x7232  #CJK UNIFIED IDEOGRAPH
+0xE0A9 0x723B  #CJK UNIFIED IDEOGRAPH
+0xE0AA 0x723C  #CJK UNIFIED IDEOGRAPH
+0xE0AB 0x723F  #CJK UNIFIED IDEOGRAPH
+0xE0AC 0x7240  #CJK UNIFIED IDEOGRAPH
+0xE0AD 0x7246  #CJK UNIFIED IDEOGRAPH
+0xE0AE 0x724B  #CJK UNIFIED IDEOGRAPH
+0xE0AF 0x7258  #CJK UNIFIED IDEOGRAPH
+0xE0B0 0x7274  #CJK UNIFIED IDEOGRAPH
+0xE0B1 0x727E  #CJK UNIFIED IDEOGRAPH
+0xE0B2 0x7282  #CJK UNIFIED IDEOGRAPH
+0xE0B3 0x7281  #CJK UNIFIED IDEOGRAPH
+0xE0B4 0x7287  #CJK UNIFIED IDEOGRAPH
+0xE0B5 0x7292  #CJK UNIFIED IDEOGRAPH
+0xE0B6 0x7296  #CJK UNIFIED IDEOGRAPH
+0xE0B7 0x72A2  #CJK UNIFIED IDEOGRAPH
+0xE0B8 0x72A7  #CJK UNIFIED IDEOGRAPH
+0xE0B9 0x72B9  #CJK UNIFIED IDEOGRAPH
+0xE0BA 0x72B2  #CJK UNIFIED IDEOGRAPH
+0xE0BB 0x72C3  #CJK UNIFIED IDEOGRAPH
+0xE0BC 0x72C6  #CJK UNIFIED IDEOGRAPH
+0xE0BD 0x72C4  #CJK UNIFIED IDEOGRAPH
+0xE0BE 0x72CE  #CJK UNIFIED IDEOGRAPH
+0xE0BF 0x72D2  #CJK UNIFIED IDEOGRAPH
+0xE0C0 0x72E2  #CJK UNIFIED IDEOGRAPH
+0xE0C1 0x72E0  #CJK UNIFIED IDEOGRAPH
+0xE0C2 0x72E1  #CJK UNIFIED IDEOGRAPH
+0xE0C3 0x72F9  #CJK UNIFIED IDEOGRAPH
+0xE0C4 0x72F7  #CJK UNIFIED IDEOGRAPH
+0xE0C5 0x500F  #CJK UNIFIED IDEOGRAPH
+0xE0C6 0x7317  #CJK UNIFIED IDEOGRAPH
+0xE0C7 0x730A  #CJK UNIFIED IDEOGRAPH
+0xE0C8 0x731C  #CJK UNIFIED IDEOGRAPH
+0xE0C9 0x7316  #CJK UNIFIED IDEOGRAPH
+0xE0CA 0x731D  #CJK UNIFIED IDEOGRAPH
+0xE0CB 0x7334  #CJK UNIFIED IDEOGRAPH
+0xE0CC 0x732F  #CJK UNIFIED IDEOGRAPH
+0xE0CD 0x7329  #CJK UNIFIED IDEOGRAPH
+0xE0CE 0x7325  #CJK UNIFIED IDEOGRAPH
+0xE0CF 0x733E  #CJK UNIFIED IDEOGRAPH
+0xE0D0 0x734E  #CJK UNIFIED IDEOGRAPH
+0xE0D1 0x734F  #CJK UNIFIED IDEOGRAPH
+0xE0D2 0x9ED8  #CJK UNIFIED IDEOGRAPH
+0xE0D3 0x7357  #CJK UNIFIED IDEOGRAPH
+0xE0D4 0x736A  #CJK UNIFIED IDEOGRAPH
+0xE0D5 0x7368  #CJK UNIFIED IDEOGRAPH
+0xE0D6 0x7370  #CJK UNIFIED IDEOGRAPH
+0xE0D7 0x7378  #CJK UNIFIED IDEOGRAPH
+0xE0D8 0x7375  #CJK UNIFIED IDEOGRAPH
+0xE0D9 0x737B  #CJK UNIFIED IDEOGRAPH
+0xE0DA 0x737A  #CJK UNIFIED IDEOGRAPH
+0xE0DB 0x73C8  #CJK UNIFIED IDEOGRAPH
+0xE0DC 0x73B3  #CJK UNIFIED IDEOGRAPH
+0xE0DD 0x73CE  #CJK UNIFIED IDEOGRAPH
+0xE0DE 0x73BB  #CJK UNIFIED IDEOGRAPH
+0xE0DF 0x73C0  #CJK UNIFIED IDEOGRAPH
+0xE0E0 0x73E5  #CJK UNIFIED IDEOGRAPH
+0xE0E1 0x73EE  #CJK UNIFIED IDEOGRAPH
+0xE0E2 0x73DE  #CJK UNIFIED IDEOGRAPH
+0xE0E3 0x74A2  #CJK UNIFIED IDEOGRAPH
+0xE0E4 0x7405  #CJK UNIFIED IDEOGRAPH
+0xE0E5 0x746F  #CJK UNIFIED IDEOGRAPH
+0xE0E6 0x7425  #CJK UNIFIED IDEOGRAPH
+0xE0E7 0x73F8  #CJK UNIFIED IDEOGRAPH
+0xE0E8 0x7432  #CJK UNIFIED IDEOGRAPH
+0xE0E9 0x743A  #CJK UNIFIED IDEOGRAPH
+0xE0EA 0x7455  #CJK UNIFIED IDEOGRAPH
+0xE0EB 0x743F  #CJK UNIFIED IDEOGRAPH
+0xE0EC 0x745F  #CJK UNIFIED IDEOGRAPH
+0xE0ED 0x7459  #CJK UNIFIED IDEOGRAPH
+0xE0EE 0x7441  #CJK UNIFIED IDEOGRAPH
+0xE0EF 0x745C  #CJK UNIFIED IDEOGRAPH
+0xE0F0 0x7469  #CJK UNIFIED IDEOGRAPH
+0xE0F1 0x7470  #CJK UNIFIED IDEOGRAPH
+0xE0F2 0x7463  #CJK UNIFIED IDEOGRAPH
+0xE0F3 0x746A  #CJK UNIFIED IDEOGRAPH
+0xE0F4 0x7476  #CJK UNIFIED IDEOGRAPH
+0xE0F5 0x747E  #CJK UNIFIED IDEOGRAPH
+0xE0F6 0x748B  #CJK UNIFIED IDEOGRAPH
+0xE0F7 0x749E  #CJK UNIFIED IDEOGRAPH
+0xE0F8 0x74A7  #CJK UNIFIED IDEOGRAPH
+0xE0F9 0x74CA  #CJK UNIFIED IDEOGRAPH
+0xE0FA 0x74CF  #CJK UNIFIED IDEOGRAPH
+0xE0FB 0x74D4  #CJK UNIFIED IDEOGRAPH
+0xE0FC 0x73F1  #CJK UNIFIED IDEOGRAPH
+0xE140 0x74E0  #CJK UNIFIED IDEOGRAPH
+0xE141 0x74E3  #CJK UNIFIED IDEOGRAPH
+0xE142 0x74E7  #CJK UNIFIED IDEOGRAPH
+0xE143 0x74E9  #CJK UNIFIED IDEOGRAPH
+0xE144 0x74EE  #CJK UNIFIED IDEOGRAPH
+0xE145 0x74F2  #CJK UNIFIED IDEOGRAPH
+0xE146 0x74F0  #CJK UNIFIED IDEOGRAPH
+0xE147 0x74F1  #CJK UNIFIED IDEOGRAPH
+0xE148 0x74F8  #CJK UNIFIED IDEOGRAPH
+0xE149 0x74F7  #CJK UNIFIED IDEOGRAPH
+0xE14A 0x7504  #CJK UNIFIED IDEOGRAPH
+0xE14B 0x7503  #CJK UNIFIED IDEOGRAPH
+0xE14C 0x7505  #CJK UNIFIED IDEOGRAPH
+0xE14D 0x750C  #CJK UNIFIED IDEOGRAPH
+0xE14E 0x750E  #CJK UNIFIED IDEOGRAPH
+0xE14F 0x750D  #CJK UNIFIED IDEOGRAPH
+0xE150 0x7515  #CJK UNIFIED IDEOGRAPH
+0xE151 0x7513  #CJK UNIFIED IDEOGRAPH
+0xE152 0x751E  #CJK UNIFIED IDEOGRAPH
+0xE153 0x7526  #CJK UNIFIED IDEOGRAPH
+0xE154 0x752C  #CJK UNIFIED IDEOGRAPH
+0xE155 0x753C  #CJK UNIFIED IDEOGRAPH
+0xE156 0x7544  #CJK UNIFIED IDEOGRAPH
+0xE157 0x754D  #CJK UNIFIED IDEOGRAPH
+0xE158 0x754A  #CJK UNIFIED IDEOGRAPH
+0xE159 0x7549  #CJK UNIFIED IDEOGRAPH
+0xE15A 0x755B  #CJK UNIFIED IDEOGRAPH
+0xE15B 0x7546  #CJK UNIFIED IDEOGRAPH
+0xE15C 0x755A  #CJK UNIFIED IDEOGRAPH
+0xE15D 0x7569  #CJK UNIFIED IDEOGRAPH
+0xE15E 0x7564  #CJK UNIFIED IDEOGRAPH
+0xE15F 0x7567  #CJK UNIFIED IDEOGRAPH
+0xE160 0x756B  #CJK UNIFIED IDEOGRAPH
+0xE161 0x756D  #CJK UNIFIED IDEOGRAPH
+0xE162 0x7578  #CJK UNIFIED IDEOGRAPH
+0xE163 0x7576  #CJK UNIFIED IDEOGRAPH
+0xE164 0x7586  #CJK UNIFIED IDEOGRAPH
+0xE165 0x7587  #CJK UNIFIED IDEOGRAPH
+0xE166 0x7574  #CJK UNIFIED IDEOGRAPH
+0xE167 0x758A  #CJK UNIFIED IDEOGRAPH
+0xE168 0x7589  #CJK UNIFIED IDEOGRAPH
+0xE169 0x7582  #CJK UNIFIED IDEOGRAPH
+0xE16A 0x7594  #CJK UNIFIED IDEOGRAPH
+0xE16B 0x759A  #CJK UNIFIED IDEOGRAPH
+0xE16C 0x759D  #CJK UNIFIED IDEOGRAPH
+0xE16D 0x75A5  #CJK UNIFIED IDEOGRAPH
+0xE16E 0x75A3  #CJK UNIFIED IDEOGRAPH
+0xE16F 0x75C2  #CJK UNIFIED IDEOGRAPH
+0xE170 0x75B3  #CJK UNIFIED IDEOGRAPH
+0xE171 0x75C3  #CJK UNIFIED IDEOGRAPH
+0xE172 0x75B5  #CJK UNIFIED IDEOGRAPH
+0xE173 0x75BD  #CJK UNIFIED IDEOGRAPH
+0xE174 0x75B8  #CJK UNIFIED IDEOGRAPH
+0xE175 0x75BC  #CJK UNIFIED IDEOGRAPH
+0xE176 0x75B1  #CJK UNIFIED IDEOGRAPH
+0xE177 0x75CD  #CJK UNIFIED IDEOGRAPH
+0xE178 0x75CA  #CJK UNIFIED IDEOGRAPH
+0xE179 0x75D2  #CJK UNIFIED IDEOGRAPH
+0xE17A 0x75D9  #CJK UNIFIED IDEOGRAPH
+0xE17B 0x75E3  #CJK UNIFIED IDEOGRAPH
+0xE17C 0x75DE  #CJK UNIFIED IDEOGRAPH
+0xE17D 0x75FE  #CJK UNIFIED IDEOGRAPH
+0xE17E 0x75FF  #CJK UNIFIED IDEOGRAPH
+0xE180 0x75FC  #CJK UNIFIED IDEOGRAPH
+0xE181 0x7601  #CJK UNIFIED IDEOGRAPH
+0xE182 0x75F0  #CJK UNIFIED IDEOGRAPH
+0xE183 0x75FA  #CJK UNIFIED IDEOGRAPH
+0xE184 0x75F2  #CJK UNIFIED IDEOGRAPH
+0xE185 0x75F3  #CJK UNIFIED IDEOGRAPH
+0xE186 0x760B  #CJK UNIFIED IDEOGRAPH
+0xE187 0x760D  #CJK UNIFIED IDEOGRAPH
+0xE188 0x7609  #CJK UNIFIED IDEOGRAPH
+0xE189 0x761F  #CJK UNIFIED IDEOGRAPH
+0xE18A 0x7627  #CJK UNIFIED IDEOGRAPH
+0xE18B 0x7620  #CJK UNIFIED IDEOGRAPH
+0xE18C 0x7621  #CJK UNIFIED IDEOGRAPH
+0xE18D 0x7622  #CJK UNIFIED IDEOGRAPH
+0xE18E 0x7624  #CJK UNIFIED IDEOGRAPH
+0xE18F 0x7634  #CJK UNIFIED IDEOGRAPH
+0xE190 0x7630  #CJK UNIFIED IDEOGRAPH
+0xE191 0x763B  #CJK UNIFIED IDEOGRAPH
+0xE192 0x7647  #CJK UNIFIED IDEOGRAPH
+0xE193 0x7648  #CJK UNIFIED IDEOGRAPH
+0xE194 0x7646  #CJK UNIFIED IDEOGRAPH
+0xE195 0x765C  #CJK UNIFIED IDEOGRAPH
+0xE196 0x7658  #CJK UNIFIED IDEOGRAPH
+0xE197 0x7661  #CJK UNIFIED IDEOGRAPH
+0xE198 0x7662  #CJK UNIFIED IDEOGRAPH
+0xE199 0x7668  #CJK UNIFIED IDEOGRAPH
+0xE19A 0x7669  #CJK UNIFIED IDEOGRAPH
+0xE19B 0x766A  #CJK UNIFIED IDEOGRAPH
+0xE19C 0x7667  #CJK UNIFIED IDEOGRAPH
+0xE19D 0x766C  #CJK UNIFIED IDEOGRAPH
+0xE19E 0x7670  #CJK UNIFIED IDEOGRAPH
+0xE19F 0x7672  #CJK UNIFIED IDEOGRAPH
+0xE1A0 0x7676  #CJK UNIFIED IDEOGRAPH
+0xE1A1 0x7678  #CJK UNIFIED IDEOGRAPH
+0xE1A2 0x767C  #CJK UNIFIED IDEOGRAPH
+0xE1A3 0x7680  #CJK UNIFIED IDEOGRAPH
+0xE1A4 0x7683  #CJK UNIFIED IDEOGRAPH
+0xE1A5 0x7688  #CJK UNIFIED IDEOGRAPH
+0xE1A6 0x768B  #CJK UNIFIED IDEOGRAPH
+0xE1A7 0x768E  #CJK UNIFIED IDEOGRAPH
+0xE1A8 0x7696  #CJK UNIFIED IDEOGRAPH
+0xE1A9 0x7693  #CJK UNIFIED IDEOGRAPH
+0xE1AA 0x7699  #CJK UNIFIED IDEOGRAPH
+0xE1AB 0x769A  #CJK UNIFIED IDEOGRAPH
+0xE1AC 0x76B0  #CJK UNIFIED IDEOGRAPH
+0xE1AD 0x76B4  #CJK UNIFIED IDEOGRAPH
+0xE1AE 0x76B8  #CJK UNIFIED IDEOGRAPH
+0xE1AF 0x76B9  #CJK UNIFIED IDEOGRAPH
+0xE1B0 0x76BA  #CJK UNIFIED IDEOGRAPH
+0xE1B1 0x76C2  #CJK UNIFIED IDEOGRAPH
+0xE1B2 0x76CD  #CJK UNIFIED IDEOGRAPH
+0xE1B3 0x76D6  #CJK UNIFIED IDEOGRAPH
+0xE1B4 0x76D2  #CJK UNIFIED IDEOGRAPH
+0xE1B5 0x76DE  #CJK UNIFIED IDEOGRAPH
+0xE1B6 0x76E1  #CJK UNIFIED IDEOGRAPH
+0xE1B7 0x76E5  #CJK UNIFIED IDEOGRAPH
+0xE1B8 0x76E7  #CJK UNIFIED IDEOGRAPH
+0xE1B9 0x76EA  #CJK UNIFIED IDEOGRAPH
+0xE1BA 0x862F  #CJK UNIFIED IDEOGRAPH
+0xE1BB 0x76FB  #CJK UNIFIED IDEOGRAPH
+0xE1BC 0x7708  #CJK UNIFIED IDEOGRAPH
+0xE1BD 0x7707  #CJK UNIFIED IDEOGRAPH
+0xE1BE 0x7704  #CJK UNIFIED IDEOGRAPH
+0xE1BF 0x7729  #CJK UNIFIED IDEOGRAPH
+0xE1C0 0x7724  #CJK UNIFIED IDEOGRAPH
+0xE1C1 0x771E  #CJK UNIFIED IDEOGRAPH
+0xE1C2 0x7725  #CJK UNIFIED IDEOGRAPH
+0xE1C3 0x7726  #CJK UNIFIED IDEOGRAPH
+0xE1C4 0x771B  #CJK UNIFIED IDEOGRAPH
+0xE1C5 0x7737  #CJK UNIFIED IDEOGRAPH
+0xE1C6 0x7738  #CJK UNIFIED IDEOGRAPH
+0xE1C7 0x7747  #CJK UNIFIED IDEOGRAPH
+0xE1C8 0x775A  #CJK UNIFIED IDEOGRAPH
+0xE1C9 0x7768  #CJK UNIFIED IDEOGRAPH
+0xE1CA 0x776B  #CJK UNIFIED IDEOGRAPH
+0xE1CB 0x775B  #CJK UNIFIED IDEOGRAPH
+0xE1CC 0x7765  #CJK UNIFIED IDEOGRAPH
+0xE1CD 0x777F  #CJK UNIFIED IDEOGRAPH
+0xE1CE 0x777E  #CJK UNIFIED IDEOGRAPH
+0xE1CF 0x7779  #CJK UNIFIED IDEOGRAPH
+0xE1D0 0x778E  #CJK UNIFIED IDEOGRAPH
+0xE1D1 0x778B  #CJK UNIFIED IDEOGRAPH
+0xE1D2 0x7791  #CJK UNIFIED IDEOGRAPH
+0xE1D3 0x77A0  #CJK UNIFIED IDEOGRAPH
+0xE1D4 0x779E  #CJK UNIFIED IDEOGRAPH
+0xE1D5 0x77B0  #CJK UNIFIED IDEOGRAPH
+0xE1D6 0x77B6  #CJK UNIFIED IDEOGRAPH
+0xE1D7 0x77B9  #CJK UNIFIED IDEOGRAPH
+0xE1D8 0x77BF  #CJK UNIFIED IDEOGRAPH
+0xE1D9 0x77BC  #CJK UNIFIED IDEOGRAPH
+0xE1DA 0x77BD  #CJK UNIFIED IDEOGRAPH
+0xE1DB 0x77BB  #CJK UNIFIED IDEOGRAPH
+0xE1DC 0x77C7  #CJK UNIFIED IDEOGRAPH
+0xE1DD 0x77CD  #CJK UNIFIED IDEOGRAPH
+0xE1DE 0x77D7  #CJK UNIFIED IDEOGRAPH
+0xE1DF 0x77DA  #CJK UNIFIED IDEOGRAPH
+0xE1E0 0x77DC  #CJK UNIFIED IDEOGRAPH
+0xE1E1 0x77E3  #CJK UNIFIED IDEOGRAPH
+0xE1E2 0x77EE  #CJK UNIFIED IDEOGRAPH
+0xE1E3 0x77FC  #CJK UNIFIED IDEOGRAPH
+0xE1E4 0x780C  #CJK UNIFIED IDEOGRAPH
+0xE1E5 0x7812  #CJK UNIFIED IDEOGRAPH
+0xE1E6 0x7926  #CJK UNIFIED IDEOGRAPH
+0xE1E7 0x7820  #CJK UNIFIED IDEOGRAPH
+0xE1E8 0x792A  #CJK UNIFIED IDEOGRAPH
+0xE1E9 0x7845  #CJK UNIFIED IDEOGRAPH
+0xE1EA 0x788E  #CJK UNIFIED IDEOGRAPH
+0xE1EB 0x7874  #CJK UNIFIED IDEOGRAPH
+0xE1EC 0x7886  #CJK UNIFIED IDEOGRAPH
+0xE1ED 0x787C  #CJK UNIFIED IDEOGRAPH
+0xE1EE 0x789A  #CJK UNIFIED IDEOGRAPH
+0xE1EF 0x788C  #CJK UNIFIED IDEOGRAPH
+0xE1F0 0x78A3  #CJK UNIFIED IDEOGRAPH
+0xE1F1 0x78B5  #CJK UNIFIED IDEOGRAPH
+0xE1F2 0x78AA  #CJK UNIFIED IDEOGRAPH
+0xE1F3 0x78AF  #CJK UNIFIED IDEOGRAPH
+0xE1F4 0x78D1  #CJK UNIFIED IDEOGRAPH
+0xE1F5 0x78C6  #CJK UNIFIED IDEOGRAPH
+0xE1F6 0x78CB  #CJK UNIFIED IDEOGRAPH
+0xE1F7 0x78D4  #CJK UNIFIED IDEOGRAPH
+0xE1F8 0x78BE  #CJK UNIFIED IDEOGRAPH
+0xE1F9 0x78BC  #CJK UNIFIED IDEOGRAPH
+0xE1FA 0x78C5  #CJK UNIFIED IDEOGRAPH
+0xE1FB 0x78CA  #CJK UNIFIED IDEOGRAPH
+0xE1FC 0x78EC  #CJK UNIFIED IDEOGRAPH
+0xE240 0x78E7  #CJK UNIFIED IDEOGRAPH
+0xE241 0x78DA  #CJK UNIFIED IDEOGRAPH
+0xE242 0x78FD  #CJK UNIFIED IDEOGRAPH
+0xE243 0x78F4  #CJK UNIFIED IDEOGRAPH
+0xE244 0x7907  #CJK UNIFIED IDEOGRAPH
+0xE245 0x7912  #CJK UNIFIED IDEOGRAPH
+0xE246 0x7911  #CJK UNIFIED IDEOGRAPH
+0xE247 0x7919  #CJK UNIFIED IDEOGRAPH
+0xE248 0x792C  #CJK UNIFIED IDEOGRAPH
+0xE249 0x792B  #CJK UNIFIED IDEOGRAPH
+0xE24A 0x7940  #CJK UNIFIED IDEOGRAPH
+0xE24B 0x7960  #CJK UNIFIED IDEOGRAPH
+0xE24C 0x7957  #CJK UNIFIED IDEOGRAPH
+0xE24D 0x795F  #CJK UNIFIED IDEOGRAPH
+0xE24E 0x795A  #CJK UNIFIED IDEOGRAPH
+0xE24F 0x7955  #CJK UNIFIED IDEOGRAPH
+0xE250 0x7953  #CJK UNIFIED IDEOGRAPH
+0xE251 0x797A  #CJK UNIFIED IDEOGRAPH
+0xE252 0x797F  #CJK UNIFIED IDEOGRAPH
+0xE253 0x798A  #CJK UNIFIED IDEOGRAPH
+0xE254 0x799D  #CJK UNIFIED IDEOGRAPH
+0xE255 0x79A7  #CJK UNIFIED IDEOGRAPH
+0xE256 0x9F4B  #CJK UNIFIED IDEOGRAPH
+0xE257 0x79AA  #CJK UNIFIED IDEOGRAPH
+0xE258 0x79AE  #CJK UNIFIED IDEOGRAPH
+0xE259 0x79B3  #CJK UNIFIED IDEOGRAPH
+0xE25A 0x79B9  #CJK UNIFIED IDEOGRAPH
+0xE25B 0x79BA  #CJK UNIFIED IDEOGRAPH
+0xE25C 0x79C9  #CJK UNIFIED IDEOGRAPH
+0xE25D 0x79D5  #CJK UNIFIED IDEOGRAPH
+0xE25E 0x79E7  #CJK UNIFIED IDEOGRAPH
+0xE25F 0x79EC  #CJK UNIFIED IDEOGRAPH
+0xE260 0x79E1  #CJK UNIFIED IDEOGRAPH
+0xE261 0x79E3  #CJK UNIFIED IDEOGRAPH
+0xE262 0x7A08  #CJK UNIFIED IDEOGRAPH
+0xE263 0x7A0D  #CJK UNIFIED IDEOGRAPH
+0xE264 0x7A18  #CJK UNIFIED IDEOGRAPH
+0xE265 0x7A19  #CJK UNIFIED IDEOGRAPH
+0xE266 0x7A20  #CJK UNIFIED IDEOGRAPH
+0xE267 0x7A1F  #CJK UNIFIED IDEOGRAPH
+0xE268 0x7980  #CJK UNIFIED IDEOGRAPH
+0xE269 0x7A31  #CJK UNIFIED IDEOGRAPH
+0xE26A 0x7A3B  #CJK UNIFIED IDEOGRAPH
+0xE26B 0x7A3E  #CJK UNIFIED IDEOGRAPH
+0xE26C 0x7A37  #CJK UNIFIED IDEOGRAPH
+0xE26D 0x7A43  #CJK UNIFIED IDEOGRAPH
+0xE26E 0x7A57  #CJK UNIFIED IDEOGRAPH
+0xE26F 0x7A49  #CJK UNIFIED IDEOGRAPH
+0xE270 0x7A61  #CJK UNIFIED IDEOGRAPH
+0xE271 0x7A62  #CJK UNIFIED IDEOGRAPH
+0xE272 0x7A69  #CJK UNIFIED IDEOGRAPH
+0xE273 0x9F9D  #CJK UNIFIED IDEOGRAPH
+0xE274 0x7A70  #CJK UNIFIED IDEOGRAPH
+0xE275 0x7A79  #CJK UNIFIED IDEOGRAPH
+0xE276 0x7A7D  #CJK UNIFIED IDEOGRAPH
+0xE277 0x7A88  #CJK UNIFIED IDEOGRAPH
+0xE278 0x7A97  #CJK UNIFIED IDEOGRAPH
+0xE279 0x7A95  #CJK UNIFIED IDEOGRAPH
+0xE27A 0x7A98  #CJK UNIFIED IDEOGRAPH
+0xE27B 0x7A96  #CJK UNIFIED IDEOGRAPH
+0xE27C 0x7AA9  #CJK UNIFIED IDEOGRAPH
+0xE27D 0x7AC8  #CJK UNIFIED IDEOGRAPH
+0xE27E 0x7AB0  #CJK UNIFIED IDEOGRAPH
+0xE280 0x7AB6  #CJK UNIFIED IDEOGRAPH
+0xE281 0x7AC5  #CJK UNIFIED IDEOGRAPH
+0xE282 0x7AC4  #CJK UNIFIED IDEOGRAPH
+0xE283 0x7ABF  #CJK UNIFIED IDEOGRAPH
+0xE284 0x9083  #CJK UNIFIED IDEOGRAPH
+0xE285 0x7AC7  #CJK UNIFIED IDEOGRAPH
+0xE286 0x7ACA  #CJK UNIFIED IDEOGRAPH
+0xE287 0x7ACD  #CJK UNIFIED IDEOGRAPH
+0xE288 0x7ACF  #CJK UNIFIED IDEOGRAPH
+0xE289 0x7AD5  #CJK UNIFIED IDEOGRAPH
+0xE28A 0x7AD3  #CJK UNIFIED IDEOGRAPH
+0xE28B 0x7AD9  #CJK UNIFIED IDEOGRAPH
+0xE28C 0x7ADA  #CJK UNIFIED IDEOGRAPH
+0xE28D 0x7ADD  #CJK UNIFIED IDEOGRAPH
+0xE28E 0x7AE1  #CJK UNIFIED IDEOGRAPH
+0xE28F 0x7AE2  #CJK UNIFIED IDEOGRAPH
+0xE290 0x7AE6  #CJK UNIFIED IDEOGRAPH
+0xE291 0x7AED  #CJK UNIFIED IDEOGRAPH
+0xE292 0x7AF0  #CJK UNIFIED IDEOGRAPH
+0xE293 0x7B02  #CJK UNIFIED IDEOGRAPH
+0xE294 0x7B0F  #CJK UNIFIED IDEOGRAPH
+0xE295 0x7B0A  #CJK UNIFIED IDEOGRAPH
+0xE296 0x7B06  #CJK UNIFIED IDEOGRAPH
+0xE297 0x7B33  #CJK UNIFIED IDEOGRAPH
+0xE298 0x7B18  #CJK UNIFIED IDEOGRAPH
+0xE299 0x7B19  #CJK UNIFIED IDEOGRAPH
+0xE29A 0x7B1E  #CJK UNIFIED IDEOGRAPH
+0xE29B 0x7B35  #CJK UNIFIED IDEOGRAPH
+0xE29C 0x7B28  #CJK UNIFIED IDEOGRAPH
+0xE29D 0x7B36  #CJK UNIFIED IDEOGRAPH
+0xE29E 0x7B50  #CJK UNIFIED IDEOGRAPH
+0xE29F 0x7B7A  #CJK UNIFIED IDEOGRAPH
+0xE2A0 0x7B04  #CJK UNIFIED IDEOGRAPH
+0xE2A1 0x7B4D  #CJK UNIFIED IDEOGRAPH
+0xE2A2 0x7B0B  #CJK UNIFIED IDEOGRAPH
+0xE2A3 0x7B4C  #CJK UNIFIED IDEOGRAPH
+0xE2A4 0x7B45  #CJK UNIFIED IDEOGRAPH
+0xE2A5 0x7B75  #CJK UNIFIED IDEOGRAPH
+0xE2A6 0x7B65  #CJK UNIFIED IDEOGRAPH
+0xE2A7 0x7B74  #CJK UNIFIED IDEOGRAPH
+0xE2A8 0x7B67  #CJK UNIFIED IDEOGRAPH
+0xE2A9 0x7B70  #CJK UNIFIED IDEOGRAPH
+0xE2AA 0x7B71  #CJK UNIFIED IDEOGRAPH
+0xE2AB 0x7B6C  #CJK UNIFIED IDEOGRAPH
+0xE2AC 0x7B6E  #CJK UNIFIED IDEOGRAPH
+0xE2AD 0x7B9D  #CJK UNIFIED IDEOGRAPH
+0xE2AE 0x7B98  #CJK UNIFIED IDEOGRAPH
+0xE2AF 0x7B9F  #CJK UNIFIED IDEOGRAPH
+0xE2B0 0x7B8D  #CJK UNIFIED IDEOGRAPH
+0xE2B1 0x7B9C  #CJK UNIFIED IDEOGRAPH
+0xE2B2 0x7B9A  #CJK UNIFIED IDEOGRAPH
+0xE2B3 0x7B8B  #CJK UNIFIED IDEOGRAPH
+0xE2B4 0x7B92  #CJK UNIFIED IDEOGRAPH
+0xE2B5 0x7B8F  #CJK UNIFIED IDEOGRAPH
+0xE2B6 0x7B5D  #CJK UNIFIED IDEOGRAPH
+0xE2B7 0x7B99  #CJK UNIFIED IDEOGRAPH
+0xE2B8 0x7BCB  #CJK UNIFIED IDEOGRAPH
+0xE2B9 0x7BC1  #CJK UNIFIED IDEOGRAPH
+0xE2BA 0x7BCC  #CJK UNIFIED IDEOGRAPH
+0xE2BB 0x7BCF  #CJK UNIFIED IDEOGRAPH
+0xE2BC 0x7BB4  #CJK UNIFIED IDEOGRAPH
+0xE2BD 0x7BC6  #CJK UNIFIED IDEOGRAPH
+0xE2BE 0x7BDD  #CJK UNIFIED IDEOGRAPH
+0xE2BF 0x7BE9  #CJK UNIFIED IDEOGRAPH
+0xE2C0 0x7C11  #CJK UNIFIED IDEOGRAPH
+0xE2C1 0x7C14  #CJK UNIFIED IDEOGRAPH
+0xE2C2 0x7BE6  #CJK UNIFIED IDEOGRAPH
+0xE2C3 0x7BE5  #CJK UNIFIED IDEOGRAPH
+0xE2C4 0x7C60  #CJK UNIFIED IDEOGRAPH
+0xE2C5 0x7C00  #CJK UNIFIED IDEOGRAPH
+0xE2C6 0x7C07  #CJK UNIFIED IDEOGRAPH
+0xE2C7 0x7C13  #CJK UNIFIED IDEOGRAPH
+0xE2C8 0x7BF3  #CJK UNIFIED IDEOGRAPH
+0xE2C9 0x7BF7  #CJK UNIFIED IDEOGRAPH
+0xE2CA 0x7C17  #CJK UNIFIED IDEOGRAPH
+0xE2CB 0x7C0D  #CJK UNIFIED IDEOGRAPH
+0xE2CC 0x7BF6  #CJK UNIFIED IDEOGRAPH
+0xE2CD 0x7C23  #CJK UNIFIED IDEOGRAPH
+0xE2CE 0x7C27  #CJK UNIFIED IDEOGRAPH
+0xE2CF 0x7C2A  #CJK UNIFIED IDEOGRAPH
+0xE2D0 0x7C1F  #CJK UNIFIED IDEOGRAPH
+0xE2D1 0x7C37  #CJK UNIFIED IDEOGRAPH
+0xE2D2 0x7C2B  #CJK UNIFIED IDEOGRAPH
+0xE2D3 0x7C3D  #CJK UNIFIED IDEOGRAPH
+0xE2D4 0x7C4C  #CJK UNIFIED IDEOGRAPH
+0xE2D5 0x7C43  #CJK UNIFIED IDEOGRAPH
+0xE2D6 0x7C54  #CJK UNIFIED IDEOGRAPH
+0xE2D7 0x7C4F  #CJK UNIFIED IDEOGRAPH
+0xE2D8 0x7C40  #CJK UNIFIED IDEOGRAPH
+0xE2D9 0x7C50  #CJK UNIFIED IDEOGRAPH
+0xE2DA 0x7C58  #CJK UNIFIED IDEOGRAPH
+0xE2DB 0x7C5F  #CJK UNIFIED IDEOGRAPH
+0xE2DC 0x7C64  #CJK UNIFIED IDEOGRAPH
+0xE2DD 0x7C56  #CJK UNIFIED IDEOGRAPH
+0xE2DE 0x7C65  #CJK UNIFIED IDEOGRAPH
+0xE2DF 0x7C6C  #CJK UNIFIED IDEOGRAPH
+0xE2E0 0x7C75  #CJK UNIFIED IDEOGRAPH
+0xE2E1 0x7C83  #CJK UNIFIED IDEOGRAPH
+0xE2E2 0x7C90  #CJK UNIFIED IDEOGRAPH
+0xE2E3 0x7CA4  #CJK UNIFIED IDEOGRAPH
+0xE2E4 0x7CAD  #CJK UNIFIED IDEOGRAPH
+0xE2E5 0x7CA2  #CJK UNIFIED IDEOGRAPH
+0xE2E6 0x7CAB  #CJK UNIFIED IDEOGRAPH
+0xE2E7 0x7CA1  #CJK UNIFIED IDEOGRAPH
+0xE2E8 0x7CA8  #CJK UNIFIED IDEOGRAPH
+0xE2E9 0x7CB3  #CJK UNIFIED IDEOGRAPH
+0xE2EA 0x7CB2  #CJK UNIFIED IDEOGRAPH
+0xE2EB 0x7CB1  #CJK UNIFIED IDEOGRAPH
+0xE2EC 0x7CAE  #CJK UNIFIED IDEOGRAPH
+0xE2ED 0x7CB9  #CJK UNIFIED IDEOGRAPH
+0xE2EE 0x7CBD  #CJK UNIFIED IDEOGRAPH
+0xE2EF 0x7CC0  #CJK UNIFIED IDEOGRAPH
+0xE2F0 0x7CC5  #CJK UNIFIED IDEOGRAPH
+0xE2F1 0x7CC2  #CJK UNIFIED IDEOGRAPH
+0xE2F2 0x7CD8  #CJK UNIFIED IDEOGRAPH
+0xE2F3 0x7CD2  #CJK UNIFIED IDEOGRAPH
+0xE2F4 0x7CDC  #CJK UNIFIED IDEOGRAPH
+0xE2F5 0x7CE2  #CJK UNIFIED IDEOGRAPH
+0xE2F6 0x9B3B  #CJK UNIFIED IDEOGRAPH
+0xE2F7 0x7CEF  #CJK UNIFIED IDEOGRAPH
+0xE2F8 0x7CF2  #CJK UNIFIED IDEOGRAPH
+0xE2F9 0x7CF4  #CJK UNIFIED IDEOGRAPH
+0xE2FA 0x7CF6  #CJK UNIFIED IDEOGRAPH
+0xE2FB 0x7CFA  #CJK UNIFIED IDEOGRAPH
+0xE2FC 0x7D06  #CJK UNIFIED IDEOGRAPH
+0xE340 0x7D02  #CJK UNIFIED IDEOGRAPH
+0xE341 0x7D1C  #CJK UNIFIED IDEOGRAPH
+0xE342 0x7D15  #CJK UNIFIED IDEOGRAPH
+0xE343 0x7D0A  #CJK UNIFIED IDEOGRAPH
+0xE344 0x7D45  #CJK UNIFIED IDEOGRAPH
+0xE345 0x7D4B  #CJK UNIFIED IDEOGRAPH
+0xE346 0x7D2E  #CJK UNIFIED IDEOGRAPH
+0xE347 0x7D32  #CJK UNIFIED IDEOGRAPH
+0xE348 0x7D3F  #CJK UNIFIED IDEOGRAPH
+0xE349 0x7D35  #CJK UNIFIED IDEOGRAPH
+0xE34A 0x7D46  #CJK UNIFIED IDEOGRAPH
+0xE34B 0x7D73  #CJK UNIFIED IDEOGRAPH
+0xE34C 0x7D56  #CJK UNIFIED IDEOGRAPH
+0xE34D 0x7D4E  #CJK UNIFIED IDEOGRAPH
+0xE34E 0x7D72  #CJK UNIFIED IDEOGRAPH
+0xE34F 0x7D68  #CJK UNIFIED IDEOGRAPH
+0xE350 0x7D6E  #CJK UNIFIED IDEOGRAPH
+0xE351 0x7D4F  #CJK UNIFIED IDEOGRAPH
+0xE352 0x7D63  #CJK UNIFIED IDEOGRAPH
+0xE353 0x7D93  #CJK UNIFIED IDEOGRAPH
+0xE354 0x7D89  #CJK UNIFIED IDEOGRAPH
+0xE355 0x7D5B  #CJK UNIFIED IDEOGRAPH
+0xE356 0x7D8F  #CJK UNIFIED IDEOGRAPH
+0xE357 0x7D7D  #CJK UNIFIED IDEOGRAPH
+0xE358 0x7D9B  #CJK UNIFIED IDEOGRAPH
+0xE359 0x7DBA  #CJK UNIFIED IDEOGRAPH
+0xE35A 0x7DAE  #CJK UNIFIED IDEOGRAPH
+0xE35B 0x7DA3  #CJK UNIFIED IDEOGRAPH
+0xE35C 0x7DB5  #CJK UNIFIED IDEOGRAPH
+0xE35D 0x7DC7  #CJK UNIFIED IDEOGRAPH
+0xE35E 0x7DBD  #CJK UNIFIED IDEOGRAPH
+0xE35F 0x7DAB  #CJK UNIFIED IDEOGRAPH
+0xE360 0x7E3D  #CJK UNIFIED IDEOGRAPH
+0xE361 0x7DA2  #CJK UNIFIED IDEOGRAPH
+0xE362 0x7DAF  #CJK UNIFIED IDEOGRAPH
+0xE363 0x7DDC  #CJK UNIFIED IDEOGRAPH
+0xE364 0x7DB8  #CJK UNIFIED IDEOGRAPH
+0xE365 0x7D9F  #CJK UNIFIED IDEOGRAPH
+0xE366 0x7DB0  #CJK UNIFIED IDEOGRAPH
+0xE367 0x7DD8  #CJK UNIFIED IDEOGRAPH
+0xE368 0x7DDD  #CJK UNIFIED IDEOGRAPH
+0xE369 0x7DE4  #CJK UNIFIED IDEOGRAPH
+0xE36A 0x7DDE  #CJK UNIFIED IDEOGRAPH
+0xE36B 0x7DFB  #CJK UNIFIED IDEOGRAPH
+0xE36C 0x7DF2  #CJK UNIFIED IDEOGRAPH
+0xE36D 0x7DE1  #CJK UNIFIED IDEOGRAPH
+0xE36E 0x7E05  #CJK UNIFIED IDEOGRAPH
+0xE36F 0x7E0A  #CJK UNIFIED IDEOGRAPH
+0xE370 0x7E23  #CJK UNIFIED IDEOGRAPH
+0xE371 0x7E21  #CJK UNIFIED IDEOGRAPH
+0xE372 0x7E12  #CJK UNIFIED IDEOGRAPH
+0xE373 0x7E31  #CJK UNIFIED IDEOGRAPH
+0xE374 0x7E1F  #CJK UNIFIED IDEOGRAPH
+0xE375 0x7E09  #CJK UNIFIED IDEOGRAPH
+0xE376 0x7E0B  #CJK UNIFIED IDEOGRAPH
+0xE377 0x7E22  #CJK UNIFIED IDEOGRAPH
+0xE378 0x7E46  #CJK UNIFIED IDEOGRAPH
+0xE379 0x7E66  #CJK UNIFIED IDEOGRAPH
+0xE37A 0x7E3B  #CJK UNIFIED IDEOGRAPH
+0xE37B 0x7E35  #CJK UNIFIED IDEOGRAPH
+0xE37C 0x7E39  #CJK UNIFIED IDEOGRAPH
+0xE37D 0x7E43  #CJK UNIFIED IDEOGRAPH
+0xE37E 0x7E37  #CJK UNIFIED IDEOGRAPH
+0xE380 0x7E32  #CJK UNIFIED IDEOGRAPH
+0xE381 0x7E3A  #CJK UNIFIED IDEOGRAPH
+0xE382 0x7E67  #CJK UNIFIED IDEOGRAPH
+0xE383 0x7E5D  #CJK UNIFIED IDEOGRAPH
+0xE384 0x7E56  #CJK UNIFIED IDEOGRAPH
+0xE385 0x7E5E  #CJK UNIFIED IDEOGRAPH
+0xE386 0x7E59  #CJK UNIFIED IDEOGRAPH
+0xE387 0x7E5A  #CJK UNIFIED IDEOGRAPH
+0xE388 0x7E79  #CJK UNIFIED IDEOGRAPH
+0xE389 0x7E6A  #CJK UNIFIED IDEOGRAPH
+0xE38A 0x7E69  #CJK UNIFIED IDEOGRAPH
+0xE38B 0x7E7C  #CJK UNIFIED IDEOGRAPH
+0xE38C 0x7E7B  #CJK UNIFIED IDEOGRAPH
+0xE38D 0x7E83  #CJK UNIFIED IDEOGRAPH
+0xE38E 0x7DD5  #CJK UNIFIED IDEOGRAPH
+0xE38F 0x7E7D  #CJK UNIFIED IDEOGRAPH
+0xE390 0x8FAE  #CJK UNIFIED IDEOGRAPH
+0xE391 0x7E7F  #CJK UNIFIED IDEOGRAPH
+0xE392 0x7E88  #CJK UNIFIED IDEOGRAPH
+0xE393 0x7E89  #CJK UNIFIED IDEOGRAPH
+0xE394 0x7E8C  #CJK UNIFIED IDEOGRAPH
+0xE395 0x7E92  #CJK UNIFIED IDEOGRAPH
+0xE396 0x7E90  #CJK UNIFIED IDEOGRAPH
+0xE397 0x7E93  #CJK UNIFIED IDEOGRAPH
+0xE398 0x7E94  #CJK UNIFIED IDEOGRAPH
+0xE399 0x7E96  #CJK UNIFIED IDEOGRAPH
+0xE39A 0x7E8E  #CJK UNIFIED IDEOGRAPH
+0xE39B 0x7E9B  #CJK UNIFIED IDEOGRAPH
+0xE39C 0x7E9C  #CJK UNIFIED IDEOGRAPH
+0xE39D 0x7F38  #CJK UNIFIED IDEOGRAPH
+0xE39E 0x7F3A  #CJK UNIFIED IDEOGRAPH
+0xE39F 0x7F45  #CJK UNIFIED IDEOGRAPH
+0xE3A0 0x7F4C  #CJK UNIFIED IDEOGRAPH
+0xE3A1 0x7F4D  #CJK UNIFIED IDEOGRAPH
+0xE3A2 0x7F4E  #CJK UNIFIED IDEOGRAPH
+0xE3A3 0x7F50  #CJK UNIFIED IDEOGRAPH
+0xE3A4 0x7F51  #CJK UNIFIED IDEOGRAPH
+0xE3A5 0x7F55  #CJK UNIFIED IDEOGRAPH
+0xE3A6 0x7F54  #CJK UNIFIED IDEOGRAPH
+0xE3A7 0x7F58  #CJK UNIFIED IDEOGRAPH
+0xE3A8 0x7F5F  #CJK UNIFIED IDEOGRAPH
+0xE3A9 0x7F60  #CJK UNIFIED IDEOGRAPH
+0xE3AA 0x7F68  #CJK UNIFIED IDEOGRAPH
+0xE3AB 0x7F69  #CJK UNIFIED IDEOGRAPH
+0xE3AC 0x7F67  #CJK UNIFIED IDEOGRAPH
+0xE3AD 0x7F78  #CJK UNIFIED IDEOGRAPH
+0xE3AE 0x7F82  #CJK UNIFIED IDEOGRAPH
+0xE3AF 0x7F86  #CJK UNIFIED IDEOGRAPH
+0xE3B0 0x7F83  #CJK UNIFIED IDEOGRAPH
+0xE3B1 0x7F88  #CJK UNIFIED IDEOGRAPH
+0xE3B2 0x7F87  #CJK UNIFIED IDEOGRAPH
+0xE3B3 0x7F8C  #CJK UNIFIED IDEOGRAPH
+0xE3B4 0x7F94  #CJK UNIFIED IDEOGRAPH
+0xE3B5 0x7F9E  #CJK UNIFIED IDEOGRAPH
+0xE3B6 0x7F9D  #CJK UNIFIED IDEOGRAPH
+0xE3B7 0x7F9A  #CJK UNIFIED IDEOGRAPH
+0xE3B8 0x7FA3  #CJK UNIFIED IDEOGRAPH
+0xE3B9 0x7FAF  #CJK UNIFIED IDEOGRAPH
+0xE3BA 0x7FB2  #CJK UNIFIED IDEOGRAPH
+0xE3BB 0x7FB9  #CJK UNIFIED IDEOGRAPH
+0xE3BC 0x7FAE  #CJK UNIFIED IDEOGRAPH
+0xE3BD 0x7FB6  #CJK UNIFIED IDEOGRAPH
+0xE3BE 0x7FB8  #CJK UNIFIED IDEOGRAPH
+0xE3BF 0x8B71  #CJK UNIFIED IDEOGRAPH
+0xE3C0 0x7FC5  #CJK UNIFIED IDEOGRAPH
+0xE3C1 0x7FC6  #CJK UNIFIED IDEOGRAPH
+0xE3C2 0x7FCA  #CJK UNIFIED IDEOGRAPH
+0xE3C3 0x7FD5  #CJK UNIFIED IDEOGRAPH
+0xE3C4 0x7FD4  #CJK UNIFIED IDEOGRAPH
+0xE3C5 0x7FE1  #CJK UNIFIED IDEOGRAPH
+0xE3C6 0x7FE6  #CJK UNIFIED IDEOGRAPH
+0xE3C7 0x7FE9  #CJK UNIFIED IDEOGRAPH
+0xE3C8 0x7FF3  #CJK UNIFIED IDEOGRAPH
+0xE3C9 0x7FF9  #CJK UNIFIED IDEOGRAPH
+0xE3CA 0x98DC  #CJK UNIFIED IDEOGRAPH
+0xE3CB 0x8006  #CJK UNIFIED IDEOGRAPH
+0xE3CC 0x8004  #CJK UNIFIED IDEOGRAPH
+0xE3CD 0x800B  #CJK UNIFIED IDEOGRAPH
+0xE3CE 0x8012  #CJK UNIFIED IDEOGRAPH
+0xE3CF 0x8018  #CJK UNIFIED IDEOGRAPH
+0xE3D0 0x8019  #CJK UNIFIED IDEOGRAPH
+0xE3D1 0x801C  #CJK UNIFIED IDEOGRAPH
+0xE3D2 0x8021  #CJK UNIFIED IDEOGRAPH
+0xE3D3 0x8028  #CJK UNIFIED IDEOGRAPH
+0xE3D4 0x803F  #CJK UNIFIED IDEOGRAPH
+0xE3D5 0x803B  #CJK UNIFIED IDEOGRAPH
+0xE3D6 0x804A  #CJK UNIFIED IDEOGRAPH
+0xE3D7 0x8046  #CJK UNIFIED IDEOGRAPH
+0xE3D8 0x8052  #CJK UNIFIED IDEOGRAPH
+0xE3D9 0x8058  #CJK UNIFIED IDEOGRAPH
+0xE3DA 0x805A  #CJK UNIFIED IDEOGRAPH
+0xE3DB 0x805F  #CJK UNIFIED IDEOGRAPH
+0xE3DC 0x8062  #CJK UNIFIED IDEOGRAPH
+0xE3DD 0x8068  #CJK UNIFIED IDEOGRAPH
+0xE3DE 0x8073  #CJK UNIFIED IDEOGRAPH
+0xE3DF 0x8072  #CJK UNIFIED IDEOGRAPH
+0xE3E0 0x8070  #CJK UNIFIED IDEOGRAPH
+0xE3E1 0x8076  #CJK UNIFIED IDEOGRAPH
+0xE3E2 0x8079  #CJK UNIFIED IDEOGRAPH
+0xE3E3 0x807D  #CJK UNIFIED IDEOGRAPH
+0xE3E4 0x807F  #CJK UNIFIED IDEOGRAPH
+0xE3E5 0x8084  #CJK UNIFIED IDEOGRAPH
+0xE3E6 0x8086  #CJK UNIFIED IDEOGRAPH
+0xE3E7 0x8085  #CJK UNIFIED IDEOGRAPH
+0xE3E8 0x809B  #CJK UNIFIED IDEOGRAPH
+0xE3E9 0x8093  #CJK UNIFIED IDEOGRAPH
+0xE3EA 0x809A  #CJK UNIFIED IDEOGRAPH
+0xE3EB 0x80AD  #CJK UNIFIED IDEOGRAPH
+0xE3EC 0x5190  #CJK UNIFIED IDEOGRAPH
+0xE3ED 0x80AC  #CJK UNIFIED IDEOGRAPH
+0xE3EE 0x80DB  #CJK UNIFIED IDEOGRAPH
+0xE3EF 0x80E5  #CJK UNIFIED IDEOGRAPH
+0xE3F0 0x80D9  #CJK UNIFIED IDEOGRAPH
+0xE3F1 0x80DD  #CJK UNIFIED IDEOGRAPH
+0xE3F2 0x80C4  #CJK UNIFIED IDEOGRAPH
+0xE3F3 0x80DA  #CJK UNIFIED IDEOGRAPH
+0xE3F4 0x80D6  #CJK UNIFIED IDEOGRAPH
+0xE3F5 0x8109  #CJK UNIFIED IDEOGRAPH
+0xE3F6 0x80EF  #CJK UNIFIED IDEOGRAPH
+0xE3F7 0x80F1  #CJK UNIFIED IDEOGRAPH
+0xE3F8 0x811B  #CJK UNIFIED IDEOGRAPH
+0xE3F9 0x8129  #CJK UNIFIED IDEOGRAPH
+0xE3FA 0x8123  #CJK UNIFIED IDEOGRAPH
+0xE3FB 0x812F  #CJK UNIFIED IDEOGRAPH
+0xE3FC 0x814B  #CJK UNIFIED IDEOGRAPH
+0xE440 0x968B  #CJK UNIFIED IDEOGRAPH
+0xE441 0x8146  #CJK UNIFIED IDEOGRAPH
+0xE442 0x813E  #CJK UNIFIED IDEOGRAPH
+0xE443 0x8153  #CJK UNIFIED IDEOGRAPH
+0xE444 0x8151  #CJK UNIFIED IDEOGRAPH
+0xE445 0x80FC  #CJK UNIFIED IDEOGRAPH
+0xE446 0x8171  #CJK UNIFIED IDEOGRAPH
+0xE447 0x816E  #CJK UNIFIED IDEOGRAPH
+0xE448 0x8165  #CJK UNIFIED IDEOGRAPH
+0xE449 0x8166  #CJK UNIFIED IDEOGRAPH
+0xE44A 0x8174  #CJK UNIFIED IDEOGRAPH
+0xE44B 0x8183  #CJK UNIFIED IDEOGRAPH
+0xE44C 0x8188  #CJK UNIFIED IDEOGRAPH
+0xE44D 0x818A  #CJK UNIFIED IDEOGRAPH
+0xE44E 0x8180  #CJK UNIFIED IDEOGRAPH
+0xE44F 0x8182  #CJK UNIFIED IDEOGRAPH
+0xE450 0x81A0  #CJK UNIFIED IDEOGRAPH
+0xE451 0x8195  #CJK UNIFIED IDEOGRAPH
+0xE452 0x81A4  #CJK UNIFIED IDEOGRAPH
+0xE453 0x81A3  #CJK UNIFIED IDEOGRAPH
+0xE454 0x815F  #CJK UNIFIED IDEOGRAPH
+0xE455 0x8193  #CJK UNIFIED IDEOGRAPH
+0xE456 0x81A9  #CJK UNIFIED IDEOGRAPH
+0xE457 0x81B0  #CJK UNIFIED IDEOGRAPH
+0xE458 0x81B5  #CJK UNIFIED IDEOGRAPH
+0xE459 0x81BE  #CJK UNIFIED IDEOGRAPH
+0xE45A 0x81B8  #CJK UNIFIED IDEOGRAPH
+0xE45B 0x81BD  #CJK UNIFIED IDEOGRAPH
+0xE45C 0x81C0  #CJK UNIFIED IDEOGRAPH
+0xE45D 0x81C2  #CJK UNIFIED IDEOGRAPH
+0xE45E 0x81BA  #CJK UNIFIED IDEOGRAPH
+0xE45F 0x81C9  #CJK UNIFIED IDEOGRAPH
+0xE460 0x81CD  #CJK UNIFIED IDEOGRAPH
+0xE461 0x81D1  #CJK UNIFIED IDEOGRAPH
+0xE462 0x81D9  #CJK UNIFIED IDEOGRAPH
+0xE463 0x81D8  #CJK UNIFIED IDEOGRAPH
+0xE464 0x81C8  #CJK UNIFIED IDEOGRAPH
+0xE465 0x81DA  #CJK UNIFIED IDEOGRAPH
+0xE466 0x81DF  #CJK UNIFIED IDEOGRAPH
+0xE467 0x81E0  #CJK UNIFIED IDEOGRAPH
+0xE468 0x81E7  #CJK UNIFIED IDEOGRAPH
+0xE469 0x81FA  #CJK UNIFIED IDEOGRAPH
+0xE46A 0x81FB  #CJK UNIFIED IDEOGRAPH
+0xE46B 0x81FE  #CJK UNIFIED IDEOGRAPH
+0xE46C 0x8201  #CJK UNIFIED IDEOGRAPH
+0xE46D 0x8202  #CJK UNIFIED IDEOGRAPH
+0xE46E 0x8205  #CJK UNIFIED IDEOGRAPH
+0xE46F 0x8207  #CJK UNIFIED IDEOGRAPH
+0xE470 0x820A  #CJK UNIFIED IDEOGRAPH
+0xE471 0x820D  #CJK UNIFIED IDEOGRAPH
+0xE472 0x8210  #CJK UNIFIED IDEOGRAPH
+0xE473 0x8216  #CJK UNIFIED IDEOGRAPH
+0xE474 0x8229  #CJK UNIFIED IDEOGRAPH
+0xE475 0x822B  #CJK UNIFIED IDEOGRAPH
+0xE476 0x8238  #CJK UNIFIED IDEOGRAPH
+0xE477 0x8233  #CJK UNIFIED IDEOGRAPH
+0xE478 0x8240  #CJK UNIFIED IDEOGRAPH
+0xE479 0x8259  #CJK UNIFIED IDEOGRAPH
+0xE47A 0x8258  #CJK UNIFIED IDEOGRAPH
+0xE47B 0x825D  #CJK UNIFIED IDEOGRAPH
+0xE47C 0x825A  #CJK UNIFIED IDEOGRAPH
+0xE47D 0x825F  #CJK UNIFIED IDEOGRAPH
+0xE47E 0x8264  #CJK UNIFIED IDEOGRAPH
+0xE480 0x8262  #CJK UNIFIED IDEOGRAPH
+0xE481 0x8268  #CJK UNIFIED IDEOGRAPH
+0xE482 0x826A  #CJK UNIFIED IDEOGRAPH
+0xE483 0x826B  #CJK UNIFIED IDEOGRAPH
+0xE484 0x822E  #CJK UNIFIED IDEOGRAPH
+0xE485 0x8271  #CJK UNIFIED IDEOGRAPH
+0xE486 0x8277  #CJK UNIFIED IDEOGRAPH
+0xE487 0x8278  #CJK UNIFIED IDEOGRAPH
+0xE488 0x827E  #CJK UNIFIED IDEOGRAPH
+0xE489 0x828D  #CJK UNIFIED IDEOGRAPH
+0xE48A 0x8292  #CJK UNIFIED IDEOGRAPH
+0xE48B 0x82AB  #CJK UNIFIED IDEOGRAPH
+0xE48C 0x829F  #CJK UNIFIED IDEOGRAPH
+0xE48D 0x82BB  #CJK UNIFIED IDEOGRAPH
+0xE48E 0x82AC  #CJK UNIFIED IDEOGRAPH
+0xE48F 0x82E1  #CJK UNIFIED IDEOGRAPH
+0xE490 0x82E3  #CJK UNIFIED IDEOGRAPH
+0xE491 0x82DF  #CJK UNIFIED IDEOGRAPH
+0xE492 0x82D2  #CJK UNIFIED IDEOGRAPH
+0xE493 0x82F4  #CJK UNIFIED IDEOGRAPH
+0xE494 0x82F3  #CJK UNIFIED IDEOGRAPH
+0xE495 0x82FA  #CJK UNIFIED IDEOGRAPH
+0xE496 0x8393  #CJK UNIFIED IDEOGRAPH
+0xE497 0x8303  #CJK UNIFIED IDEOGRAPH
+0xE498 0x82FB  #CJK UNIFIED IDEOGRAPH
+0xE499 0x82F9  #CJK UNIFIED IDEOGRAPH
+0xE49A 0x82DE  #CJK UNIFIED IDEOGRAPH
+0xE49B 0x8306  #CJK UNIFIED IDEOGRAPH
+0xE49C 0x82DC  #CJK UNIFIED IDEOGRAPH
+0xE49D 0x8309  #CJK UNIFIED IDEOGRAPH
+0xE49E 0x82D9  #CJK UNIFIED IDEOGRAPH
+0xE49F 0x8335  #CJK UNIFIED IDEOGRAPH
+0xE4A0 0x8334  #CJK UNIFIED IDEOGRAPH
+0xE4A1 0x8316  #CJK UNIFIED IDEOGRAPH
+0xE4A2 0x8332  #CJK UNIFIED IDEOGRAPH
+0xE4A3 0x8331  #CJK UNIFIED IDEOGRAPH
+0xE4A4 0x8340  #CJK UNIFIED IDEOGRAPH
+0xE4A5 0x8339  #CJK UNIFIED IDEOGRAPH
+0xE4A6 0x8350  #CJK UNIFIED IDEOGRAPH
+0xE4A7 0x8345  #CJK UNIFIED IDEOGRAPH
+0xE4A8 0x832F  #CJK UNIFIED IDEOGRAPH
+0xE4A9 0x832B  #CJK UNIFIED IDEOGRAPH
+0xE4AA 0x8317  #CJK UNIFIED IDEOGRAPH
+0xE4AB 0x8318  #CJK UNIFIED IDEOGRAPH
+0xE4AC 0x8385  #CJK UNIFIED IDEOGRAPH
+0xE4AD 0x839A  #CJK UNIFIED IDEOGRAPH
+0xE4AE 0x83AA  #CJK UNIFIED IDEOGRAPH
+0xE4AF 0x839F  #CJK UNIFIED IDEOGRAPH
+0xE4B0 0x83A2  #CJK UNIFIED IDEOGRAPH
+0xE4B1 0x8396  #CJK UNIFIED IDEOGRAPH
+0xE4B2 0x8323  #CJK UNIFIED IDEOGRAPH
+0xE4B3 0x838E  #CJK UNIFIED IDEOGRAPH
+0xE4B4 0x8387  #CJK UNIFIED IDEOGRAPH
+0xE4B5 0x838A  #CJK UNIFIED IDEOGRAPH
+0xE4B6 0x837C  #CJK UNIFIED IDEOGRAPH
+0xE4B7 0x83B5  #CJK UNIFIED IDEOGRAPH
+0xE4B8 0x8373  #CJK UNIFIED IDEOGRAPH
+0xE4B9 0x8375  #CJK UNIFIED IDEOGRAPH
+0xE4BA 0x83A0  #CJK UNIFIED IDEOGRAPH
+0xE4BB 0x8389  #CJK UNIFIED IDEOGRAPH
+0xE4BC 0x83A8  #CJK UNIFIED IDEOGRAPH
+0xE4BD 0x83F4  #CJK UNIFIED IDEOGRAPH
+0xE4BE 0x8413  #CJK UNIFIED IDEOGRAPH
+0xE4BF 0x83EB  #CJK UNIFIED IDEOGRAPH
+0xE4C0 0x83CE  #CJK UNIFIED IDEOGRAPH
+0xE4C1 0x83FD  #CJK UNIFIED IDEOGRAPH
+0xE4C2 0x8403  #CJK UNIFIED IDEOGRAPH
+0xE4C3 0x83D8  #CJK UNIFIED IDEOGRAPH
+0xE4C4 0x840B  #CJK UNIFIED IDEOGRAPH
+0xE4C5 0x83C1  #CJK UNIFIED IDEOGRAPH
+0xE4C6 0x83F7  #CJK UNIFIED IDEOGRAPH
+0xE4C7 0x8407  #CJK UNIFIED IDEOGRAPH
+0xE4C8 0x83E0  #CJK UNIFIED IDEOGRAPH
+0xE4C9 0x83F2  #CJK UNIFIED IDEOGRAPH
+0xE4CA 0x840D  #CJK UNIFIED IDEOGRAPH
+0xE4CB 0x8422  #CJK UNIFIED IDEOGRAPH
+0xE4CC 0x8420  #CJK UNIFIED IDEOGRAPH
+0xE4CD 0x83BD  #CJK UNIFIED IDEOGRAPH
+0xE4CE 0x8438  #CJK UNIFIED IDEOGRAPH
+0xE4CF 0x8506  #CJK UNIFIED IDEOGRAPH
+0xE4D0 0x83FB  #CJK UNIFIED IDEOGRAPH
+0xE4D1 0x846D  #CJK UNIFIED IDEOGRAPH
+0xE4D2 0x842A  #CJK UNIFIED IDEOGRAPH
+0xE4D3 0x843C  #CJK UNIFIED IDEOGRAPH
+0xE4D4 0x855A  #CJK UNIFIED IDEOGRAPH
+0xE4D5 0x8484  #CJK UNIFIED IDEOGRAPH
+0xE4D6 0x8477  #CJK UNIFIED IDEOGRAPH
+0xE4D7 0x846B  #CJK UNIFIED IDEOGRAPH
+0xE4D8 0x84AD  #CJK UNIFIED IDEOGRAPH
+0xE4D9 0x846E  #CJK UNIFIED IDEOGRAPH
+0xE4DA 0x8482  #CJK UNIFIED IDEOGRAPH
+0xE4DB 0x8469  #CJK UNIFIED IDEOGRAPH
+0xE4DC 0x8446  #CJK UNIFIED IDEOGRAPH
+0xE4DD 0x842C  #CJK UNIFIED IDEOGRAPH
+0xE4DE 0x846F  #CJK UNIFIED IDEOGRAPH
+0xE4DF 0x8479  #CJK UNIFIED IDEOGRAPH
+0xE4E0 0x8435  #CJK UNIFIED IDEOGRAPH
+0xE4E1 0x84CA  #CJK UNIFIED IDEOGRAPH
+0xE4E2 0x8462  #CJK UNIFIED IDEOGRAPH
+0xE4E3 0x84B9  #CJK UNIFIED IDEOGRAPH
+0xE4E4 0x84BF  #CJK UNIFIED IDEOGRAPH
+0xE4E5 0x849F  #CJK UNIFIED IDEOGRAPH
+0xE4E6 0x84D9  #CJK UNIFIED IDEOGRAPH
+0xE4E7 0x84CD  #CJK UNIFIED IDEOGRAPH
+0xE4E8 0x84BB  #CJK UNIFIED IDEOGRAPH
+0xE4E9 0x84DA  #CJK UNIFIED IDEOGRAPH
+0xE4EA 0x84D0  #CJK UNIFIED IDEOGRAPH
+0xE4EB 0x84C1  #CJK UNIFIED IDEOGRAPH
+0xE4EC 0x84C6  #CJK UNIFIED IDEOGRAPH
+0xE4ED 0x84D6  #CJK UNIFIED IDEOGRAPH
+0xE4EE 0x84A1  #CJK UNIFIED IDEOGRAPH
+0xE4EF 0x8521  #CJK UNIFIED IDEOGRAPH
+0xE4F0 0x84FF  #CJK UNIFIED IDEOGRAPH
+0xE4F1 0x84F4  #CJK UNIFIED IDEOGRAPH
+0xE4F2 0x8517  #CJK UNIFIED IDEOGRAPH
+0xE4F3 0x8518  #CJK UNIFIED IDEOGRAPH
+0xE4F4 0x852C  #CJK UNIFIED IDEOGRAPH
+0xE4F5 0x851F  #CJK UNIFIED IDEOGRAPH
+0xE4F6 0x8515  #CJK UNIFIED IDEOGRAPH
+0xE4F7 0x8514  #CJK UNIFIED IDEOGRAPH
+0xE4F8 0x84FC  #CJK UNIFIED IDEOGRAPH
+0xE4F9 0x8540  #CJK UNIFIED IDEOGRAPH
+0xE4FA 0x8563  #CJK UNIFIED IDEOGRAPH
+0xE4FB 0x8558  #CJK UNIFIED IDEOGRAPH
+0xE4FC 0x8548  #CJK UNIFIED IDEOGRAPH
+0xE540 0x8541  #CJK UNIFIED IDEOGRAPH
+0xE541 0x8602  #CJK UNIFIED IDEOGRAPH
+0xE542 0x854B  #CJK UNIFIED IDEOGRAPH
+0xE543 0x8555  #CJK UNIFIED IDEOGRAPH
+0xE544 0x8580  #CJK UNIFIED IDEOGRAPH
+0xE545 0x85A4  #CJK UNIFIED IDEOGRAPH
+0xE546 0x8588  #CJK UNIFIED IDEOGRAPH
+0xE547 0x8591  #CJK UNIFIED IDEOGRAPH
+0xE548 0x858A  #CJK UNIFIED IDEOGRAPH
+0xE549 0x85A8  #CJK UNIFIED IDEOGRAPH
+0xE54A 0x856D  #CJK UNIFIED IDEOGRAPH
+0xE54B 0x8594  #CJK UNIFIED IDEOGRAPH
+0xE54C 0x859B  #CJK UNIFIED IDEOGRAPH
+0xE54D 0x85EA  #CJK UNIFIED IDEOGRAPH
+0xE54E 0x8587  #CJK UNIFIED IDEOGRAPH
+0xE54F 0x859C  #CJK UNIFIED IDEOGRAPH
+0xE550 0x8577  #CJK UNIFIED IDEOGRAPH
+0xE551 0x857E  #CJK UNIFIED IDEOGRAPH
+0xE552 0x8590  #CJK UNIFIED IDEOGRAPH
+0xE553 0x85C9  #CJK UNIFIED IDEOGRAPH
+0xE554 0x85BA  #CJK UNIFIED IDEOGRAPH
+0xE555 0x85CF  #CJK UNIFIED IDEOGRAPH
+0xE556 0x85B9  #CJK UNIFIED IDEOGRAPH
+0xE557 0x85D0  #CJK UNIFIED IDEOGRAPH
+0xE558 0x85D5  #CJK UNIFIED IDEOGRAPH
+0xE559 0x85DD  #CJK UNIFIED IDEOGRAPH
+0xE55A 0x85E5  #CJK UNIFIED IDEOGRAPH
+0xE55B 0x85DC  #CJK UNIFIED IDEOGRAPH
+0xE55C 0x85F9  #CJK UNIFIED IDEOGRAPH
+0xE55D 0x860A  #CJK UNIFIED IDEOGRAPH
+0xE55E 0x8613  #CJK UNIFIED IDEOGRAPH
+0xE55F 0x860B  #CJK UNIFIED IDEOGRAPH
+0xE560 0x85FE  #CJK UNIFIED IDEOGRAPH
+0xE561 0x85FA  #CJK UNIFIED IDEOGRAPH
+0xE562 0x8606  #CJK UNIFIED IDEOGRAPH
+0xE563 0x8622  #CJK UNIFIED IDEOGRAPH
+0xE564 0x861A  #CJK UNIFIED IDEOGRAPH
+0xE565 0x8630  #CJK UNIFIED IDEOGRAPH
+0xE566 0x863F  #CJK UNIFIED IDEOGRAPH
+0xE567 0x864D  #CJK UNIFIED IDEOGRAPH
+0xE568 0x4E55  #CJK UNIFIED IDEOGRAPH
+0xE569 0x8654  #CJK UNIFIED IDEOGRAPH
+0xE56A 0x865F  #CJK UNIFIED IDEOGRAPH
+0xE56B 0x8667  #CJK UNIFIED IDEOGRAPH
+0xE56C 0x8671  #CJK UNIFIED IDEOGRAPH
+0xE56D 0x8693  #CJK UNIFIED IDEOGRAPH
+0xE56E 0x86A3  #CJK UNIFIED IDEOGRAPH
+0xE56F 0x86A9  #CJK UNIFIED IDEOGRAPH
+0xE570 0x86AA  #CJK UNIFIED IDEOGRAPH
+0xE571 0x868B  #CJK UNIFIED IDEOGRAPH
+0xE572 0x868C  #CJK UNIFIED IDEOGRAPH
+0xE573 0x86B6  #CJK UNIFIED IDEOGRAPH
+0xE574 0x86AF  #CJK UNIFIED IDEOGRAPH
+0xE575 0x86C4  #CJK UNIFIED IDEOGRAPH
+0xE576 0x86C6  #CJK UNIFIED IDEOGRAPH
+0xE577 0x86B0  #CJK UNIFIED IDEOGRAPH
+0xE578 0x86C9  #CJK UNIFIED IDEOGRAPH
+0xE579 0x8823  #CJK UNIFIED IDEOGRAPH
+0xE57A 0x86AB  #CJK UNIFIED IDEOGRAPH
+0xE57B 0x86D4  #CJK UNIFIED IDEOGRAPH
+0xE57C 0x86DE  #CJK UNIFIED IDEOGRAPH
+0xE57D 0x86E9  #CJK UNIFIED IDEOGRAPH
+0xE57E 0x86EC  #CJK UNIFIED IDEOGRAPH
+0xE580 0x86DF  #CJK UNIFIED IDEOGRAPH
+0xE581 0x86DB  #CJK UNIFIED IDEOGRAPH
+0xE582 0x86EF  #CJK UNIFIED IDEOGRAPH
+0xE583 0x8712  #CJK UNIFIED IDEOGRAPH
+0xE584 0x8706  #CJK UNIFIED IDEOGRAPH
+0xE585 0x8708  #CJK UNIFIED IDEOGRAPH
+0xE586 0x8700  #CJK UNIFIED IDEOGRAPH
+0xE587 0x8703  #CJK UNIFIED IDEOGRAPH
+0xE588 0x86FB  #CJK UNIFIED IDEOGRAPH
+0xE589 0x8711  #CJK UNIFIED IDEOGRAPH
+0xE58A 0x8709  #CJK UNIFIED IDEOGRAPH
+0xE58B 0x870D  #CJK UNIFIED IDEOGRAPH
+0xE58C 0x86F9  #CJK UNIFIED IDEOGRAPH
+0xE58D 0x870A  #CJK UNIFIED IDEOGRAPH
+0xE58E 0x8734  #CJK UNIFIED IDEOGRAPH
+0xE58F 0x873F  #CJK UNIFIED IDEOGRAPH
+0xE590 0x8737  #CJK UNIFIED IDEOGRAPH
+0xE591 0x873B  #CJK UNIFIED IDEOGRAPH
+0xE592 0x8725  #CJK UNIFIED IDEOGRAPH
+0xE593 0x8729  #CJK UNIFIED IDEOGRAPH
+0xE594 0x871A  #CJK UNIFIED IDEOGRAPH
+0xE595 0x8760  #CJK UNIFIED IDEOGRAPH
+0xE596 0x875F  #CJK UNIFIED IDEOGRAPH
+0xE597 0x8778  #CJK UNIFIED IDEOGRAPH
+0xE598 0x874C  #CJK UNIFIED IDEOGRAPH
+0xE599 0x874E  #CJK UNIFIED IDEOGRAPH
+0xE59A 0x8774  #CJK UNIFIED IDEOGRAPH
+0xE59B 0x8757  #CJK UNIFIED IDEOGRAPH
+0xE59C 0x8768  #CJK UNIFIED IDEOGRAPH
+0xE59D 0x876E  #CJK UNIFIED IDEOGRAPH
+0xE59E 0x8759  #CJK UNIFIED IDEOGRAPH
+0xE59F 0x8753  #CJK UNIFIED IDEOGRAPH
+0xE5A0 0x8763  #CJK UNIFIED IDEOGRAPH
+0xE5A1 0x876A  #CJK UNIFIED IDEOGRAPH
+0xE5A2 0x8805  #CJK UNIFIED IDEOGRAPH
+0xE5A3 0x87A2  #CJK UNIFIED IDEOGRAPH
+0xE5A4 0x879F  #CJK UNIFIED IDEOGRAPH
+0xE5A5 0x8782  #CJK UNIFIED IDEOGRAPH
+0xE5A6 0x87AF  #CJK UNIFIED IDEOGRAPH
+0xE5A7 0x87CB  #CJK UNIFIED IDEOGRAPH
+0xE5A8 0x87BD  #CJK UNIFIED IDEOGRAPH
+0xE5A9 0x87C0  #CJK UNIFIED IDEOGRAPH
+0xE5AA 0x87D0  #CJK UNIFIED IDEOGRAPH
+0xE5AB 0x96D6  #CJK UNIFIED IDEOGRAPH
+0xE5AC 0x87AB  #CJK UNIFIED IDEOGRAPH
+0xE5AD 0x87C4  #CJK UNIFIED IDEOGRAPH
+0xE5AE 0x87B3  #CJK UNIFIED IDEOGRAPH
+0xE5AF 0x87C7  #CJK UNIFIED IDEOGRAPH
+0xE5B0 0x87C6  #CJK UNIFIED IDEOGRAPH
+0xE5B1 0x87BB  #CJK UNIFIED IDEOGRAPH
+0xE5B2 0x87EF  #CJK UNIFIED IDEOGRAPH
+0xE5B3 0x87F2  #CJK UNIFIED IDEOGRAPH
+0xE5B4 0x87E0  #CJK UNIFIED IDEOGRAPH
+0xE5B5 0x880F  #CJK UNIFIED IDEOGRAPH
+0xE5B6 0x880D  #CJK UNIFIED IDEOGRAPH
+0xE5B7 0x87FE  #CJK UNIFIED IDEOGRAPH
+0xE5B8 0x87F6  #CJK UNIFIED IDEOGRAPH
+0xE5B9 0x87F7  #CJK UNIFIED IDEOGRAPH
+0xE5BA 0x880E  #CJK UNIFIED IDEOGRAPH
+0xE5BB 0x87D2  #CJK UNIFIED IDEOGRAPH
+0xE5BC 0x8811  #CJK UNIFIED IDEOGRAPH
+0xE5BD 0x8816  #CJK UNIFIED IDEOGRAPH
+0xE5BE 0x8815  #CJK UNIFIED IDEOGRAPH
+0xE5BF 0x8822  #CJK UNIFIED IDEOGRAPH
+0xE5C0 0x8821  #CJK UNIFIED IDEOGRAPH
+0xE5C1 0x8831  #CJK UNIFIED IDEOGRAPH
+0xE5C2 0x8836  #CJK UNIFIED IDEOGRAPH
+0xE5C3 0x8839  #CJK UNIFIED IDEOGRAPH
+0xE5C4 0x8827  #CJK UNIFIED IDEOGRAPH
+0xE5C5 0x883B  #CJK UNIFIED IDEOGRAPH
+0xE5C6 0x8844  #CJK UNIFIED IDEOGRAPH
+0xE5C7 0x8842  #CJK UNIFIED IDEOGRAPH
+0xE5C8 0x8852  #CJK UNIFIED IDEOGRAPH
+0xE5C9 0x8859  #CJK UNIFIED IDEOGRAPH
+0xE5CA 0x885E  #CJK UNIFIED IDEOGRAPH
+0xE5CB 0x8862  #CJK UNIFIED IDEOGRAPH
+0xE5CC 0x886B  #CJK UNIFIED IDEOGRAPH
+0xE5CD 0x8881  #CJK UNIFIED IDEOGRAPH
+0xE5CE 0x887E  #CJK UNIFIED IDEOGRAPH
+0xE5CF 0x889E  #CJK UNIFIED IDEOGRAPH
+0xE5D0 0x8875  #CJK UNIFIED IDEOGRAPH
+0xE5D1 0x887D  #CJK UNIFIED IDEOGRAPH
+0xE5D2 0x88B5  #CJK UNIFIED IDEOGRAPH
+0xE5D3 0x8872  #CJK UNIFIED IDEOGRAPH
+0xE5D4 0x8882  #CJK UNIFIED IDEOGRAPH
+0xE5D5 0x8897  #CJK UNIFIED IDEOGRAPH
+0xE5D6 0x8892  #CJK UNIFIED IDEOGRAPH
+0xE5D7 0x88AE  #CJK UNIFIED IDEOGRAPH
+0xE5D8 0x8899  #CJK UNIFIED IDEOGRAPH
+0xE5D9 0x88A2  #CJK UNIFIED IDEOGRAPH
+0xE5DA 0x888D  #CJK UNIFIED IDEOGRAPH
+0xE5DB 0x88A4  #CJK UNIFIED IDEOGRAPH
+0xE5DC 0x88B0  #CJK UNIFIED IDEOGRAPH
+0xE5DD 0x88BF  #CJK UNIFIED IDEOGRAPH
+0xE5DE 0x88B1  #CJK UNIFIED IDEOGRAPH
+0xE5DF 0x88C3  #CJK UNIFIED IDEOGRAPH
+0xE5E0 0x88C4  #CJK UNIFIED IDEOGRAPH
+0xE5E1 0x88D4  #CJK UNIFIED IDEOGRAPH
+0xE5E2 0x88D8  #CJK UNIFIED IDEOGRAPH
+0xE5E3 0x88D9  #CJK UNIFIED IDEOGRAPH
+0xE5E4 0x88DD  #CJK UNIFIED IDEOGRAPH
+0xE5E5 0x88F9  #CJK UNIFIED IDEOGRAPH
+0xE5E6 0x8902  #CJK UNIFIED IDEOGRAPH
+0xE5E7 0x88FC  #CJK UNIFIED IDEOGRAPH
+0xE5E8 0x88F4  #CJK UNIFIED IDEOGRAPH
+0xE5E9 0x88E8  #CJK UNIFIED IDEOGRAPH
+0xE5EA 0x88F2  #CJK UNIFIED IDEOGRAPH
+0xE5EB 0x8904  #CJK UNIFIED IDEOGRAPH
+0xE5EC 0x890C  #CJK UNIFIED IDEOGRAPH
+0xE5ED 0x890A  #CJK UNIFIED IDEOGRAPH
+0xE5EE 0x8913  #CJK UNIFIED IDEOGRAPH
+0xE5EF 0x8943  #CJK UNIFIED IDEOGRAPH
+0xE5F0 0x891E  #CJK UNIFIED IDEOGRAPH
+0xE5F1 0x8925  #CJK UNIFIED IDEOGRAPH
+0xE5F2 0x892A  #CJK UNIFIED IDEOGRAPH
+0xE5F3 0x892B  #CJK UNIFIED IDEOGRAPH
+0xE5F4 0x8941  #CJK UNIFIED IDEOGRAPH
+0xE5F5 0x8944  #CJK UNIFIED IDEOGRAPH
+0xE5F6 0x893B  #CJK UNIFIED IDEOGRAPH
+0xE5F7 0x8936  #CJK UNIFIED IDEOGRAPH
+0xE5F8 0x8938  #CJK UNIFIED IDEOGRAPH
+0xE5F9 0x894C  #CJK UNIFIED IDEOGRAPH
+0xE5FA 0x891D  #CJK UNIFIED IDEOGRAPH
+0xE5FB 0x8960  #CJK UNIFIED IDEOGRAPH
+0xE5FC 0x895E  #CJK UNIFIED IDEOGRAPH
+0xE640 0x8966  #CJK UNIFIED IDEOGRAPH
+0xE641 0x8964  #CJK UNIFIED IDEOGRAPH
+0xE642 0x896D  #CJK UNIFIED IDEOGRAPH
+0xE643 0x896A  #CJK UNIFIED IDEOGRAPH
+0xE644 0x896F  #CJK UNIFIED IDEOGRAPH
+0xE645 0x8974  #CJK UNIFIED IDEOGRAPH
+0xE646 0x8977  #CJK UNIFIED IDEOGRAPH
+0xE647 0x897E  #CJK UNIFIED IDEOGRAPH
+0xE648 0x8983  #CJK UNIFIED IDEOGRAPH
+0xE649 0x8988  #CJK UNIFIED IDEOGRAPH
+0xE64A 0x898A  #CJK UNIFIED IDEOGRAPH
+0xE64B 0x8993  #CJK UNIFIED IDEOGRAPH
+0xE64C 0x8998  #CJK UNIFIED IDEOGRAPH
+0xE64D 0x89A1  #CJK UNIFIED IDEOGRAPH
+0xE64E 0x89A9  #CJK UNIFIED IDEOGRAPH
+0xE64F 0x89A6  #CJK UNIFIED IDEOGRAPH
+0xE650 0x89AC  #CJK UNIFIED IDEOGRAPH
+0xE651 0x89AF  #CJK UNIFIED IDEOGRAPH
+0xE652 0x89B2  #CJK UNIFIED IDEOGRAPH
+0xE653 0x89BA  #CJK UNIFIED IDEOGRAPH
+0xE654 0x89BD  #CJK UNIFIED IDEOGRAPH
+0xE655 0x89BF  #CJK UNIFIED IDEOGRAPH
+0xE656 0x89C0  #CJK UNIFIED IDEOGRAPH
+0xE657 0x89DA  #CJK UNIFIED IDEOGRAPH
+0xE658 0x89DC  #CJK UNIFIED IDEOGRAPH
+0xE659 0x89DD  #CJK UNIFIED IDEOGRAPH
+0xE65A 0x89E7  #CJK UNIFIED IDEOGRAPH
+0xE65B 0x89F4  #CJK UNIFIED IDEOGRAPH
+0xE65C 0x89F8  #CJK UNIFIED IDEOGRAPH
+0xE65D 0x8A03  #CJK UNIFIED IDEOGRAPH
+0xE65E 0x8A16  #CJK UNIFIED IDEOGRAPH
+0xE65F 0x8A10  #CJK UNIFIED IDEOGRAPH
+0xE660 0x8A0C  #CJK UNIFIED IDEOGRAPH
+0xE661 0x8A1B  #CJK UNIFIED IDEOGRAPH
+0xE662 0x8A1D  #CJK UNIFIED IDEOGRAPH
+0xE663 0x8A25  #CJK UNIFIED IDEOGRAPH
+0xE664 0x8A36  #CJK UNIFIED IDEOGRAPH
+0xE665 0x8A41  #CJK UNIFIED IDEOGRAPH
+0xE666 0x8A5B  #CJK UNIFIED IDEOGRAPH
+0xE667 0x8A52  #CJK UNIFIED IDEOGRAPH
+0xE668 0x8A46  #CJK UNIFIED IDEOGRAPH
+0xE669 0x8A48  #CJK UNIFIED IDEOGRAPH
+0xE66A 0x8A7C  #CJK UNIFIED IDEOGRAPH
+0xE66B 0x8A6D  #CJK UNIFIED IDEOGRAPH
+0xE66C 0x8A6C  #CJK UNIFIED IDEOGRAPH
+0xE66D 0x8A62  #CJK UNIFIED IDEOGRAPH
+0xE66E 0x8A85  #CJK UNIFIED IDEOGRAPH
+0xE66F 0x8A82  #CJK UNIFIED IDEOGRAPH
+0xE670 0x8A84  #CJK UNIFIED IDEOGRAPH
+0xE671 0x8AA8  #CJK UNIFIED IDEOGRAPH
+0xE672 0x8AA1  #CJK UNIFIED IDEOGRAPH
+0xE673 0x8A91  #CJK UNIFIED IDEOGRAPH
+0xE674 0x8AA5  #CJK UNIFIED IDEOGRAPH
+0xE675 0x8AA6  #CJK UNIFIED IDEOGRAPH
+0xE676 0x8A9A  #CJK UNIFIED IDEOGRAPH
+0xE677 0x8AA3  #CJK UNIFIED IDEOGRAPH
+0xE678 0x8AC4  #CJK UNIFIED IDEOGRAPH
+0xE679 0x8ACD  #CJK UNIFIED IDEOGRAPH
+0xE67A 0x8AC2  #CJK UNIFIED IDEOGRAPH
+0xE67B 0x8ADA  #CJK UNIFIED IDEOGRAPH
+0xE67C 0x8AEB  #CJK UNIFIED IDEOGRAPH
+0xE67D 0x8AF3  #CJK UNIFIED IDEOGRAPH
+0xE67E 0x8AE7  #CJK UNIFIED IDEOGRAPH
+0xE680 0x8AE4  #CJK UNIFIED IDEOGRAPH
+0xE681 0x8AF1  #CJK UNIFIED IDEOGRAPH
+0xE682 0x8B14  #CJK UNIFIED IDEOGRAPH
+0xE683 0x8AE0  #CJK UNIFIED IDEOGRAPH
+0xE684 0x8AE2  #CJK UNIFIED IDEOGRAPH
+0xE685 0x8AF7  #CJK UNIFIED IDEOGRAPH
+0xE686 0x8ADE  #CJK UNIFIED IDEOGRAPH
+0xE687 0x8ADB  #CJK UNIFIED IDEOGRAPH
+0xE688 0x8B0C  #CJK UNIFIED IDEOGRAPH
+0xE689 0x8B07  #CJK UNIFIED IDEOGRAPH
+0xE68A 0x8B1A  #CJK UNIFIED IDEOGRAPH
+0xE68B 0x8AE1  #CJK UNIFIED IDEOGRAPH
+0xE68C 0x8B16  #CJK UNIFIED IDEOGRAPH
+0xE68D 0x8B10  #CJK UNIFIED IDEOGRAPH
+0xE68E 0x8B17  #CJK UNIFIED IDEOGRAPH
+0xE68F 0x8B20  #CJK UNIFIED IDEOGRAPH
+0xE690 0x8B33  #CJK UNIFIED IDEOGRAPH
+0xE691 0x97AB  #CJK UNIFIED IDEOGRAPH
+0xE692 0x8B26  #CJK UNIFIED IDEOGRAPH
+0xE693 0x8B2B  #CJK UNIFIED IDEOGRAPH
+0xE694 0x8B3E  #CJK UNIFIED IDEOGRAPH
+0xE695 0x8B28  #CJK UNIFIED IDEOGRAPH
+0xE696 0x8B41  #CJK UNIFIED IDEOGRAPH
+0xE697 0x8B4C  #CJK UNIFIED IDEOGRAPH
+0xE698 0x8B4F  #CJK UNIFIED IDEOGRAPH
+0xE699 0x8B4E  #CJK UNIFIED IDEOGRAPH
+0xE69A 0x8B49  #CJK UNIFIED IDEOGRAPH
+0xE69B 0x8B56  #CJK UNIFIED IDEOGRAPH
+0xE69C 0x8B5B  #CJK UNIFIED IDEOGRAPH
+0xE69D 0x8B5A  #CJK UNIFIED IDEOGRAPH
+0xE69E 0x8B6B  #CJK UNIFIED IDEOGRAPH
+0xE69F 0x8B5F  #CJK UNIFIED IDEOGRAPH
+0xE6A0 0x8B6C  #CJK UNIFIED IDEOGRAPH
+0xE6A1 0x8B6F  #CJK UNIFIED IDEOGRAPH
+0xE6A2 0x8B74  #CJK UNIFIED IDEOGRAPH
+0xE6A3 0x8B7D  #CJK UNIFIED IDEOGRAPH
+0xE6A4 0x8B80  #CJK UNIFIED IDEOGRAPH
+0xE6A5 0x8B8C  #CJK UNIFIED IDEOGRAPH
+0xE6A6 0x8B8E  #CJK UNIFIED IDEOGRAPH
+0xE6A7 0x8B92  #CJK UNIFIED IDEOGRAPH
+0xE6A8 0x8B93  #CJK UNIFIED IDEOGRAPH
+0xE6A9 0x8B96  #CJK UNIFIED IDEOGRAPH
+0xE6AA 0x8B99  #CJK UNIFIED IDEOGRAPH
+0xE6AB 0x8B9A  #CJK UNIFIED IDEOGRAPH
+0xE6AC 0x8C3A  #CJK UNIFIED IDEOGRAPH
+0xE6AD 0x8C41  #CJK UNIFIED IDEOGRAPH
+0xE6AE 0x8C3F  #CJK UNIFIED IDEOGRAPH
+0xE6AF 0x8C48  #CJK UNIFIED IDEOGRAPH
+0xE6B0 0x8C4C  #CJK UNIFIED IDEOGRAPH
+0xE6B1 0x8C4E  #CJK UNIFIED IDEOGRAPH
+0xE6B2 0x8C50  #CJK UNIFIED IDEOGRAPH
+0xE6B3 0x8C55  #CJK UNIFIED IDEOGRAPH
+0xE6B4 0x8C62  #CJK UNIFIED IDEOGRAPH
+0xE6B5 0x8C6C  #CJK UNIFIED IDEOGRAPH
+0xE6B6 0x8C78  #CJK UNIFIED IDEOGRAPH
+0xE6B7 0x8C7A  #CJK UNIFIED IDEOGRAPH
+0xE6B8 0x8C82  #CJK UNIFIED IDEOGRAPH
+0xE6B9 0x8C89  #CJK UNIFIED IDEOGRAPH
+0xE6BA 0x8C85  #CJK UNIFIED IDEOGRAPH
+0xE6BB 0x8C8A  #CJK UNIFIED IDEOGRAPH
+0xE6BC 0x8C8D  #CJK UNIFIED IDEOGRAPH
+0xE6BD 0x8C8E  #CJK UNIFIED IDEOGRAPH
+0xE6BE 0x8C94  #CJK UNIFIED IDEOGRAPH
+0xE6BF 0x8C7C  #CJK UNIFIED IDEOGRAPH
+0xE6C0 0x8C98  #CJK UNIFIED IDEOGRAPH
+0xE6C1 0x621D  #CJK UNIFIED IDEOGRAPH
+0xE6C2 0x8CAD  #CJK UNIFIED IDEOGRAPH
+0xE6C3 0x8CAA  #CJK UNIFIED IDEOGRAPH
+0xE6C4 0x8CBD  #CJK UNIFIED IDEOGRAPH
+0xE6C5 0x8CB2  #CJK UNIFIED IDEOGRAPH
+0xE6C6 0x8CB3  #CJK UNIFIED IDEOGRAPH
+0xE6C7 0x8CAE  #CJK UNIFIED IDEOGRAPH
+0xE6C8 0x8CB6  #CJK UNIFIED IDEOGRAPH
+0xE6C9 0x8CC8  #CJK UNIFIED IDEOGRAPH
+0xE6CA 0x8CC1  #CJK UNIFIED IDEOGRAPH
+0xE6CB 0x8CE4  #CJK UNIFIED IDEOGRAPH
+0xE6CC 0x8CE3  #CJK UNIFIED IDEOGRAPH
+0xE6CD 0x8CDA  #CJK UNIFIED IDEOGRAPH
+0xE6CE 0x8CFD  #CJK UNIFIED IDEOGRAPH
+0xE6CF 0x8CFA  #CJK UNIFIED IDEOGRAPH
+0xE6D0 0x8CFB  #CJK UNIFIED IDEOGRAPH
+0xE6D1 0x8D04  #CJK UNIFIED IDEOGRAPH
+0xE6D2 0x8D05  #CJK UNIFIED IDEOGRAPH
+0xE6D3 0x8D0A  #CJK UNIFIED IDEOGRAPH
+0xE6D4 0x8D07  #CJK UNIFIED IDEOGRAPH
+0xE6D5 0x8D0F  #CJK UNIFIED IDEOGRAPH
+0xE6D6 0x8D0D  #CJK UNIFIED IDEOGRAPH
+0xE6D7 0x8D10  #CJK UNIFIED IDEOGRAPH
+0xE6D8 0x9F4E  #CJK UNIFIED IDEOGRAPH
+0xE6D9 0x8D13  #CJK UNIFIED IDEOGRAPH
+0xE6DA 0x8CCD  #CJK UNIFIED IDEOGRAPH
+0xE6DB 0x8D14  #CJK UNIFIED IDEOGRAPH
+0xE6DC 0x8D16  #CJK UNIFIED IDEOGRAPH
+0xE6DD 0x8D67  #CJK UNIFIED IDEOGRAPH
+0xE6DE 0x8D6D  #CJK UNIFIED IDEOGRAPH
+0xE6DF 0x8D71  #CJK UNIFIED IDEOGRAPH
+0xE6E0 0x8D73  #CJK UNIFIED IDEOGRAPH
+0xE6E1 0x8D81  #CJK UNIFIED IDEOGRAPH
+0xE6E2 0x8D99  #CJK UNIFIED IDEOGRAPH
+0xE6E3 0x8DC2  #CJK UNIFIED IDEOGRAPH
+0xE6E4 0x8DBE  #CJK UNIFIED IDEOGRAPH
+0xE6E5 0x8DBA  #CJK UNIFIED IDEOGRAPH
+0xE6E6 0x8DCF  #CJK UNIFIED IDEOGRAPH
+0xE6E7 0x8DDA  #CJK UNIFIED IDEOGRAPH
+0xE6E8 0x8DD6  #CJK UNIFIED IDEOGRAPH
+0xE6E9 0x8DCC  #CJK UNIFIED IDEOGRAPH
+0xE6EA 0x8DDB  #CJK UNIFIED IDEOGRAPH
+0xE6EB 0x8DCB  #CJK UNIFIED IDEOGRAPH
+0xE6EC 0x8DEA  #CJK UNIFIED IDEOGRAPH
+0xE6ED 0x8DEB  #CJK UNIFIED IDEOGRAPH
+0xE6EE 0x8DDF  #CJK UNIFIED IDEOGRAPH
+0xE6EF 0x8DE3  #CJK UNIFIED IDEOGRAPH
+0xE6F0 0x8DFC  #CJK UNIFIED IDEOGRAPH
+0xE6F1 0x8E08  #CJK UNIFIED IDEOGRAPH
+0xE6F2 0x8E09  #CJK UNIFIED IDEOGRAPH
+0xE6F3 0x8DFF  #CJK UNIFIED IDEOGRAPH
+0xE6F4 0x8E1D  #CJK UNIFIED IDEOGRAPH
+0xE6F5 0x8E1E  #CJK UNIFIED IDEOGRAPH
+0xE6F6 0x8E10  #CJK UNIFIED IDEOGRAPH
+0xE6F7 0x8E1F  #CJK UNIFIED IDEOGRAPH
+0xE6F8 0x8E42  #CJK UNIFIED IDEOGRAPH
+0xE6F9 0x8E35  #CJK UNIFIED IDEOGRAPH
+0xE6FA 0x8E30  #CJK UNIFIED IDEOGRAPH
+0xE6FB 0x8E34  #CJK UNIFIED IDEOGRAPH
+0xE6FC 0x8E4A  #CJK UNIFIED IDEOGRAPH
+0xE740 0x8E47  #CJK UNIFIED IDEOGRAPH
+0xE741 0x8E49  #CJK UNIFIED IDEOGRAPH
+0xE742 0x8E4C  #CJK UNIFIED IDEOGRAPH
+0xE743 0x8E50  #CJK UNIFIED IDEOGRAPH
+0xE744 0x8E48  #CJK UNIFIED IDEOGRAPH
+0xE745 0x8E59  #CJK UNIFIED IDEOGRAPH
+0xE746 0x8E64  #CJK UNIFIED IDEOGRAPH
+0xE747 0x8E60  #CJK UNIFIED IDEOGRAPH
+0xE748 0x8E2A  #CJK UNIFIED IDEOGRAPH
+0xE749 0x8E63  #CJK UNIFIED IDEOGRAPH
+0xE74A 0x8E55  #CJK UNIFIED IDEOGRAPH
+0xE74B 0x8E76  #CJK UNIFIED IDEOGRAPH
+0xE74C 0x8E72  #CJK UNIFIED IDEOGRAPH
+0xE74D 0x8E7C  #CJK UNIFIED IDEOGRAPH
+0xE74E 0x8E81  #CJK UNIFIED IDEOGRAPH
+0xE74F 0x8E87  #CJK UNIFIED IDEOGRAPH
+0xE750 0x8E85  #CJK UNIFIED IDEOGRAPH
+0xE751 0x8E84  #CJK UNIFIED IDEOGRAPH
+0xE752 0x8E8B  #CJK UNIFIED IDEOGRAPH
+0xE753 0x8E8A  #CJK UNIFIED IDEOGRAPH
+0xE754 0x8E93  #CJK UNIFIED IDEOGRAPH
+0xE755 0x8E91  #CJK UNIFIED IDEOGRAPH
+0xE756 0x8E94  #CJK UNIFIED IDEOGRAPH
+0xE757 0x8E99  #CJK UNIFIED IDEOGRAPH
+0xE758 0x8EAA  #CJK UNIFIED IDEOGRAPH
+0xE759 0x8EA1  #CJK UNIFIED IDEOGRAPH
+0xE75A 0x8EAC  #CJK UNIFIED IDEOGRAPH
+0xE75B 0x8EB0  #CJK UNIFIED IDEOGRAPH
+0xE75C 0x8EC6  #CJK UNIFIED IDEOGRAPH
+0xE75D 0x8EB1  #CJK UNIFIED IDEOGRAPH
+0xE75E 0x8EBE  #CJK UNIFIED IDEOGRAPH
+0xE75F 0x8EC5  #CJK UNIFIED IDEOGRAPH
+0xE760 0x8EC8  #CJK UNIFIED IDEOGRAPH
+0xE761 0x8ECB  #CJK UNIFIED IDEOGRAPH
+0xE762 0x8EDB  #CJK UNIFIED IDEOGRAPH
+0xE763 0x8EE3  #CJK UNIFIED IDEOGRAPH
+0xE764 0x8EFC  #CJK UNIFIED IDEOGRAPH
+0xE765 0x8EFB  #CJK UNIFIED IDEOGRAPH
+0xE766 0x8EEB  #CJK UNIFIED IDEOGRAPH
+0xE767 0x8EFE  #CJK UNIFIED IDEOGRAPH
+0xE768 0x8F0A  #CJK UNIFIED IDEOGRAPH
+0xE769 0x8F05  #CJK UNIFIED IDEOGRAPH
+0xE76A 0x8F15  #CJK UNIFIED IDEOGRAPH
+0xE76B 0x8F12  #CJK UNIFIED IDEOGRAPH
+0xE76C 0x8F19  #CJK UNIFIED IDEOGRAPH
+0xE76D 0x8F13  #CJK UNIFIED IDEOGRAPH
+0xE76E 0x8F1C  #CJK UNIFIED IDEOGRAPH
+0xE76F 0x8F1F  #CJK UNIFIED IDEOGRAPH
+0xE770 0x8F1B  #CJK UNIFIED IDEOGRAPH
+0xE771 0x8F0C  #CJK UNIFIED IDEOGRAPH
+0xE772 0x8F26  #CJK UNIFIED IDEOGRAPH
+0xE773 0x8F33  #CJK UNIFIED IDEOGRAPH
+0xE774 0x8F3B  #CJK UNIFIED IDEOGRAPH
+0xE775 0x8F39  #CJK UNIFIED IDEOGRAPH
+0xE776 0x8F45  #CJK UNIFIED IDEOGRAPH
+0xE777 0x8F42  #CJK UNIFIED IDEOGRAPH
+0xE778 0x8F3E  #CJK UNIFIED IDEOGRAPH
+0xE779 0x8F4C  #CJK UNIFIED IDEOGRAPH
+0xE77A 0x8F49  #CJK UNIFIED IDEOGRAPH
+0xE77B 0x8F46  #CJK UNIFIED IDEOGRAPH
+0xE77C 0x8F4E  #CJK UNIFIED IDEOGRAPH
+0xE77D 0x8F57  #CJK UNIFIED IDEOGRAPH
+0xE77E 0x8F5C  #CJK UNIFIED IDEOGRAPH
+0xE780 0x8F62  #CJK UNIFIED IDEOGRAPH
+0xE781 0x8F63  #CJK UNIFIED IDEOGRAPH
+0xE782 0x8F64  #CJK UNIFIED IDEOGRAPH
+0xE783 0x8F9C  #CJK UNIFIED IDEOGRAPH
+0xE784 0x8F9F  #CJK UNIFIED IDEOGRAPH
+0xE785 0x8FA3  #CJK UNIFIED IDEOGRAPH
+0xE786 0x8FAD  #CJK UNIFIED IDEOGRAPH
+0xE787 0x8FAF  #CJK UNIFIED IDEOGRAPH
+0xE788 0x8FB7  #CJK UNIFIED IDEOGRAPH
+0xE789 0x8FDA  #CJK UNIFIED IDEOGRAPH
+0xE78A 0x8FE5  #CJK UNIFIED IDEOGRAPH
+0xE78B 0x8FE2  #CJK UNIFIED IDEOGRAPH
+0xE78C 0x8FEA  #CJK UNIFIED IDEOGRAPH
+0xE78D 0x8FEF  #CJK UNIFIED IDEOGRAPH
+0xE78E 0x9087  #CJK UNIFIED IDEOGRAPH
+0xE78F 0x8FF4  #CJK UNIFIED IDEOGRAPH
+0xE790 0x9005  #CJK UNIFIED IDEOGRAPH
+0xE791 0x8FF9  #CJK UNIFIED IDEOGRAPH
+0xE792 0x8FFA  #CJK UNIFIED IDEOGRAPH
+0xE793 0x9011  #CJK UNIFIED IDEOGRAPH
+0xE794 0x9015  #CJK UNIFIED IDEOGRAPH
+0xE795 0x9021  #CJK UNIFIED IDEOGRAPH
+0xE796 0x900D  #CJK UNIFIED IDEOGRAPH
+0xE797 0x901E  #CJK UNIFIED IDEOGRAPH
+0xE798 0x9016  #CJK UNIFIED IDEOGRAPH
+0xE799 0x900B  #CJK UNIFIED IDEOGRAPH
+0xE79A 0x9027  #CJK UNIFIED IDEOGRAPH
+0xE79B 0x9036  #CJK UNIFIED IDEOGRAPH
+0xE79C 0x9035  #CJK UNIFIED IDEOGRAPH
+0xE79D 0x9039  #CJK UNIFIED IDEOGRAPH
+0xE79E 0x8FF8  #CJK UNIFIED IDEOGRAPH
+0xE79F 0x904F  #CJK UNIFIED IDEOGRAPH
+0xE7A0 0x9050  #CJK UNIFIED IDEOGRAPH
+0xE7A1 0x9051  #CJK UNIFIED IDEOGRAPH
+0xE7A2 0x9052  #CJK UNIFIED IDEOGRAPH
+0xE7A3 0x900E  #CJK UNIFIED IDEOGRAPH
+0xE7A4 0x9049  #CJK UNIFIED IDEOGRAPH
+0xE7A5 0x903E  #CJK UNIFIED IDEOGRAPH
+0xE7A6 0x9056  #CJK UNIFIED IDEOGRAPH
+0xE7A7 0x9058  #CJK UNIFIED IDEOGRAPH
+0xE7A8 0x905E  #CJK UNIFIED IDEOGRAPH
+0xE7A9 0x9068  #CJK UNIFIED IDEOGRAPH
+0xE7AA 0x906F  #CJK UNIFIED IDEOGRAPH
+0xE7AB 0x9076  #CJK UNIFIED IDEOGRAPH
+0xE7AC 0x96A8  #CJK UNIFIED IDEOGRAPH
+0xE7AD 0x9072  #CJK UNIFIED IDEOGRAPH
+0xE7AE 0x9082  #CJK UNIFIED IDEOGRAPH
+0xE7AF 0x907D  #CJK UNIFIED IDEOGRAPH
+0xE7B0 0x9081  #CJK UNIFIED IDEOGRAPH
+0xE7B1 0x9080  #CJK UNIFIED IDEOGRAPH
+0xE7B2 0x908A  #CJK UNIFIED IDEOGRAPH
+0xE7B3 0x9089  #CJK UNIFIED IDEOGRAPH
+0xE7B4 0x908F  #CJK UNIFIED IDEOGRAPH
+0xE7B5 0x90A8  #CJK UNIFIED IDEOGRAPH
+0xE7B6 0x90AF  #CJK UNIFIED IDEOGRAPH
+0xE7B7 0x90B1  #CJK UNIFIED IDEOGRAPH
+0xE7B8 0x90B5  #CJK UNIFIED IDEOGRAPH
+0xE7B9 0x90E2  #CJK UNIFIED IDEOGRAPH
+0xE7BA 0x90E4  #CJK UNIFIED IDEOGRAPH
+0xE7BB 0x6248  #CJK UNIFIED IDEOGRAPH
+0xE7BC 0x90DB  #CJK UNIFIED IDEOGRAPH
+0xE7BD 0x9102  #CJK UNIFIED IDEOGRAPH
+0xE7BE 0x9112  #CJK UNIFIED IDEOGRAPH
+0xE7BF 0x9119  #CJK UNIFIED IDEOGRAPH
+0xE7C0 0x9132  #CJK UNIFIED IDEOGRAPH
+0xE7C1 0x9130  #CJK UNIFIED IDEOGRAPH
+0xE7C2 0x914A  #CJK UNIFIED IDEOGRAPH
+0xE7C3 0x9156  #CJK UNIFIED IDEOGRAPH
+0xE7C4 0x9158  #CJK UNIFIED IDEOGRAPH
+0xE7C5 0x9163  #CJK UNIFIED IDEOGRAPH
+0xE7C6 0x9165  #CJK UNIFIED IDEOGRAPH
+0xE7C7 0x9169  #CJK UNIFIED IDEOGRAPH
+0xE7C8 0x9173  #CJK UNIFIED IDEOGRAPH
+0xE7C9 0x9172  #CJK UNIFIED IDEOGRAPH
+0xE7CA 0x918B  #CJK UNIFIED IDEOGRAPH
+0xE7CB 0x9189  #CJK UNIFIED IDEOGRAPH
+0xE7CC 0x9182  #CJK UNIFIED IDEOGRAPH
+0xE7CD 0x91A2  #CJK UNIFIED IDEOGRAPH
+0xE7CE 0x91AB  #CJK UNIFIED IDEOGRAPH
+0xE7CF 0x91AF  #CJK UNIFIED IDEOGRAPH
+0xE7D0 0x91AA  #CJK UNIFIED IDEOGRAPH
+0xE7D1 0x91B5  #CJK UNIFIED IDEOGRAPH
+0xE7D2 0x91B4  #CJK UNIFIED IDEOGRAPH
+0xE7D3 0x91BA  #CJK UNIFIED IDEOGRAPH
+0xE7D4 0x91C0  #CJK UNIFIED IDEOGRAPH
+0xE7D5 0x91C1  #CJK UNIFIED IDEOGRAPH
+0xE7D6 0x91C9  #CJK UNIFIED IDEOGRAPH
+0xE7D7 0x91CB  #CJK UNIFIED IDEOGRAPH
+0xE7D8 0x91D0  #CJK UNIFIED IDEOGRAPH
+0xE7D9 0x91D6  #CJK UNIFIED IDEOGRAPH
+0xE7DA 0x91DF  #CJK UNIFIED IDEOGRAPH
+0xE7DB 0x91E1  #CJK UNIFIED IDEOGRAPH
+0xE7DC 0x91DB  #CJK UNIFIED IDEOGRAPH
+0xE7DD 0x91FC  #CJK UNIFIED IDEOGRAPH
+0xE7DE 0x91F5  #CJK UNIFIED IDEOGRAPH
+0xE7DF 0x91F6  #CJK UNIFIED IDEOGRAPH
+0xE7E0 0x921E  #CJK UNIFIED IDEOGRAPH
+0xE7E1 0x91FF  #CJK UNIFIED IDEOGRAPH
+0xE7E2 0x9214  #CJK UNIFIED IDEOGRAPH
+0xE7E3 0x922C  #CJK UNIFIED IDEOGRAPH
+0xE7E4 0x9215  #CJK UNIFIED IDEOGRAPH
+0xE7E5 0x9211  #CJK UNIFIED IDEOGRAPH
+0xE7E6 0x925E  #CJK UNIFIED IDEOGRAPH
+0xE7E7 0x9257  #CJK UNIFIED IDEOGRAPH
+0xE7E8 0x9245  #CJK UNIFIED IDEOGRAPH
+0xE7E9 0x9249  #CJK UNIFIED IDEOGRAPH
+0xE7EA 0x9264  #CJK UNIFIED IDEOGRAPH
+0xE7EB 0x9248  #CJK UNIFIED IDEOGRAPH
+0xE7EC 0x9295  #CJK UNIFIED IDEOGRAPH
+0xE7ED 0x923F  #CJK UNIFIED IDEOGRAPH
+0xE7EE 0x924B  #CJK UNIFIED IDEOGRAPH
+0xE7EF 0x9250  #CJK UNIFIED IDEOGRAPH
+0xE7F0 0x929C  #CJK UNIFIED IDEOGRAPH
+0xE7F1 0x9296  #CJK UNIFIED IDEOGRAPH
+0xE7F2 0x9293  #CJK UNIFIED IDEOGRAPH
+0xE7F3 0x929B  #CJK UNIFIED IDEOGRAPH
+0xE7F4 0x925A  #CJK UNIFIED IDEOGRAPH
+0xE7F5 0x92CF  #CJK UNIFIED IDEOGRAPH
+0xE7F6 0x92B9  #CJK UNIFIED IDEOGRAPH
+0xE7F7 0x92B7  #CJK UNIFIED IDEOGRAPH
+0xE7F8 0x92E9  #CJK UNIFIED IDEOGRAPH
+0xE7F9 0x930F  #CJK UNIFIED IDEOGRAPH
+0xE7FA 0x92FA  #CJK UNIFIED IDEOGRAPH
+0xE7FB 0x9344  #CJK UNIFIED IDEOGRAPH
+0xE7FC 0x932E  #CJK UNIFIED IDEOGRAPH
+0xE840 0x9319  #CJK UNIFIED IDEOGRAPH
+0xE841 0x9322  #CJK UNIFIED IDEOGRAPH
+0xE842 0x931A  #CJK UNIFIED IDEOGRAPH
+0xE843 0x9323  #CJK UNIFIED IDEOGRAPH
+0xE844 0x933A  #CJK UNIFIED IDEOGRAPH
+0xE845 0x9335  #CJK UNIFIED IDEOGRAPH
+0xE846 0x933B  #CJK UNIFIED IDEOGRAPH
+0xE847 0x935C  #CJK UNIFIED IDEOGRAPH
+0xE848 0x9360  #CJK UNIFIED IDEOGRAPH
+0xE849 0x937C  #CJK UNIFIED IDEOGRAPH
+0xE84A 0x936E  #CJK UNIFIED IDEOGRAPH
+0xE84B 0x9356  #CJK UNIFIED IDEOGRAPH
+0xE84C 0x93B0  #CJK UNIFIED IDEOGRAPH
+0xE84D 0x93AC  #CJK UNIFIED IDEOGRAPH
+0xE84E 0x93AD  #CJK UNIFIED IDEOGRAPH
+0xE84F 0x9394  #CJK UNIFIED IDEOGRAPH
+0xE850 0x93B9  #CJK UNIFIED IDEOGRAPH
+0xE851 0x93D6  #CJK UNIFIED IDEOGRAPH
+0xE852 0x93D7  #CJK UNIFIED IDEOGRAPH
+0xE853 0x93E8  #CJK UNIFIED IDEOGRAPH
+0xE854 0x93E5  #CJK UNIFIED IDEOGRAPH
+0xE855 0x93D8  #CJK UNIFIED IDEOGRAPH
+0xE856 0x93C3  #CJK UNIFIED IDEOGRAPH
+0xE857 0x93DD  #CJK UNIFIED IDEOGRAPH
+0xE858 0x93D0  #CJK UNIFIED IDEOGRAPH
+0xE859 0x93C8  #CJK UNIFIED IDEOGRAPH
+0xE85A 0x93E4  #CJK UNIFIED IDEOGRAPH
+0xE85B 0x941A  #CJK UNIFIED IDEOGRAPH
+0xE85C 0x9414  #CJK UNIFIED IDEOGRAPH
+0xE85D 0x9413  #CJK UNIFIED IDEOGRAPH
+0xE85E 0x9403  #CJK UNIFIED IDEOGRAPH
+0xE85F 0x9407  #CJK UNIFIED IDEOGRAPH
+0xE860 0x9410  #CJK UNIFIED IDEOGRAPH
+0xE861 0x9436  #CJK UNIFIED IDEOGRAPH
+0xE862 0x942B  #CJK UNIFIED IDEOGRAPH
+0xE863 0x9435  #CJK UNIFIED IDEOGRAPH
+0xE864 0x9421  #CJK UNIFIED IDEOGRAPH
+0xE865 0x943A  #CJK UNIFIED IDEOGRAPH
+0xE866 0x9441  #CJK UNIFIED IDEOGRAPH
+0xE867 0x9452  #CJK UNIFIED IDEOGRAPH
+0xE868 0x9444  #CJK UNIFIED IDEOGRAPH
+0xE869 0x945B  #CJK UNIFIED IDEOGRAPH
+0xE86A 0x9460  #CJK UNIFIED IDEOGRAPH
+0xE86B 0x9462  #CJK UNIFIED IDEOGRAPH
+0xE86C 0x945E  #CJK UNIFIED IDEOGRAPH
+0xE86D 0x946A  #CJK UNIFIED IDEOGRAPH
+0xE86E 0x9229  #CJK UNIFIED IDEOGRAPH
+0xE86F 0x9470  #CJK UNIFIED IDEOGRAPH
+0xE870 0x9475  #CJK UNIFIED IDEOGRAPH
+0xE871 0x9477  #CJK UNIFIED IDEOGRAPH
+0xE872 0x947D  #CJK UNIFIED IDEOGRAPH
+0xE873 0x945A  #CJK UNIFIED IDEOGRAPH
+0xE874 0x947C  #CJK UNIFIED IDEOGRAPH
+0xE875 0x947E  #CJK UNIFIED IDEOGRAPH
+0xE876 0x9481  #CJK UNIFIED IDEOGRAPH
+0xE877 0x947F  #CJK UNIFIED IDEOGRAPH
+0xE878 0x9582  #CJK UNIFIED IDEOGRAPH
+0xE879 0x9587  #CJK UNIFIED IDEOGRAPH
+0xE87A 0x958A  #CJK UNIFIED IDEOGRAPH
+0xE87B 0x9594  #CJK UNIFIED IDEOGRAPH
+0xE87C 0x9596  #CJK UNIFIED IDEOGRAPH
+0xE87D 0x9598  #CJK UNIFIED IDEOGRAPH
+0xE87E 0x9599  #CJK UNIFIED IDEOGRAPH
+0xE880 0x95A0  #CJK UNIFIED IDEOGRAPH
+0xE881 0x95A8  #CJK UNIFIED IDEOGRAPH
+0xE882 0x95A7  #CJK UNIFIED IDEOGRAPH
+0xE883 0x95AD  #CJK UNIFIED IDEOGRAPH
+0xE884 0x95BC  #CJK UNIFIED IDEOGRAPH
+0xE885 0x95BB  #CJK UNIFIED IDEOGRAPH
+0xE886 0x95B9  #CJK UNIFIED IDEOGRAPH
+0xE887 0x95BE  #CJK UNIFIED IDEOGRAPH
+0xE888 0x95CA  #CJK UNIFIED IDEOGRAPH
+0xE889 0x6FF6  #CJK UNIFIED IDEOGRAPH
+0xE88A 0x95C3  #CJK UNIFIED IDEOGRAPH
+0xE88B 0x95CD  #CJK UNIFIED IDEOGRAPH
+0xE88C 0x95CC  #CJK UNIFIED IDEOGRAPH
+0xE88D 0x95D5  #CJK UNIFIED IDEOGRAPH
+0xE88E 0x95D4  #CJK UNIFIED IDEOGRAPH
+0xE88F 0x95D6  #CJK UNIFIED IDEOGRAPH
+0xE890 0x95DC  #CJK UNIFIED IDEOGRAPH
+0xE891 0x95E1  #CJK UNIFIED IDEOGRAPH
+0xE892 0x95E5  #CJK UNIFIED IDEOGRAPH
+0xE893 0x95E2  #CJK UNIFIED IDEOGRAPH
+0xE894 0x9621  #CJK UNIFIED IDEOGRAPH
+0xE895 0x9628  #CJK UNIFIED IDEOGRAPH
+0xE896 0x962E  #CJK UNIFIED IDEOGRAPH
+0xE897 0x962F  #CJK UNIFIED IDEOGRAPH
+0xE898 0x9642  #CJK UNIFIED IDEOGRAPH
+0xE899 0x964C  #CJK UNIFIED IDEOGRAPH
+0xE89A 0x964F  #CJK UNIFIED IDEOGRAPH
+0xE89B 0x964B  #CJK UNIFIED IDEOGRAPH
+0xE89C 0x9677  #CJK UNIFIED IDEOGRAPH
+0xE89D 0x965C  #CJK UNIFIED IDEOGRAPH
+0xE89E 0x965E  #CJK UNIFIED IDEOGRAPH
+0xE89F 0x965D  #CJK UNIFIED IDEOGRAPH
+0xE8A0 0x965F  #CJK UNIFIED IDEOGRAPH
+0xE8A1 0x9666  #CJK UNIFIED IDEOGRAPH
+0xE8A2 0x9672  #CJK UNIFIED IDEOGRAPH
+0xE8A3 0x966C  #CJK UNIFIED IDEOGRAPH
+0xE8A4 0x968D  #CJK UNIFIED IDEOGRAPH
+0xE8A5 0x9698  #CJK UNIFIED IDEOGRAPH
+0xE8A6 0x9695  #CJK UNIFIED IDEOGRAPH
+0xE8A7 0x9697  #CJK UNIFIED IDEOGRAPH
+0xE8A8 0x96AA  #CJK UNIFIED IDEOGRAPH
+0xE8A9 0x96A7  #CJK UNIFIED IDEOGRAPH
+0xE8AA 0x96B1  #CJK UNIFIED IDEOGRAPH
+0xE8AB 0x96B2  #CJK UNIFIED IDEOGRAPH
+0xE8AC 0x96B0  #CJK UNIFIED IDEOGRAPH
+0xE8AD 0x96B4  #CJK UNIFIED IDEOGRAPH
+0xE8AE 0x96B6  #CJK UNIFIED IDEOGRAPH
+0xE8AF 0x96B8  #CJK UNIFIED IDEOGRAPH
+0xE8B0 0x96B9  #CJK UNIFIED IDEOGRAPH
+0xE8B1 0x96CE  #CJK UNIFIED IDEOGRAPH
+0xE8B2 0x96CB  #CJK UNIFIED IDEOGRAPH
+0xE8B3 0x96C9  #CJK UNIFIED IDEOGRAPH
+0xE8B4 0x96CD  #CJK UNIFIED IDEOGRAPH
+0xE8B5 0x894D  #CJK UNIFIED IDEOGRAPH
+0xE8B6 0x96DC  #CJK UNIFIED IDEOGRAPH
+0xE8B7 0x970D  #CJK UNIFIED IDEOGRAPH
+0xE8B8 0x96D5  #CJK UNIFIED IDEOGRAPH
+0xE8B9 0x96F9  #CJK UNIFIED IDEOGRAPH
+0xE8BA 0x9704  #CJK UNIFIED IDEOGRAPH
+0xE8BB 0x9706  #CJK UNIFIED IDEOGRAPH
+0xE8BC 0x9708  #CJK UNIFIED IDEOGRAPH
+0xE8BD 0x9713  #CJK UNIFIED IDEOGRAPH
+0xE8BE 0x970E  #CJK UNIFIED IDEOGRAPH
+0xE8BF 0x9711  #CJK UNIFIED IDEOGRAPH
+0xE8C0 0x970F  #CJK UNIFIED IDEOGRAPH
+0xE8C1 0x9716  #CJK UNIFIED IDEOGRAPH
+0xE8C2 0x9719  #CJK UNIFIED IDEOGRAPH
+0xE8C3 0x9724  #CJK UNIFIED IDEOGRAPH
+0xE8C4 0x972A  #CJK UNIFIED IDEOGRAPH
+0xE8C5 0x9730  #CJK UNIFIED IDEOGRAPH
+0xE8C6 0x9739  #CJK UNIFIED IDEOGRAPH
+0xE8C7 0x973D  #CJK UNIFIED IDEOGRAPH
+0xE8C8 0x973E  #CJK UNIFIED IDEOGRAPH
+0xE8C9 0x9744  #CJK UNIFIED IDEOGRAPH
+0xE8CA 0x9746  #CJK UNIFIED IDEOGRAPH
+0xE8CB 0x9748  #CJK UNIFIED IDEOGRAPH
+0xE8CC 0x9742  #CJK UNIFIED IDEOGRAPH
+0xE8CD 0x9749  #CJK UNIFIED IDEOGRAPH
+0xE8CE 0x975C  #CJK UNIFIED IDEOGRAPH
+0xE8CF 0x9760  #CJK UNIFIED IDEOGRAPH
+0xE8D0 0x9764  #CJK UNIFIED IDEOGRAPH
+0xE8D1 0x9766  #CJK UNIFIED IDEOGRAPH
+0xE8D2 0x9768  #CJK UNIFIED IDEOGRAPH
+0xE8D3 0x52D2  #CJK UNIFIED IDEOGRAPH
+0xE8D4 0x976B  #CJK UNIFIED IDEOGRAPH
+0xE8D5 0x9771  #CJK UNIFIED IDEOGRAPH
+0xE8D6 0x9779  #CJK UNIFIED IDEOGRAPH
+0xE8D7 0x9785  #CJK UNIFIED IDEOGRAPH
+0xE8D8 0x977C  #CJK UNIFIED IDEOGRAPH
+0xE8D9 0x9781  #CJK UNIFIED IDEOGRAPH
+0xE8DA 0x977A  #CJK UNIFIED IDEOGRAPH
+0xE8DB 0x9786  #CJK UNIFIED IDEOGRAPH
+0xE8DC 0x978B  #CJK UNIFIED IDEOGRAPH
+0xE8DD 0x978F  #CJK UNIFIED IDEOGRAPH
+0xE8DE 0x9790  #CJK UNIFIED IDEOGRAPH
+0xE8DF 0x979C  #CJK UNIFIED IDEOGRAPH
+0xE8E0 0x97A8  #CJK UNIFIED IDEOGRAPH
+0xE8E1 0x97A6  #CJK UNIFIED IDEOGRAPH
+0xE8E2 0x97A3  #CJK UNIFIED IDEOGRAPH
+0xE8E3 0x97B3  #CJK UNIFIED IDEOGRAPH
+0xE8E4 0x97B4  #CJK UNIFIED IDEOGRAPH
+0xE8E5 0x97C3  #CJK UNIFIED IDEOGRAPH
+0xE8E6 0x97C6  #CJK UNIFIED IDEOGRAPH
+0xE8E7 0x97C8  #CJK UNIFIED IDEOGRAPH
+0xE8E8 0x97CB  #CJK UNIFIED IDEOGRAPH
+0xE8E9 0x97DC  #CJK UNIFIED IDEOGRAPH
+0xE8EA 0x97ED  #CJK UNIFIED IDEOGRAPH
+0xE8EB 0x9F4F  #CJK UNIFIED IDEOGRAPH
+0xE8EC 0x97F2  #CJK UNIFIED IDEOGRAPH
+0xE8ED 0x7ADF  #CJK UNIFIED IDEOGRAPH
+0xE8EE 0x97F6  #CJK UNIFIED IDEOGRAPH
+0xE8EF 0x97F5  #CJK UNIFIED IDEOGRAPH
+0xE8F0 0x980F  #CJK UNIFIED IDEOGRAPH
+0xE8F1 0x980C  #CJK UNIFIED IDEOGRAPH
+0xE8F2 0x9838  #CJK UNIFIED IDEOGRAPH
+0xE8F3 0x9824  #CJK UNIFIED IDEOGRAPH
+0xE8F4 0x9821  #CJK UNIFIED IDEOGRAPH
+0xE8F5 0x9837  #CJK UNIFIED IDEOGRAPH
+0xE8F6 0x983D  #CJK UNIFIED IDEOGRAPH
+0xE8F7 0x9846  #CJK UNIFIED IDEOGRAPH
+0xE8F8 0x984F  #CJK UNIFIED IDEOGRAPH
+0xE8F9 0x984B  #CJK UNIFIED IDEOGRAPH
+0xE8FA 0x986B  #CJK UNIFIED IDEOGRAPH
+0xE8FB 0x986F  #CJK UNIFIED IDEOGRAPH
+0xE8FC 0x9870  #CJK UNIFIED IDEOGRAPH
+0xE940 0x9871  #CJK UNIFIED IDEOGRAPH
+0xE941 0x9874  #CJK UNIFIED IDEOGRAPH
+0xE942 0x9873  #CJK UNIFIED IDEOGRAPH
+0xE943 0x98AA  #CJK UNIFIED IDEOGRAPH
+0xE944 0x98AF  #CJK UNIFIED IDEOGRAPH
+0xE945 0x98B1  #CJK UNIFIED IDEOGRAPH
+0xE946 0x98B6  #CJK UNIFIED IDEOGRAPH
+0xE947 0x98C4  #CJK UNIFIED IDEOGRAPH
+0xE948 0x98C3  #CJK UNIFIED IDEOGRAPH
+0xE949 0x98C6  #CJK UNIFIED IDEOGRAPH
+0xE94A 0x98E9  #CJK UNIFIED IDEOGRAPH
+0xE94B 0x98EB  #CJK UNIFIED IDEOGRAPH
+0xE94C 0x9903  #CJK UNIFIED IDEOGRAPH
+0xE94D 0x9909  #CJK UNIFIED IDEOGRAPH
+0xE94E 0x9912  #CJK UNIFIED IDEOGRAPH
+0xE94F 0x9914  #CJK UNIFIED IDEOGRAPH
+0xE950 0x9918  #CJK UNIFIED IDEOGRAPH
+0xE951 0x9921  #CJK UNIFIED IDEOGRAPH
+0xE952 0x991D  #CJK UNIFIED IDEOGRAPH
+0xE953 0x991E  #CJK UNIFIED IDEOGRAPH
+0xE954 0x9924  #CJK UNIFIED IDEOGRAPH
+0xE955 0x9920  #CJK UNIFIED IDEOGRAPH
+0xE956 0x992C  #CJK UNIFIED IDEOGRAPH
+0xE957 0x992E  #CJK UNIFIED IDEOGRAPH
+0xE958 0x993D  #CJK UNIFIED IDEOGRAPH
+0xE959 0x993E  #CJK UNIFIED IDEOGRAPH
+0xE95A 0x9942  #CJK UNIFIED IDEOGRAPH
+0xE95B 0x9949  #CJK UNIFIED IDEOGRAPH
+0xE95C 0x9945  #CJK UNIFIED IDEOGRAPH
+0xE95D 0x9950  #CJK UNIFIED IDEOGRAPH
+0xE95E 0x994B  #CJK UNIFIED IDEOGRAPH
+0xE95F 0x9951  #CJK UNIFIED IDEOGRAPH
+0xE960 0x9952  #CJK UNIFIED IDEOGRAPH
+0xE961 0x994C  #CJK UNIFIED IDEOGRAPH
+0xE962 0x9955  #CJK UNIFIED IDEOGRAPH
+0xE963 0x9997  #CJK UNIFIED IDEOGRAPH
+0xE964 0x9998  #CJK UNIFIED IDEOGRAPH
+0xE965 0x99A5  #CJK UNIFIED IDEOGRAPH
+0xE966 0x99AD  #CJK UNIFIED IDEOGRAPH
+0xE967 0x99AE  #CJK UNIFIED IDEOGRAPH
+0xE968 0x99BC  #CJK UNIFIED IDEOGRAPH
+0xE969 0x99DF  #CJK UNIFIED IDEOGRAPH
+0xE96A 0x99DB  #CJK UNIFIED IDEOGRAPH
+0xE96B 0x99DD  #CJK UNIFIED IDEOGRAPH
+0xE96C 0x99D8  #CJK UNIFIED IDEOGRAPH
+0xE96D 0x99D1  #CJK UNIFIED IDEOGRAPH
+0xE96E 0x99ED  #CJK UNIFIED IDEOGRAPH
+0xE96F 0x99EE  #CJK UNIFIED IDEOGRAPH
+0xE970 0x99F1  #CJK UNIFIED IDEOGRAPH
+0xE971 0x99F2  #CJK UNIFIED IDEOGRAPH
+0xE972 0x99FB  #CJK UNIFIED IDEOGRAPH
+0xE973 0x99F8  #CJK UNIFIED IDEOGRAPH
+0xE974 0x9A01  #CJK UNIFIED IDEOGRAPH
+0xE975 0x9A0F  #CJK UNIFIED IDEOGRAPH
+0xE976 0x9A05  #CJK UNIFIED IDEOGRAPH
+0xE977 0x99E2  #CJK UNIFIED IDEOGRAPH
+0xE978 0x9A19  #CJK UNIFIED IDEOGRAPH
+0xE979 0x9A2B  #CJK UNIFIED IDEOGRAPH
+0xE97A 0x9A37  #CJK UNIFIED IDEOGRAPH
+0xE97B 0x9A45  #CJK UNIFIED IDEOGRAPH
+0xE97C 0x9A42  #CJK UNIFIED IDEOGRAPH
+0xE97D 0x9A40  #CJK UNIFIED IDEOGRAPH
+0xE97E 0x9A43  #CJK UNIFIED IDEOGRAPH
+0xE980 0x9A3E  #CJK UNIFIED IDEOGRAPH
+0xE981 0x9A55  #CJK UNIFIED IDEOGRAPH
+0xE982 0x9A4D  #CJK UNIFIED IDEOGRAPH
+0xE983 0x9A5B  #CJK UNIFIED IDEOGRAPH
+0xE984 0x9A57  #CJK UNIFIED IDEOGRAPH
+0xE985 0x9A5F  #CJK UNIFIED IDEOGRAPH
+0xE986 0x9A62  #CJK UNIFIED IDEOGRAPH
+0xE987 0x9A65  #CJK UNIFIED IDEOGRAPH
+0xE988 0x9A64  #CJK UNIFIED IDEOGRAPH
+0xE989 0x9A69  #CJK UNIFIED IDEOGRAPH
+0xE98A 0x9A6B  #CJK UNIFIED IDEOGRAPH
+0xE98B 0x9A6A  #CJK UNIFIED IDEOGRAPH
+0xE98C 0x9AAD  #CJK UNIFIED IDEOGRAPH
+0xE98D 0x9AB0  #CJK UNIFIED IDEOGRAPH
+0xE98E 0x9ABC  #CJK UNIFIED IDEOGRAPH
+0xE98F 0x9AC0  #CJK UNIFIED IDEOGRAPH
+0xE990 0x9ACF  #CJK UNIFIED IDEOGRAPH
+0xE991 0x9AD1  #CJK UNIFIED IDEOGRAPH
+0xE992 0x9AD3  #CJK UNIFIED IDEOGRAPH
+0xE993 0x9AD4  #CJK UNIFIED IDEOGRAPH
+0xE994 0x9ADE  #CJK UNIFIED IDEOGRAPH
+0xE995 0x9ADF  #CJK UNIFIED IDEOGRAPH
+0xE996 0x9AE2  #CJK UNIFIED IDEOGRAPH
+0xE997 0x9AE3  #CJK UNIFIED IDEOGRAPH
+0xE998 0x9AE6  #CJK UNIFIED IDEOGRAPH
+0xE999 0x9AEF  #CJK UNIFIED IDEOGRAPH
+0xE99A 0x9AEB  #CJK UNIFIED IDEOGRAPH
+0xE99B 0x9AEE  #CJK UNIFIED IDEOGRAPH
+0xE99C 0x9AF4  #CJK UNIFIED IDEOGRAPH
+0xE99D 0x9AF1  #CJK UNIFIED IDEOGRAPH
+0xE99E 0x9AF7  #CJK UNIFIED IDEOGRAPH
+0xE99F 0x9AFB  #CJK UNIFIED IDEOGRAPH
+0xE9A0 0x9B06  #CJK UNIFIED IDEOGRAPH
+0xE9A1 0x9B18  #CJK UNIFIED IDEOGRAPH
+0xE9A2 0x9B1A  #CJK UNIFIED IDEOGRAPH
+0xE9A3 0x9B1F  #CJK UNIFIED IDEOGRAPH
+0xE9A4 0x9B22  #CJK UNIFIED IDEOGRAPH
+0xE9A5 0x9B23  #CJK UNIFIED IDEOGRAPH
+0xE9A6 0x9B25  #CJK UNIFIED IDEOGRAPH
+0xE9A7 0x9B27  #CJK UNIFIED IDEOGRAPH
+0xE9A8 0x9B28  #CJK UNIFIED IDEOGRAPH
+0xE9A9 0x9B29  #CJK UNIFIED IDEOGRAPH
+0xE9AA 0x9B2A  #CJK UNIFIED IDEOGRAPH
+0xE9AB 0x9B2E  #CJK UNIFIED IDEOGRAPH
+0xE9AC 0x9B2F  #CJK UNIFIED IDEOGRAPH
+0xE9AD 0x9B32  #CJK UNIFIED IDEOGRAPH
+0xE9AE 0x9B44  #CJK UNIFIED IDEOGRAPH
+0xE9AF 0x9B43  #CJK UNIFIED IDEOGRAPH
+0xE9B0 0x9B4F  #CJK UNIFIED IDEOGRAPH
+0xE9B1 0x9B4D  #CJK UNIFIED IDEOGRAPH
+0xE9B2 0x9B4E  #CJK UNIFIED IDEOGRAPH
+0xE9B3 0x9B51  #CJK UNIFIED IDEOGRAPH
+0xE9B4 0x9B58  #CJK UNIFIED IDEOGRAPH
+0xE9B5 0x9B74  #CJK UNIFIED IDEOGRAPH
+0xE9B6 0x9B93  #CJK UNIFIED IDEOGRAPH
+0xE9B7 0x9B83  #CJK UNIFIED IDEOGRAPH
+0xE9B8 0x9B91  #CJK UNIFIED IDEOGRAPH
+0xE9B9 0x9B96  #CJK UNIFIED IDEOGRAPH
+0xE9BA 0x9B97  #CJK UNIFIED IDEOGRAPH
+0xE9BB 0x9B9F  #CJK UNIFIED IDEOGRAPH
+0xE9BC 0x9BA0  #CJK UNIFIED IDEOGRAPH
+0xE9BD 0x9BA8  #CJK UNIFIED IDEOGRAPH
+0xE9BE 0x9BB4  #CJK UNIFIED IDEOGRAPH
+0xE9BF 0x9BC0  #CJK UNIFIED IDEOGRAPH
+0xE9C0 0x9BCA  #CJK UNIFIED IDEOGRAPH
+0xE9C1 0x9BB9  #CJK UNIFIED IDEOGRAPH
+0xE9C2 0x9BC6  #CJK UNIFIED IDEOGRAPH
+0xE9C3 0x9BCF  #CJK UNIFIED IDEOGRAPH
+0xE9C4 0x9BD1  #CJK UNIFIED IDEOGRAPH
+0xE9C5 0x9BD2  #CJK UNIFIED IDEOGRAPH
+0xE9C6 0x9BE3  #CJK UNIFIED IDEOGRAPH
+0xE9C7 0x9BE2  #CJK UNIFIED IDEOGRAPH
+0xE9C8 0x9BE4  #CJK UNIFIED IDEOGRAPH
+0xE9C9 0x9BD4  #CJK UNIFIED IDEOGRAPH
+0xE9CA 0x9BE1  #CJK UNIFIED IDEOGRAPH
+0xE9CB 0x9C3A  #CJK UNIFIED IDEOGRAPH
+0xE9CC 0x9BF2  #CJK UNIFIED IDEOGRAPH
+0xE9CD 0x9BF1  #CJK UNIFIED IDEOGRAPH
+0xE9CE 0x9BF0  #CJK UNIFIED IDEOGRAPH
+0xE9CF 0x9C15  #CJK UNIFIED IDEOGRAPH
+0xE9D0 0x9C14  #CJK UNIFIED IDEOGRAPH
+0xE9D1 0x9C09  #CJK UNIFIED IDEOGRAPH
+0xE9D2 0x9C13  #CJK UNIFIED IDEOGRAPH
+0xE9D3 0x9C0C  #CJK UNIFIED IDEOGRAPH
+0xE9D4 0x9C06  #CJK UNIFIED IDEOGRAPH
+0xE9D5 0x9C08  #CJK UNIFIED IDEOGRAPH
+0xE9D6 0x9C12  #CJK UNIFIED IDEOGRAPH
+0xE9D7 0x9C0A  #CJK UNIFIED IDEOGRAPH
+0xE9D8 0x9C04  #CJK UNIFIED IDEOGRAPH
+0xE9D9 0x9C2E  #CJK UNIFIED IDEOGRAPH
+0xE9DA 0x9C1B  #CJK UNIFIED IDEOGRAPH
+0xE9DB 0x9C25  #CJK UNIFIED IDEOGRAPH
+0xE9DC 0x9C24  #CJK UNIFIED IDEOGRAPH
+0xE9DD 0x9C21  #CJK UNIFIED IDEOGRAPH
+0xE9DE 0x9C30  #CJK UNIFIED IDEOGRAPH
+0xE9DF 0x9C47  #CJK UNIFIED IDEOGRAPH
+0xE9E0 0x9C32  #CJK UNIFIED IDEOGRAPH
+0xE9E1 0x9C46  #CJK UNIFIED IDEOGRAPH
+0xE9E2 0x9C3E  #CJK UNIFIED IDEOGRAPH
+0xE9E3 0x9C5A  #CJK UNIFIED IDEOGRAPH
+0xE9E4 0x9C60  #CJK UNIFIED IDEOGRAPH
+0xE9E5 0x9C67  #CJK UNIFIED IDEOGRAPH
+0xE9E6 0x9C76  #CJK UNIFIED IDEOGRAPH
+0xE9E7 0x9C78  #CJK UNIFIED IDEOGRAPH
+0xE9E8 0x9CE7  #CJK UNIFIED IDEOGRAPH
+0xE9E9 0x9CEC  #CJK UNIFIED IDEOGRAPH
+0xE9EA 0x9CF0  #CJK UNIFIED IDEOGRAPH
+0xE9EB 0x9D09  #CJK UNIFIED IDEOGRAPH
+0xE9EC 0x9D08  #CJK UNIFIED IDEOGRAPH
+0xE9ED 0x9CEB  #CJK UNIFIED IDEOGRAPH
+0xE9EE 0x9D03  #CJK UNIFIED IDEOGRAPH
+0xE9EF 0x9D06  #CJK UNIFIED IDEOGRAPH
+0xE9F0 0x9D2A  #CJK UNIFIED IDEOGRAPH
+0xE9F1 0x9D26  #CJK UNIFIED IDEOGRAPH
+0xE9F2 0x9DAF  #CJK UNIFIED IDEOGRAPH
+0xE9F3 0x9D23  #CJK UNIFIED IDEOGRAPH
+0xE9F4 0x9D1F  #CJK UNIFIED IDEOGRAPH
+0xE9F5 0x9D44  #CJK UNIFIED IDEOGRAPH
+0xE9F6 0x9D15  #CJK UNIFIED IDEOGRAPH
+0xE9F7 0x9D12  #CJK UNIFIED IDEOGRAPH
+0xE9F8 0x9D41  #CJK UNIFIED IDEOGRAPH
+0xE9F9 0x9D3F  #CJK UNIFIED IDEOGRAPH
+0xE9FA 0x9D3E  #CJK UNIFIED IDEOGRAPH
+0xE9FB 0x9D46  #CJK UNIFIED IDEOGRAPH
+0xE9FC 0x9D48  #CJK UNIFIED IDEOGRAPH
+0xEA40 0x9D5D  #CJK UNIFIED IDEOGRAPH
+0xEA41 0x9D5E  #CJK UNIFIED IDEOGRAPH
+0xEA42 0x9D64  #CJK UNIFIED IDEOGRAPH
+0xEA43 0x9D51  #CJK UNIFIED IDEOGRAPH
+0xEA44 0x9D50  #CJK UNIFIED IDEOGRAPH
+0xEA45 0x9D59  #CJK UNIFIED IDEOGRAPH
+0xEA46 0x9D72  #CJK UNIFIED IDEOGRAPH
+0xEA47 0x9D89  #CJK UNIFIED IDEOGRAPH
+0xEA48 0x9D87  #CJK UNIFIED IDEOGRAPH
+0xEA49 0x9DAB  #CJK UNIFIED IDEOGRAPH
+0xEA4A 0x9D6F  #CJK UNIFIED IDEOGRAPH
+0xEA4B 0x9D7A  #CJK UNIFIED IDEOGRAPH
+0xEA4C 0x9D9A  #CJK UNIFIED IDEOGRAPH
+0xEA4D 0x9DA4  #CJK UNIFIED IDEOGRAPH
+0xEA4E 0x9DA9  #CJK UNIFIED IDEOGRAPH
+0xEA4F 0x9DB2  #CJK UNIFIED IDEOGRAPH
+0xEA50 0x9DC4  #CJK UNIFIED IDEOGRAPH
+0xEA51 0x9DC1  #CJK UNIFIED IDEOGRAPH
+0xEA52 0x9DBB  #CJK UNIFIED IDEOGRAPH
+0xEA53 0x9DB8  #CJK UNIFIED IDEOGRAPH
+0xEA54 0x9DBA  #CJK UNIFIED IDEOGRAPH
+0xEA55 0x9DC6  #CJK UNIFIED IDEOGRAPH
+0xEA56 0x9DCF  #CJK UNIFIED IDEOGRAPH
+0xEA57 0x9DC2  #CJK UNIFIED IDEOGRAPH
+0xEA58 0x9DD9  #CJK UNIFIED IDEOGRAPH
+0xEA59 0x9DD3  #CJK UNIFIED IDEOGRAPH
+0xEA5A 0x9DF8  #CJK UNIFIED IDEOGRAPH
+0xEA5B 0x9DE6  #CJK UNIFIED IDEOGRAPH
+0xEA5C 0x9DED  #CJK UNIFIED IDEOGRAPH
+0xEA5D 0x9DEF  #CJK UNIFIED IDEOGRAPH
+0xEA5E 0x9DFD  #CJK UNIFIED IDEOGRAPH
+0xEA5F 0x9E1A  #CJK UNIFIED IDEOGRAPH
+0xEA60 0x9E1B  #CJK UNIFIED IDEOGRAPH
+0xEA61 0x9E1E  #CJK UNIFIED IDEOGRAPH
+0xEA62 0x9E75  #CJK UNIFIED IDEOGRAPH
+0xEA63 0x9E79  #CJK UNIFIED IDEOGRAPH
+0xEA64 0x9E7D  #CJK UNIFIED IDEOGRAPH
+0xEA65 0x9E81  #CJK UNIFIED IDEOGRAPH
+0xEA66 0x9E88  #CJK UNIFIED IDEOGRAPH
+0xEA67 0x9E8B  #CJK UNIFIED IDEOGRAPH
+0xEA68 0x9E8C  #CJK UNIFIED IDEOGRAPH
+0xEA69 0x9E92  #CJK UNIFIED IDEOGRAPH
+0xEA6A 0x9E95  #CJK UNIFIED IDEOGRAPH
+0xEA6B 0x9E91  #CJK UNIFIED IDEOGRAPH
+0xEA6C 0x9E9D  #CJK UNIFIED IDEOGRAPH
+0xEA6D 0x9EA5  #CJK UNIFIED IDEOGRAPH
+0xEA6E 0x9EA9  #CJK UNIFIED IDEOGRAPH
+0xEA6F 0x9EB8  #CJK UNIFIED IDEOGRAPH
+0xEA70 0x9EAA  #CJK UNIFIED IDEOGRAPH
+0xEA71 0x9EAD  #CJK UNIFIED IDEOGRAPH
+0xEA72 0x9761  #CJK UNIFIED IDEOGRAPH
+0xEA73 0x9ECC  #CJK UNIFIED IDEOGRAPH
+0xEA74 0x9ECE  #CJK UNIFIED IDEOGRAPH
+0xEA75 0x9ECF  #CJK UNIFIED IDEOGRAPH
+0xEA76 0x9ED0  #CJK UNIFIED IDEOGRAPH
+0xEA77 0x9ED4  #CJK UNIFIED IDEOGRAPH
+0xEA78 0x9EDC  #CJK UNIFIED IDEOGRAPH
+0xEA79 0x9EDE  #CJK UNIFIED IDEOGRAPH
+0xEA7A 0x9EDD  #CJK UNIFIED IDEOGRAPH
+0xEA7B 0x9EE0  #CJK UNIFIED IDEOGRAPH
+0xEA7C 0x9EE5  #CJK UNIFIED IDEOGRAPH
+0xEA7D 0x9EE8  #CJK UNIFIED IDEOGRAPH
+0xEA7E 0x9EEF  #CJK UNIFIED IDEOGRAPH
+0xEA80 0x9EF4  #CJK UNIFIED IDEOGRAPH
+0xEA81 0x9EF6  #CJK UNIFIED IDEOGRAPH
+0xEA82 0x9EF7  #CJK UNIFIED IDEOGRAPH
+0xEA83 0x9EF9  #CJK UNIFIED IDEOGRAPH
+0xEA84 0x9EFB  #CJK UNIFIED IDEOGRAPH
+0xEA85 0x9EFC  #CJK UNIFIED IDEOGRAPH
+0xEA86 0x9EFD  #CJK UNIFIED IDEOGRAPH
+0xEA87 0x9F07  #CJK UNIFIED IDEOGRAPH
+0xEA88 0x9F08  #CJK UNIFIED IDEOGRAPH
+0xEA89 0x76B7  #CJK UNIFIED IDEOGRAPH
+0xEA8A 0x9F15  #CJK UNIFIED IDEOGRAPH
+0xEA8B 0x9F21  #CJK UNIFIED IDEOGRAPH
+0xEA8C 0x9F2C  #CJK UNIFIED IDEOGRAPH
+0xEA8D 0x9F3E  #CJK UNIFIED IDEOGRAPH
+0xEA8E 0x9F4A  #CJK UNIFIED IDEOGRAPH
+0xEA8F 0x9F52  #CJK UNIFIED IDEOGRAPH
+0xEA90 0x9F54  #CJK UNIFIED IDEOGRAPH
+0xEA91 0x9F63  #CJK UNIFIED IDEOGRAPH
+0xEA92 0x9F5F  #CJK UNIFIED IDEOGRAPH
+0xEA93 0x9F60  #CJK UNIFIED IDEOGRAPH
+0xEA94 0x9F61  #CJK UNIFIED IDEOGRAPH
+0xEA95 0x9F66  #CJK UNIFIED IDEOGRAPH
+0xEA96 0x9F67  #CJK UNIFIED IDEOGRAPH
+0xEA97 0x9F6C  #CJK UNIFIED IDEOGRAPH
+0xEA98 0x9F6A  #CJK UNIFIED IDEOGRAPH
+0xEA99 0x9F77  #CJK UNIFIED IDEOGRAPH
+0xEA9A 0x9F72  #CJK UNIFIED IDEOGRAPH
+0xEA9B 0x9F76  #CJK UNIFIED IDEOGRAPH
+0xEA9C 0x9F95  #CJK UNIFIED IDEOGRAPH
+0xEA9D 0x9F9C  #CJK UNIFIED IDEOGRAPH
+0xEA9E 0x9FA0  #CJK UNIFIED IDEOGRAPH
+0xEA9F 0x582F  #CJK UNIFIED IDEOGRAPH
+0xEAA0 0x69C7  #CJK UNIFIED IDEOGRAPH
+0xEAA1 0x9059  #CJK UNIFIED IDEOGRAPH
+0xEAA2 0x7464  #CJK UNIFIED IDEOGRAPH
+0xEAA3 0x51DC  #CJK UNIFIED IDEOGRAPH
+0xEAA4 0x7199  #CJK UNIFIED IDEOGRAPH
+0xED40 0x7E8A  #CJK UNIFIED IDEOGRAPH
+0xED41 0x891C  #CJK UNIFIED IDEOGRAPH
+0xED42 0x9348  #CJK UNIFIED IDEOGRAPH
+0xED43 0x9288  #CJK UNIFIED IDEOGRAPH
+0xED44 0x84DC  #CJK UNIFIED IDEOGRAPH
+0xED45 0x4FC9  #CJK UNIFIED IDEOGRAPH
+0xED46 0x70BB  #CJK UNIFIED IDEOGRAPH
+0xED47 0x6631  #CJK UNIFIED IDEOGRAPH
+0xED48 0x68C8  #CJK UNIFIED IDEOGRAPH
+0xED49 0x92F9  #CJK UNIFIED IDEOGRAPH
+0xED4A 0x66FB  #CJK UNIFIED IDEOGRAPH
+0xED4B 0x5F45  #CJK UNIFIED IDEOGRAPH
+0xED4C 0x4E28  #CJK UNIFIED IDEOGRAPH
+0xED4D 0x4EE1  #CJK UNIFIED IDEOGRAPH
+0xED4E 0x4EFC  #CJK UNIFIED IDEOGRAPH
+0xED4F 0x4F00  #CJK UNIFIED IDEOGRAPH
+0xED50 0x4F03  #CJK UNIFIED IDEOGRAPH
+0xED51 0x4F39  #CJK UNIFIED IDEOGRAPH
+0xED52 0x4F56  #CJK UNIFIED IDEOGRAPH
+0xED53 0x4F92  #CJK UNIFIED IDEOGRAPH
+0xED54 0x4F8A  #CJK UNIFIED IDEOGRAPH
+0xED55 0x4F9A  #CJK UNIFIED IDEOGRAPH
+0xED56 0x4F94  #CJK UNIFIED IDEOGRAPH
+0xED57 0x4FCD  #CJK UNIFIED IDEOGRAPH
+0xED58 0x5040  #CJK UNIFIED IDEOGRAPH
+0xED59 0x5022  #CJK UNIFIED IDEOGRAPH
+0xED5A 0x4FFF  #CJK UNIFIED IDEOGRAPH
+0xED5B 0x501E  #CJK UNIFIED IDEOGRAPH
+0xED5C 0x5046  #CJK UNIFIED IDEOGRAPH
+0xED5D 0x5070  #CJK UNIFIED IDEOGRAPH
+0xED5E 0x5042  #CJK UNIFIED IDEOGRAPH
+0xED5F 0x5094  #CJK UNIFIED IDEOGRAPH
+0xED60 0x50F4  #CJK UNIFIED IDEOGRAPH
+0xED61 0x50D8  #CJK UNIFIED IDEOGRAPH
+0xED62 0x514A  #CJK UNIFIED IDEOGRAPH
+0xED63 0x5164  #CJK UNIFIED IDEOGRAPH
+0xED64 0x519D  #CJK UNIFIED IDEOGRAPH
+0xED65 0x51BE  #CJK UNIFIED IDEOGRAPH
+0xED66 0x51EC  #CJK UNIFIED IDEOGRAPH
+0xED67 0x5215  #CJK UNIFIED IDEOGRAPH
+0xED68 0x529C  #CJK UNIFIED IDEOGRAPH
+0xED69 0x52A6  #CJK UNIFIED IDEOGRAPH
+0xED6A 0x52C0  #CJK UNIFIED IDEOGRAPH
+0xED6B 0x52DB  #CJK UNIFIED IDEOGRAPH
+0xED6C 0x5300  #CJK UNIFIED IDEOGRAPH
+0xED6D 0x5307  #CJK UNIFIED IDEOGRAPH
+0xED6E 0x5324  #CJK UNIFIED IDEOGRAPH
+0xED6F 0x5372  #CJK UNIFIED IDEOGRAPH
+0xED70 0x5393  #CJK UNIFIED IDEOGRAPH
+0xED71 0x53B2  #CJK UNIFIED IDEOGRAPH
+0xED72 0x53DD  #CJK UNIFIED IDEOGRAPH
+0xED73 0xFA0E  #CJK COMPATIBILITY IDEOGRAPH
+0xED74 0x549C  #CJK UNIFIED IDEOGRAPH
+0xED75 0x548A  #CJK UNIFIED IDEOGRAPH
+0xED76 0x54A9  #CJK UNIFIED IDEOGRAPH
+0xED77 0x54FF  #CJK UNIFIED IDEOGRAPH
+0xED78 0x5586  #CJK UNIFIED IDEOGRAPH
+0xED79 0x5759  #CJK UNIFIED IDEOGRAPH
+0xED7A 0x5765  #CJK UNIFIED IDEOGRAPH
+0xED7B 0x57AC  #CJK UNIFIED IDEOGRAPH
+0xED7C 0x57C8  #CJK UNIFIED IDEOGRAPH
+0xED7D 0x57C7  #CJK UNIFIED IDEOGRAPH
+0xED7E 0xFA0F  #CJK COMPATIBILITY IDEOGRAPH
+0xED80 0xFA10  #CJK COMPATIBILITY IDEOGRAPH
+0xED81 0x589E  #CJK UNIFIED IDEOGRAPH
+0xED82 0x58B2  #CJK UNIFIED IDEOGRAPH
+0xED83 0x590B  #CJK UNIFIED IDEOGRAPH
+0xED84 0x5953  #CJK UNIFIED IDEOGRAPH
+0xED85 0x595B  #CJK UNIFIED IDEOGRAPH
+0xED86 0x595D  #CJK UNIFIED IDEOGRAPH
+0xED87 0x5963  #CJK UNIFIED IDEOGRAPH
+0xED88 0x59A4  #CJK UNIFIED IDEOGRAPH
+0xED89 0x59BA  #CJK UNIFIED IDEOGRAPH
+0xED8A 0x5B56  #CJK UNIFIED IDEOGRAPH
+0xED8B 0x5BC0  #CJK UNIFIED IDEOGRAPH
+0xED8C 0x752F  #CJK UNIFIED IDEOGRAPH
+0xED8D 0x5BD8  #CJK UNIFIED IDEOGRAPH
+0xED8E 0x5BEC  #CJK UNIFIED IDEOGRAPH
+0xED8F 0x5C1E  #CJK UNIFIED IDEOGRAPH
+0xED90 0x5CA6  #CJK UNIFIED IDEOGRAPH
+0xED91 0x5CBA  #CJK UNIFIED IDEOGRAPH
+0xED92 0x5CF5  #CJK UNIFIED IDEOGRAPH
+0xED93 0x5D27  #CJK UNIFIED IDEOGRAPH
+0xED94 0x5D53  #CJK UNIFIED IDEOGRAPH
+0xED95 0xFA11  #CJK COMPATIBILITY IDEOGRAPH
+0xED96 0x5D42  #CJK UNIFIED IDEOGRAPH
+0xED97 0x5D6D  #CJK UNIFIED IDEOGRAPH
+0xED98 0x5DB8  #CJK UNIFIED IDEOGRAPH
+0xED99 0x5DB9  #CJK UNIFIED IDEOGRAPH
+0xED9A 0x5DD0  #CJK UNIFIED IDEOGRAPH
+0xED9B 0x5F21  #CJK UNIFIED IDEOGRAPH
+0xED9C 0x5F34  #CJK UNIFIED IDEOGRAPH
+0xED9D 0x5F67  #CJK UNIFIED IDEOGRAPH
+0xED9E 0x5FB7  #CJK UNIFIED IDEOGRAPH
+0xED9F 0x5FDE  #CJK UNIFIED IDEOGRAPH
+0xEDA0 0x605D  #CJK UNIFIED IDEOGRAPH
+0xEDA1 0x6085  #CJK UNIFIED IDEOGRAPH
+0xEDA2 0x608A  #CJK UNIFIED IDEOGRAPH
+0xEDA3 0x60DE  #CJK UNIFIED IDEOGRAPH
+0xEDA4 0x60D5  #CJK UNIFIED IDEOGRAPH
+0xEDA5 0x6120  #CJK UNIFIED IDEOGRAPH
+0xEDA6 0x60F2  #CJK UNIFIED IDEOGRAPH
+0xEDA7 0x6111  #CJK UNIFIED IDEOGRAPH
+0xEDA8 0x6137  #CJK UNIFIED IDEOGRAPH
+0xEDA9 0x6130  #CJK UNIFIED IDEOGRAPH
+0xEDAA 0x6198  #CJK UNIFIED IDEOGRAPH
+0xEDAB 0x6213  #CJK UNIFIED IDEOGRAPH
+0xEDAC 0x62A6  #CJK UNIFIED IDEOGRAPH
+0xEDAD 0x63F5  #CJK UNIFIED IDEOGRAPH
+0xEDAE 0x6460  #CJK UNIFIED IDEOGRAPH
+0xEDAF 0x649D  #CJK UNIFIED IDEOGRAPH
+0xEDB0 0x64CE  #CJK UNIFIED IDEOGRAPH
+0xEDB1 0x654E  #CJK UNIFIED IDEOGRAPH
+0xEDB2 0x6600  #CJK UNIFIED IDEOGRAPH
+0xEDB3 0x6615  #CJK UNIFIED IDEOGRAPH
+0xEDB4 0x663B  #CJK UNIFIED IDEOGRAPH
+0xEDB5 0x6609  #CJK UNIFIED IDEOGRAPH
+0xEDB6 0x662E  #CJK UNIFIED IDEOGRAPH
+0xEDB7 0x661E  #CJK UNIFIED IDEOGRAPH
+0xEDB8 0x6624  #CJK UNIFIED IDEOGRAPH
+0xEDB9 0x6665  #CJK UNIFIED IDEOGRAPH
+0xEDBA 0x6657  #CJK UNIFIED IDEOGRAPH
+0xEDBB 0x6659  #CJK UNIFIED IDEOGRAPH
+0xEDBC 0xFA12  #CJK COMPATIBILITY IDEOGRAPH
+0xEDBD 0x6673  #CJK UNIFIED IDEOGRAPH
+0xEDBE 0x6699  #CJK UNIFIED IDEOGRAPH
+0xEDBF 0x66A0  #CJK UNIFIED IDEOGRAPH
+0xEDC0 0x66B2  #CJK UNIFIED IDEOGRAPH
+0xEDC1 0x66BF  #CJK UNIFIED IDEOGRAPH
+0xEDC2 0x66FA  #CJK UNIFIED IDEOGRAPH
+0xEDC3 0x670E  #CJK UNIFIED IDEOGRAPH
+0xEDC4 0xF929  #CJK COMPATIBILITY IDEOGRAPH
+0xEDC5 0x6766  #CJK UNIFIED IDEOGRAPH
+0xEDC6 0x67BB  #CJK UNIFIED IDEOGRAPH
+0xEDC7 0x6852  #CJK UNIFIED IDEOGRAPH
+0xEDC8 0x67C0  #CJK UNIFIED IDEOGRAPH
+0xEDC9 0x6801  #CJK UNIFIED IDEOGRAPH
+0xEDCA 0x6844  #CJK UNIFIED IDEOGRAPH
+0xEDCB 0x68CF  #CJK UNIFIED IDEOGRAPH
+0xEDCC 0xFA13  #CJK COMPATIBILITY IDEOGRAPH
+0xEDCD 0x6968  #CJK UNIFIED IDEOGRAPH
+0xEDCE 0xFA14  #CJK COMPATIBILITY IDEOGRAPH
+0xEDCF 0x6998  #CJK UNIFIED IDEOGRAPH
+0xEDD0 0x69E2  #CJK UNIFIED IDEOGRAPH
+0xEDD1 0x6A30  #CJK UNIFIED IDEOGRAPH
+0xEDD2 0x6A6B  #CJK UNIFIED IDEOGRAPH
+0xEDD3 0x6A46  #CJK UNIFIED IDEOGRAPH
+0xEDD4 0x6A73  #CJK UNIFIED IDEOGRAPH
+0xEDD5 0x6A7E  #CJK UNIFIED IDEOGRAPH
+0xEDD6 0x6AE2  #CJK UNIFIED IDEOGRAPH
+0xEDD7 0x6AE4  #CJK UNIFIED IDEOGRAPH
+0xEDD8 0x6BD6  #CJK UNIFIED IDEOGRAPH
+0xEDD9 0x6C3F  #CJK UNIFIED IDEOGRAPH
+0xEDDA 0x6C5C  #CJK UNIFIED IDEOGRAPH
+0xEDDB 0x6C86  #CJK UNIFIED IDEOGRAPH
+0xEDDC 0x6C6F  #CJK UNIFIED IDEOGRAPH
+0xEDDD 0x6CDA  #CJK UNIFIED IDEOGRAPH
+0xEDDE 0x6D04  #CJK UNIFIED IDEOGRAPH
+0xEDDF 0x6D87  #CJK UNIFIED IDEOGRAPH
+0xEDE0 0x6D6F  #CJK UNIFIED IDEOGRAPH
+0xEDE1 0x6D96  #CJK UNIFIED IDEOGRAPH
+0xEDE2 0x6DAC  #CJK UNIFIED IDEOGRAPH
+0xEDE3 0x6DCF  #CJK UNIFIED IDEOGRAPH
+0xEDE4 0x6DF8  #CJK UNIFIED IDEOGRAPH
+0xEDE5 0x6DF2  #CJK UNIFIED IDEOGRAPH
+0xEDE6 0x6DFC  #CJK UNIFIED IDEOGRAPH
+0xEDE7 0x6E39  #CJK UNIFIED IDEOGRAPH
+0xEDE8 0x6E5C  #CJK UNIFIED IDEOGRAPH
+0xEDE9 0x6E27  #CJK UNIFIED IDEOGRAPH
+0xEDEA 0x6E3C  #CJK UNIFIED IDEOGRAPH
+0xEDEB 0x6EBF  #CJK UNIFIED IDEOGRAPH
+0xEDEC 0x6F88  #CJK UNIFIED IDEOGRAPH
+0xEDED 0x6FB5  #CJK UNIFIED IDEOGRAPH
+0xEDEE 0x6FF5  #CJK UNIFIED IDEOGRAPH
+0xEDEF 0x7005  #CJK UNIFIED IDEOGRAPH
+0xEDF0 0x7007  #CJK UNIFIED IDEOGRAPH
+0xEDF1 0x7028  #CJK UNIFIED IDEOGRAPH
+0xEDF2 0x7085  #CJK UNIFIED IDEOGRAPH
+0xEDF3 0x70AB  #CJK UNIFIED IDEOGRAPH
+0xEDF4 0x710F  #CJK UNIFIED IDEOGRAPH
+0xEDF5 0x7104  #CJK UNIFIED IDEOGRAPH
+0xEDF6 0x715C  #CJK UNIFIED IDEOGRAPH
+0xEDF7 0x7146  #CJK UNIFIED IDEOGRAPH
+0xEDF8 0x7147  #CJK UNIFIED IDEOGRAPH
+0xEDF9 0xFA15  #CJK COMPATIBILITY IDEOGRAPH
+0xEDFA 0x71C1  #CJK UNIFIED IDEOGRAPH
+0xEDFB 0x71FE  #CJK UNIFIED IDEOGRAPH
+0xEDFC 0x72B1  #CJK UNIFIED IDEOGRAPH
+0xEE40 0x72BE  #CJK UNIFIED IDEOGRAPH
+0xEE41 0x7324  #CJK UNIFIED IDEOGRAPH
+0xEE42 0xFA16  #CJK COMPATIBILITY IDEOGRAPH
+0xEE43 0x7377  #CJK UNIFIED IDEOGRAPH
+0xEE44 0x73BD  #CJK UNIFIED IDEOGRAPH
+0xEE45 0x73C9  #CJK UNIFIED IDEOGRAPH
+0xEE46 0x73D6  #CJK UNIFIED IDEOGRAPH
+0xEE47 0x73E3  #CJK UNIFIED IDEOGRAPH
+0xEE48 0x73D2  #CJK UNIFIED IDEOGRAPH
+0xEE49 0x7407  #CJK UNIFIED IDEOGRAPH
+0xEE4A 0x73F5  #CJK UNIFIED IDEOGRAPH
+0xEE4B 0x7426  #CJK UNIFIED IDEOGRAPH
+0xEE4C 0x742A  #CJK UNIFIED IDEOGRAPH
+0xEE4D 0x7429  #CJK UNIFIED IDEOGRAPH
+0xEE4E 0x742E  #CJK UNIFIED IDEOGRAPH
+0xEE4F 0x7462  #CJK UNIFIED IDEOGRAPH
+0xEE50 0x7489  #CJK UNIFIED IDEOGRAPH
+0xEE51 0x749F  #CJK UNIFIED IDEOGRAPH
+0xEE52 0x7501  #CJK UNIFIED IDEOGRAPH
+0xEE53 0x756F  #CJK UNIFIED IDEOGRAPH
+0xEE54 0x7682  #CJK UNIFIED IDEOGRAPH
+0xEE55 0x769C  #CJK UNIFIED IDEOGRAPH
+0xEE56 0x769E  #CJK UNIFIED IDEOGRAPH
+0xEE57 0x769B  #CJK UNIFIED IDEOGRAPH
+0xEE58 0x76A6  #CJK UNIFIED IDEOGRAPH
+0xEE59 0xFA17  #CJK COMPATIBILITY IDEOGRAPH
+0xEE5A 0x7746  #CJK UNIFIED IDEOGRAPH
+0xEE5B 0x52AF  #CJK UNIFIED IDEOGRAPH
+0xEE5C 0x7821  #CJK UNIFIED IDEOGRAPH
+0xEE5D 0x784E  #CJK UNIFIED IDEOGRAPH
+0xEE5E 0x7864  #CJK UNIFIED IDEOGRAPH
+0xEE5F 0x787A  #CJK UNIFIED IDEOGRAPH
+0xEE60 0x7930  #CJK UNIFIED IDEOGRAPH
+0xEE61 0xFA18  #CJK COMPATIBILITY IDEOGRAPH
+0xEE62 0xFA19  #CJK COMPATIBILITY IDEOGRAPH
+0xEE63 0xFA1A  #CJK COMPATIBILITY IDEOGRAPH
+0xEE64 0x7994  #CJK UNIFIED IDEOGRAPH
+0xEE65 0xFA1B  #CJK COMPATIBILITY IDEOGRAPH
+0xEE66 0x799B  #CJK UNIFIED IDEOGRAPH
+0xEE67 0x7AD1  #CJK UNIFIED IDEOGRAPH
+0xEE68 0x7AE7  #CJK UNIFIED IDEOGRAPH
+0xEE69 0xFA1C  #CJK COMPATIBILITY IDEOGRAPH
+0xEE6A 0x7AEB  #CJK UNIFIED IDEOGRAPH
+0xEE6B 0x7B9E  #CJK UNIFIED IDEOGRAPH
+0xEE6C 0xFA1D  #CJK COMPATIBILITY IDEOGRAPH
+0xEE6D 0x7D48  #CJK UNIFIED IDEOGRAPH
+0xEE6E 0x7D5C  #CJK UNIFIED IDEOGRAPH
+0xEE6F 0x7DB7  #CJK UNIFIED IDEOGRAPH
+0xEE70 0x7DA0  #CJK UNIFIED IDEOGRAPH
+0xEE71 0x7DD6  #CJK UNIFIED IDEOGRAPH
+0xEE72 0x7E52  #CJK UNIFIED IDEOGRAPH
+0xEE73 0x7F47  #CJK UNIFIED IDEOGRAPH
+0xEE74 0x7FA1  #CJK UNIFIED IDEOGRAPH
+0xEE75 0xFA1E  #CJK COMPATIBILITY IDEOGRAPH
+0xEE76 0x8301  #CJK UNIFIED IDEOGRAPH
+0xEE77 0x8362  #CJK UNIFIED IDEOGRAPH
+0xEE78 0x837F  #CJK UNIFIED IDEOGRAPH
+0xEE79 0x83C7  #CJK UNIFIED IDEOGRAPH
+0xEE7A 0x83F6  #CJK UNIFIED IDEOGRAPH
+0xEE7B 0x8448  #CJK UNIFIED IDEOGRAPH
+0xEE7C 0x84B4  #CJK UNIFIED IDEOGRAPH
+0xEE7D 0x8553  #CJK UNIFIED IDEOGRAPH
+0xEE7E 0x8559  #CJK UNIFIED IDEOGRAPH
+0xEE80 0x856B  #CJK UNIFIED IDEOGRAPH
+0xEE81 0xFA1F  #CJK COMPATIBILITY IDEOGRAPH
+0xEE82 0x85B0  #CJK UNIFIED IDEOGRAPH
+0xEE83 0xFA20  #CJK COMPATIBILITY IDEOGRAPH
+0xEE84 0xFA21  #CJK COMPATIBILITY IDEOGRAPH
+0xEE85 0x8807  #CJK UNIFIED IDEOGRAPH
+0xEE86 0x88F5  #CJK UNIFIED IDEOGRAPH
+0xEE87 0x8A12  #CJK UNIFIED IDEOGRAPH
+0xEE88 0x8A37  #CJK UNIFIED IDEOGRAPH
+0xEE89 0x8A79  #CJK UNIFIED IDEOGRAPH
+0xEE8A 0x8AA7  #CJK UNIFIED IDEOGRAPH
+0xEE8B 0x8ABE  #CJK UNIFIED IDEOGRAPH
+0xEE8C 0x8ADF  #CJK UNIFIED IDEOGRAPH
+0xEE8D 0xFA22  #CJK COMPATIBILITY IDEOGRAPH
+0xEE8E 0x8AF6  #CJK UNIFIED IDEOGRAPH
+0xEE8F 0x8B53  #CJK UNIFIED IDEOGRAPH
+0xEE90 0x8B7F  #CJK UNIFIED IDEOGRAPH
+0xEE91 0x8CF0  #CJK UNIFIED IDEOGRAPH
+0xEE92 0x8CF4  #CJK UNIFIED IDEOGRAPH
+0xEE93 0x8D12  #CJK UNIFIED IDEOGRAPH
+0xEE94 0x8D76  #CJK UNIFIED IDEOGRAPH
+0xEE95 0xFA23  #CJK COMPATIBILITY IDEOGRAPH
+0xEE96 0x8ECF  #CJK UNIFIED IDEOGRAPH
+0xEE97 0xFA24  #CJK COMPATIBILITY IDEOGRAPH
+0xEE98 0xFA25  #CJK COMPATIBILITY IDEOGRAPH
+0xEE99 0x9067  #CJK UNIFIED IDEOGRAPH
+0xEE9A 0x90DE  #CJK UNIFIED IDEOGRAPH
+0xEE9B 0xFA26  #CJK COMPATIBILITY IDEOGRAPH
+0xEE9C 0x9115  #CJK UNIFIED IDEOGRAPH
+0xEE9D 0x9127  #CJK UNIFIED IDEOGRAPH
+0xEE9E 0x91DA  #CJK UNIFIED IDEOGRAPH
+0xEE9F 0x91D7  #CJK UNIFIED IDEOGRAPH
+0xEEA0 0x91DE  #CJK UNIFIED IDEOGRAPH
+0xEEA1 0x91ED  #CJK UNIFIED IDEOGRAPH
+0xEEA2 0x91EE  #CJK UNIFIED IDEOGRAPH
+0xEEA3 0x91E4  #CJK UNIFIED IDEOGRAPH
+0xEEA4 0x91E5  #CJK UNIFIED IDEOGRAPH
+0xEEA5 0x9206  #CJK UNIFIED IDEOGRAPH
+0xEEA6 0x9210  #CJK UNIFIED IDEOGRAPH
+0xEEA7 0x920A  #CJK UNIFIED IDEOGRAPH
+0xEEA8 0x923A  #CJK UNIFIED IDEOGRAPH
+0xEEA9 0x9240  #CJK UNIFIED IDEOGRAPH
+0xEEAA 0x923C  #CJK UNIFIED IDEOGRAPH
+0xEEAB 0x924E  #CJK UNIFIED IDEOGRAPH
+0xEEAC 0x9259  #CJK UNIFIED IDEOGRAPH
+0xEEAD 0x9251  #CJK UNIFIED IDEOGRAPH
+0xEEAE 0x9239  #CJK UNIFIED IDEOGRAPH
+0xEEAF 0x9267  #CJK UNIFIED IDEOGRAPH
+0xEEB0 0x92A7  #CJK UNIFIED IDEOGRAPH
+0xEEB1 0x9277  #CJK UNIFIED IDEOGRAPH
+0xEEB2 0x9278  #CJK UNIFIED IDEOGRAPH
+0xEEB3 0x92E7  #CJK UNIFIED IDEOGRAPH
+0xEEB4 0x92D7  #CJK UNIFIED IDEOGRAPH
+0xEEB5 0x92D9  #CJK UNIFIED IDEOGRAPH
+0xEEB6 0x92D0  #CJK UNIFIED IDEOGRAPH
+0xEEB7 0xFA27  #CJK COMPATIBILITY IDEOGRAPH
+0xEEB8 0x92D5  #CJK UNIFIED IDEOGRAPH
+0xEEB9 0x92E0  #CJK UNIFIED IDEOGRAPH
+0xEEBA 0x92D3  #CJK UNIFIED IDEOGRAPH
+0xEEBB 0x9325  #CJK UNIFIED IDEOGRAPH
+0xEEBC 0x9321  #CJK UNIFIED IDEOGRAPH
+0xEEBD 0x92FB  #CJK UNIFIED IDEOGRAPH
+0xEEBE 0xFA28  #CJK COMPATIBILITY IDEOGRAPH
+0xEEBF 0x931E  #CJK UNIFIED IDEOGRAPH
+0xEEC0 0x92FF  #CJK UNIFIED IDEOGRAPH
+0xEEC1 0x931D  #CJK UNIFIED IDEOGRAPH
+0xEEC2 0x9302  #CJK UNIFIED IDEOGRAPH
+0xEEC3 0x9370  #CJK UNIFIED IDEOGRAPH
+0xEEC4 0x9357  #CJK UNIFIED IDEOGRAPH
+0xEEC5 0x93A4  #CJK UNIFIED IDEOGRAPH
+0xEEC6 0x93C6  #CJK UNIFIED IDEOGRAPH
+0xEEC7 0x93DE  #CJK UNIFIED IDEOGRAPH
+0xEEC8 0x93F8  #CJK UNIFIED IDEOGRAPH
+0xEEC9 0x9431  #CJK UNIFIED IDEOGRAPH
+0xEECA 0x9445  #CJK UNIFIED IDEOGRAPH
+0xEECB 0x9448  #CJK UNIFIED IDEOGRAPH
+0xEECC 0x9592  #CJK UNIFIED IDEOGRAPH
+0xEECD 0xF9DC  #CJK COMPATIBILITY IDEOGRAPH
+0xEECE 0xFA29  #CJK COMPATIBILITY IDEOGRAPH
+0xEECF 0x969D  #CJK UNIFIED IDEOGRAPH
+0xEED0 0x96AF  #CJK UNIFIED IDEOGRAPH
+0xEED1 0x9733  #CJK UNIFIED IDEOGRAPH
+0xEED2 0x973B  #CJK UNIFIED IDEOGRAPH
+0xEED3 0x9743  #CJK UNIFIED IDEOGRAPH
+0xEED4 0x974D  #CJK UNIFIED IDEOGRAPH
+0xEED5 0x974F  #CJK UNIFIED IDEOGRAPH
+0xEED6 0x9751  #CJK UNIFIED IDEOGRAPH
+0xEED7 0x9755  #CJK UNIFIED IDEOGRAPH
+0xEED8 0x9857  #CJK UNIFIED IDEOGRAPH
+0xEED9 0x9865  #CJK UNIFIED IDEOGRAPH
+0xEEDA 0xFA2A  #CJK COMPATIBILITY IDEOGRAPH
+0xEEDB 0xFA2B  #CJK COMPATIBILITY IDEOGRAPH
+0xEEDC 0x9927  #CJK UNIFIED IDEOGRAPH
+0xEEDD 0xFA2C  #CJK COMPATIBILITY IDEOGRAPH
+0xEEDE 0x999E  #CJK UNIFIED IDEOGRAPH
+0xEEDF 0x9A4E  #CJK UNIFIED IDEOGRAPH
+0xEEE0 0x9AD9  #CJK UNIFIED IDEOGRAPH
+0xEEE1 0x9ADC  #CJK UNIFIED IDEOGRAPH
+0xEEE2 0x9B75  #CJK UNIFIED IDEOGRAPH
+0xEEE3 0x9B72  #CJK UNIFIED IDEOGRAPH
+0xEEE4 0x9B8F  #CJK UNIFIED IDEOGRAPH
+0xEEE5 0x9BB1  #CJK UNIFIED IDEOGRAPH
+0xEEE6 0x9BBB  #CJK UNIFIED IDEOGRAPH
+0xEEE7 0x9C00  #CJK UNIFIED IDEOGRAPH
+0xEEE8 0x9D70  #CJK UNIFIED IDEOGRAPH
+0xEEE9 0x9D6B  #CJK UNIFIED IDEOGRAPH
+0xEEEA 0xFA2D  #CJK COMPATIBILITY IDEOGRAPH
+0xEEEB 0x9E19  #CJK UNIFIED IDEOGRAPH
+0xEEEC 0x9ED1  #CJK UNIFIED IDEOGRAPH
+0xEEEF 0x2170  #SMALL ROMAN NUMERAL ONE
+0xEEF0 0x2171  #SMALL ROMAN NUMERAL TWO
+0xEEF1 0x2172  #SMALL ROMAN NUMERAL THREE
+0xEEF2 0x2173  #SMALL ROMAN NUMERAL FOUR
+0xEEF3 0x2174  #SMALL ROMAN NUMERAL FIVE
+0xEEF4 0x2175  #SMALL ROMAN NUMERAL SIX
+0xEEF5 0x2176  #SMALL ROMAN NUMERAL SEVEN
+0xEEF6 0x2177  #SMALL ROMAN NUMERAL EIGHT
+0xEEF7 0x2178  #SMALL ROMAN NUMERAL NINE
+0xEEF8 0x2179  #SMALL ROMAN NUMERAL TEN
+0xEEF9 0xFFE2  #FULLWIDTH NOT SIGN
+0xEEFA 0xFFE4  #FULLWIDTH BROKEN BAR
+0xEEFB 0xFF07  #FULLWIDTH APOSTROPHE
+0xEEFC 0xFF02  #FULLWIDTH QUOTATION MARK
+0xFA40 0x2170  #SMALL ROMAN NUMERAL ONE
+0xFA41 0x2171  #SMALL ROMAN NUMERAL TWO
+0xFA42 0x2172  #SMALL ROMAN NUMERAL THREE
+0xFA43 0x2173  #SMALL ROMAN NUMERAL FOUR
+0xFA44 0x2174  #SMALL ROMAN NUMERAL FIVE
+0xFA45 0x2175  #SMALL ROMAN NUMERAL SIX
+0xFA46 0x2176  #SMALL ROMAN NUMERAL SEVEN
+0xFA47 0x2177  #SMALL ROMAN NUMERAL EIGHT
+0xFA48 0x2178  #SMALL ROMAN NUMERAL NINE
+0xFA49 0x2179  #SMALL ROMAN NUMERAL TEN
+0xFA4A 0x2160  #ROMAN NUMERAL ONE
+0xFA4B 0x2161  #ROMAN NUMERAL TWO
+0xFA4C 0x2162  #ROMAN NUMERAL THREE
+0xFA4D 0x2163  #ROMAN NUMERAL FOUR
+0xFA4E 0x2164  #ROMAN NUMERAL FIVE
+0xFA4F 0x2165  #ROMAN NUMERAL SIX
+0xFA50 0x2166  #ROMAN NUMERAL SEVEN
+0xFA51 0x2167  #ROMAN NUMERAL EIGHT
+0xFA52 0x2168  #ROMAN NUMERAL NINE
+0xFA53 0x2169  #ROMAN NUMERAL TEN
+0xFA54 0xFFE2  #FULLWIDTH NOT SIGN
+0xFA55 0xFFE4  #FULLWIDTH BROKEN BAR
+0xFA56 0xFF07  #FULLWIDTH APOSTROPHE
+0xFA57 0xFF02  #FULLWIDTH QUOTATION MARK
+0xFA58 0x3231  #PARENTHESIZED IDEOGRAPH STOCK
+0xFA59 0x2116  #NUMERO SIGN
+0xFA5A 0x2121  #TELEPHONE SIGN
+0xFA5B 0x2235  #BECAUSE
+0xFA5C 0x7E8A  #CJK UNIFIED IDEOGRAPH
+0xFA5D 0x891C  #CJK UNIFIED IDEOGRAPH
+0xFA5E 0x9348  #CJK UNIFIED IDEOGRAPH
+0xFA5F 0x9288  #CJK UNIFIED IDEOGRAPH
+0xFA60 0x84DC  #CJK UNIFIED IDEOGRAPH
+0xFA61 0x4FC9  #CJK UNIFIED IDEOGRAPH
+0xFA62 0x70BB  #CJK UNIFIED IDEOGRAPH
+0xFA63 0x6631  #CJK UNIFIED IDEOGRAPH
+0xFA64 0x68C8  #CJK UNIFIED IDEOGRAPH
+0xFA65 0x92F9  #CJK UNIFIED IDEOGRAPH
+0xFA66 0x66FB  #CJK UNIFIED IDEOGRAPH
+0xFA67 0x5F45  #CJK UNIFIED IDEOGRAPH
+0xFA68 0x4E28  #CJK UNIFIED IDEOGRAPH
+0xFA69 0x4EE1  #CJK UNIFIED IDEOGRAPH
+0xFA6A 0x4EFC  #CJK UNIFIED IDEOGRAPH
+0xFA6B 0x4F00  #CJK UNIFIED IDEOGRAPH
+0xFA6C 0x4F03  #CJK UNIFIED IDEOGRAPH
+0xFA6D 0x4F39  #CJK UNIFIED IDEOGRAPH
+0xFA6E 0x4F56  #CJK UNIFIED IDEOGRAPH
+0xFA6F 0x4F92  #CJK UNIFIED IDEOGRAPH
+0xFA70 0x4F8A  #CJK UNIFIED IDEOGRAPH
+0xFA71 0x4F9A  #CJK UNIFIED IDEOGRAPH
+0xFA72 0x4F94  #CJK UNIFIED IDEOGRAPH
+0xFA73 0x4FCD  #CJK UNIFIED IDEOGRAPH
+0xFA74 0x5040  #CJK UNIFIED IDEOGRAPH
+0xFA75 0x5022  #CJK UNIFIED IDEOGRAPH
+0xFA76 0x4FFF  #CJK UNIFIED IDEOGRAPH
+0xFA77 0x501E  #CJK UNIFIED IDEOGRAPH
+0xFA78 0x5046  #CJK UNIFIED IDEOGRAPH
+0xFA79 0x5070  #CJK UNIFIED IDEOGRAPH
+0xFA7A 0x5042  #CJK UNIFIED IDEOGRAPH
+0xFA7B 0x5094  #CJK UNIFIED IDEOGRAPH
+0xFA7C 0x50F4  #CJK UNIFIED IDEOGRAPH
+0xFA7D 0x50D8  #CJK UNIFIED IDEOGRAPH
+0xFA7E 0x514A  #CJK UNIFIED IDEOGRAPH
+0xFA80 0x5164  #CJK UNIFIED IDEOGRAPH
+0xFA81 0x519D  #CJK UNIFIED IDEOGRAPH
+0xFA82 0x51BE  #CJK UNIFIED IDEOGRAPH
+0xFA83 0x51EC  #CJK UNIFIED IDEOGRAPH
+0xFA84 0x5215  #CJK UNIFIED IDEOGRAPH
+0xFA85 0x529C  #CJK UNIFIED IDEOGRAPH
+0xFA86 0x52A6  #CJK UNIFIED IDEOGRAPH
+0xFA87 0x52C0  #CJK UNIFIED IDEOGRAPH
+0xFA88 0x52DB  #CJK UNIFIED IDEOGRAPH
+0xFA89 0x5300  #CJK UNIFIED IDEOGRAPH
+0xFA8A 0x5307  #CJK UNIFIED IDEOGRAPH
+0xFA8B 0x5324  #CJK UNIFIED IDEOGRAPH
+0xFA8C 0x5372  #CJK UNIFIED IDEOGRAPH
+0xFA8D 0x5393  #CJK UNIFIED IDEOGRAPH
+0xFA8E 0x53B2  #CJK UNIFIED IDEOGRAPH
+0xFA8F 0x53DD  #CJK UNIFIED IDEOGRAPH
+0xFA90 0xFA0E  #CJK COMPATIBILITY IDEOGRAPH
+0xFA91 0x549C  #CJK UNIFIED IDEOGRAPH
+0xFA92 0x548A  #CJK UNIFIED IDEOGRAPH
+0xFA93 0x54A9  #CJK UNIFIED IDEOGRAPH
+0xFA94 0x54FF  #CJK UNIFIED IDEOGRAPH
+0xFA95 0x5586  #CJK UNIFIED IDEOGRAPH
+0xFA96 0x5759  #CJK UNIFIED IDEOGRAPH
+0xFA97 0x5765  #CJK UNIFIED IDEOGRAPH
+0xFA98 0x57AC  #CJK UNIFIED IDEOGRAPH
+0xFA99 0x57C8  #CJK UNIFIED IDEOGRAPH
+0xFA9A 0x57C7  #CJK UNIFIED IDEOGRAPH
+0xFA9B 0xFA0F  #CJK COMPATIBILITY IDEOGRAPH
+0xFA9C 0xFA10  #CJK COMPATIBILITY IDEOGRAPH
+0xFA9D 0x589E  #CJK UNIFIED IDEOGRAPH
+0xFA9E 0x58B2  #CJK UNIFIED IDEOGRAPH
+0xFA9F 0x590B  #CJK UNIFIED IDEOGRAPH
+0xFAA0 0x5953  #CJK UNIFIED IDEOGRAPH
+0xFAA1 0x595B  #CJK UNIFIED IDEOGRAPH
+0xFAA2 0x595D  #CJK UNIFIED IDEOGRAPH
+0xFAA3 0x5963  #CJK UNIFIED IDEOGRAPH
+0xFAA4 0x59A4  #CJK UNIFIED IDEOGRAPH
+0xFAA5 0x59BA  #CJK UNIFIED IDEOGRAPH
+0xFAA6 0x5B56  #CJK UNIFIED IDEOGRAPH
+0xFAA7 0x5BC0  #CJK UNIFIED IDEOGRAPH
+0xFAA8 0x752F  #CJK UNIFIED IDEOGRAPH
+0xFAA9 0x5BD8  #CJK UNIFIED IDEOGRAPH
+0xFAAA 0x5BEC  #CJK UNIFIED IDEOGRAPH
+0xFAAB 0x5C1E  #CJK UNIFIED IDEOGRAPH
+0xFAAC 0x5CA6  #CJK UNIFIED IDEOGRAPH
+0xFAAD 0x5CBA  #CJK UNIFIED IDEOGRAPH
+0xFAAE 0x5CF5  #CJK UNIFIED IDEOGRAPH
+0xFAAF 0x5D27  #CJK UNIFIED IDEOGRAPH
+0xFAB0 0x5D53  #CJK UNIFIED IDEOGRAPH
+0xFAB1 0xFA11  #CJK COMPATIBILITY IDEOGRAPH
+0xFAB2 0x5D42  #CJK UNIFIED IDEOGRAPH
+0xFAB3 0x5D6D  #CJK UNIFIED IDEOGRAPH
+0xFAB4 0x5DB8  #CJK UNIFIED IDEOGRAPH
+0xFAB5 0x5DB9  #CJK UNIFIED IDEOGRAPH
+0xFAB6 0x5DD0  #CJK UNIFIED IDEOGRAPH
+0xFAB7 0x5F21  #CJK UNIFIED IDEOGRAPH
+0xFAB8 0x5F34  #CJK UNIFIED IDEOGRAPH
+0xFAB9 0x5F67  #CJK UNIFIED IDEOGRAPH
+0xFABA 0x5FB7  #CJK UNIFIED IDEOGRAPH
+0xFABB 0x5FDE  #CJK UNIFIED IDEOGRAPH
+0xFABC 0x605D  #CJK UNIFIED IDEOGRAPH
+0xFABD 0x6085  #CJK UNIFIED IDEOGRAPH
+0xFABE 0x608A  #CJK UNIFIED IDEOGRAPH
+0xFABF 0x60DE  #CJK UNIFIED IDEOGRAPH
+0xFAC0 0x60D5  #CJK UNIFIED IDEOGRAPH
+0xFAC1 0x6120  #CJK UNIFIED IDEOGRAPH
+0xFAC2 0x60F2  #CJK UNIFIED IDEOGRAPH
+0xFAC3 0x6111  #CJK UNIFIED IDEOGRAPH
+0xFAC4 0x6137  #CJK UNIFIED IDEOGRAPH
+0xFAC5 0x6130  #CJK UNIFIED IDEOGRAPH
+0xFAC6 0x6198  #CJK UNIFIED IDEOGRAPH
+0xFAC7 0x6213  #CJK UNIFIED IDEOGRAPH
+0xFAC8 0x62A6  #CJK UNIFIED IDEOGRAPH
+0xFAC9 0x63F5  #CJK UNIFIED IDEOGRAPH
+0xFACA 0x6460  #CJK UNIFIED IDEOGRAPH
+0xFACB 0x649D  #CJK UNIFIED IDEOGRAPH
+0xFACC 0x64CE  #CJK UNIFIED IDEOGRAPH
+0xFACD 0x654E  #CJK UNIFIED IDEOGRAPH
+0xFACE 0x6600  #CJK UNIFIED IDEOGRAPH
+0xFACF 0x6615  #CJK UNIFIED IDEOGRAPH
+0xFAD0 0x663B  #CJK UNIFIED IDEOGRAPH
+0xFAD1 0x6609  #CJK UNIFIED IDEOGRAPH
+0xFAD2 0x662E  #CJK UNIFIED IDEOGRAPH
+0xFAD3 0x661E  #CJK UNIFIED IDEOGRAPH
+0xFAD4 0x6624  #CJK UNIFIED IDEOGRAPH
+0xFAD5 0x6665  #CJK UNIFIED IDEOGRAPH
+0xFAD6 0x6657  #CJK UNIFIED IDEOGRAPH
+0xFAD7 0x6659  #CJK UNIFIED IDEOGRAPH
+0xFAD8 0xFA12  #CJK COMPATIBILITY IDEOGRAPH
+0xFAD9 0x6673  #CJK UNIFIED IDEOGRAPH
+0xFADA 0x6699  #CJK UNIFIED IDEOGRAPH
+0xFADB 0x66A0  #CJK UNIFIED IDEOGRAPH
+0xFADC 0x66B2  #CJK UNIFIED IDEOGRAPH
+0xFADD 0x66BF  #CJK UNIFIED IDEOGRAPH
+0xFADE 0x66FA  #CJK UNIFIED IDEOGRAPH
+0xFADF 0x670E  #CJK UNIFIED IDEOGRAPH
+0xFAE0 0xF929  #CJK COMPATIBILITY IDEOGRAPH
+0xFAE1 0x6766  #CJK UNIFIED IDEOGRAPH
+0xFAE2 0x67BB  #CJK UNIFIED IDEOGRAPH
+0xFAE3 0x6852  #CJK UNIFIED IDEOGRAPH
+0xFAE4 0x67C0  #CJK UNIFIED IDEOGRAPH
+0xFAE5 0x6801  #CJK UNIFIED IDEOGRAPH
+0xFAE6 0x6844  #CJK UNIFIED IDEOGRAPH
+0xFAE7 0x68CF  #CJK UNIFIED IDEOGRAPH
+0xFAE8 0xFA13  #CJK COMPATIBILITY IDEOGRAPH
+0xFAE9 0x6968  #CJK UNIFIED IDEOGRAPH
+0xFAEA 0xFA14  #CJK COMPATIBILITY IDEOGRAPH
+0xFAEB 0x6998  #CJK UNIFIED IDEOGRAPH
+0xFAEC 0x69E2  #CJK UNIFIED IDEOGRAPH
+0xFAED 0x6A30  #CJK UNIFIED IDEOGRAPH
+0xFAEE 0x6A6B  #CJK UNIFIED IDEOGRAPH
+0xFAEF 0x6A46  #CJK UNIFIED IDEOGRAPH
+0xFAF0 0x6A73  #CJK UNIFIED IDEOGRAPH
+0xFAF1 0x6A7E  #CJK UNIFIED IDEOGRAPH
+0xFAF2 0x6AE2  #CJK UNIFIED IDEOGRAPH
+0xFAF3 0x6AE4  #CJK UNIFIED IDEOGRAPH
+0xFAF4 0x6BD6  #CJK UNIFIED IDEOGRAPH
+0xFAF5 0x6C3F  #CJK UNIFIED IDEOGRAPH
+0xFAF6 0x6C5C  #CJK UNIFIED IDEOGRAPH
+0xFAF7 0x6C86  #CJK UNIFIED IDEOGRAPH
+0xFAF8 0x6C6F  #CJK UNIFIED IDEOGRAPH
+0xFAF9 0x6CDA  #CJK UNIFIED IDEOGRAPH
+0xFAFA 0x6D04  #CJK UNIFIED IDEOGRAPH
+0xFAFB 0x6D87  #CJK UNIFIED IDEOGRAPH
+0xFAFC 0x6D6F  #CJK UNIFIED IDEOGRAPH
+0xFB40 0x6D96  #CJK UNIFIED IDEOGRAPH
+0xFB41 0x6DAC  #CJK UNIFIED IDEOGRAPH
+0xFB42 0x6DCF  #CJK UNIFIED IDEOGRAPH
+0xFB43 0x6DF8  #CJK UNIFIED IDEOGRAPH
+0xFB44 0x6DF2  #CJK UNIFIED IDEOGRAPH
+0xFB45 0x6DFC  #CJK UNIFIED IDEOGRAPH
+0xFB46 0x6E39  #CJK UNIFIED IDEOGRAPH
+0xFB47 0x6E5C  #CJK UNIFIED IDEOGRAPH
+0xFB48 0x6E27  #CJK UNIFIED IDEOGRAPH
+0xFB49 0x6E3C  #CJK UNIFIED IDEOGRAPH
+0xFB4A 0x6EBF  #CJK UNIFIED IDEOGRAPH
+0xFB4B 0x6F88  #CJK UNIFIED IDEOGRAPH
+0xFB4C 0x6FB5  #CJK UNIFIED IDEOGRAPH
+0xFB4D 0x6FF5  #CJK UNIFIED IDEOGRAPH
+0xFB4E 0x7005  #CJK UNIFIED IDEOGRAPH
+0xFB4F 0x7007  #CJK UNIFIED IDEOGRAPH
+0xFB50 0x7028  #CJK UNIFIED IDEOGRAPH
+0xFB51 0x7085  #CJK UNIFIED IDEOGRAPH
+0xFB52 0x70AB  #CJK UNIFIED IDEOGRAPH
+0xFB53 0x710F  #CJK UNIFIED IDEOGRAPH
+0xFB54 0x7104  #CJK UNIFIED IDEOGRAPH
+0xFB55 0x715C  #CJK UNIFIED IDEOGRAPH
+0xFB56 0x7146  #CJK UNIFIED IDEOGRAPH
+0xFB57 0x7147  #CJK UNIFIED IDEOGRAPH
+0xFB58 0xFA15  #CJK COMPATIBILITY IDEOGRAPH
+0xFB59 0x71C1  #CJK UNIFIED IDEOGRAPH
+0xFB5A 0x71FE  #CJK UNIFIED IDEOGRAPH
+0xFB5B 0x72B1  #CJK UNIFIED IDEOGRAPH
+0xFB5C 0x72BE  #CJK UNIFIED IDEOGRAPH
+0xFB5D 0x7324  #CJK UNIFIED IDEOGRAPH
+0xFB5E 0xFA16  #CJK COMPATIBILITY IDEOGRAPH
+0xFB5F 0x7377  #CJK UNIFIED IDEOGRAPH
+0xFB60 0x73BD  #CJK UNIFIED IDEOGRAPH
+0xFB61 0x73C9  #CJK UNIFIED IDEOGRAPH
+0xFB62 0x73D6  #CJK UNIFIED IDEOGRAPH
+0xFB63 0x73E3  #CJK UNIFIED IDEOGRAPH
+0xFB64 0x73D2  #CJK UNIFIED IDEOGRAPH
+0xFB65 0x7407  #CJK UNIFIED IDEOGRAPH
+0xFB66 0x73F5  #CJK UNIFIED IDEOGRAPH
+0xFB67 0x7426  #CJK UNIFIED IDEOGRAPH
+0xFB68 0x742A  #CJK UNIFIED IDEOGRAPH
+0xFB69 0x7429  #CJK UNIFIED IDEOGRAPH
+0xFB6A 0x742E  #CJK UNIFIED IDEOGRAPH
+0xFB6B 0x7462  #CJK UNIFIED IDEOGRAPH
+0xFB6C 0x7489  #CJK UNIFIED IDEOGRAPH
+0xFB6D 0x749F  #CJK UNIFIED IDEOGRAPH
+0xFB6E 0x7501  #CJK UNIFIED IDEOGRAPH
+0xFB6F 0x756F  #CJK UNIFIED IDEOGRAPH
+0xFB70 0x7682  #CJK UNIFIED IDEOGRAPH
+0xFB71 0x769C  #CJK UNIFIED IDEOGRAPH
+0xFB72 0x769E  #CJK UNIFIED IDEOGRAPH
+0xFB73 0x769B  #CJK UNIFIED IDEOGRAPH
+0xFB74 0x76A6  #CJK UNIFIED IDEOGRAPH
+0xFB75 0xFA17  #CJK COMPATIBILITY IDEOGRAPH
+0xFB76 0x7746  #CJK UNIFIED IDEOGRAPH
+0xFB77 0x52AF  #CJK UNIFIED IDEOGRAPH
+0xFB78 0x7821  #CJK UNIFIED IDEOGRAPH
+0xFB79 0x784E  #CJK UNIFIED IDEOGRAPH
+0xFB7A 0x7864  #CJK UNIFIED IDEOGRAPH
+0xFB7B 0x787A  #CJK UNIFIED IDEOGRAPH
+0xFB7C 0x7930  #CJK UNIFIED IDEOGRAPH
+0xFB7D 0xFA18  #CJK COMPATIBILITY IDEOGRAPH
+0xFB7E 0xFA19  #CJK COMPATIBILITY IDEOGRAPH
+0xFB80 0xFA1A  #CJK COMPATIBILITY IDEOGRAPH
+0xFB81 0x7994  #CJK UNIFIED IDEOGRAPH
+0xFB82 0xFA1B  #CJK COMPATIBILITY IDEOGRAPH
+0xFB83 0x799B  #CJK UNIFIED IDEOGRAPH
+0xFB84 0x7AD1  #CJK UNIFIED IDEOGRAPH
+0xFB85 0x7AE7  #CJK UNIFIED IDEOGRAPH
+0xFB86 0xFA1C  #CJK COMPATIBILITY IDEOGRAPH
+0xFB87 0x7AEB  #CJK UNIFIED IDEOGRAPH
+0xFB88 0x7B9E  #CJK UNIFIED IDEOGRAPH
+0xFB89 0xFA1D  #CJK COMPATIBILITY IDEOGRAPH
+0xFB8A 0x7D48  #CJK UNIFIED IDEOGRAPH
+0xFB8B 0x7D5C  #CJK UNIFIED IDEOGRAPH
+0xFB8C 0x7DB7  #CJK UNIFIED IDEOGRAPH
+0xFB8D 0x7DA0  #CJK UNIFIED IDEOGRAPH
+0xFB8E 0x7DD6  #CJK UNIFIED IDEOGRAPH
+0xFB8F 0x7E52  #CJK UNIFIED IDEOGRAPH
+0xFB90 0x7F47  #CJK UNIFIED IDEOGRAPH
+0xFB91 0x7FA1  #CJK UNIFIED IDEOGRAPH
+0xFB92 0xFA1E  #CJK COMPATIBILITY IDEOGRAPH
+0xFB93 0x8301  #CJK UNIFIED IDEOGRAPH
+0xFB94 0x8362  #CJK UNIFIED IDEOGRAPH
+0xFB95 0x837F  #CJK UNIFIED IDEOGRAPH
+0xFB96 0x83C7  #CJK UNIFIED IDEOGRAPH
+0xFB97 0x83F6  #CJK UNIFIED IDEOGRAPH
+0xFB98 0x8448  #CJK UNIFIED IDEOGRAPH
+0xFB99 0x84B4  #CJK UNIFIED IDEOGRAPH
+0xFB9A 0x8553  #CJK UNIFIED IDEOGRAPH
+0xFB9B 0x8559  #CJK UNIFIED IDEOGRAPH
+0xFB9C 0x856B  #CJK UNIFIED IDEOGRAPH
+0xFB9D 0xFA1F  #CJK COMPATIBILITY IDEOGRAPH
+0xFB9E 0x85B0  #CJK UNIFIED IDEOGRAPH
+0xFB9F 0xFA20  #CJK COMPATIBILITY IDEOGRAPH
+0xFBA0 0xFA21  #CJK COMPATIBILITY IDEOGRAPH
+0xFBA1 0x8807  #CJK UNIFIED IDEOGRAPH
+0xFBA2 0x88F5  #CJK UNIFIED IDEOGRAPH
+0xFBA3 0x8A12  #CJK UNIFIED IDEOGRAPH
+0xFBA4 0x8A37  #CJK UNIFIED IDEOGRAPH
+0xFBA5 0x8A79  #CJK UNIFIED IDEOGRAPH
+0xFBA6 0x8AA7  #CJK UNIFIED IDEOGRAPH
+0xFBA7 0x8ABE  #CJK UNIFIED IDEOGRAPH
+0xFBA8 0x8ADF  #CJK UNIFIED IDEOGRAPH
+0xFBA9 0xFA22  #CJK COMPATIBILITY IDEOGRAPH
+0xFBAA 0x8AF6  #CJK UNIFIED IDEOGRAPH
+0xFBAB 0x8B53  #CJK UNIFIED IDEOGRAPH
+0xFBAC 0x8B7F  #CJK UNIFIED IDEOGRAPH
+0xFBAD 0x8CF0  #CJK UNIFIED IDEOGRAPH
+0xFBAE 0x8CF4  #CJK UNIFIED IDEOGRAPH
+0xFBAF 0x8D12  #CJK UNIFIED IDEOGRAPH
+0xFBB0 0x8D76  #CJK UNIFIED IDEOGRAPH
+0xFBB1 0xFA23  #CJK COMPATIBILITY IDEOGRAPH
+0xFBB2 0x8ECF  #CJK UNIFIED IDEOGRAPH
+0xFBB3 0xFA24  #CJK COMPATIBILITY IDEOGRAPH
+0xFBB4 0xFA25  #CJK COMPATIBILITY IDEOGRAPH
+0xFBB5 0x9067  #CJK UNIFIED IDEOGRAPH
+0xFBB6 0x90DE  #CJK UNIFIED IDEOGRAPH
+0xFBB7 0xFA26  #CJK COMPATIBILITY IDEOGRAPH
+0xFBB8 0x9115  #CJK UNIFIED IDEOGRAPH
+0xFBB9 0x9127  #CJK UNIFIED IDEOGRAPH
+0xFBBA 0x91DA  #CJK UNIFIED IDEOGRAPH
+0xFBBB 0x91D7  #CJK UNIFIED IDEOGRAPH
+0xFBBC 0x91DE  #CJK UNIFIED IDEOGRAPH
+0xFBBD 0x91ED  #CJK UNIFIED IDEOGRAPH
+0xFBBE 0x91EE  #CJK UNIFIED IDEOGRAPH
+0xFBBF 0x91E4  #CJK UNIFIED IDEOGRAPH
+0xFBC0 0x91E5  #CJK UNIFIED IDEOGRAPH
+0xFBC1 0x9206  #CJK UNIFIED IDEOGRAPH
+0xFBC2 0x9210  #CJK UNIFIED IDEOGRAPH
+0xFBC3 0x920A  #CJK UNIFIED IDEOGRAPH
+0xFBC4 0x923A  #CJK UNIFIED IDEOGRAPH
+0xFBC5 0x9240  #CJK UNIFIED IDEOGRAPH
+0xFBC6 0x923C  #CJK UNIFIED IDEOGRAPH
+0xFBC7 0x924E  #CJK UNIFIED IDEOGRAPH
+0xFBC8 0x9259  #CJK UNIFIED IDEOGRAPH
+0xFBC9 0x9251  #CJK UNIFIED IDEOGRAPH
+0xFBCA 0x9239  #CJK UNIFIED IDEOGRAPH
+0xFBCB 0x9267  #CJK UNIFIED IDEOGRAPH
+0xFBCC 0x92A7  #CJK UNIFIED IDEOGRAPH
+0xFBCD 0x9277  #CJK UNIFIED IDEOGRAPH
+0xFBCE 0x9278  #CJK UNIFIED IDEOGRAPH
+0xFBCF 0x92E7  #CJK UNIFIED IDEOGRAPH
+0xFBD0 0x92D7  #CJK UNIFIED IDEOGRAPH
+0xFBD1 0x92D9  #CJK UNIFIED IDEOGRAPH
+0xFBD2 0x92D0  #CJK UNIFIED IDEOGRAPH
+0xFBD3 0xFA27  #CJK COMPATIBILITY IDEOGRAPH
+0xFBD4 0x92D5  #CJK UNIFIED IDEOGRAPH
+0xFBD5 0x92E0  #CJK UNIFIED IDEOGRAPH
+0xFBD6 0x92D3  #CJK UNIFIED IDEOGRAPH
+0xFBD7 0x9325  #CJK UNIFIED IDEOGRAPH
+0xFBD8 0x9321  #CJK UNIFIED IDEOGRAPH
+0xFBD9 0x92FB  #CJK UNIFIED IDEOGRAPH
+0xFBDA 0xFA28  #CJK COMPATIBILITY IDEOGRAPH
+0xFBDB 0x931E  #CJK UNIFIED IDEOGRAPH
+0xFBDC 0x92FF  #CJK UNIFIED IDEOGRAPH
+0xFBDD 0x931D  #CJK UNIFIED IDEOGRAPH
+0xFBDE 0x9302  #CJK UNIFIED IDEOGRAPH
+0xFBDF 0x9370  #CJK UNIFIED IDEOGRAPH
+0xFBE0 0x9357  #CJK UNIFIED IDEOGRAPH
+0xFBE1 0x93A4  #CJK UNIFIED IDEOGRAPH
+0xFBE2 0x93C6  #CJK UNIFIED IDEOGRAPH
+0xFBE3 0x93DE  #CJK UNIFIED IDEOGRAPH
+0xFBE4 0x93F8  #CJK UNIFIED IDEOGRAPH
+0xFBE5 0x9431  #CJK UNIFIED IDEOGRAPH
+0xFBE6 0x9445  #CJK UNIFIED IDEOGRAPH
+0xFBE7 0x9448  #CJK UNIFIED IDEOGRAPH
+0xFBE8 0x9592  #CJK UNIFIED IDEOGRAPH
+0xFBE9 0xF9DC  #CJK COMPATIBILITY IDEOGRAPH
+0xFBEA 0xFA29  #CJK COMPATIBILITY IDEOGRAPH
+0xFBEB 0x969D  #CJK UNIFIED IDEOGRAPH
+0xFBEC 0x96AF  #CJK UNIFIED IDEOGRAPH
+0xFBED 0x9733  #CJK UNIFIED IDEOGRAPH
+0xFBEE 0x973B  #CJK UNIFIED IDEOGRAPH
+0xFBEF 0x9743  #CJK UNIFIED IDEOGRAPH
+0xFBF0 0x974D  #CJK UNIFIED IDEOGRAPH
+0xFBF1 0x974F  #CJK UNIFIED IDEOGRAPH
+0xFBF2 0x9751  #CJK UNIFIED IDEOGRAPH
+0xFBF3 0x9755  #CJK UNIFIED IDEOGRAPH
+0xFBF4 0x9857  #CJK UNIFIED IDEOGRAPH
+0xFBF5 0x9865  #CJK UNIFIED IDEOGRAPH
+0xFBF6 0xFA2A  #CJK COMPATIBILITY IDEOGRAPH
+0xFBF7 0xFA2B  #CJK COMPATIBILITY IDEOGRAPH
+0xFBF8 0x9927  #CJK UNIFIED IDEOGRAPH
+0xFBF9 0xFA2C  #CJK COMPATIBILITY IDEOGRAPH
+0xFBFA 0x999E  #CJK UNIFIED IDEOGRAPH
+0xFBFB 0x9A4E  #CJK UNIFIED IDEOGRAPH
+0xFBFC 0x9AD9  #CJK UNIFIED IDEOGRAPH
+0xFC40 0x9ADC  #CJK UNIFIED IDEOGRAPH
+0xFC41 0x9B75  #CJK UNIFIED IDEOGRAPH
+0xFC42 0x9B72  #CJK UNIFIED IDEOGRAPH
+0xFC43 0x9B8F  #CJK UNIFIED IDEOGRAPH
+0xFC44 0x9BB1  #CJK UNIFIED IDEOGRAPH
+0xFC45 0x9BBB  #CJK UNIFIED IDEOGRAPH
+0xFC46 0x9C00  #CJK UNIFIED IDEOGRAPH
+0xFC47 0x9D70  #CJK UNIFIED IDEOGRAPH
+0xFC48 0x9D6B  #CJK UNIFIED IDEOGRAPH
+0xFC49 0xFA2D  #CJK COMPATIBILITY IDEOGRAPH
+0xFC4A 0x9E19  #CJK UNIFIED IDEOGRAPH
+0xFC4B 0x9ED1  #CJK UNIFIED IDEOGRAPH
diff --git a/include/CP932.h2 b/include/CP932.h2
new file mode 100644 (file)
index 0000000..f5bc422
--- /dev/null
@@ -0,0 +1,8004 @@
+//#
+//#,Name:,     cp932 to Unicode table
+//#,Unicode, version: 2.0
+//#,Table, version: 2.01
+//#,Table, format:  Format A
+//#,Date:,          04/15/98
+//#
+//#,Contact:,       Shawn.Steele@microsoft.com
+//#
+//#,General, notes: none
+//#
+//#,Format:, Three tab-separated columns
+//#,Column, //#1 is the cp932 code (in hex)
+//#,Column, //#2 is the Unicode (in hex as 0xXXXX)
+//#,Column, //#3 is the Unicode name (follows a comment sign, '//#')
+//#
+//#,The, entries are in cp932 order
+//#
+struct conv_pair{
+       wchar_t cp932;
+       wchar_t unicode;
+};
+struct conv_pair cp932_unicode[]={
+0x00,0x0000,   //#NULL
+0x01,0x0001,   //#START OF HEADING
+0x02,0x0002,   //#START OF TEXT
+0x03,0x0003,   //#END OF TEXT
+0x04,0x0004,   //#END OF TRANSMISSION
+0x05,0x0005,   //#ENQUIRY
+0x06,0x0006,   //#ACKNOWLEDGE
+0x07,0x0007,   //#BELL
+0x08,0x0008,   //#BACKSPACE
+0x09,0x0009,   //#HORIZONTAL TABULATION
+0x0A,0x000A,   //#LINE FEED
+0x0B,0x000B,   //#VERTICAL TABULATION
+0x0C,0x000C,   //#FORM FEED
+0x0D,0x000D,   //#CARRIAGE RETURN
+0x0E,0x000E,   //#SHIFT OUT
+0x0F,0x000F,   //#SHIFT IN
+0x10,0x0010,   //#DATA LINK ESCAPE
+0x11,0x0011,   //#DEVICE CONTROL ONE
+0x12,0x0012,   //#DEVICE CONTROL TWO
+0x13,0x0013,   //#DEVICE CONTROL THREE
+0x14,0x0014,   //#DEVICE CONTROL FOUR
+0x15,0x0015,   //#NEGATIVE ACKNOWLEDGE
+0x16,0x0016,   //#SYNCHRONOUS IDLE
+0x17,0x0017,   //#END OF TRANSMISSION BLOCK
+0x18,0x0018,   //#CANCEL
+0x19,0x0019,   //#END OF MEDIUM
+0x1A,0x001A,   //#SUBSTITUTE
+0x1B,0x001B,   //#ESCAPE
+0x1C,0x001C,   //#FILE SEPARATOR
+0x1D,0x001D,   //#GROUP SEPARATOR
+0x1E,0x001E,   //#RECORD SEPARATOR
+0x1F,0x001F,   //#UNIT SEPARATOR
+0x20,0x0020,   //#SPACE
+0x21,0x0021,   //#EXCLAMATION MARK
+0x22,0x0022,   //#QUOTATION MARK
+0x23,0x0023,   //#NUMBER SIGN
+0x24,0x0024,   //#DOLLAR SIGN
+0x25,0x0025,   //#PERCENT SIGN
+0x26,0x0026,   //#AMPERSAND
+0x27,0x0027,   //#APOSTROPHE
+0x28,0x0028,   //#LEFT PARENTHESIS
+0x29,0x0029,   //#RIGHT PARENTHESIS
+0x2A,0x002A,   //#ASTERISK
+0x2B,0x002B,   //#PLUS SIGN
+0x2C,0x002C,   //#COMMA
+0x2D,0x002D,   //#HYPHEN-MINUS
+0x2E,0x002E,   //#FULL STOP
+0x2F,0x002F,   //#SOLIDUS
+0x30,0x0030,   //#DIGIT ZERO
+0x31,0x0031,   //#DIGIT ONE
+0x32,0x0032,   //#DIGIT TWO
+0x33,0x0033,   //#DIGIT THREE
+0x34,0x0034,   //#DIGIT FOUR
+0x35,0x0035,   //#DIGIT FIVE
+0x36,0x0036,   //#DIGIT SIX
+0x37,0x0037,   //#DIGIT SEVEN
+0x38,0x0038,   //#DIGIT EIGHT
+0x39,0x0039,   //#DIGIT NINE
+0x3A,0x003A,   //#COLON
+0x3B,0x003B,   //#SEMICOLON
+0x3C,0x003C,   //#LESS-THAN SIGN
+0x3D,0x003D,   //#EQUALS SIGN
+0x3E,0x003E,   //#GREATER-THAN SIGN
+0x3F,0x003F,   //#QUESTION MARK
+0x40,0x0040,   //#COMMERCIAL AT
+0x41,0x0041,   //#LATIN CAPITAL LETTER A
+0x42,0x0042,   //#LATIN CAPITAL LETTER B
+0x43,0x0043,   //#LATIN CAPITAL LETTER C
+0x44,0x0044,   //#LATIN CAPITAL LETTER D
+0x45,0x0045,   //#LATIN CAPITAL LETTER E
+0x46,0x0046,   //#LATIN CAPITAL LETTER F
+0x47,0x0047,   //#LATIN CAPITAL LETTER G
+0x48,0x0048,   //#LATIN CAPITAL LETTER H
+0x49,0x0049,   //#LATIN CAPITAL LETTER I
+0x4A,0x004A,   //#LATIN CAPITAL LETTER J
+0x4B,0x004B,   //#LATIN CAPITAL LETTER K
+0x4C,0x004C,   //#LATIN CAPITAL LETTER L
+0x4D,0x004D,   //#LATIN CAPITAL LETTER M
+0x4E,0x004E,   //#LATIN CAPITAL LETTER N
+0x4F,0x004F,   //#LATIN CAPITAL LETTER O
+0x50,0x0050,   //#LATIN CAPITAL LETTER P
+0x51,0x0051,   //#LATIN CAPITAL LETTER Q
+0x52,0x0052,   //#LATIN CAPITAL LETTER R
+0x53,0x0053,   //#LATIN CAPITAL LETTER S
+0x54,0x0054,   //#LATIN CAPITAL LETTER T
+0x55,0x0055,   //#LATIN CAPITAL LETTER U
+0x56,0x0056,   //#LATIN CAPITAL LETTER V
+0x57,0x0057,   //#LATIN CAPITAL LETTER W
+0x58,0x0058,   //#LATIN CAPITAL LETTER X
+0x59,0x0059,   //#LATIN CAPITAL LETTER Y
+0x5A,0x005A,   //#LATIN CAPITAL LETTER Z
+0x5B,0x005B,   //#LEFT SQUARE BRACKET
+0x5C,0x005C,   //#REVERSE SOLIDUS
+0x5D,0x005D,   //#RIGHT SQUARE BRACKET
+0x5E,0x005E,   //#CIRCUMFLEX ACCENT
+0x5F,0x005F,   //#LOW LINE
+0x60,0x0060,   //#GRAVE ACCENT
+0x61,0x0061,   //#LATIN SMALL LETTER A
+0x62,0x0062,   //#LATIN SMALL LETTER B
+0x63,0x0063,   //#LATIN SMALL LETTER C
+0x64,0x0064,   //#LATIN SMALL LETTER D
+0x65,0x0065,   //#LATIN SMALL LETTER E
+0x66,0x0066,   //#LATIN SMALL LETTER F
+0x67,0x0067,   //#LATIN SMALL LETTER G
+0x68,0x0068,   //#LATIN SMALL LETTER H
+0x69,0x0069,   //#LATIN SMALL LETTER I
+0x6A,0x006A,   //#LATIN SMALL LETTER J
+0x6B,0x006B,   //#LATIN SMALL LETTER K
+0x6C,0x006C,   //#LATIN SMALL LETTER L
+0x6D,0x006D,   //#LATIN SMALL LETTER M
+0x6E,0x006E,   //#LATIN SMALL LETTER N
+0x6F,0x006F,   //#LATIN SMALL LETTER O
+0x70,0x0070,   //#LATIN SMALL LETTER P
+0x71,0x0071,   //#LATIN SMALL LETTER Q
+0x72,0x0072,   //#LATIN SMALL LETTER R
+0x73,0x0073,   //#LATIN SMALL LETTER S
+0x74,0x0074,   //#LATIN SMALL LETTER T
+0x75,0x0075,   //#LATIN SMALL LETTER U
+0x76,0x0076,   //#LATIN SMALL LETTER V
+0x77,0x0077,   //#LATIN SMALL LETTER W
+0x78,0x0078,   //#LATIN SMALL LETTER X
+0x79,0x0079,   //#LATIN SMALL LETTER Y
+0x7A,0x007A,   //#LATIN SMALL LETTER Z
+0x7B,0x007B,   //#LEFT CURLY BRACKET
+0x7C,0x007C,   //#VERTICAL LINE
+0x7D,0x007D,   //#RIGHT CURLY BRACKET
+0x7E,0x007E,   //#TILDE
+0x7F,0x007F,   //#DELETE
+0x80,0x0000,//#UNDEFINED,
+0x81,0x0000,//#DBCS, LEAD BYTE
+0x82,0x0000,//#DBCS, LEAD BYTE
+0x83,0x0000,//#DBCS, LEAD BYTE
+0x84,0x0000,//#DBCS, LEAD BYTE
+0x85,0x0000,//#DBCS, LEAD BYTE
+0x86,0x0000,//#DBCS, LEAD BYTE
+0x87,0x0000,//#DBCS, LEAD BYTE
+0x88,0x0000,//#DBCS, LEAD BYTE
+0x89,0x0000,//#DBCS, LEAD BYTE
+0x8A,0x0000,//#DBCS, LEAD BYTE
+0x8B,0x0000,//#DBCS, LEAD BYTE
+0x8C,0x0000,//#DBCS, LEAD BYTE
+0x8D,0x0000,//#DBCS, LEAD BYTE
+0x8E,0x0000,//#DBCS, LEAD BYTE
+0x8F,0x0000,//#DBCS, LEAD BYTE
+0x90,0x0000,//#DBCS, LEAD BYTE
+0x91,0x0000,//#DBCS, LEAD BYTE
+0x92,0x0000,//#DBCS, LEAD BYTE
+0x93,0x0000,//#DBCS, LEAD BYTE
+0x94,0x0000,//#DBCS, LEAD BYTE
+0x95,0x0000,//#DBCS, LEAD BYTE
+0x96,0x0000,//#DBCS, LEAD BYTE
+0x97,0x0000,//#DBCS, LEAD BYTE
+0x98,0x0000,//#DBCS, LEAD BYTE
+0x99,0x0000,//#DBCS, LEAD BYTE
+0x9A,0x0000,//#DBCS, LEAD BYTE
+0x9B,0x0000,//#DBCS, LEAD BYTE
+0x9C,0x0000,//#DBCS, LEAD BYTE
+0x9D,0x0000,//#DBCS, LEAD BYTE
+0x9E,0x0000,//#DBCS, LEAD BYTE
+0x9F,0x0000,//#DBCS, LEAD BYTE
+0xA0,0x0000,//#UNDEFINED,
+0xA1,0xFF61,   //#HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2,0xFF62,   //#HALFWIDTH LEFT CORNER BRACKET
+0xA3,0xFF63,   //#HALFWIDTH RIGHT CORNER BRACKET
+0xA4,0xFF64,   //#HALFWIDTH IDEOGRAPHIC COMMA
+0xA5,0xFF65,   //#HALFWIDTH KATAKANA MIDDLE DOT
+0xA6,0xFF66,   //#HALFWIDTH KATAKANA LETTER WO
+0xA7,0xFF67,   //#HALFWIDTH KATAKANA LETTER SMALL A
+0xA8,0xFF68,   //#HALFWIDTH KATAKANA LETTER SMALL I
+0xA9,0xFF69,   //#HALFWIDTH KATAKANA LETTER SMALL U
+0xAA,0xFF6A,   //#HALFWIDTH KATAKANA LETTER SMALL E
+0xAB,0xFF6B,   //#HALFWIDTH KATAKANA LETTER SMALL O
+0xAC,0xFF6C,   //#HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD,0xFF6D,   //#HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE,0xFF6E,   //#HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF,0xFF6F,   //#HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0,0xFF70,   //#HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1,0xFF71,   //#HALFWIDTH KATAKANA LETTER A
+0xB2,0xFF72,   //#HALFWIDTH KATAKANA LETTER I
+0xB3,0xFF73,   //#HALFWIDTH KATAKANA LETTER U
+0xB4,0xFF74,   //#HALFWIDTH KATAKANA LETTER E
+0xB5,0xFF75,   //#HALFWIDTH KATAKANA LETTER O
+0xB6,0xFF76,   //#HALFWIDTH KATAKANA LETTER KA
+0xB7,0xFF77,   //#HALFWIDTH KATAKANA LETTER KI
+0xB8,0xFF78,   //#HALFWIDTH KATAKANA LETTER KU
+0xB9,0xFF79,   //#HALFWIDTH KATAKANA LETTER KE
+0xBA,0xFF7A,   //#HALFWIDTH KATAKANA LETTER KO
+0xBB,0xFF7B,   //#HALFWIDTH KATAKANA LETTER SA
+0xBC,0xFF7C,   //#HALFWIDTH KATAKANA LETTER SI
+0xBD,0xFF7D,   //#HALFWIDTH KATAKANA LETTER SU
+0xBE,0xFF7E,   //#HALFWIDTH KATAKANA LETTER SE
+0xBF,0xFF7F,   //#HALFWIDTH KATAKANA LETTER SO
+0xC0,0xFF80,   //#HALFWIDTH KATAKANA LETTER TA
+0xC1,0xFF81,   //#HALFWIDTH KATAKANA LETTER TI
+0xC2,0xFF82,   //#HALFWIDTH KATAKANA LETTER TU
+0xC3,0xFF83,   //#HALFWIDTH KATAKANA LETTER TE
+0xC4,0xFF84,   //#HALFWIDTH KATAKANA LETTER TO
+0xC5,0xFF85,   //#HALFWIDTH KATAKANA LETTER NA
+0xC6,0xFF86,   //#HALFWIDTH KATAKANA LETTER NI
+0xC7,0xFF87,   //#HALFWIDTH KATAKANA LETTER NU
+0xC8,0xFF88,   //#HALFWIDTH KATAKANA LETTER NE
+0xC9,0xFF89,   //#HALFWIDTH KATAKANA LETTER NO
+0xCA,0xFF8A,   //#HALFWIDTH KATAKANA LETTER HA
+0xCB,0xFF8B,   //#HALFWIDTH KATAKANA LETTER HI
+0xCC,0xFF8C,   //#HALFWIDTH KATAKANA LETTER HU
+0xCD,0xFF8D,   //#HALFWIDTH KATAKANA LETTER HE
+0xCE,0xFF8E,   //#HALFWIDTH KATAKANA LETTER HO
+0xCF,0xFF8F,   //#HALFWIDTH KATAKANA LETTER MA
+0xD0,0xFF90,   //#HALFWIDTH KATAKANA LETTER MI
+0xD1,0xFF91,   //#HALFWIDTH KATAKANA LETTER MU
+0xD2,0xFF92,   //#HALFWIDTH KATAKANA LETTER ME
+0xD3,0xFF93,   //#HALFWIDTH KATAKANA LETTER MO
+0xD4,0xFF94,   //#HALFWIDTH KATAKANA LETTER YA
+0xD5,0xFF95,   //#HALFWIDTH KATAKANA LETTER YU
+0xD6,0xFF96,   //#HALFWIDTH KATAKANA LETTER YO
+0xD7,0xFF97,   //#HALFWIDTH KATAKANA LETTER RA
+0xD8,0xFF98,   //#HALFWIDTH KATAKANA LETTER RI
+0xD9,0xFF99,   //#HALFWIDTH KATAKANA LETTER RU
+0xDA,0xFF9A,   //#HALFWIDTH KATAKANA LETTER RE
+0xDB,0xFF9B,   //#HALFWIDTH KATAKANA LETTER RO
+0xDC,0xFF9C,   //#HALFWIDTH KATAKANA LETTER WA
+0xDD,0xFF9D,   //#HALFWIDTH KATAKANA LETTER N
+0xDE,0xFF9E,   //#HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF,0xFF9F,   //#HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE0,0x0000,//#DBCS, LEAD BYTE
+0xE1,0x0000,//#DBCS, LEAD BYTE
+0xE2,0x0000,//#DBCS, LEAD BYTE
+0xE3,0x0000,//#DBCS, LEAD BYTE
+0xE4,0x0000,//#DBCS, LEAD BYTE
+0xE5,0x0000,//#DBCS, LEAD BYTE
+0xE6,0x0000,//#DBCS, LEAD BYTE
+0xE7,0x0000,//#DBCS, LEAD BYTE
+0xE8,0x0000,//#DBCS, LEAD BYTE
+0xE9,0x0000,//#DBCS, LEAD BYTE
+0xEA,0x0000,//#DBCS, LEAD BYTE
+0xEB,0x0000,//#DBCS, LEAD BYTE
+0xEC,0x0000,//#DBCS, LEAD BYTE
+0xED,0x0000,//#DBCS, LEAD BYTE
+0xEE,0x0000,//#DBCS, LEAD BYTE
+0xEF,0x0000,//#DBCS, LEAD BYTE
+0xF0,0x0000,//#DBCS, LEAD BYTE
+0xF1,0x0000,//#DBCS, LEAD BYTE
+0xF2,0x0000,//#DBCS, LEAD BYTE
+0xF3,0x0000,//#DBCS, LEAD BYTE
+0xF4,0x0000,//#DBCS, LEAD BYTE
+0xF5,0x0000,//#DBCS, LEAD BYTE
+0xF6,0x0000,//#DBCS, LEAD BYTE
+0xF7,0x0000,//#DBCS, LEAD BYTE
+0xF8,0x0000,//#DBCS, LEAD BYTE
+0xF9,0x0000,//#DBCS, LEAD BYTE
+0xFA,0x0000,//#DBCS, LEAD BYTE
+0xFB,0x0000,//#DBCS, LEAD BYTE
+0xFC,0x0000,//#DBCS, LEAD BYTE
+0xFD,0x0000,//#UNDEFINED,
+0xFE,0x0000,//#UNDEFINED,
+0xFF,0x0000,//#UNDEFINED,
+0x8140,0x3000, //#IDEOGRAPHIC SPACE
+0x8141,0x3001, //#IDEOGRAPHIC COMMA
+0x8142,0x3002, //#IDEOGRAPHIC FULL STOP
+0x8143,0xFF0C, //#FULLWIDTH COMMA
+0x8144,0xFF0E, //#FULLWIDTH FULL STOP
+0x8145,0x30FB, //#KATAKANA MIDDLE DOT
+0x8146,0xFF1A, //#FULLWIDTH COLON
+0x8147,0xFF1B, //#FULLWIDTH SEMICOLON
+0x8148,0xFF1F, //#FULLWIDTH QUESTION MARK
+0x8149,0xFF01, //#FULLWIDTH EXCLAMATION MARK
+0x814A,0x309B, //#KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B,0x309C, //#KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C,0x00B4, //#ACUTE ACCENT
+0x814D,0xFF40, //#FULLWIDTH GRAVE ACCENT
+0x814E,0x00A8, //#DIAERESIS
+0x814F,0xFF3E, //#FULLWIDTH CIRCUMFLEX ACCENT
+0x8150,0xFFE3, //#FULLWIDTH MACRON
+0x8151,0xFF3F, //#FULLWIDTH LOW LINE
+0x8152,0x30FD, //#KATAKANA ITERATION MARK
+0x8153,0x30FE, //#KATAKANA VOICED ITERATION MARK
+0x8154,0x309D, //#HIRAGANA ITERATION MARK
+0x8155,0x309E, //#HIRAGANA VOICED ITERATION MARK
+0x8156,0x3003, //#DITTO MARK
+0x8157,0x4EDD, //#CJK UNIFIED IDEOGRAPH
+0x8158,0x3005, //#IDEOGRAPHIC ITERATION MARK
+0x8159,0x3006, //#IDEOGRAPHIC CLOSING MARK
+0x815A,0x3007, //#IDEOGRAPHIC NUMBER ZERO
+0x815B,0x30FC, //#KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C,0x2015, //#HORIZONTAL BAR
+0x815D,0x2010, //#HYPHEN
+0x815E,0xFF0F, //#FULLWIDTH SOLIDUS
+0x815F,0xFF3C, //#FULLWIDTH REVERSE SOLIDUS
+0x8160,0xFF5E, //#FULLWIDTH TILDE
+0x8161,0x2225, //#PARALLEL TO
+0x8162,0xFF5C, //#FULLWIDTH VERTICAL LINE
+0x8163,0x2026, //#HORIZONTAL ELLIPSIS
+0x8164,0x2025, //#TWO DOT LEADER
+0x8165,0x2018, //#LEFT SINGLE QUOTATION MARK
+0x8166,0x2019, //#RIGHT SINGLE QUOTATION MARK
+0x8167,0x201C, //#LEFT DOUBLE QUOTATION MARK
+0x8168,0x201D, //#RIGHT DOUBLE QUOTATION MARK
+0x8169,0xFF08, //#FULLWIDTH LEFT PARENTHESIS
+0x816A,0xFF09, //#FULLWIDTH RIGHT PARENTHESIS
+0x816B,0x3014, //#LEFT TORTOISE SHELL BRACKET
+0x816C,0x3015, //#RIGHT TORTOISE SHELL BRACKET
+0x816D,0xFF3B, //#FULLWIDTH LEFT SQUARE BRACKET
+0x816E,0xFF3D, //#FULLWIDTH RIGHT SQUARE BRACKET
+0x816F,0xFF5B, //#FULLWIDTH LEFT CURLY BRACKET
+0x8170,0xFF5D, //#FULLWIDTH RIGHT CURLY BRACKET
+0x8171,0x3008, //#LEFT ANGLE BRACKET
+0x8172,0x3009, //#RIGHT ANGLE BRACKET
+0x8173,0x300A, //#LEFT DOUBLE ANGLE BRACKET
+0x8174,0x300B, //#RIGHT DOUBLE ANGLE BRACKET
+0x8175,0x300C, //#LEFT CORNER BRACKET
+0x8176,0x300D, //#RIGHT CORNER BRACKET
+0x8177,0x300E, //#LEFT WHITE CORNER BRACKET
+0x8178,0x300F, //#RIGHT WHITE CORNER BRACKET
+0x8179,0x3010, //#LEFT BLACK LENTICULAR BRACKET
+0x817A,0x3011, //#RIGHT BLACK LENTICULAR BRACKET
+0x817B,0xFF0B, //#FULLWIDTH PLUS SIGN
+0x817C,0xFF0D, //#FULLWIDTH HYPHEN-MINUS
+0x817D,0x00B1, //#PLUS-MINUS SIGN
+0x817E,0x00D7, //#MULTIPLICATION SIGN
+0x8180,0x00F7, //#DIVISION SIGN
+0x8181,0xFF1D, //#FULLWIDTH EQUALS SIGN
+0x8182,0x2260, //#NOT EQUAL TO
+0x8183,0xFF1C, //#FULLWIDTH LESS-THAN SIGN
+0x8184,0xFF1E, //#FULLWIDTH GREATER-THAN SIGN
+0x8185,0x2266, //#LESS-THAN OVER EQUAL TO
+0x8186,0x2267, //#GREATER-THAN OVER EQUAL TO
+0x8187,0x221E, //#INFINITY
+0x8188,0x2234, //#THEREFORE
+0x8189,0x2642, //#MALE SIGN
+0x818A,0x2640, //#FEMALE SIGN
+0x818B,0x00B0, //#DEGREE SIGN
+0x818C,0x2032, //#PRIME
+0x818D,0x2033, //#DOUBLE PRIME
+0x818E,0x2103, //#DEGREE CELSIUS
+0x818F,0xFFE5, //#FULLWIDTH YEN SIGN
+0x8190,0xFF04, //#FULLWIDTH DOLLAR SIGN
+0x8191,0xFFE0, //#FULLWIDTH CENT SIGN
+0x8192,0xFFE1, //#FULLWIDTH POUND SIGN
+0x8193,0xFF05, //#FULLWIDTH PERCENT SIGN
+0x8194,0xFF03, //#FULLWIDTH NUMBER SIGN
+0x8195,0xFF06, //#FULLWIDTH AMPERSAND
+0x8196,0xFF0A, //#FULLWIDTH ASTERISK
+0x8197,0xFF20, //#FULLWIDTH COMMERCIAL AT
+0x8198,0x00A7, //#SECTION SIGN
+0x8199,0x2606, //#WHITE STAR
+0x819A,0x2605, //#BLACK STAR
+0x819B,0x25CB, //#WHITE CIRCLE
+0x819C,0x25CF, //#BLACK CIRCLE
+0x819D,0x25CE, //#BULLSEYE
+0x819E,0x25C7, //#WHITE DIAMOND
+0x819F,0x25C6, //#BLACK DIAMOND
+0x81A0,0x25A1, //#WHITE SQUARE
+0x81A1,0x25A0, //#BLACK SQUARE
+0x81A2,0x25B3, //#WHITE UP-POINTING TRIANGLE
+0x81A3,0x25B2, //#BLACK UP-POINTING TRIANGLE
+0x81A4,0x25BD, //#WHITE DOWN-POINTING TRIANGLE
+0x81A5,0x25BC, //#BLACK DOWN-POINTING TRIANGLE
+0x81A6,0x203B, //#REFERENCE MARK
+0x81A7,0x3012, //#POSTAL MARK
+0x81A8,0x2192, //#RIGHTWARDS ARROW
+0x81A9,0x2190, //#LEFTWARDS ARROW
+0x81AA,0x2191, //#UPWARDS ARROW
+0x81AB,0x2193, //#DOWNWARDS ARROW
+0x81AC,0x3013, //#GETA MARK
+0x81B8,0x2208, //#ELEMENT OF
+0x81B9,0x220B, //#CONTAINS AS MEMBER
+0x81BA,0x2286, //#SUBSET OF OR EQUAL TO
+0x81BB,0x2287, //#SUPERSET OF OR EQUAL TO
+0x81BC,0x2282, //#SUBSET OF
+0x81BD,0x2283, //#SUPERSET OF
+0x81BE,0x222A, //#UNION
+0x81BF,0x2229, //#INTERSECTION
+0x81C8,0x2227, //#LOGICAL AND
+0x81C9,0x2228, //#LOGICAL OR
+0x81CA,0xFFE2, //#FULLWIDTH NOT SIGN
+0x81CB,0x21D2, //#RIGHTWARDS DOUBLE ARROW
+0x81CC,0x21D4, //#LEFT RIGHT DOUBLE ARROW
+0x81CD,0x2200, //#FOR ALL
+0x81CE,0x2203, //#THERE EXISTS
+0x81DA,0x2220, //#ANGLE
+0x81DB,0x22A5, //#UP TACK
+0x81DC,0x2312, //#ARC
+0x81DD,0x2202, //#PARTIAL DIFFERENTIAL
+0x81DE,0x2207, //#NABLA
+0x81DF,0x2261, //#IDENTICAL TO
+0x81E0,0x2252, //#APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1,0x226A, //#MUCH LESS-THAN
+0x81E2,0x226B, //#MUCH GREATER-THAN
+0x81E3,0x221A, //#SQUARE ROOT
+0x81E4,0x223D, //#REVERSED TILDE
+0x81E5,0x221D, //#PROPORTIONAL TO
+0x81E6,0x2235, //#BECAUSE
+0x81E7,0x222B, //#INTEGRAL
+0x81E8,0x222C, //#DOUBLE INTEGRAL
+0x81F0,0x212B, //#ANGSTROM SIGN
+0x81F1,0x2030, //#PER MILLE SIGN
+0x81F2,0x266F, //#MUSIC SHARP SIGN
+0x81F3,0x266D, //#MUSIC FLAT SIGN
+0x81F4,0x266A, //#EIGHTH NOTE
+0x81F5,0x2020, //#DAGGER
+0x81F6,0x2021, //#DOUBLE DAGGER
+0x81F7,0x00B6, //#PILCROW SIGN
+0x81FC,0x25EF, //#LARGE CIRCLE
+0x824F,0xFF10, //#FULLWIDTH DIGIT ZERO
+0x8250,0xFF11, //#FULLWIDTH DIGIT ONE
+0x8251,0xFF12, //#FULLWIDTH DIGIT TWO
+0x8252,0xFF13, //#FULLWIDTH DIGIT THREE
+0x8253,0xFF14, //#FULLWIDTH DIGIT FOUR
+0x8254,0xFF15, //#FULLWIDTH DIGIT FIVE
+0x8255,0xFF16, //#FULLWIDTH DIGIT SIX
+0x8256,0xFF17, //#FULLWIDTH DIGIT SEVEN
+0x8257,0xFF18, //#FULLWIDTH DIGIT EIGHT
+0x8258,0xFF19, //#FULLWIDTH DIGIT NINE
+0x8260,0xFF21, //#FULLWIDTH LATIN CAPITAL LETTER A
+0x8261,0xFF22, //#FULLWIDTH LATIN CAPITAL LETTER B
+0x8262,0xFF23, //#FULLWIDTH LATIN CAPITAL LETTER C
+0x8263,0xFF24, //#FULLWIDTH LATIN CAPITAL LETTER D
+0x8264,0xFF25, //#FULLWIDTH LATIN CAPITAL LETTER E
+0x8265,0xFF26, //#FULLWIDTH LATIN CAPITAL LETTER F
+0x8266,0xFF27, //#FULLWIDTH LATIN CAPITAL LETTER G
+0x8267,0xFF28, //#FULLWIDTH LATIN CAPITAL LETTER H
+0x8268,0xFF29, //#FULLWIDTH LATIN CAPITAL LETTER I
+0x8269,0xFF2A, //#FULLWIDTH LATIN CAPITAL LETTER J
+0x826A,0xFF2B, //#FULLWIDTH LATIN CAPITAL LETTER K
+0x826B,0xFF2C, //#FULLWIDTH LATIN CAPITAL LETTER L
+0x826C,0xFF2D, //#FULLWIDTH LATIN CAPITAL LETTER M
+0x826D,0xFF2E, //#FULLWIDTH LATIN CAPITAL LETTER N
+0x826E,0xFF2F, //#FULLWIDTH LATIN CAPITAL LETTER O
+0x826F,0xFF30, //#FULLWIDTH LATIN CAPITAL LETTER P
+0x8270,0xFF31, //#FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271,0xFF32, //#FULLWIDTH LATIN CAPITAL LETTER R
+0x8272,0xFF33, //#FULLWIDTH LATIN CAPITAL LETTER S
+0x8273,0xFF34, //#FULLWIDTH LATIN CAPITAL LETTER T
+0x8274,0xFF35, //#FULLWIDTH LATIN CAPITAL LETTER U
+0x8275,0xFF36, //#FULLWIDTH LATIN CAPITAL LETTER V
+0x8276,0xFF37, //#FULLWIDTH LATIN CAPITAL LETTER W
+0x8277,0xFF38, //#FULLWIDTH LATIN CAPITAL LETTER X
+0x8278,0xFF39, //#FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279,0xFF3A, //#FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281,0xFF41, //#FULLWIDTH LATIN SMALL LETTER A
+0x8282,0xFF42, //#FULLWIDTH LATIN SMALL LETTER B
+0x8283,0xFF43, //#FULLWIDTH LATIN SMALL LETTER C
+0x8284,0xFF44, //#FULLWIDTH LATIN SMALL LETTER D
+0x8285,0xFF45, //#FULLWIDTH LATIN SMALL LETTER E
+0x8286,0xFF46, //#FULLWIDTH LATIN SMALL LETTER F
+0x8287,0xFF47, //#FULLWIDTH LATIN SMALL LETTER G
+0x8288,0xFF48, //#FULLWIDTH LATIN SMALL LETTER H
+0x8289,0xFF49, //#FULLWIDTH LATIN SMALL LETTER I
+0x828A,0xFF4A, //#FULLWIDTH LATIN SMALL LETTER J
+0x828B,0xFF4B, //#FULLWIDTH LATIN SMALL LETTER K
+0x828C,0xFF4C, //#FULLWIDTH LATIN SMALL LETTER L
+0x828D,0xFF4D, //#FULLWIDTH LATIN SMALL LETTER M
+0x828E,0xFF4E, //#FULLWIDTH LATIN SMALL LETTER N
+0x828F,0xFF4F, //#FULLWIDTH LATIN SMALL LETTER O
+0x8290,0xFF50, //#FULLWIDTH LATIN SMALL LETTER P
+0x8291,0xFF51, //#FULLWIDTH LATIN SMALL LETTER Q
+0x8292,0xFF52, //#FULLWIDTH LATIN SMALL LETTER R
+0x8293,0xFF53, //#FULLWIDTH LATIN SMALL LETTER S
+0x8294,0xFF54, //#FULLWIDTH LATIN SMALL LETTER T
+0x8295,0xFF55, //#FULLWIDTH LATIN SMALL LETTER U
+0x8296,0xFF56, //#FULLWIDTH LATIN SMALL LETTER V
+0x8297,0xFF57, //#FULLWIDTH LATIN SMALL LETTER W
+0x8298,0xFF58, //#FULLWIDTH LATIN SMALL LETTER X
+0x8299,0xFF59, //#FULLWIDTH LATIN SMALL LETTER Y
+0x829A,0xFF5A, //#FULLWIDTH LATIN SMALL LETTER Z
+0x829F,0x3041, //#HIRAGANA LETTER SMALL A
+0x82A0,0x3042, //#HIRAGANA LETTER A
+0x82A1,0x3043, //#HIRAGANA LETTER SMALL I
+0x82A2,0x3044, //#HIRAGANA LETTER I
+0x82A3,0x3045, //#HIRAGANA LETTER SMALL U
+0x82A4,0x3046, //#HIRAGANA LETTER U
+0x82A5,0x3047, //#HIRAGANA LETTER SMALL E
+0x82A6,0x3048, //#HIRAGANA LETTER E
+0x82A7,0x3049, //#HIRAGANA LETTER SMALL O
+0x82A8,0x304A, //#HIRAGANA LETTER O
+0x82A9,0x304B, //#HIRAGANA LETTER KA
+0x82AA,0x304C, //#HIRAGANA LETTER GA
+0x82AB,0x304D, //#HIRAGANA LETTER KI
+0x82AC,0x304E, //#HIRAGANA LETTER GI
+0x82AD,0x304F, //#HIRAGANA LETTER KU
+0x82AE,0x3050, //#HIRAGANA LETTER GU
+0x82AF,0x3051, //#HIRAGANA LETTER KE
+0x82B0,0x3052, //#HIRAGANA LETTER GE
+0x82B1,0x3053, //#HIRAGANA LETTER KO
+0x82B2,0x3054, //#HIRAGANA LETTER GO
+0x82B3,0x3055, //#HIRAGANA LETTER SA
+0x82B4,0x3056, //#HIRAGANA LETTER ZA
+0x82B5,0x3057, //#HIRAGANA LETTER SI
+0x82B6,0x3058, //#HIRAGANA LETTER ZI
+0x82B7,0x3059, //#HIRAGANA LETTER SU
+0x82B8,0x305A, //#HIRAGANA LETTER ZU
+0x82B9,0x305B, //#HIRAGANA LETTER SE
+0x82BA,0x305C, //#HIRAGANA LETTER ZE
+0x82BB,0x305D, //#HIRAGANA LETTER SO
+0x82BC,0x305E, //#HIRAGANA LETTER ZO
+0x82BD,0x305F, //#HIRAGANA LETTER TA
+0x82BE,0x3060, //#HIRAGANA LETTER DA
+0x82BF,0x3061, //#HIRAGANA LETTER TI
+0x82C0,0x3062, //#HIRAGANA LETTER DI
+0x82C1,0x3063, //#HIRAGANA LETTER SMALL TU
+0x82C2,0x3064, //#HIRAGANA LETTER TU
+0x82C3,0x3065, //#HIRAGANA LETTER DU
+0x82C4,0x3066, //#HIRAGANA LETTER TE
+0x82C5,0x3067, //#HIRAGANA LETTER DE
+0x82C6,0x3068, //#HIRAGANA LETTER TO
+0x82C7,0x3069, //#HIRAGANA LETTER DO
+0x82C8,0x306A, //#HIRAGANA LETTER NA
+0x82C9,0x306B, //#HIRAGANA LETTER NI
+0x82CA,0x306C, //#HIRAGANA LETTER NU
+0x82CB,0x306D, //#HIRAGANA LETTER NE
+0x82CC,0x306E, //#HIRAGANA LETTER NO
+0x82CD,0x306F, //#HIRAGANA LETTER HA
+0x82CE,0x3070, //#HIRAGANA LETTER BA
+0x82CF,0x3071, //#HIRAGANA LETTER PA
+0x82D0,0x3072, //#HIRAGANA LETTER HI
+0x82D1,0x3073, //#HIRAGANA LETTER BI
+0x82D2,0x3074, //#HIRAGANA LETTER PI
+0x82D3,0x3075, //#HIRAGANA LETTER HU
+0x82D4,0x3076, //#HIRAGANA LETTER BU
+0x82D5,0x3077, //#HIRAGANA LETTER PU
+0x82D6,0x3078, //#HIRAGANA LETTER HE
+0x82D7,0x3079, //#HIRAGANA LETTER BE
+0x82D8,0x307A, //#HIRAGANA LETTER PE
+0x82D9,0x307B, //#HIRAGANA LETTER HO
+0x82DA,0x307C, //#HIRAGANA LETTER BO
+0x82DB,0x307D, //#HIRAGANA LETTER PO
+0x82DC,0x307E, //#HIRAGANA LETTER MA
+0x82DD,0x307F, //#HIRAGANA LETTER MI
+0x82DE,0x3080, //#HIRAGANA LETTER MU
+0x82DF,0x3081, //#HIRAGANA LETTER ME
+0x82E0,0x3082, //#HIRAGANA LETTER MO
+0x82E1,0x3083, //#HIRAGANA LETTER SMALL YA
+0x82E2,0x3084, //#HIRAGANA LETTER YA
+0x82E3,0x3085, //#HIRAGANA LETTER SMALL YU
+0x82E4,0x3086, //#HIRAGANA LETTER YU
+0x82E5,0x3087, //#HIRAGANA LETTER SMALL YO
+0x82E6,0x3088, //#HIRAGANA LETTER YO
+0x82E7,0x3089, //#HIRAGANA LETTER RA
+0x82E8,0x308A, //#HIRAGANA LETTER RI
+0x82E9,0x308B, //#HIRAGANA LETTER RU
+0x82EA,0x308C, //#HIRAGANA LETTER RE
+0x82EB,0x308D, //#HIRAGANA LETTER RO
+0x82EC,0x308E, //#HIRAGANA LETTER SMALL WA
+0x82ED,0x308F, //#HIRAGANA LETTER WA
+0x82EE,0x3090, //#HIRAGANA LETTER WI
+0x82EF,0x3091, //#HIRAGANA LETTER WE
+0x82F0,0x3092, //#HIRAGANA LETTER WO
+0x82F1,0x3093, //#HIRAGANA LETTER N
+0x8340,0x30A1, //#KATAKANA LETTER SMALL A
+0x8341,0x30A2, //#KATAKANA LETTER A
+0x8342,0x30A3, //#KATAKANA LETTER SMALL I
+0x8343,0x30A4, //#KATAKANA LETTER I
+0x8344,0x30A5, //#KATAKANA LETTER SMALL U
+0x8345,0x30A6, //#KATAKANA LETTER U
+0x8346,0x30A7, //#KATAKANA LETTER SMALL E
+0x8347,0x30A8, //#KATAKANA LETTER E
+0x8348,0x30A9, //#KATAKANA LETTER SMALL O
+0x8349,0x30AA, //#KATAKANA LETTER O
+0x834A,0x30AB, //#KATAKANA LETTER KA
+0x834B,0x30AC, //#KATAKANA LETTER GA
+0x834C,0x30AD, //#KATAKANA LETTER KI
+0x834D,0x30AE, //#KATAKANA LETTER GI
+0x834E,0x30AF, //#KATAKANA LETTER KU
+0x834F,0x30B0, //#KATAKANA LETTER GU
+0x8350,0x30B1, //#KATAKANA LETTER KE
+0x8351,0x30B2, //#KATAKANA LETTER GE
+0x8352,0x30B3, //#KATAKANA LETTER KO
+0x8353,0x30B4, //#KATAKANA LETTER GO
+0x8354,0x30B5, //#KATAKANA LETTER SA
+0x8355,0x30B6, //#KATAKANA LETTER ZA
+0x8356,0x30B7, //#KATAKANA LETTER SI
+0x8357,0x30B8, //#KATAKANA LETTER ZI
+0x8358,0x30B9, //#KATAKANA LETTER SU
+0x8359,0x30BA, //#KATAKANA LETTER ZU
+0x835A,0x30BB, //#KATAKANA LETTER SE
+0x835B,0x30BC, //#KATAKANA LETTER ZE
+0x835C,0x30BD, //#KATAKANA LETTER SO
+0x835D,0x30BE, //#KATAKANA LETTER ZO
+0x835E,0x30BF, //#KATAKANA LETTER TA
+0x835F,0x30C0, //#KATAKANA LETTER DA
+0x8360,0x30C1, //#KATAKANA LETTER TI
+0x8361,0x30C2, //#KATAKANA LETTER DI
+0x8362,0x30C3, //#KATAKANA LETTER SMALL TU
+0x8363,0x30C4, //#KATAKANA LETTER TU
+0x8364,0x30C5, //#KATAKANA LETTER DU
+0x8365,0x30C6, //#KATAKANA LETTER TE
+0x8366,0x30C7, //#KATAKANA LETTER DE
+0x8367,0x30C8, //#KATAKANA LETTER TO
+0x8368,0x30C9, //#KATAKANA LETTER DO
+0x8369,0x30CA, //#KATAKANA LETTER NA
+0x836A,0x30CB, //#KATAKANA LETTER NI
+0x836B,0x30CC, //#KATAKANA LETTER NU
+0x836C,0x30CD, //#KATAKANA LETTER NE
+0x836D,0x30CE, //#KATAKANA LETTER NO
+0x836E,0x30CF, //#KATAKANA LETTER HA
+0x836F,0x30D0, //#KATAKANA LETTER BA
+0x8370,0x30D1, //#KATAKANA LETTER PA
+0x8371,0x30D2, //#KATAKANA LETTER HI
+0x8372,0x30D3, //#KATAKANA LETTER BI
+0x8373,0x30D4, //#KATAKANA LETTER PI
+0x8374,0x30D5, //#KATAKANA LETTER HU
+0x8375,0x30D6, //#KATAKANA LETTER BU
+0x8376,0x30D7, //#KATAKANA LETTER PU
+0x8377,0x30D8, //#KATAKANA LETTER HE
+0x8378,0x30D9, //#KATAKANA LETTER BE
+0x8379,0x30DA, //#KATAKANA LETTER PE
+0x837A,0x30DB, //#KATAKANA LETTER HO
+0x837B,0x30DC, //#KATAKANA LETTER BO
+0x837C,0x30DD, //#KATAKANA LETTER PO
+0x837D,0x30DE, //#KATAKANA LETTER MA
+0x837E,0x30DF, //#KATAKANA LETTER MI
+0x8380,0x30E0, //#KATAKANA LETTER MU
+0x8381,0x30E1, //#KATAKANA LETTER ME
+0x8382,0x30E2, //#KATAKANA LETTER MO
+0x8383,0x30E3, //#KATAKANA LETTER SMALL YA
+0x8384,0x30E4, //#KATAKANA LETTER YA
+0x8385,0x30E5, //#KATAKANA LETTER SMALL YU
+0x8386,0x30E6, //#KATAKANA LETTER YU
+0x8387,0x30E7, //#KATAKANA LETTER SMALL YO
+0x8388,0x30E8, //#KATAKANA LETTER YO
+0x8389,0x30E9, //#KATAKANA LETTER RA
+0x838A,0x30EA, //#KATAKANA LETTER RI
+0x838B,0x30EB, //#KATAKANA LETTER RU
+0x838C,0x30EC, //#KATAKANA LETTER RE
+0x838D,0x30ED, //#KATAKANA LETTER RO
+0x838E,0x30EE, //#KATAKANA LETTER SMALL WA
+0x838F,0x30EF, //#KATAKANA LETTER WA
+0x8390,0x30F0, //#KATAKANA LETTER WI
+0x8391,0x30F1, //#KATAKANA LETTER WE
+0x8392,0x30F2, //#KATAKANA LETTER WO
+0x8393,0x30F3, //#KATAKANA LETTER N
+0x8394,0x30F4, //#KATAKANA LETTER VU
+0x8395,0x30F5, //#KATAKANA LETTER SMALL KA
+0x8396,0x30F6, //#KATAKANA LETTER SMALL KE
+0x839F,0x0391, //#GREEK CAPITAL LETTER ALPHA
+0x83A0,0x0392, //#GREEK CAPITAL LETTER BETA
+0x83A1,0x0393, //#GREEK CAPITAL LETTER GAMMA
+0x83A2,0x0394, //#GREEK CAPITAL LETTER DELTA
+0x83A3,0x0395, //#GREEK CAPITAL LETTER EPSILON
+0x83A4,0x0396, //#GREEK CAPITAL LETTER ZETA
+0x83A5,0x0397, //#GREEK CAPITAL LETTER ETA
+0x83A6,0x0398, //#GREEK CAPITAL LETTER THETA
+0x83A7,0x0399, //#GREEK CAPITAL LETTER IOTA
+0x83A8,0x039A, //#GREEK CAPITAL LETTER KAPPA
+0x83A9,0x039B, //#GREEK CAPITAL LETTER LAMDA
+0x83AA,0x039C, //#GREEK CAPITAL LETTER MU
+0x83AB,0x039D, //#GREEK CAPITAL LETTER NU
+0x83AC,0x039E, //#GREEK CAPITAL LETTER XI
+0x83AD,0x039F, //#GREEK CAPITAL LETTER OMICRON
+0x83AE,0x03A0, //#GREEK CAPITAL LETTER PI
+0x83AF,0x03A1, //#GREEK CAPITAL LETTER RHO
+0x83B0,0x03A3, //#GREEK CAPITAL LETTER SIGMA
+0x83B1,0x03A4, //#GREEK CAPITAL LETTER TAU
+0x83B2,0x03A5, //#GREEK CAPITAL LETTER UPSILON
+0x83B3,0x03A6, //#GREEK CAPITAL LETTER PHI
+0x83B4,0x03A7, //#GREEK CAPITAL LETTER CHI
+0x83B5,0x03A8, //#GREEK CAPITAL LETTER PSI
+0x83B6,0x03A9, //#GREEK CAPITAL LETTER OMEGA
+0x83BF,0x03B1, //#GREEK SMALL LETTER ALPHA
+0x83C0,0x03B2, //#GREEK SMALL LETTER BETA
+0x83C1,0x03B3, //#GREEK SMALL LETTER GAMMA
+0x83C2,0x03B4, //#GREEK SMALL LETTER DELTA
+0x83C3,0x03B5, //#GREEK SMALL LETTER EPSILON
+0x83C4,0x03B6, //#GREEK SMALL LETTER ZETA
+0x83C5,0x03B7, //#GREEK SMALL LETTER ETA
+0x83C6,0x03B8, //#GREEK SMALL LETTER THETA
+0x83C7,0x03B9, //#GREEK SMALL LETTER IOTA
+0x83C8,0x03BA, //#GREEK SMALL LETTER KAPPA
+0x83C9,0x03BB, //#GREEK SMALL LETTER LAMDA
+0x83CA,0x03BC, //#GREEK SMALL LETTER MU
+0x83CB,0x03BD, //#GREEK SMALL LETTER NU
+0x83CC,0x03BE, //#GREEK SMALL LETTER XI
+0x83CD,0x03BF, //#GREEK SMALL LETTER OMICRON
+0x83CE,0x03C0, //#GREEK SMALL LETTER PI
+0x83CF,0x03C1, //#GREEK SMALL LETTER RHO
+0x83D0,0x03C3, //#GREEK SMALL LETTER SIGMA
+0x83D1,0x03C4, //#GREEK SMALL LETTER TAU
+0x83D2,0x03C5, //#GREEK SMALL LETTER UPSILON
+0x83D3,0x03C6, //#GREEK SMALL LETTER PHI
+0x83D4,0x03C7, //#GREEK SMALL LETTER CHI
+0x83D5,0x03C8, //#GREEK SMALL LETTER PSI
+0x83D6,0x03C9, //#GREEK SMALL LETTER OMEGA
+0x8440,0x0410, //#CYRILLIC CAPITAL LETTER A
+0x8441,0x0411, //#CYRILLIC CAPITAL LETTER BE
+0x8442,0x0412, //#CYRILLIC CAPITAL LETTER VE
+0x8443,0x0413, //#CYRILLIC CAPITAL LETTER GHE
+0x8444,0x0414, //#CYRILLIC CAPITAL LETTER DE
+0x8445,0x0415, //#CYRILLIC CAPITAL LETTER IE
+0x8446,0x0401, //#CYRILLIC CAPITAL LETTER IO
+0x8447,0x0416, //#CYRILLIC CAPITAL LETTER ZHE
+0x8448,0x0417, //#CYRILLIC CAPITAL LETTER ZE
+0x8449,0x0418, //#CYRILLIC CAPITAL LETTER I
+0x844A,0x0419, //#CYRILLIC CAPITAL LETTER SHORT I
+0x844B,0x041A, //#CYRILLIC CAPITAL LETTER KA
+0x844C,0x041B, //#CYRILLIC CAPITAL LETTER EL
+0x844D,0x041C, //#CYRILLIC CAPITAL LETTER EM
+0x844E,0x041D, //#CYRILLIC CAPITAL LETTER EN
+0x844F,0x041E, //#CYRILLIC CAPITAL LETTER O
+0x8450,0x041F, //#CYRILLIC CAPITAL LETTER PE
+0x8451,0x0420, //#CYRILLIC CAPITAL LETTER ER
+0x8452,0x0421, //#CYRILLIC CAPITAL LETTER ES
+0x8453,0x0422, //#CYRILLIC CAPITAL LETTER TE
+0x8454,0x0423, //#CYRILLIC CAPITAL LETTER U
+0x8455,0x0424, //#CYRILLIC CAPITAL LETTER EF
+0x8456,0x0425, //#CYRILLIC CAPITAL LETTER HA
+0x8457,0x0426, //#CYRILLIC CAPITAL LETTER TSE
+0x8458,0x0427, //#CYRILLIC CAPITAL LETTER CHE
+0x8459,0x0428, //#CYRILLIC CAPITAL LETTER SHA
+0x845A,0x0429, //#CYRILLIC CAPITAL LETTER SHCHA
+0x845B,0x042A, //#CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C,0x042B, //#CYRILLIC CAPITAL LETTER YERU
+0x845D,0x042C, //#CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E,0x042D, //#CYRILLIC CAPITAL LETTER E
+0x845F,0x042E, //#CYRILLIC CAPITAL LETTER YU
+0x8460,0x042F, //#CYRILLIC CAPITAL LETTER YA
+0x8470,0x0430, //#CYRILLIC SMALL LETTER A
+0x8471,0x0431, //#CYRILLIC SMALL LETTER BE
+0x8472,0x0432, //#CYRILLIC SMALL LETTER VE
+0x8473,0x0433, //#CYRILLIC SMALL LETTER GHE
+0x8474,0x0434, //#CYRILLIC SMALL LETTER DE
+0x8475,0x0435, //#CYRILLIC SMALL LETTER IE
+0x8476,0x0451, //#CYRILLIC SMALL LETTER IO
+0x8477,0x0436, //#CYRILLIC SMALL LETTER ZHE
+0x8478,0x0437, //#CYRILLIC SMALL LETTER ZE
+0x8479,0x0438, //#CYRILLIC SMALL LETTER I
+0x847A,0x0439, //#CYRILLIC SMALL LETTER SHORT I
+0x847B,0x043A, //#CYRILLIC SMALL LETTER KA
+0x847C,0x043B, //#CYRILLIC SMALL LETTER EL
+0x847D,0x043C, //#CYRILLIC SMALL LETTER EM
+0x847E,0x043D, //#CYRILLIC SMALL LETTER EN
+0x8480,0x043E, //#CYRILLIC SMALL LETTER O
+0x8481,0x043F, //#CYRILLIC SMALL LETTER PE
+0x8482,0x0440, //#CYRILLIC SMALL LETTER ER
+0x8483,0x0441, //#CYRILLIC SMALL LETTER ES
+0x8484,0x0442, //#CYRILLIC SMALL LETTER TE
+0x8485,0x0443, //#CYRILLIC SMALL LETTER U
+0x8486,0x0444, //#CYRILLIC SMALL LETTER EF
+0x8487,0x0445, //#CYRILLIC SMALL LETTER HA
+0x8488,0x0446, //#CYRILLIC SMALL LETTER TSE
+0x8489,0x0447, //#CYRILLIC SMALL LETTER CHE
+0x848A,0x0448, //#CYRILLIC SMALL LETTER SHA
+0x848B,0x0449, //#CYRILLIC SMALL LETTER SHCHA
+0x848C,0x044A, //#CYRILLIC SMALL LETTER HARD SIGN
+0x848D,0x044B, //#CYRILLIC SMALL LETTER YERU
+0x848E,0x044C, //#CYRILLIC SMALL LETTER SOFT SIGN
+0x848F,0x044D, //#CYRILLIC SMALL LETTER E
+0x8490,0x044E, //#CYRILLIC SMALL LETTER YU
+0x8491,0x044F, //#CYRILLIC SMALL LETTER YA
+0x849F,0x2500, //#BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0,0x2502, //#BOX DRAWINGS LIGHT VERTICAL
+0x84A1,0x250C, //#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2,0x2510, //#BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3,0x2518, //#BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4,0x2514, //#BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5,0x251C, //#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6,0x252C, //#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7,0x2524, //#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8,0x2534, //#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9,0x253C, //#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA,0x2501, //#BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB,0x2503, //#BOX DRAWINGS HEAVY VERTICAL
+0x84AC,0x250F, //#BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD,0x2513, //#BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE,0x251B, //#BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF,0x2517, //#BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0,0x2523, //#BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1,0x2533, //#BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2,0x252B, //#BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3,0x253B, //#BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4,0x254B, //#BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5,0x2520, //#BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6,0x252F, //#BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7,0x2528, //#BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8,0x2537, //#BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9,0x253F, //#BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA,0x251D, //#BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB,0x2530, //#BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC,0x2525, //#BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD,0x2538, //#BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE,0x2542, //#BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x8740,0x2460, //#CIRCLED DIGIT ONE
+0x8741,0x2461, //#CIRCLED DIGIT TWO
+0x8742,0x2462, //#CIRCLED DIGIT THREE
+0x8743,0x2463, //#CIRCLED DIGIT FOUR
+0x8744,0x2464, //#CIRCLED DIGIT FIVE
+0x8745,0x2465, //#CIRCLED DIGIT SIX
+0x8746,0x2466, //#CIRCLED DIGIT SEVEN
+0x8747,0x2467, //#CIRCLED DIGIT EIGHT
+0x8748,0x2468, //#CIRCLED DIGIT NINE
+0x8749,0x2469, //#CIRCLED NUMBER TEN
+0x874A,0x246A, //#CIRCLED NUMBER ELEVEN
+0x874B,0x246B, //#CIRCLED NUMBER TWELVE
+0x874C,0x246C, //#CIRCLED NUMBER THIRTEEN
+0x874D,0x246D, //#CIRCLED NUMBER FOURTEEN
+0x874E,0x246E, //#CIRCLED NUMBER FIFTEEN
+0x874F,0x246F, //#CIRCLED NUMBER SIXTEEN
+0x8750,0x2470, //#CIRCLED NUMBER SEVENTEEN
+0x8751,0x2471, //#CIRCLED NUMBER EIGHTEEN
+0x8752,0x2472, //#CIRCLED NUMBER NINETEEN
+0x8753,0x2473, //#CIRCLED NUMBER TWENTY
+0x8754,0x2160, //#ROMAN NUMERAL ONE
+0x8755,0x2161, //#ROMAN NUMERAL TWO
+0x8756,0x2162, //#ROMAN NUMERAL THREE
+0x8757,0x2163, //#ROMAN NUMERAL FOUR
+0x8758,0x2164, //#ROMAN NUMERAL FIVE
+0x8759,0x2165, //#ROMAN NUMERAL SIX
+0x875A,0x2166, //#ROMAN NUMERAL SEVEN
+0x875B,0x2167, //#ROMAN NUMERAL EIGHT
+0x875C,0x2168, //#ROMAN NUMERAL NINE
+0x875D,0x2169, //#ROMAN NUMERAL TEN
+0x875F,0x3349, //#SQUARE MIRI
+0x8760,0x3314, //#SQUARE KIRO
+0x8761,0x3322, //#SQUARE SENTI
+0x8762,0x334D, //#SQUARE MEETORU
+0x8763,0x3318, //#SQUARE GURAMU
+0x8764,0x3327, //#SQUARE TON
+0x8765,0x3303, //#SQUARE AARU
+0x8766,0x3336, //#SQUARE HEKUTAARU
+0x8767,0x3351, //#SQUARE RITTORU
+0x8768,0x3357, //#SQUARE WATTO
+0x8769,0x330D, //#SQUARE KARORII
+0x876A,0x3326, //#SQUARE DORU
+0x876B,0x3323, //#SQUARE SENTO
+0x876C,0x332B, //#SQUARE PAASENTO
+0x876D,0x334A, //#SQUARE MIRIBAARU
+0x876E,0x333B, //#SQUARE PEEZI
+0x876F,0x339C, //#SQUARE MM
+0x8770,0x339D, //#SQUARE CM
+0x8771,0x339E, //#SQUARE KM
+0x8772,0x338E, //#SQUARE MG
+0x8773,0x338F, //#SQUARE KG
+0x8774,0x33C4, //#SQUARE CC
+0x8775,0x33A1, //#SQUARE M SQUARED
+0x877E,0x337B, //#SQUARE ERA NAME HEISEI
+0x8780,0x301D, //#REVERSED DOUBLE PRIME QUOTATION MARK
+0x8781,0x301F, //#LOW DOUBLE PRIME QUOTATION MARK
+0x8782,0x2116, //#NUMERO SIGN
+0x8783,0x33CD, //#SQUARE KK
+0x8784,0x2121, //#TELEPHONE SIGN
+0x8785,0x32A4, //#CIRCLED IDEOGRAPH HIGH
+0x8786,0x32A5, //#CIRCLED IDEOGRAPH CENTRE
+0x8787,0x32A6, //#CIRCLED IDEOGRAPH LOW
+0x8788,0x32A7, //#CIRCLED IDEOGRAPH LEFT
+0x8789,0x32A8, //#CIRCLED IDEOGRAPH RIGHT
+0x878A,0x3231, //#PARENTHESIZED IDEOGRAPH STOCK
+0x878B,0x3232, //#PARENTHESIZED IDEOGRAPH HAVE
+0x878C,0x3239, //#PARENTHESIZED IDEOGRAPH REPRESENT
+0x878D,0x337E, //#SQUARE ERA NAME MEIZI
+0x878E,0x337D, //#SQUARE ERA NAME TAISYOU
+0x878F,0x337C, //#SQUARE ERA NAME SYOUWA
+0x8790,0x2252, //#APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x8791,0x2261, //#IDENTICAL TO
+0x8792,0x222B, //#INTEGRAL
+0x8793,0x222E, //#CONTOUR INTEGRAL
+0x8794,0x2211, //#N-ARY SUMMATION
+0x8795,0x221A, //#SQUARE ROOT
+0x8796,0x22A5, //#UP TACK
+0x8797,0x2220, //#ANGLE
+0x8798,0x221F, //#RIGHT ANGLE
+0x8799,0x22BF, //#RIGHT TRIANGLE
+0x879A,0x2235, //#BECAUSE
+0x879B,0x2229, //#INTERSECTION
+0x879C,0x222A, //#UNION
+0x889F,0x4E9C, //#CJK UNIFIED IDEOGRAPH
+0x88A0,0x5516, //#CJK UNIFIED IDEOGRAPH
+0x88A1,0x5A03, //#CJK UNIFIED IDEOGRAPH
+0x88A2,0x963F, //#CJK UNIFIED IDEOGRAPH
+0x88A3,0x54C0, //#CJK UNIFIED IDEOGRAPH
+0x88A4,0x611B, //#CJK UNIFIED IDEOGRAPH
+0x88A5,0x6328, //#CJK UNIFIED IDEOGRAPH
+0x88A6,0x59F6, //#CJK UNIFIED IDEOGRAPH
+0x88A7,0x9022, //#CJK UNIFIED IDEOGRAPH
+0x88A8,0x8475, //#CJK UNIFIED IDEOGRAPH
+0x88A9,0x831C, //#CJK UNIFIED IDEOGRAPH
+0x88AA,0x7A50, //#CJK UNIFIED IDEOGRAPH
+0x88AB,0x60AA, //#CJK UNIFIED IDEOGRAPH
+0x88AC,0x63E1, //#CJK UNIFIED IDEOGRAPH
+0x88AD,0x6E25, //#CJK UNIFIED IDEOGRAPH
+0x88AE,0x65ED, //#CJK UNIFIED IDEOGRAPH
+0x88AF,0x8466, //#CJK UNIFIED IDEOGRAPH
+0x88B0,0x82A6, //#CJK UNIFIED IDEOGRAPH
+0x88B1,0x9BF5, //#CJK UNIFIED IDEOGRAPH
+0x88B2,0x6893, //#CJK UNIFIED IDEOGRAPH
+0x88B3,0x5727, //#CJK UNIFIED IDEOGRAPH
+0x88B4,0x65A1, //#CJK UNIFIED IDEOGRAPH
+0x88B5,0x6271, //#CJK UNIFIED IDEOGRAPH
+0x88B6,0x5B9B, //#CJK UNIFIED IDEOGRAPH
+0x88B7,0x59D0, //#CJK UNIFIED IDEOGRAPH
+0x88B8,0x867B, //#CJK UNIFIED IDEOGRAPH
+0x88B9,0x98F4, //#CJK UNIFIED IDEOGRAPH
+0x88BA,0x7D62, //#CJK UNIFIED IDEOGRAPH
+0x88BB,0x7DBE, //#CJK UNIFIED IDEOGRAPH
+0x88BC,0x9B8E, //#CJK UNIFIED IDEOGRAPH
+0x88BD,0x6216, //#CJK UNIFIED IDEOGRAPH
+0x88BE,0x7C9F, //#CJK UNIFIED IDEOGRAPH
+0x88BF,0x88B7, //#CJK UNIFIED IDEOGRAPH
+0x88C0,0x5B89, //#CJK UNIFIED IDEOGRAPH
+0x88C1,0x5EB5, //#CJK UNIFIED IDEOGRAPH
+0x88C2,0x6309, //#CJK UNIFIED IDEOGRAPH
+0x88C3,0x6697, //#CJK UNIFIED IDEOGRAPH
+0x88C4,0x6848, //#CJK UNIFIED IDEOGRAPH
+0x88C5,0x95C7, //#CJK UNIFIED IDEOGRAPH
+0x88C6,0x978D, //#CJK UNIFIED IDEOGRAPH
+0x88C7,0x674F, //#CJK UNIFIED IDEOGRAPH
+0x88C8,0x4EE5, //#CJK UNIFIED IDEOGRAPH
+0x88C9,0x4F0A, //#CJK UNIFIED IDEOGRAPH
+0x88CA,0x4F4D, //#CJK UNIFIED IDEOGRAPH
+0x88CB,0x4F9D, //#CJK UNIFIED IDEOGRAPH
+0x88CC,0x5049, //#CJK UNIFIED IDEOGRAPH
+0x88CD,0x56F2, //#CJK UNIFIED IDEOGRAPH
+0x88CE,0x5937, //#CJK UNIFIED IDEOGRAPH
+0x88CF,0x59D4, //#CJK UNIFIED IDEOGRAPH
+0x88D0,0x5A01, //#CJK UNIFIED IDEOGRAPH
+0x88D1,0x5C09, //#CJK UNIFIED IDEOGRAPH
+0x88D2,0x60DF, //#CJK UNIFIED IDEOGRAPH
+0x88D3,0x610F, //#CJK UNIFIED IDEOGRAPH
+0x88D4,0x6170, //#CJK UNIFIED IDEOGRAPH
+0x88D5,0x6613, //#CJK UNIFIED IDEOGRAPH
+0x88D6,0x6905, //#CJK UNIFIED IDEOGRAPH
+0x88D7,0x70BA, //#CJK UNIFIED IDEOGRAPH
+0x88D8,0x754F, //#CJK UNIFIED IDEOGRAPH
+0x88D9,0x7570, //#CJK UNIFIED IDEOGRAPH
+0x88DA,0x79FB, //#CJK UNIFIED IDEOGRAPH
+0x88DB,0x7DAD, //#CJK UNIFIED IDEOGRAPH
+0x88DC,0x7DEF, //#CJK UNIFIED IDEOGRAPH
+0x88DD,0x80C3, //#CJK UNIFIED IDEOGRAPH
+0x88DE,0x840E, //#CJK UNIFIED IDEOGRAPH
+0x88DF,0x8863, //#CJK UNIFIED IDEOGRAPH
+0x88E0,0x8B02, //#CJK UNIFIED IDEOGRAPH
+0x88E1,0x9055, //#CJK UNIFIED IDEOGRAPH
+0x88E2,0x907A, //#CJK UNIFIED IDEOGRAPH
+0x88E3,0x533B, //#CJK UNIFIED IDEOGRAPH
+0x88E4,0x4E95, //#CJK UNIFIED IDEOGRAPH
+0x88E5,0x4EA5, //#CJK UNIFIED IDEOGRAPH
+0x88E6,0x57DF, //#CJK UNIFIED IDEOGRAPH
+0x88E7,0x80B2, //#CJK UNIFIED IDEOGRAPH
+0x88E8,0x90C1, //#CJK UNIFIED IDEOGRAPH
+0x88E9,0x78EF, //#CJK UNIFIED IDEOGRAPH
+0x88EA,0x4E00, //#CJK UNIFIED IDEOGRAPH
+0x88EB,0x58F1, //#CJK UNIFIED IDEOGRAPH
+0x88EC,0x6EA2, //#CJK UNIFIED IDEOGRAPH
+0x88ED,0x9038, //#CJK UNIFIED IDEOGRAPH
+0x88EE,0x7A32, //#CJK UNIFIED IDEOGRAPH
+0x88EF,0x8328, //#CJK UNIFIED IDEOGRAPH
+0x88F0,0x828B, //#CJK UNIFIED IDEOGRAPH
+0x88F1,0x9C2F, //#CJK UNIFIED IDEOGRAPH
+0x88F2,0x5141, //#CJK UNIFIED IDEOGRAPH
+0x88F3,0x5370, //#CJK UNIFIED IDEOGRAPH
+0x88F4,0x54BD, //#CJK UNIFIED IDEOGRAPH
+0x88F5,0x54E1, //#CJK UNIFIED IDEOGRAPH
+0x88F6,0x56E0, //#CJK UNIFIED IDEOGRAPH
+0x88F7,0x59FB, //#CJK UNIFIED IDEOGRAPH
+0x88F8,0x5F15, //#CJK UNIFIED IDEOGRAPH
+0x88F9,0x98F2, //#CJK UNIFIED IDEOGRAPH
+0x88FA,0x6DEB, //#CJK UNIFIED IDEOGRAPH
+0x88FB,0x80E4, //#CJK UNIFIED IDEOGRAPH
+0x88FC,0x852D, //#CJK UNIFIED IDEOGRAPH
+0x8940,0x9662, //#CJK UNIFIED IDEOGRAPH
+0x8941,0x9670, //#CJK UNIFIED IDEOGRAPH
+0x8942,0x96A0, //#CJK UNIFIED IDEOGRAPH
+0x8943,0x97FB, //#CJK UNIFIED IDEOGRAPH
+0x8944,0x540B, //#CJK UNIFIED IDEOGRAPH
+0x8945,0x53F3, //#CJK UNIFIED IDEOGRAPH
+0x8946,0x5B87, //#CJK UNIFIED IDEOGRAPH
+0x8947,0x70CF, //#CJK UNIFIED IDEOGRAPH
+0x8948,0x7FBD, //#CJK UNIFIED IDEOGRAPH
+0x8949,0x8FC2, //#CJK UNIFIED IDEOGRAPH
+0x894A,0x96E8, //#CJK UNIFIED IDEOGRAPH
+0x894B,0x536F, //#CJK UNIFIED IDEOGRAPH
+0x894C,0x9D5C, //#CJK UNIFIED IDEOGRAPH
+0x894D,0x7ABA, //#CJK UNIFIED IDEOGRAPH
+0x894E,0x4E11, //#CJK UNIFIED IDEOGRAPH
+0x894F,0x7893, //#CJK UNIFIED IDEOGRAPH
+0x8950,0x81FC, //#CJK UNIFIED IDEOGRAPH
+0x8951,0x6E26, //#CJK UNIFIED IDEOGRAPH
+0x8952,0x5618, //#CJK UNIFIED IDEOGRAPH
+0x8953,0x5504, //#CJK UNIFIED IDEOGRAPH
+0x8954,0x6B1D, //#CJK UNIFIED IDEOGRAPH
+0x8955,0x851A, //#CJK UNIFIED IDEOGRAPH
+0x8956,0x9C3B, //#CJK UNIFIED IDEOGRAPH
+0x8957,0x59E5, //#CJK UNIFIED IDEOGRAPH
+0x8958,0x53A9, //#CJK UNIFIED IDEOGRAPH
+0x8959,0x6D66, //#CJK UNIFIED IDEOGRAPH
+0x895A,0x74DC, //#CJK UNIFIED IDEOGRAPH
+0x895B,0x958F, //#CJK UNIFIED IDEOGRAPH
+0x895C,0x5642, //#CJK UNIFIED IDEOGRAPH
+0x895D,0x4E91, //#CJK UNIFIED IDEOGRAPH
+0x895E,0x904B, //#CJK UNIFIED IDEOGRAPH
+0x895F,0x96F2, //#CJK UNIFIED IDEOGRAPH
+0x8960,0x834F, //#CJK UNIFIED IDEOGRAPH
+0x8961,0x990C, //#CJK UNIFIED IDEOGRAPH
+0x8962,0x53E1, //#CJK UNIFIED IDEOGRAPH
+0x8963,0x55B6, //#CJK UNIFIED IDEOGRAPH
+0x8964,0x5B30, //#CJK UNIFIED IDEOGRAPH
+0x8965,0x5F71, //#CJK UNIFIED IDEOGRAPH
+0x8966,0x6620, //#CJK UNIFIED IDEOGRAPH
+0x8967,0x66F3, //#CJK UNIFIED IDEOGRAPH
+0x8968,0x6804, //#CJK UNIFIED IDEOGRAPH
+0x8969,0x6C38, //#CJK UNIFIED IDEOGRAPH
+0x896A,0x6CF3, //#CJK UNIFIED IDEOGRAPH
+0x896B,0x6D29, //#CJK UNIFIED IDEOGRAPH
+0x896C,0x745B, //#CJK UNIFIED IDEOGRAPH
+0x896D,0x76C8, //#CJK UNIFIED IDEOGRAPH
+0x896E,0x7A4E, //#CJK UNIFIED IDEOGRAPH
+0x896F,0x9834, //#CJK UNIFIED IDEOGRAPH
+0x8970,0x82F1, //#CJK UNIFIED IDEOGRAPH
+0x8971,0x885B, //#CJK UNIFIED IDEOGRAPH
+0x8972,0x8A60, //#CJK UNIFIED IDEOGRAPH
+0x8973,0x92ED, //#CJK UNIFIED IDEOGRAPH
+0x8974,0x6DB2, //#CJK UNIFIED IDEOGRAPH
+0x8975,0x75AB, //#CJK UNIFIED IDEOGRAPH
+0x8976,0x76CA, //#CJK UNIFIED IDEOGRAPH
+0x8977,0x99C5, //#CJK UNIFIED IDEOGRAPH
+0x8978,0x60A6, //#CJK UNIFIED IDEOGRAPH
+0x8979,0x8B01, //#CJK UNIFIED IDEOGRAPH
+0x897A,0x8D8A, //#CJK UNIFIED IDEOGRAPH
+0x897B,0x95B2, //#CJK UNIFIED IDEOGRAPH
+0x897C,0x698E, //#CJK UNIFIED IDEOGRAPH
+0x897D,0x53AD, //#CJK UNIFIED IDEOGRAPH
+0x897E,0x5186, //#CJK UNIFIED IDEOGRAPH
+0x8980,0x5712, //#CJK UNIFIED IDEOGRAPH
+0x8981,0x5830, //#CJK UNIFIED IDEOGRAPH
+0x8982,0x5944, //#CJK UNIFIED IDEOGRAPH
+0x8983,0x5BB4, //#CJK UNIFIED IDEOGRAPH
+0x8984,0x5EF6, //#CJK UNIFIED IDEOGRAPH
+0x8985,0x6028, //#CJK UNIFIED IDEOGRAPH
+0x8986,0x63A9, //#CJK UNIFIED IDEOGRAPH
+0x8987,0x63F4, //#CJK UNIFIED IDEOGRAPH
+0x8988,0x6CBF, //#CJK UNIFIED IDEOGRAPH
+0x8989,0x6F14, //#CJK UNIFIED IDEOGRAPH
+0x898A,0x708E, //#CJK UNIFIED IDEOGRAPH
+0x898B,0x7114, //#CJK UNIFIED IDEOGRAPH
+0x898C,0x7159, //#CJK UNIFIED IDEOGRAPH
+0x898D,0x71D5, //#CJK UNIFIED IDEOGRAPH
+0x898E,0x733F, //#CJK UNIFIED IDEOGRAPH
+0x898F,0x7E01, //#CJK UNIFIED IDEOGRAPH
+0x8990,0x8276, //#CJK UNIFIED IDEOGRAPH
+0x8991,0x82D1, //#CJK UNIFIED IDEOGRAPH
+0x8992,0x8597, //#CJK UNIFIED IDEOGRAPH
+0x8993,0x9060, //#CJK UNIFIED IDEOGRAPH
+0x8994,0x925B, //#CJK UNIFIED IDEOGRAPH
+0x8995,0x9D1B, //#CJK UNIFIED IDEOGRAPH
+0x8996,0x5869, //#CJK UNIFIED IDEOGRAPH
+0x8997,0x65BC, //#CJK UNIFIED IDEOGRAPH
+0x8998,0x6C5A, //#CJK UNIFIED IDEOGRAPH
+0x8999,0x7525, //#CJK UNIFIED IDEOGRAPH
+0x899A,0x51F9, //#CJK UNIFIED IDEOGRAPH
+0x899B,0x592E, //#CJK UNIFIED IDEOGRAPH
+0x899C,0x5965, //#CJK UNIFIED IDEOGRAPH
+0x899D,0x5F80, //#CJK UNIFIED IDEOGRAPH
+0x899E,0x5FDC, //#CJK UNIFIED IDEOGRAPH
+0x899F,0x62BC, //#CJK UNIFIED IDEOGRAPH
+0x89A0,0x65FA, //#CJK UNIFIED IDEOGRAPH
+0x89A1,0x6A2A, //#CJK UNIFIED IDEOGRAPH
+0x89A2,0x6B27, //#CJK UNIFIED IDEOGRAPH
+0x89A3,0x6BB4, //#CJK UNIFIED IDEOGRAPH
+0x89A4,0x738B, //#CJK UNIFIED IDEOGRAPH
+0x89A5,0x7FC1, //#CJK UNIFIED IDEOGRAPH
+0x89A6,0x8956, //#CJK UNIFIED IDEOGRAPH
+0x89A7,0x9D2C, //#CJK UNIFIED IDEOGRAPH
+0x89A8,0x9D0E, //#CJK UNIFIED IDEOGRAPH
+0x89A9,0x9EC4, //#CJK UNIFIED IDEOGRAPH
+0x89AA,0x5CA1, //#CJK UNIFIED IDEOGRAPH
+0x89AB,0x6C96, //#CJK UNIFIED IDEOGRAPH
+0x89AC,0x837B, //#CJK UNIFIED IDEOGRAPH
+0x89AD,0x5104, //#CJK UNIFIED IDEOGRAPH
+0x89AE,0x5C4B, //#CJK UNIFIED IDEOGRAPH
+0x89AF,0x61B6, //#CJK UNIFIED IDEOGRAPH
+0x89B0,0x81C6, //#CJK UNIFIED IDEOGRAPH
+0x89B1,0x6876, //#CJK UNIFIED IDEOGRAPH
+0x89B2,0x7261, //#CJK UNIFIED IDEOGRAPH
+0x89B3,0x4E59, //#CJK UNIFIED IDEOGRAPH
+0x89B4,0x4FFA, //#CJK UNIFIED IDEOGRAPH
+0x89B5,0x5378, //#CJK UNIFIED IDEOGRAPH
+0x89B6,0x6069, //#CJK UNIFIED IDEOGRAPH
+0x89B7,0x6E29, //#CJK UNIFIED IDEOGRAPH
+0x89B8,0x7A4F, //#CJK UNIFIED IDEOGRAPH
+0x89B9,0x97F3, //#CJK UNIFIED IDEOGRAPH
+0x89BA,0x4E0B, //#CJK UNIFIED IDEOGRAPH
+0x89BB,0x5316, //#CJK UNIFIED IDEOGRAPH
+0x89BC,0x4EEE, //#CJK UNIFIED IDEOGRAPH
+0x89BD,0x4F55, //#CJK UNIFIED IDEOGRAPH
+0x89BE,0x4F3D, //#CJK UNIFIED IDEOGRAPH
+0x89BF,0x4FA1, //#CJK UNIFIED IDEOGRAPH
+0x89C0,0x4F73, //#CJK UNIFIED IDEOGRAPH
+0x89C1,0x52A0, //#CJK UNIFIED IDEOGRAPH
+0x89C2,0x53EF, //#CJK UNIFIED IDEOGRAPH
+0x89C3,0x5609, //#CJK UNIFIED IDEOGRAPH
+0x89C4,0x590F, //#CJK UNIFIED IDEOGRAPH
+0x89C5,0x5AC1, //#CJK UNIFIED IDEOGRAPH
+0x89C6,0x5BB6, //#CJK UNIFIED IDEOGRAPH
+0x89C7,0x5BE1, //#CJK UNIFIED IDEOGRAPH
+0x89C8,0x79D1, //#CJK UNIFIED IDEOGRAPH
+0x89C9,0x6687, //#CJK UNIFIED IDEOGRAPH
+0x89CA,0x679C, //#CJK UNIFIED IDEOGRAPH
+0x89CB,0x67B6, //#CJK UNIFIED IDEOGRAPH
+0x89CC,0x6B4C, //#CJK UNIFIED IDEOGRAPH
+0x89CD,0x6CB3, //#CJK UNIFIED IDEOGRAPH
+0x89CE,0x706B, //#CJK UNIFIED IDEOGRAPH
+0x89CF,0x73C2, //#CJK UNIFIED IDEOGRAPH
+0x89D0,0x798D, //#CJK UNIFIED IDEOGRAPH
+0x89D1,0x79BE, //#CJK UNIFIED IDEOGRAPH
+0x89D2,0x7A3C, //#CJK UNIFIED IDEOGRAPH
+0x89D3,0x7B87, //#CJK UNIFIED IDEOGRAPH
+0x89D4,0x82B1, //#CJK UNIFIED IDEOGRAPH
+0x89D5,0x82DB, //#CJK UNIFIED IDEOGRAPH
+0x89D6,0x8304, //#CJK UNIFIED IDEOGRAPH
+0x89D7,0x8377, //#CJK UNIFIED IDEOGRAPH
+0x89D8,0x83EF, //#CJK UNIFIED IDEOGRAPH
+0x89D9,0x83D3, //#CJK UNIFIED IDEOGRAPH
+0x89DA,0x8766, //#CJK UNIFIED IDEOGRAPH
+0x89DB,0x8AB2, //#CJK UNIFIED IDEOGRAPH
+0x89DC,0x5629, //#CJK UNIFIED IDEOGRAPH
+0x89DD,0x8CA8, //#CJK UNIFIED IDEOGRAPH
+0x89DE,0x8FE6, //#CJK UNIFIED IDEOGRAPH
+0x89DF,0x904E, //#CJK UNIFIED IDEOGRAPH
+0x89E0,0x971E, //#CJK UNIFIED IDEOGRAPH
+0x89E1,0x868A, //#CJK UNIFIED IDEOGRAPH
+0x89E2,0x4FC4, //#CJK UNIFIED IDEOGRAPH
+0x89E3,0x5CE8, //#CJK UNIFIED IDEOGRAPH
+0x89E4,0x6211, //#CJK UNIFIED IDEOGRAPH
+0x89E5,0x7259, //#CJK UNIFIED IDEOGRAPH
+0x89E6,0x753B, //#CJK UNIFIED IDEOGRAPH
+0x89E7,0x81E5, //#CJK UNIFIED IDEOGRAPH
+0x89E8,0x82BD, //#CJK UNIFIED IDEOGRAPH
+0x89E9,0x86FE, //#CJK UNIFIED IDEOGRAPH
+0x89EA,0x8CC0, //#CJK UNIFIED IDEOGRAPH
+0x89EB,0x96C5, //#CJK UNIFIED IDEOGRAPH
+0x89EC,0x9913, //#CJK UNIFIED IDEOGRAPH
+0x89ED,0x99D5, //#CJK UNIFIED IDEOGRAPH
+0x89EE,0x4ECB, //#CJK UNIFIED IDEOGRAPH
+0x89EF,0x4F1A, //#CJK UNIFIED IDEOGRAPH
+0x89F0,0x89E3, //#CJK UNIFIED IDEOGRAPH
+0x89F1,0x56DE, //#CJK UNIFIED IDEOGRAPH
+0x89F2,0x584A, //#CJK UNIFIED IDEOGRAPH
+0x89F3,0x58CA, //#CJK UNIFIED IDEOGRAPH
+0x89F4,0x5EFB, //#CJK UNIFIED IDEOGRAPH
+0x89F5,0x5FEB, //#CJK UNIFIED IDEOGRAPH
+0x89F6,0x602A, //#CJK UNIFIED IDEOGRAPH
+0x89F7,0x6094, //#CJK UNIFIED IDEOGRAPH
+0x89F8,0x6062, //#CJK UNIFIED IDEOGRAPH
+0x89F9,0x61D0, //#CJK UNIFIED IDEOGRAPH
+0x89FA,0x6212, //#CJK UNIFIED IDEOGRAPH
+0x89FB,0x62D0, //#CJK UNIFIED IDEOGRAPH
+0x89FC,0x6539, //#CJK UNIFIED IDEOGRAPH
+0x8A40,0x9B41, //#CJK UNIFIED IDEOGRAPH
+0x8A41,0x6666, //#CJK UNIFIED IDEOGRAPH
+0x8A42,0x68B0, //#CJK UNIFIED IDEOGRAPH
+0x8A43,0x6D77, //#CJK UNIFIED IDEOGRAPH
+0x8A44,0x7070, //#CJK UNIFIED IDEOGRAPH
+0x8A45,0x754C, //#CJK UNIFIED IDEOGRAPH
+0x8A46,0x7686, //#CJK UNIFIED IDEOGRAPH
+0x8A47,0x7D75, //#CJK UNIFIED IDEOGRAPH
+0x8A48,0x82A5, //#CJK UNIFIED IDEOGRAPH
+0x8A49,0x87F9, //#CJK UNIFIED IDEOGRAPH
+0x8A4A,0x958B, //#CJK UNIFIED IDEOGRAPH
+0x8A4B,0x968E, //#CJK UNIFIED IDEOGRAPH
+0x8A4C,0x8C9D, //#CJK UNIFIED IDEOGRAPH
+0x8A4D,0x51F1, //#CJK UNIFIED IDEOGRAPH
+0x8A4E,0x52BE, //#CJK UNIFIED IDEOGRAPH
+0x8A4F,0x5916, //#CJK UNIFIED IDEOGRAPH
+0x8A50,0x54B3, //#CJK UNIFIED IDEOGRAPH
+0x8A51,0x5BB3, //#CJK UNIFIED IDEOGRAPH
+0x8A52,0x5D16, //#CJK UNIFIED IDEOGRAPH
+0x8A53,0x6168, //#CJK UNIFIED IDEOGRAPH
+0x8A54,0x6982, //#CJK UNIFIED IDEOGRAPH
+0x8A55,0x6DAF, //#CJK UNIFIED IDEOGRAPH
+0x8A56,0x788D, //#CJK UNIFIED IDEOGRAPH
+0x8A57,0x84CB, //#CJK UNIFIED IDEOGRAPH
+0x8A58,0x8857, //#CJK UNIFIED IDEOGRAPH
+0x8A59,0x8A72, //#CJK UNIFIED IDEOGRAPH
+0x8A5A,0x93A7, //#CJK UNIFIED IDEOGRAPH
+0x8A5B,0x9AB8, //#CJK UNIFIED IDEOGRAPH
+0x8A5C,0x6D6C, //#CJK UNIFIED IDEOGRAPH
+0x8A5D,0x99A8, //#CJK UNIFIED IDEOGRAPH
+0x8A5E,0x86D9, //#CJK UNIFIED IDEOGRAPH
+0x8A5F,0x57A3, //#CJK UNIFIED IDEOGRAPH
+0x8A60,0x67FF, //#CJK UNIFIED IDEOGRAPH
+0x8A61,0x86CE, //#CJK UNIFIED IDEOGRAPH
+0x8A62,0x920E, //#CJK UNIFIED IDEOGRAPH
+0x8A63,0x5283, //#CJK UNIFIED IDEOGRAPH
+0x8A64,0x5687, //#CJK UNIFIED IDEOGRAPH
+0x8A65,0x5404, //#CJK UNIFIED IDEOGRAPH
+0x8A66,0x5ED3, //#CJK UNIFIED IDEOGRAPH
+0x8A67,0x62E1, //#CJK UNIFIED IDEOGRAPH
+0x8A68,0x64B9, //#CJK UNIFIED IDEOGRAPH
+0x8A69,0x683C, //#CJK UNIFIED IDEOGRAPH
+0x8A6A,0x6838, //#CJK UNIFIED IDEOGRAPH
+0x8A6B,0x6BBB, //#CJK UNIFIED IDEOGRAPH
+0x8A6C,0x7372, //#CJK UNIFIED IDEOGRAPH
+0x8A6D,0x78BA, //#CJK UNIFIED IDEOGRAPH
+0x8A6E,0x7A6B, //#CJK UNIFIED IDEOGRAPH
+0x8A6F,0x899A, //#CJK UNIFIED IDEOGRAPH
+0x8A70,0x89D2, //#CJK UNIFIED IDEOGRAPH
+0x8A71,0x8D6B, //#CJK UNIFIED IDEOGRAPH
+0x8A72,0x8F03, //#CJK UNIFIED IDEOGRAPH
+0x8A73,0x90ED, //#CJK UNIFIED IDEOGRAPH
+0x8A74,0x95A3, //#CJK UNIFIED IDEOGRAPH
+0x8A75,0x9694, //#CJK UNIFIED IDEOGRAPH
+0x8A76,0x9769, //#CJK UNIFIED IDEOGRAPH
+0x8A77,0x5B66, //#CJK UNIFIED IDEOGRAPH
+0x8A78,0x5CB3, //#CJK UNIFIED IDEOGRAPH
+0x8A79,0x697D, //#CJK UNIFIED IDEOGRAPH
+0x8A7A,0x984D, //#CJK UNIFIED IDEOGRAPH
+0x8A7B,0x984E, //#CJK UNIFIED IDEOGRAPH
+0x8A7C,0x639B, //#CJK UNIFIED IDEOGRAPH
+0x8A7D,0x7B20, //#CJK UNIFIED IDEOGRAPH
+0x8A7E,0x6A2B, //#CJK UNIFIED IDEOGRAPH
+0x8A80,0x6A7F, //#CJK UNIFIED IDEOGRAPH
+0x8A81,0x68B6, //#CJK UNIFIED IDEOGRAPH
+0x8A82,0x9C0D, //#CJK UNIFIED IDEOGRAPH
+0x8A83,0x6F5F, //#CJK UNIFIED IDEOGRAPH
+0x8A84,0x5272, //#CJK UNIFIED IDEOGRAPH
+0x8A85,0x559D, //#CJK UNIFIED IDEOGRAPH
+0x8A86,0x6070, //#CJK UNIFIED IDEOGRAPH
+0x8A87,0x62EC, //#CJK UNIFIED IDEOGRAPH
+0x8A88,0x6D3B, //#CJK UNIFIED IDEOGRAPH
+0x8A89,0x6E07, //#CJK UNIFIED IDEOGRAPH
+0x8A8A,0x6ED1, //#CJK UNIFIED IDEOGRAPH
+0x8A8B,0x845B, //#CJK UNIFIED IDEOGRAPH
+0x8A8C,0x8910, //#CJK UNIFIED IDEOGRAPH
+0x8A8D,0x8F44, //#CJK UNIFIED IDEOGRAPH
+0x8A8E,0x4E14, //#CJK UNIFIED IDEOGRAPH
+0x8A8F,0x9C39, //#CJK UNIFIED IDEOGRAPH
+0x8A90,0x53F6, //#CJK UNIFIED IDEOGRAPH
+0x8A91,0x691B, //#CJK UNIFIED IDEOGRAPH
+0x8A92,0x6A3A, //#CJK UNIFIED IDEOGRAPH
+0x8A93,0x9784, //#CJK UNIFIED IDEOGRAPH
+0x8A94,0x682A, //#CJK UNIFIED IDEOGRAPH
+0x8A95,0x515C, //#CJK UNIFIED IDEOGRAPH
+0x8A96,0x7AC3, //#CJK UNIFIED IDEOGRAPH
+0x8A97,0x84B2, //#CJK UNIFIED IDEOGRAPH
+0x8A98,0x91DC, //#CJK UNIFIED IDEOGRAPH
+0x8A99,0x938C, //#CJK UNIFIED IDEOGRAPH
+0x8A9A,0x565B, //#CJK UNIFIED IDEOGRAPH
+0x8A9B,0x9D28, //#CJK UNIFIED IDEOGRAPH
+0x8A9C,0x6822, //#CJK UNIFIED IDEOGRAPH
+0x8A9D,0x8305, //#CJK UNIFIED IDEOGRAPH
+0x8A9E,0x8431, //#CJK UNIFIED IDEOGRAPH
+0x8A9F,0x7CA5, //#CJK UNIFIED IDEOGRAPH
+0x8AA0,0x5208, //#CJK UNIFIED IDEOGRAPH
+0x8AA1,0x82C5, //#CJK UNIFIED IDEOGRAPH
+0x8AA2,0x74E6, //#CJK UNIFIED IDEOGRAPH
+0x8AA3,0x4E7E, //#CJK UNIFIED IDEOGRAPH
+0x8AA4,0x4F83, //#CJK UNIFIED IDEOGRAPH
+0x8AA5,0x51A0, //#CJK UNIFIED IDEOGRAPH
+0x8AA6,0x5BD2, //#CJK UNIFIED IDEOGRAPH
+0x8AA7,0x520A, //#CJK UNIFIED IDEOGRAPH
+0x8AA8,0x52D8, //#CJK UNIFIED IDEOGRAPH
+0x8AA9,0x52E7, //#CJK UNIFIED IDEOGRAPH
+0x8AAA,0x5DFB, //#CJK UNIFIED IDEOGRAPH
+0x8AAB,0x559A, //#CJK UNIFIED IDEOGRAPH
+0x8AAC,0x582A, //#CJK UNIFIED IDEOGRAPH
+0x8AAD,0x59E6, //#CJK UNIFIED IDEOGRAPH
+0x8AAE,0x5B8C, //#CJK UNIFIED IDEOGRAPH
+0x8AAF,0x5B98, //#CJK UNIFIED IDEOGRAPH
+0x8AB0,0x5BDB, //#CJK UNIFIED IDEOGRAPH
+0x8AB1,0x5E72, //#CJK UNIFIED IDEOGRAPH
+0x8AB2,0x5E79, //#CJK UNIFIED IDEOGRAPH
+0x8AB3,0x60A3, //#CJK UNIFIED IDEOGRAPH
+0x8AB4,0x611F, //#CJK UNIFIED IDEOGRAPH
+0x8AB5,0x6163, //#CJK UNIFIED IDEOGRAPH
+0x8AB6,0x61BE, //#CJK UNIFIED IDEOGRAPH
+0x8AB7,0x63DB, //#CJK UNIFIED IDEOGRAPH
+0x8AB8,0x6562, //#CJK UNIFIED IDEOGRAPH
+0x8AB9,0x67D1, //#CJK UNIFIED IDEOGRAPH
+0x8ABA,0x6853, //#CJK UNIFIED IDEOGRAPH
+0x8ABB,0x68FA, //#CJK UNIFIED IDEOGRAPH
+0x8ABC,0x6B3E, //#CJK UNIFIED IDEOGRAPH
+0x8ABD,0x6B53, //#CJK UNIFIED IDEOGRAPH
+0x8ABE,0x6C57, //#CJK UNIFIED IDEOGRAPH
+0x8ABF,0x6F22, //#CJK UNIFIED IDEOGRAPH
+0x8AC0,0x6F97, //#CJK UNIFIED IDEOGRAPH
+0x8AC1,0x6F45, //#CJK UNIFIED IDEOGRAPH
+0x8AC2,0x74B0, //#CJK UNIFIED IDEOGRAPH
+0x8AC3,0x7518, //#CJK UNIFIED IDEOGRAPH
+0x8AC4,0x76E3, //#CJK UNIFIED IDEOGRAPH
+0x8AC5,0x770B, //#CJK UNIFIED IDEOGRAPH
+0x8AC6,0x7AFF, //#CJK UNIFIED IDEOGRAPH
+0x8AC7,0x7BA1, //#CJK UNIFIED IDEOGRAPH
+0x8AC8,0x7C21, //#CJK UNIFIED IDEOGRAPH
+0x8AC9,0x7DE9, //#CJK UNIFIED IDEOGRAPH
+0x8ACA,0x7F36, //#CJK UNIFIED IDEOGRAPH
+0x8ACB,0x7FF0, //#CJK UNIFIED IDEOGRAPH
+0x8ACC,0x809D, //#CJK UNIFIED IDEOGRAPH
+0x8ACD,0x8266, //#CJK UNIFIED IDEOGRAPH
+0x8ACE,0x839E, //#CJK UNIFIED IDEOGRAPH
+0x8ACF,0x89B3, //#CJK UNIFIED IDEOGRAPH
+0x8AD0,0x8ACC, //#CJK UNIFIED IDEOGRAPH
+0x8AD1,0x8CAB, //#CJK UNIFIED IDEOGRAPH
+0x8AD2,0x9084, //#CJK UNIFIED IDEOGRAPH
+0x8AD3,0x9451, //#CJK UNIFIED IDEOGRAPH
+0x8AD4,0x9593, //#CJK UNIFIED IDEOGRAPH
+0x8AD5,0x9591, //#CJK UNIFIED IDEOGRAPH
+0x8AD6,0x95A2, //#CJK UNIFIED IDEOGRAPH
+0x8AD7,0x9665, //#CJK UNIFIED IDEOGRAPH
+0x8AD8,0x97D3, //#CJK UNIFIED IDEOGRAPH
+0x8AD9,0x9928, //#CJK UNIFIED IDEOGRAPH
+0x8ADA,0x8218, //#CJK UNIFIED IDEOGRAPH
+0x8ADB,0x4E38, //#CJK UNIFIED IDEOGRAPH
+0x8ADC,0x542B, //#CJK UNIFIED IDEOGRAPH
+0x8ADD,0x5CB8, //#CJK UNIFIED IDEOGRAPH
+0x8ADE,0x5DCC, //#CJK UNIFIED IDEOGRAPH
+0x8ADF,0x73A9, //#CJK UNIFIED IDEOGRAPH
+0x8AE0,0x764C, //#CJK UNIFIED IDEOGRAPH
+0x8AE1,0x773C, //#CJK UNIFIED IDEOGRAPH
+0x8AE2,0x5CA9, //#CJK UNIFIED IDEOGRAPH
+0x8AE3,0x7FEB, //#CJK UNIFIED IDEOGRAPH
+0x8AE4,0x8D0B, //#CJK UNIFIED IDEOGRAPH
+0x8AE5,0x96C1, //#CJK UNIFIED IDEOGRAPH
+0x8AE6,0x9811, //#CJK UNIFIED IDEOGRAPH
+0x8AE7,0x9854, //#CJK UNIFIED IDEOGRAPH
+0x8AE8,0x9858, //#CJK UNIFIED IDEOGRAPH
+0x8AE9,0x4F01, //#CJK UNIFIED IDEOGRAPH
+0x8AEA,0x4F0E, //#CJK UNIFIED IDEOGRAPH
+0x8AEB,0x5371, //#CJK UNIFIED IDEOGRAPH
+0x8AEC,0x559C, //#CJK UNIFIED IDEOGRAPH
+0x8AED,0x5668, //#CJK UNIFIED IDEOGRAPH
+0x8AEE,0x57FA, //#CJK UNIFIED IDEOGRAPH
+0x8AEF,0x5947, //#CJK UNIFIED IDEOGRAPH
+0x8AF0,0x5B09, //#CJK UNIFIED IDEOGRAPH
+0x8AF1,0x5BC4, //#CJK UNIFIED IDEOGRAPH
+0x8AF2,0x5C90, //#CJK UNIFIED IDEOGRAPH
+0x8AF3,0x5E0C, //#CJK UNIFIED IDEOGRAPH
+0x8AF4,0x5E7E, //#CJK UNIFIED IDEOGRAPH
+0x8AF5,0x5FCC, //#CJK UNIFIED IDEOGRAPH
+0x8AF6,0x63EE, //#CJK UNIFIED IDEOGRAPH
+0x8AF7,0x673A, //#CJK UNIFIED IDEOGRAPH
+0x8AF8,0x65D7, //#CJK UNIFIED IDEOGRAPH
+0x8AF9,0x65E2, //#CJK UNIFIED IDEOGRAPH
+0x8AFA,0x671F, //#CJK UNIFIED IDEOGRAPH
+0x8AFB,0x68CB, //#CJK UNIFIED IDEOGRAPH
+0x8AFC,0x68C4, //#CJK UNIFIED IDEOGRAPH
+0x8B40,0x6A5F, //#CJK UNIFIED IDEOGRAPH
+0x8B41,0x5E30, //#CJK UNIFIED IDEOGRAPH
+0x8B42,0x6BC5, //#CJK UNIFIED IDEOGRAPH
+0x8B43,0x6C17, //#CJK UNIFIED IDEOGRAPH
+0x8B44,0x6C7D, //#CJK UNIFIED IDEOGRAPH
+0x8B45,0x757F, //#CJK UNIFIED IDEOGRAPH
+0x8B46,0x7948, //#CJK UNIFIED IDEOGRAPH
+0x8B47,0x5B63, //#CJK UNIFIED IDEOGRAPH
+0x8B48,0x7A00, //#CJK UNIFIED IDEOGRAPH
+0x8B49,0x7D00, //#CJK UNIFIED IDEOGRAPH
+0x8B4A,0x5FBD, //#CJK UNIFIED IDEOGRAPH
+0x8B4B,0x898F, //#CJK UNIFIED IDEOGRAPH
+0x8B4C,0x8A18, //#CJK UNIFIED IDEOGRAPH
+0x8B4D,0x8CB4, //#CJK UNIFIED IDEOGRAPH
+0x8B4E,0x8D77, //#CJK UNIFIED IDEOGRAPH
+0x8B4F,0x8ECC, //#CJK UNIFIED IDEOGRAPH
+0x8B50,0x8F1D, //#CJK UNIFIED IDEOGRAPH
+0x8B51,0x98E2, //#CJK UNIFIED IDEOGRAPH
+0x8B52,0x9A0E, //#CJK UNIFIED IDEOGRAPH
+0x8B53,0x9B3C, //#CJK UNIFIED IDEOGRAPH
+0x8B54,0x4E80, //#CJK UNIFIED IDEOGRAPH
+0x8B55,0x507D, //#CJK UNIFIED IDEOGRAPH
+0x8B56,0x5100, //#CJK UNIFIED IDEOGRAPH
+0x8B57,0x5993, //#CJK UNIFIED IDEOGRAPH
+0x8B58,0x5B9C, //#CJK UNIFIED IDEOGRAPH
+0x8B59,0x622F, //#CJK UNIFIED IDEOGRAPH
+0x8B5A,0x6280, //#CJK UNIFIED IDEOGRAPH
+0x8B5B,0x64EC, //#CJK UNIFIED IDEOGRAPH
+0x8B5C,0x6B3A, //#CJK UNIFIED IDEOGRAPH
+0x8B5D,0x72A0, //#CJK UNIFIED IDEOGRAPH
+0x8B5E,0x7591, //#CJK UNIFIED IDEOGRAPH
+0x8B5F,0x7947, //#CJK UNIFIED IDEOGRAPH
+0x8B60,0x7FA9, //#CJK UNIFIED IDEOGRAPH
+0x8B61,0x87FB, //#CJK UNIFIED IDEOGRAPH
+0x8B62,0x8ABC, //#CJK UNIFIED IDEOGRAPH
+0x8B63,0x8B70, //#CJK UNIFIED IDEOGRAPH
+0x8B64,0x63AC, //#CJK UNIFIED IDEOGRAPH
+0x8B65,0x83CA, //#CJK UNIFIED IDEOGRAPH
+0x8B66,0x97A0, //#CJK UNIFIED IDEOGRAPH
+0x8B67,0x5409, //#CJK UNIFIED IDEOGRAPH
+0x8B68,0x5403, //#CJK UNIFIED IDEOGRAPH
+0x8B69,0x55AB, //#CJK UNIFIED IDEOGRAPH
+0x8B6A,0x6854, //#CJK UNIFIED IDEOGRAPH
+0x8B6B,0x6A58, //#CJK UNIFIED IDEOGRAPH
+0x8B6C,0x8A70, //#CJK UNIFIED IDEOGRAPH
+0x8B6D,0x7827, //#CJK UNIFIED IDEOGRAPH
+0x8B6E,0x6775, //#CJK UNIFIED IDEOGRAPH
+0x8B6F,0x9ECD, //#CJK UNIFIED IDEOGRAPH
+0x8B70,0x5374, //#CJK UNIFIED IDEOGRAPH
+0x8B71,0x5BA2, //#CJK UNIFIED IDEOGRAPH
+0x8B72,0x811A, //#CJK UNIFIED IDEOGRAPH
+0x8B73,0x8650, //#CJK UNIFIED IDEOGRAPH
+0x8B74,0x9006, //#CJK UNIFIED IDEOGRAPH
+0x8B75,0x4E18, //#CJK UNIFIED IDEOGRAPH
+0x8B76,0x4E45, //#CJK UNIFIED IDEOGRAPH
+0x8B77,0x4EC7, //#CJK UNIFIED IDEOGRAPH
+0x8B78,0x4F11, //#CJK UNIFIED IDEOGRAPH
+0x8B79,0x53CA, //#CJK UNIFIED IDEOGRAPH
+0x8B7A,0x5438, //#CJK UNIFIED IDEOGRAPH
+0x8B7B,0x5BAE, //#CJK UNIFIED IDEOGRAPH
+0x8B7C,0x5F13, //#CJK UNIFIED IDEOGRAPH
+0x8B7D,0x6025, //#CJK UNIFIED IDEOGRAPH
+0x8B7E,0x6551, //#CJK UNIFIED IDEOGRAPH
+0x8B80,0x673D, //#CJK UNIFIED IDEOGRAPH
+0x8B81,0x6C42, //#CJK UNIFIED IDEOGRAPH
+0x8B82,0x6C72, //#CJK UNIFIED IDEOGRAPH
+0x8B83,0x6CE3, //#CJK UNIFIED IDEOGRAPH
+0x8B84,0x7078, //#CJK UNIFIED IDEOGRAPH
+0x8B85,0x7403, //#CJK UNIFIED IDEOGRAPH
+0x8B86,0x7A76, //#CJK UNIFIED IDEOGRAPH
+0x8B87,0x7AAE, //#CJK UNIFIED IDEOGRAPH
+0x8B88,0x7B08, //#CJK UNIFIED IDEOGRAPH
+0x8B89,0x7D1A, //#CJK UNIFIED IDEOGRAPH
+0x8B8A,0x7CFE, //#CJK UNIFIED IDEOGRAPH
+0x8B8B,0x7D66, //#CJK UNIFIED IDEOGRAPH
+0x8B8C,0x65E7, //#CJK UNIFIED IDEOGRAPH
+0x8B8D,0x725B, //#CJK UNIFIED IDEOGRAPH
+0x8B8E,0x53BB, //#CJK UNIFIED IDEOGRAPH
+0x8B8F,0x5C45, //#CJK UNIFIED IDEOGRAPH
+0x8B90,0x5DE8, //#CJK UNIFIED IDEOGRAPH
+0x8B91,0x62D2, //#CJK UNIFIED IDEOGRAPH
+0x8B92,0x62E0, //#CJK UNIFIED IDEOGRAPH
+0x8B93,0x6319, //#CJK UNIFIED IDEOGRAPH
+0x8B94,0x6E20, //#CJK UNIFIED IDEOGRAPH
+0x8B95,0x865A, //#CJK UNIFIED IDEOGRAPH
+0x8B96,0x8A31, //#CJK UNIFIED IDEOGRAPH
+0x8B97,0x8DDD, //#CJK UNIFIED IDEOGRAPH
+0x8B98,0x92F8, //#CJK UNIFIED IDEOGRAPH
+0x8B99,0x6F01, //#CJK UNIFIED IDEOGRAPH
+0x8B9A,0x79A6, //#CJK UNIFIED IDEOGRAPH
+0x8B9B,0x9B5A, //#CJK UNIFIED IDEOGRAPH
+0x8B9C,0x4EA8, //#CJK UNIFIED IDEOGRAPH
+0x8B9D,0x4EAB, //#CJK UNIFIED IDEOGRAPH
+0x8B9E,0x4EAC, //#CJK UNIFIED IDEOGRAPH
+0x8B9F,0x4F9B, //#CJK UNIFIED IDEOGRAPH
+0x8BA0,0x4FA0, //#CJK UNIFIED IDEOGRAPH
+0x8BA1,0x50D1, //#CJK UNIFIED IDEOGRAPH
+0x8BA2,0x5147, //#CJK UNIFIED IDEOGRAPH
+0x8BA3,0x7AF6, //#CJK UNIFIED IDEOGRAPH
+0x8BA4,0x5171, //#CJK UNIFIED IDEOGRAPH
+0x8BA5,0x51F6, //#CJK UNIFIED IDEOGRAPH
+0x8BA6,0x5354, //#CJK UNIFIED IDEOGRAPH
+0x8BA7,0x5321, //#CJK UNIFIED IDEOGRAPH
+0x8BA8,0x537F, //#CJK UNIFIED IDEOGRAPH
+0x8BA9,0x53EB, //#CJK UNIFIED IDEOGRAPH
+0x8BAA,0x55AC, //#CJK UNIFIED IDEOGRAPH
+0x8BAB,0x5883, //#CJK UNIFIED IDEOGRAPH
+0x8BAC,0x5CE1, //#CJK UNIFIED IDEOGRAPH
+0x8BAD,0x5F37, //#CJK UNIFIED IDEOGRAPH
+0x8BAE,0x5F4A, //#CJK UNIFIED IDEOGRAPH
+0x8BAF,0x602F, //#CJK UNIFIED IDEOGRAPH
+0x8BB0,0x6050, //#CJK UNIFIED IDEOGRAPH
+0x8BB1,0x606D, //#CJK UNIFIED IDEOGRAPH
+0x8BB2,0x631F, //#CJK UNIFIED IDEOGRAPH
+0x8BB3,0x6559, //#CJK UNIFIED IDEOGRAPH
+0x8BB4,0x6A4B, //#CJK UNIFIED IDEOGRAPH
+0x8BB5,0x6CC1, //#CJK UNIFIED IDEOGRAPH
+0x8BB6,0x72C2, //#CJK UNIFIED IDEOGRAPH
+0x8BB7,0x72ED, //#CJK UNIFIED IDEOGRAPH
+0x8BB8,0x77EF, //#CJK UNIFIED IDEOGRAPH
+0x8BB9,0x80F8, //#CJK UNIFIED IDEOGRAPH
+0x8BBA,0x8105, //#CJK UNIFIED IDEOGRAPH
+0x8BBB,0x8208, //#CJK UNIFIED IDEOGRAPH
+0x8BBC,0x854E, //#CJK UNIFIED IDEOGRAPH
+0x8BBD,0x90F7, //#CJK UNIFIED IDEOGRAPH
+0x8BBE,0x93E1, //#CJK UNIFIED IDEOGRAPH
+0x8BBF,0x97FF, //#CJK UNIFIED IDEOGRAPH
+0x8BC0,0x9957, //#CJK UNIFIED IDEOGRAPH
+0x8BC1,0x9A5A, //#CJK UNIFIED IDEOGRAPH
+0x8BC2,0x4EF0, //#CJK UNIFIED IDEOGRAPH
+0x8BC3,0x51DD, //#CJK UNIFIED IDEOGRAPH
+0x8BC4,0x5C2D, //#CJK UNIFIED IDEOGRAPH
+0x8BC5,0x6681, //#CJK UNIFIED IDEOGRAPH
+0x8BC6,0x696D, //#CJK UNIFIED IDEOGRAPH
+0x8BC7,0x5C40, //#CJK UNIFIED IDEOGRAPH
+0x8BC8,0x66F2, //#CJK UNIFIED IDEOGRAPH
+0x8BC9,0x6975, //#CJK UNIFIED IDEOGRAPH
+0x8BCA,0x7389, //#CJK UNIFIED IDEOGRAPH
+0x8BCB,0x6850, //#CJK UNIFIED IDEOGRAPH
+0x8BCC,0x7C81, //#CJK UNIFIED IDEOGRAPH
+0x8BCD,0x50C5, //#CJK UNIFIED IDEOGRAPH
+0x8BCE,0x52E4, //#CJK UNIFIED IDEOGRAPH
+0x8BCF,0x5747, //#CJK UNIFIED IDEOGRAPH
+0x8BD0,0x5DFE, //#CJK UNIFIED IDEOGRAPH
+0x8BD1,0x9326, //#CJK UNIFIED IDEOGRAPH
+0x8BD2,0x65A4, //#CJK UNIFIED IDEOGRAPH
+0x8BD3,0x6B23, //#CJK UNIFIED IDEOGRAPH
+0x8BD4,0x6B3D, //#CJK UNIFIED IDEOGRAPH
+0x8BD5,0x7434, //#CJK UNIFIED IDEOGRAPH
+0x8BD6,0x7981, //#CJK UNIFIED IDEOGRAPH
+0x8BD7,0x79BD, //#CJK UNIFIED IDEOGRAPH
+0x8BD8,0x7B4B, //#CJK UNIFIED IDEOGRAPH
+0x8BD9,0x7DCA, //#CJK UNIFIED IDEOGRAPH
+0x8BDA,0x82B9, //#CJK UNIFIED IDEOGRAPH
+0x8BDB,0x83CC, //#CJK UNIFIED IDEOGRAPH
+0x8BDC,0x887F, //#CJK UNIFIED IDEOGRAPH
+0x8BDD,0x895F, //#CJK UNIFIED IDEOGRAPH
+0x8BDE,0x8B39, //#CJK UNIFIED IDEOGRAPH
+0x8BDF,0x8FD1, //#CJK UNIFIED IDEOGRAPH
+0x8BE0,0x91D1, //#CJK UNIFIED IDEOGRAPH
+0x8BE1,0x541F, //#CJK UNIFIED IDEOGRAPH
+0x8BE2,0x9280, //#CJK UNIFIED IDEOGRAPH
+0x8BE3,0x4E5D, //#CJK UNIFIED IDEOGRAPH
+0x8BE4,0x5036, //#CJK UNIFIED IDEOGRAPH
+0x8BE5,0x53E5, //#CJK UNIFIED IDEOGRAPH
+0x8BE6,0x533A, //#CJK UNIFIED IDEOGRAPH
+0x8BE7,0x72D7, //#CJK UNIFIED IDEOGRAPH
+0x8BE8,0x7396, //#CJK UNIFIED IDEOGRAPH
+0x8BE9,0x77E9, //#CJK UNIFIED IDEOGRAPH
+0x8BEA,0x82E6, //#CJK UNIFIED IDEOGRAPH
+0x8BEB,0x8EAF, //#CJK UNIFIED IDEOGRAPH
+0x8BEC,0x99C6, //#CJK UNIFIED IDEOGRAPH
+0x8BED,0x99C8, //#CJK UNIFIED IDEOGRAPH
+0x8BEE,0x99D2, //#CJK UNIFIED IDEOGRAPH
+0x8BEF,0x5177, //#CJK UNIFIED IDEOGRAPH
+0x8BF0,0x611A, //#CJK UNIFIED IDEOGRAPH
+0x8BF1,0x865E, //#CJK UNIFIED IDEOGRAPH
+0x8BF2,0x55B0, //#CJK UNIFIED IDEOGRAPH
+0x8BF3,0x7A7A, //#CJK UNIFIED IDEOGRAPH
+0x8BF4,0x5076, //#CJK UNIFIED IDEOGRAPH
+0x8BF5,0x5BD3, //#CJK UNIFIED IDEOGRAPH
+0x8BF6,0x9047, //#CJK UNIFIED IDEOGRAPH
+0x8BF7,0x9685, //#CJK UNIFIED IDEOGRAPH
+0x8BF8,0x4E32, //#CJK UNIFIED IDEOGRAPH
+0x8BF9,0x6ADB, //#CJK UNIFIED IDEOGRAPH
+0x8BFA,0x91E7, //#CJK UNIFIED IDEOGRAPH
+0x8BFB,0x5C51, //#CJK UNIFIED IDEOGRAPH
+0x8BFC,0x5C48, //#CJK UNIFIED IDEOGRAPH
+0x8C40,0x6398, //#CJK UNIFIED IDEOGRAPH
+0x8C41,0x7A9F, //#CJK UNIFIED IDEOGRAPH
+0x8C42,0x6C93, //#CJK UNIFIED IDEOGRAPH
+0x8C43,0x9774, //#CJK UNIFIED IDEOGRAPH
+0x8C44,0x8F61, //#CJK UNIFIED IDEOGRAPH
+0x8C45,0x7AAA, //#CJK UNIFIED IDEOGRAPH
+0x8C46,0x718A, //#CJK UNIFIED IDEOGRAPH
+0x8C47,0x9688, //#CJK UNIFIED IDEOGRAPH
+0x8C48,0x7C82, //#CJK UNIFIED IDEOGRAPH
+0x8C49,0x6817, //#CJK UNIFIED IDEOGRAPH
+0x8C4A,0x7E70, //#CJK UNIFIED IDEOGRAPH
+0x8C4B,0x6851, //#CJK UNIFIED IDEOGRAPH
+0x8C4C,0x936C, //#CJK UNIFIED IDEOGRAPH
+0x8C4D,0x52F2, //#CJK UNIFIED IDEOGRAPH
+0x8C4E,0x541B, //#CJK UNIFIED IDEOGRAPH
+0x8C4F,0x85AB, //#CJK UNIFIED IDEOGRAPH
+0x8C50,0x8A13, //#CJK UNIFIED IDEOGRAPH
+0x8C51,0x7FA4, //#CJK UNIFIED IDEOGRAPH
+0x8C52,0x8ECD, //#CJK UNIFIED IDEOGRAPH
+0x8C53,0x90E1, //#CJK UNIFIED IDEOGRAPH
+0x8C54,0x5366, //#CJK UNIFIED IDEOGRAPH
+0x8C55,0x8888, //#CJK UNIFIED IDEOGRAPH
+0x8C56,0x7941, //#CJK UNIFIED IDEOGRAPH
+0x8C57,0x4FC2, //#CJK UNIFIED IDEOGRAPH
+0x8C58,0x50BE, //#CJK UNIFIED IDEOGRAPH
+0x8C59,0x5211, //#CJK UNIFIED IDEOGRAPH
+0x8C5A,0x5144, //#CJK UNIFIED IDEOGRAPH
+0x8C5B,0x5553, //#CJK UNIFIED IDEOGRAPH
+0x8C5C,0x572D, //#CJK UNIFIED IDEOGRAPH
+0x8C5D,0x73EA, //#CJK UNIFIED IDEOGRAPH
+0x8C5E,0x578B, //#CJK UNIFIED IDEOGRAPH
+0x8C5F,0x5951, //#CJK UNIFIED IDEOGRAPH
+0x8C60,0x5F62, //#CJK UNIFIED IDEOGRAPH
+0x8C61,0x5F84, //#CJK UNIFIED IDEOGRAPH
+0x8C62,0x6075, //#CJK UNIFIED IDEOGRAPH
+0x8C63,0x6176, //#CJK UNIFIED IDEOGRAPH
+0x8C64,0x6167, //#CJK UNIFIED IDEOGRAPH
+0x8C65,0x61A9, //#CJK UNIFIED IDEOGRAPH
+0x8C66,0x63B2, //#CJK UNIFIED IDEOGRAPH
+0x8C67,0x643A, //#CJK UNIFIED IDEOGRAPH
+0x8C68,0x656C, //#CJK UNIFIED IDEOGRAPH
+0x8C69,0x666F, //#CJK UNIFIED IDEOGRAPH
+0x8C6A,0x6842, //#CJK UNIFIED IDEOGRAPH
+0x8C6B,0x6E13, //#CJK UNIFIED IDEOGRAPH
+0x8C6C,0x7566, //#CJK UNIFIED IDEOGRAPH
+0x8C6D,0x7A3D, //#CJK UNIFIED IDEOGRAPH
+0x8C6E,0x7CFB, //#CJK UNIFIED IDEOGRAPH
+0x8C6F,0x7D4C, //#CJK UNIFIED IDEOGRAPH
+0x8C70,0x7D99, //#CJK UNIFIED IDEOGRAPH
+0x8C71,0x7E4B, //#CJK UNIFIED IDEOGRAPH
+0x8C72,0x7F6B, //#CJK UNIFIED IDEOGRAPH
+0x8C73,0x830E, //#CJK UNIFIED IDEOGRAPH
+0x8C74,0x834A, //#CJK UNIFIED IDEOGRAPH
+0x8C75,0x86CD, //#CJK UNIFIED IDEOGRAPH
+0x8C76,0x8A08, //#CJK UNIFIED IDEOGRAPH
+0x8C77,0x8A63, //#CJK UNIFIED IDEOGRAPH
+0x8C78,0x8B66, //#CJK UNIFIED IDEOGRAPH
+0x8C79,0x8EFD, //#CJK UNIFIED IDEOGRAPH
+0x8C7A,0x981A, //#CJK UNIFIED IDEOGRAPH
+0x8C7B,0x9D8F, //#CJK UNIFIED IDEOGRAPH
+0x8C7C,0x82B8, //#CJK UNIFIED IDEOGRAPH
+0x8C7D,0x8FCE, //#CJK UNIFIED IDEOGRAPH
+0x8C7E,0x9BE8, //#CJK UNIFIED IDEOGRAPH
+0x8C80,0x5287, //#CJK UNIFIED IDEOGRAPH
+0x8C81,0x621F, //#CJK UNIFIED IDEOGRAPH
+0x8C82,0x6483, //#CJK UNIFIED IDEOGRAPH
+0x8C83,0x6FC0, //#CJK UNIFIED IDEOGRAPH
+0x8C84,0x9699, //#CJK UNIFIED IDEOGRAPH
+0x8C85,0x6841, //#CJK UNIFIED IDEOGRAPH
+0x8C86,0x5091, //#CJK UNIFIED IDEOGRAPH
+0x8C87,0x6B20, //#CJK UNIFIED IDEOGRAPH
+0x8C88,0x6C7A, //#CJK UNIFIED IDEOGRAPH
+0x8C89,0x6F54, //#CJK UNIFIED IDEOGRAPH
+0x8C8A,0x7A74, //#CJK UNIFIED IDEOGRAPH
+0x8C8B,0x7D50, //#CJK UNIFIED IDEOGRAPH
+0x8C8C,0x8840, //#CJK UNIFIED IDEOGRAPH
+0x8C8D,0x8A23, //#CJK UNIFIED IDEOGRAPH
+0x8C8E,0x6708, //#CJK UNIFIED IDEOGRAPH
+0x8C8F,0x4EF6, //#CJK UNIFIED IDEOGRAPH
+0x8C90,0x5039, //#CJK UNIFIED IDEOGRAPH
+0x8C91,0x5026, //#CJK UNIFIED IDEOGRAPH
+0x8C92,0x5065, //#CJK UNIFIED IDEOGRAPH
+0x8C93,0x517C, //#CJK UNIFIED IDEOGRAPH
+0x8C94,0x5238, //#CJK UNIFIED IDEOGRAPH
+0x8C95,0x5263, //#CJK UNIFIED IDEOGRAPH
+0x8C96,0x55A7, //#CJK UNIFIED IDEOGRAPH
+0x8C97,0x570F, //#CJK UNIFIED IDEOGRAPH
+0x8C98,0x5805, //#CJK UNIFIED IDEOGRAPH
+0x8C99,0x5ACC, //#CJK UNIFIED IDEOGRAPH
+0x8C9A,0x5EFA, //#CJK UNIFIED IDEOGRAPH
+0x8C9B,0x61B2, //#CJK UNIFIED IDEOGRAPH
+0x8C9C,0x61F8, //#CJK UNIFIED IDEOGRAPH
+0x8C9D,0x62F3, //#CJK UNIFIED IDEOGRAPH
+0x8C9E,0x6372, //#CJK UNIFIED IDEOGRAPH
+0x8C9F,0x691C, //#CJK UNIFIED IDEOGRAPH
+0x8CA0,0x6A29, //#CJK UNIFIED IDEOGRAPH
+0x8CA1,0x727D, //#CJK UNIFIED IDEOGRAPH
+0x8CA2,0x72AC, //#CJK UNIFIED IDEOGRAPH
+0x8CA3,0x732E, //#CJK UNIFIED IDEOGRAPH
+0x8CA4,0x7814, //#CJK UNIFIED IDEOGRAPH
+0x8CA5,0x786F, //#CJK UNIFIED IDEOGRAPH
+0x8CA6,0x7D79, //#CJK UNIFIED IDEOGRAPH
+0x8CA7,0x770C, //#CJK UNIFIED IDEOGRAPH
+0x8CA8,0x80A9, //#CJK UNIFIED IDEOGRAPH
+0x8CA9,0x898B, //#CJK UNIFIED IDEOGRAPH
+0x8CAA,0x8B19, //#CJK UNIFIED IDEOGRAPH
+0x8CAB,0x8CE2, //#CJK UNIFIED IDEOGRAPH
+0x8CAC,0x8ED2, //#CJK UNIFIED IDEOGRAPH
+0x8CAD,0x9063, //#CJK UNIFIED IDEOGRAPH
+0x8CAE,0x9375, //#CJK UNIFIED IDEOGRAPH
+0x8CAF,0x967A, //#CJK UNIFIED IDEOGRAPH
+0x8CB0,0x9855, //#CJK UNIFIED IDEOGRAPH
+0x8CB1,0x9A13, //#CJK UNIFIED IDEOGRAPH
+0x8CB2,0x9E78, //#CJK UNIFIED IDEOGRAPH
+0x8CB3,0x5143, //#CJK UNIFIED IDEOGRAPH
+0x8CB4,0x539F, //#CJK UNIFIED IDEOGRAPH
+0x8CB5,0x53B3, //#CJK UNIFIED IDEOGRAPH
+0x8CB6,0x5E7B, //#CJK UNIFIED IDEOGRAPH
+0x8CB7,0x5F26, //#CJK UNIFIED IDEOGRAPH
+0x8CB8,0x6E1B, //#CJK UNIFIED IDEOGRAPH
+0x8CB9,0x6E90, //#CJK UNIFIED IDEOGRAPH
+0x8CBA,0x7384, //#CJK UNIFIED IDEOGRAPH
+0x8CBB,0x73FE, //#CJK UNIFIED IDEOGRAPH
+0x8CBC,0x7D43, //#CJK UNIFIED IDEOGRAPH
+0x8CBD,0x8237, //#CJK UNIFIED IDEOGRAPH
+0x8CBE,0x8A00, //#CJK UNIFIED IDEOGRAPH
+0x8CBF,0x8AFA, //#CJK UNIFIED IDEOGRAPH
+0x8CC0,0x9650, //#CJK UNIFIED IDEOGRAPH
+0x8CC1,0x4E4E, //#CJK UNIFIED IDEOGRAPH
+0x8CC2,0x500B, //#CJK UNIFIED IDEOGRAPH
+0x8CC3,0x53E4, //#CJK UNIFIED IDEOGRAPH
+0x8CC4,0x547C, //#CJK UNIFIED IDEOGRAPH
+0x8CC5,0x56FA, //#CJK UNIFIED IDEOGRAPH
+0x8CC6,0x59D1, //#CJK UNIFIED IDEOGRAPH
+0x8CC7,0x5B64, //#CJK UNIFIED IDEOGRAPH
+0x8CC8,0x5DF1, //#CJK UNIFIED IDEOGRAPH
+0x8CC9,0x5EAB, //#CJK UNIFIED IDEOGRAPH
+0x8CCA,0x5F27, //#CJK UNIFIED IDEOGRAPH
+0x8CCB,0x6238, //#CJK UNIFIED IDEOGRAPH
+0x8CCC,0x6545, //#CJK UNIFIED IDEOGRAPH
+0x8CCD,0x67AF, //#CJK UNIFIED IDEOGRAPH
+0x8CCE,0x6E56, //#CJK UNIFIED IDEOGRAPH
+0x8CCF,0x72D0, //#CJK UNIFIED IDEOGRAPH
+0x8CD0,0x7CCA, //#CJK UNIFIED IDEOGRAPH
+0x8CD1,0x88B4, //#CJK UNIFIED IDEOGRAPH
+0x8CD2,0x80A1, //#CJK UNIFIED IDEOGRAPH
+0x8CD3,0x80E1, //#CJK UNIFIED IDEOGRAPH
+0x8CD4,0x83F0, //#CJK UNIFIED IDEOGRAPH
+0x8CD5,0x864E, //#CJK UNIFIED IDEOGRAPH
+0x8CD6,0x8A87, //#CJK UNIFIED IDEOGRAPH
+0x8CD7,0x8DE8, //#CJK UNIFIED IDEOGRAPH
+0x8CD8,0x9237, //#CJK UNIFIED IDEOGRAPH
+0x8CD9,0x96C7, //#CJK UNIFIED IDEOGRAPH
+0x8CDA,0x9867, //#CJK UNIFIED IDEOGRAPH
+0x8CDB,0x9F13, //#CJK UNIFIED IDEOGRAPH
+0x8CDC,0x4E94, //#CJK UNIFIED IDEOGRAPH
+0x8CDD,0x4E92, //#CJK UNIFIED IDEOGRAPH
+0x8CDE,0x4F0D, //#CJK UNIFIED IDEOGRAPH
+0x8CDF,0x5348, //#CJK UNIFIED IDEOGRAPH
+0x8CE0,0x5449, //#CJK UNIFIED IDEOGRAPH
+0x8CE1,0x543E, //#CJK UNIFIED IDEOGRAPH
+0x8CE2,0x5A2F, //#CJK UNIFIED IDEOGRAPH
+0x8CE3,0x5F8C, //#CJK UNIFIED IDEOGRAPH
+0x8CE4,0x5FA1, //#CJK UNIFIED IDEOGRAPH
+0x8CE5,0x609F, //#CJK UNIFIED IDEOGRAPH
+0x8CE6,0x68A7, //#CJK UNIFIED IDEOGRAPH
+0x8CE7,0x6A8E, //#CJK UNIFIED IDEOGRAPH
+0x8CE8,0x745A, //#CJK UNIFIED IDEOGRAPH
+0x8CE9,0x7881, //#CJK UNIFIED IDEOGRAPH
+0x8CEA,0x8A9E, //#CJK UNIFIED IDEOGRAPH
+0x8CEB,0x8AA4, //#CJK UNIFIED IDEOGRAPH
+0x8CEC,0x8B77, //#CJK UNIFIED IDEOGRAPH
+0x8CED,0x9190, //#CJK UNIFIED IDEOGRAPH
+0x8CEE,0x4E5E, //#CJK UNIFIED IDEOGRAPH
+0x8CEF,0x9BC9, //#CJK UNIFIED IDEOGRAPH
+0x8CF0,0x4EA4, //#CJK UNIFIED IDEOGRAPH
+0x8CF1,0x4F7C, //#CJK UNIFIED IDEOGRAPH
+0x8CF2,0x4FAF, //#CJK UNIFIED IDEOGRAPH
+0x8CF3,0x5019, //#CJK UNIFIED IDEOGRAPH
+0x8CF4,0x5016, //#CJK UNIFIED IDEOGRAPH
+0x8CF5,0x5149, //#CJK UNIFIED IDEOGRAPH
+0x8CF6,0x516C, //#CJK UNIFIED IDEOGRAPH
+0x8CF7,0x529F, //#CJK UNIFIED IDEOGRAPH
+0x8CF8,0x52B9, //#CJK UNIFIED IDEOGRAPH
+0x8CF9,0x52FE, //#CJK UNIFIED IDEOGRAPH
+0x8CFA,0x539A, //#CJK UNIFIED IDEOGRAPH
+0x8CFB,0x53E3, //#CJK UNIFIED IDEOGRAPH
+0x8CFC,0x5411, //#CJK UNIFIED IDEOGRAPH
+0x8D40,0x540E, //#CJK UNIFIED IDEOGRAPH
+0x8D41,0x5589, //#CJK UNIFIED IDEOGRAPH
+0x8D42,0x5751, //#CJK UNIFIED IDEOGRAPH
+0x8D43,0x57A2, //#CJK UNIFIED IDEOGRAPH
+0x8D44,0x597D, //#CJK UNIFIED IDEOGRAPH
+0x8D45,0x5B54, //#CJK UNIFIED IDEOGRAPH
+0x8D46,0x5B5D, //#CJK UNIFIED IDEOGRAPH
+0x8D47,0x5B8F, //#CJK UNIFIED IDEOGRAPH
+0x8D48,0x5DE5, //#CJK UNIFIED IDEOGRAPH
+0x8D49,0x5DE7, //#CJK UNIFIED IDEOGRAPH
+0x8D4A,0x5DF7, //#CJK UNIFIED IDEOGRAPH
+0x8D4B,0x5E78, //#CJK UNIFIED IDEOGRAPH
+0x8D4C,0x5E83, //#CJK UNIFIED IDEOGRAPH
+0x8D4D,0x5E9A, //#CJK UNIFIED IDEOGRAPH
+0x8D4E,0x5EB7, //#CJK UNIFIED IDEOGRAPH
+0x8D4F,0x5F18, //#CJK UNIFIED IDEOGRAPH
+0x8D50,0x6052, //#CJK UNIFIED IDEOGRAPH
+0x8D51,0x614C, //#CJK UNIFIED IDEOGRAPH
+0x8D52,0x6297, //#CJK UNIFIED IDEOGRAPH
+0x8D53,0x62D8, //#CJK UNIFIED IDEOGRAPH
+0x8D54,0x63A7, //#CJK UNIFIED IDEOGRAPH
+0x8D55,0x653B, //#CJK UNIFIED IDEOGRAPH
+0x8D56,0x6602, //#CJK UNIFIED IDEOGRAPH
+0x8D57,0x6643, //#CJK UNIFIED IDEOGRAPH
+0x8D58,0x66F4, //#CJK UNIFIED IDEOGRAPH
+0x8D59,0x676D, //#CJK UNIFIED IDEOGRAPH
+0x8D5A,0x6821, //#CJK UNIFIED IDEOGRAPH
+0x8D5B,0x6897, //#CJK UNIFIED IDEOGRAPH
+0x8D5C,0x69CB, //#CJK UNIFIED IDEOGRAPH
+0x8D5D,0x6C5F, //#CJK UNIFIED IDEOGRAPH
+0x8D5E,0x6D2A, //#CJK UNIFIED IDEOGRAPH
+0x8D5F,0x6D69, //#CJK UNIFIED IDEOGRAPH
+0x8D60,0x6E2F, //#CJK UNIFIED IDEOGRAPH
+0x8D61,0x6E9D, //#CJK UNIFIED IDEOGRAPH
+0x8D62,0x7532, //#CJK UNIFIED IDEOGRAPH
+0x8D63,0x7687, //#CJK UNIFIED IDEOGRAPH
+0x8D64,0x786C, //#CJK UNIFIED IDEOGRAPH
+0x8D65,0x7A3F, //#CJK UNIFIED IDEOGRAPH
+0x8D66,0x7CE0, //#CJK UNIFIED IDEOGRAPH
+0x8D67,0x7D05, //#CJK UNIFIED IDEOGRAPH
+0x8D68,0x7D18, //#CJK UNIFIED IDEOGRAPH
+0x8D69,0x7D5E, //#CJK UNIFIED IDEOGRAPH
+0x8D6A,0x7DB1, //#CJK UNIFIED IDEOGRAPH
+0x8D6B,0x8015, //#CJK UNIFIED IDEOGRAPH
+0x8D6C,0x8003, //#CJK UNIFIED IDEOGRAPH
+0x8D6D,0x80AF, //#CJK UNIFIED IDEOGRAPH
+0x8D6E,0x80B1, //#CJK UNIFIED IDEOGRAPH
+0x8D6F,0x8154, //#CJK UNIFIED IDEOGRAPH
+0x8D70,0x818F, //#CJK UNIFIED IDEOGRAPH
+0x8D71,0x822A, //#CJK UNIFIED IDEOGRAPH
+0x8D72,0x8352, //#CJK UNIFIED IDEOGRAPH
+0x8D73,0x884C, //#CJK UNIFIED IDEOGRAPH
+0x8D74,0x8861, //#CJK UNIFIED IDEOGRAPH
+0x8D75,0x8B1B, //#CJK UNIFIED IDEOGRAPH
+0x8D76,0x8CA2, //#CJK UNIFIED IDEOGRAPH
+0x8D77,0x8CFC, //#CJK UNIFIED IDEOGRAPH
+0x8D78,0x90CA, //#CJK UNIFIED IDEOGRAPH
+0x8D79,0x9175, //#CJK UNIFIED IDEOGRAPH
+0x8D7A,0x9271, //#CJK UNIFIED IDEOGRAPH
+0x8D7B,0x783F, //#CJK UNIFIED IDEOGRAPH
+0x8D7C,0x92FC, //#CJK UNIFIED IDEOGRAPH
+0x8D7D,0x95A4, //#CJK UNIFIED IDEOGRAPH
+0x8D7E,0x964D, //#CJK UNIFIED IDEOGRAPH
+0x8D80,0x9805, //#CJK UNIFIED IDEOGRAPH
+0x8D81,0x9999, //#CJK UNIFIED IDEOGRAPH
+0x8D82,0x9AD8, //#CJK UNIFIED IDEOGRAPH
+0x8D83,0x9D3B, //#CJK UNIFIED IDEOGRAPH
+0x8D84,0x525B, //#CJK UNIFIED IDEOGRAPH
+0x8D85,0x52AB, //#CJK UNIFIED IDEOGRAPH
+0x8D86,0x53F7, //#CJK UNIFIED IDEOGRAPH
+0x8D87,0x5408, //#CJK UNIFIED IDEOGRAPH
+0x8D88,0x58D5, //#CJK UNIFIED IDEOGRAPH
+0x8D89,0x62F7, //#CJK UNIFIED IDEOGRAPH
+0x8D8A,0x6FE0, //#CJK UNIFIED IDEOGRAPH
+0x8D8B,0x8C6A, //#CJK UNIFIED IDEOGRAPH
+0x8D8C,0x8F5F, //#CJK UNIFIED IDEOGRAPH
+0x8D8D,0x9EB9, //#CJK UNIFIED IDEOGRAPH
+0x8D8E,0x514B, //#CJK UNIFIED IDEOGRAPH
+0x8D8F,0x523B, //#CJK UNIFIED IDEOGRAPH
+0x8D90,0x544A, //#CJK UNIFIED IDEOGRAPH
+0x8D91,0x56FD, //#CJK UNIFIED IDEOGRAPH
+0x8D92,0x7A40, //#CJK UNIFIED IDEOGRAPH
+0x8D93,0x9177, //#CJK UNIFIED IDEOGRAPH
+0x8D94,0x9D60, //#CJK UNIFIED IDEOGRAPH
+0x8D95,0x9ED2, //#CJK UNIFIED IDEOGRAPH
+0x8D96,0x7344, //#CJK UNIFIED IDEOGRAPH
+0x8D97,0x6F09, //#CJK UNIFIED IDEOGRAPH
+0x8D98,0x8170, //#CJK UNIFIED IDEOGRAPH
+0x8D99,0x7511, //#CJK UNIFIED IDEOGRAPH
+0x8D9A,0x5FFD, //#CJK UNIFIED IDEOGRAPH
+0x8D9B,0x60DA, //#CJK UNIFIED IDEOGRAPH
+0x8D9C,0x9AA8, //#CJK UNIFIED IDEOGRAPH
+0x8D9D,0x72DB, //#CJK UNIFIED IDEOGRAPH
+0x8D9E,0x8FBC, //#CJK UNIFIED IDEOGRAPH
+0x8D9F,0x6B64, //#CJK UNIFIED IDEOGRAPH
+0x8DA0,0x9803, //#CJK UNIFIED IDEOGRAPH
+0x8DA1,0x4ECA, //#CJK UNIFIED IDEOGRAPH
+0x8DA2,0x56F0, //#CJK UNIFIED IDEOGRAPH
+0x8DA3,0x5764, //#CJK UNIFIED IDEOGRAPH
+0x8DA4,0x58BE, //#CJK UNIFIED IDEOGRAPH
+0x8DA5,0x5A5A, //#CJK UNIFIED IDEOGRAPH
+0x8DA6,0x6068, //#CJK UNIFIED IDEOGRAPH
+0x8DA7,0x61C7, //#CJK UNIFIED IDEOGRAPH
+0x8DA8,0x660F, //#CJK UNIFIED IDEOGRAPH
+0x8DA9,0x6606, //#CJK UNIFIED IDEOGRAPH
+0x8DAA,0x6839, //#CJK UNIFIED IDEOGRAPH
+0x8DAB,0x68B1, //#CJK UNIFIED IDEOGRAPH
+0x8DAC,0x6DF7, //#CJK UNIFIED IDEOGRAPH
+0x8DAD,0x75D5, //#CJK UNIFIED IDEOGRAPH
+0x8DAE,0x7D3A, //#CJK UNIFIED IDEOGRAPH
+0x8DAF,0x826E, //#CJK UNIFIED IDEOGRAPH
+0x8DB0,0x9B42, //#CJK UNIFIED IDEOGRAPH
+0x8DB1,0x4E9B, //#CJK UNIFIED IDEOGRAPH
+0x8DB2,0x4F50, //#CJK UNIFIED IDEOGRAPH
+0x8DB3,0x53C9, //#CJK UNIFIED IDEOGRAPH
+0x8DB4,0x5506, //#CJK UNIFIED IDEOGRAPH
+0x8DB5,0x5D6F, //#CJK UNIFIED IDEOGRAPH
+0x8DB6,0x5DE6, //#CJK UNIFIED IDEOGRAPH
+0x8DB7,0x5DEE, //#CJK UNIFIED IDEOGRAPH
+0x8DB8,0x67FB, //#CJK UNIFIED IDEOGRAPH
+0x8DB9,0x6C99, //#CJK UNIFIED IDEOGRAPH
+0x8DBA,0x7473, //#CJK UNIFIED IDEOGRAPH
+0x8DBB,0x7802, //#CJK UNIFIED IDEOGRAPH
+0x8DBC,0x8A50, //#CJK UNIFIED IDEOGRAPH
+0x8DBD,0x9396, //#CJK UNIFIED IDEOGRAPH
+0x8DBE,0x88DF, //#CJK UNIFIED IDEOGRAPH
+0x8DBF,0x5750, //#CJK UNIFIED IDEOGRAPH
+0x8DC0,0x5EA7, //#CJK UNIFIED IDEOGRAPH
+0x8DC1,0x632B, //#CJK UNIFIED IDEOGRAPH
+0x8DC2,0x50B5, //#CJK UNIFIED IDEOGRAPH
+0x8DC3,0x50AC, //#CJK UNIFIED IDEOGRAPH
+0x8DC4,0x518D, //#CJK UNIFIED IDEOGRAPH
+0x8DC5,0x6700, //#CJK UNIFIED IDEOGRAPH
+0x8DC6,0x54C9, //#CJK UNIFIED IDEOGRAPH
+0x8DC7,0x585E, //#CJK UNIFIED IDEOGRAPH
+0x8DC8,0x59BB, //#CJK UNIFIED IDEOGRAPH
+0x8DC9,0x5BB0, //#CJK UNIFIED IDEOGRAPH
+0x8DCA,0x5F69, //#CJK UNIFIED IDEOGRAPH
+0x8DCB,0x624D, //#CJK UNIFIED IDEOGRAPH
+0x8DCC,0x63A1, //#CJK UNIFIED IDEOGRAPH
+0x8DCD,0x683D, //#CJK UNIFIED IDEOGRAPH
+0x8DCE,0x6B73, //#CJK UNIFIED IDEOGRAPH
+0x8DCF,0x6E08, //#CJK UNIFIED IDEOGRAPH
+0x8DD0,0x707D, //#CJK UNIFIED IDEOGRAPH
+0x8DD1,0x91C7, //#CJK UNIFIED IDEOGRAPH
+0x8DD2,0x7280, //#CJK UNIFIED IDEOGRAPH
+0x8DD3,0x7815, //#CJK UNIFIED IDEOGRAPH
+0x8DD4,0x7826, //#CJK UNIFIED IDEOGRAPH
+0x8DD5,0x796D, //#CJK UNIFIED IDEOGRAPH
+0x8DD6,0x658E, //#CJK UNIFIED IDEOGRAPH
+0x8DD7,0x7D30, //#CJK UNIFIED IDEOGRAPH
+0x8DD8,0x83DC, //#CJK UNIFIED IDEOGRAPH
+0x8DD9,0x88C1, //#CJK UNIFIED IDEOGRAPH
+0x8DDA,0x8F09, //#CJK UNIFIED IDEOGRAPH
+0x8DDB,0x969B, //#CJK UNIFIED IDEOGRAPH
+0x8DDC,0x5264, //#CJK UNIFIED IDEOGRAPH
+0x8DDD,0x5728, //#CJK UNIFIED IDEOGRAPH
+0x8DDE,0x6750, //#CJK UNIFIED IDEOGRAPH
+0x8DDF,0x7F6A, //#CJK UNIFIED IDEOGRAPH
+0x8DE0,0x8CA1, //#CJK UNIFIED IDEOGRAPH
+0x8DE1,0x51B4, //#CJK UNIFIED IDEOGRAPH
+0x8DE2,0x5742, //#CJK UNIFIED IDEOGRAPH
+0x8DE3,0x962A, //#CJK UNIFIED IDEOGRAPH
+0x8DE4,0x583A, //#CJK UNIFIED IDEOGRAPH
+0x8DE5,0x698A, //#CJK UNIFIED IDEOGRAPH
+0x8DE6,0x80B4, //#CJK UNIFIED IDEOGRAPH
+0x8DE7,0x54B2, //#CJK UNIFIED IDEOGRAPH
+0x8DE8,0x5D0E, //#CJK UNIFIED IDEOGRAPH
+0x8DE9,0x57FC, //#CJK UNIFIED IDEOGRAPH
+0x8DEA,0x7895, //#CJK UNIFIED IDEOGRAPH
+0x8DEB,0x9DFA, //#CJK UNIFIED IDEOGRAPH
+0x8DEC,0x4F5C, //#CJK UNIFIED IDEOGRAPH
+0x8DED,0x524A, //#CJK UNIFIED IDEOGRAPH
+0x8DEE,0x548B, //#CJK UNIFIED IDEOGRAPH
+0x8DEF,0x643E, //#CJK UNIFIED IDEOGRAPH
+0x8DF0,0x6628, //#CJK UNIFIED IDEOGRAPH
+0x8DF1,0x6714, //#CJK UNIFIED IDEOGRAPH
+0x8DF2,0x67F5, //#CJK UNIFIED IDEOGRAPH
+0x8DF3,0x7A84, //#CJK UNIFIED IDEOGRAPH
+0x8DF4,0x7B56, //#CJK UNIFIED IDEOGRAPH
+0x8DF5,0x7D22, //#CJK UNIFIED IDEOGRAPH
+0x8DF6,0x932F, //#CJK UNIFIED IDEOGRAPH
+0x8DF7,0x685C, //#CJK UNIFIED IDEOGRAPH
+0x8DF8,0x9BAD, //#CJK UNIFIED IDEOGRAPH
+0x8DF9,0x7B39, //#CJK UNIFIED IDEOGRAPH
+0x8DFA,0x5319, //#CJK UNIFIED IDEOGRAPH
+0x8DFB,0x518A, //#CJK UNIFIED IDEOGRAPH
+0x8DFC,0x5237, //#CJK UNIFIED IDEOGRAPH
+0x8E40,0x5BDF, //#CJK UNIFIED IDEOGRAPH
+0x8E41,0x62F6, //#CJK UNIFIED IDEOGRAPH
+0x8E42,0x64AE, //#CJK UNIFIED IDEOGRAPH
+0x8E43,0x64E6, //#CJK UNIFIED IDEOGRAPH
+0x8E44,0x672D, //#CJK UNIFIED IDEOGRAPH
+0x8E45,0x6BBA, //#CJK UNIFIED IDEOGRAPH
+0x8E46,0x85A9, //#CJK UNIFIED IDEOGRAPH
+0x8E47,0x96D1, //#CJK UNIFIED IDEOGRAPH
+0x8E48,0x7690, //#CJK UNIFIED IDEOGRAPH
+0x8E49,0x9BD6, //#CJK UNIFIED IDEOGRAPH
+0x8E4A,0x634C, //#CJK UNIFIED IDEOGRAPH
+0x8E4B,0x9306, //#CJK UNIFIED IDEOGRAPH
+0x8E4C,0x9BAB, //#CJK UNIFIED IDEOGRAPH
+0x8E4D,0x76BF, //#CJK UNIFIED IDEOGRAPH
+0x8E4E,0x6652, //#CJK UNIFIED IDEOGRAPH
+0x8E4F,0x4E09, //#CJK UNIFIED IDEOGRAPH
+0x8E50,0x5098, //#CJK UNIFIED IDEOGRAPH
+0x8E51,0x53C2, //#CJK UNIFIED IDEOGRAPH
+0x8E52,0x5C71, //#CJK UNIFIED IDEOGRAPH
+0x8E53,0x60E8, //#CJK UNIFIED IDEOGRAPH
+0x8E54,0x6492, //#CJK UNIFIED IDEOGRAPH
+0x8E55,0x6563, //#CJK UNIFIED IDEOGRAPH
+0x8E56,0x685F, //#CJK UNIFIED IDEOGRAPH
+0x8E57,0x71E6, //#CJK UNIFIED IDEOGRAPH
+0x8E58,0x73CA, //#CJK UNIFIED IDEOGRAPH
+0x8E59,0x7523, //#CJK UNIFIED IDEOGRAPH
+0x8E5A,0x7B97, //#CJK UNIFIED IDEOGRAPH
+0x8E5B,0x7E82, //#CJK UNIFIED IDEOGRAPH
+0x8E5C,0x8695, //#CJK UNIFIED IDEOGRAPH
+0x8E5D,0x8B83, //#CJK UNIFIED IDEOGRAPH
+0x8E5E,0x8CDB, //#CJK UNIFIED IDEOGRAPH
+0x8E5F,0x9178, //#CJK UNIFIED IDEOGRAPH
+0x8E60,0x9910, //#CJK UNIFIED IDEOGRAPH
+0x8E61,0x65AC, //#CJK UNIFIED IDEOGRAPH
+0x8E62,0x66AB, //#CJK UNIFIED IDEOGRAPH
+0x8E63,0x6B8B, //#CJK UNIFIED IDEOGRAPH
+0x8E64,0x4ED5, //#CJK UNIFIED IDEOGRAPH
+0x8E65,0x4ED4, //#CJK UNIFIED IDEOGRAPH
+0x8E66,0x4F3A, //#CJK UNIFIED IDEOGRAPH
+0x8E67,0x4F7F, //#CJK UNIFIED IDEOGRAPH
+0x8E68,0x523A, //#CJK UNIFIED IDEOGRAPH
+0x8E69,0x53F8, //#CJK UNIFIED IDEOGRAPH
+0x8E6A,0x53F2, //#CJK UNIFIED IDEOGRAPH
+0x8E6B,0x55E3, //#CJK UNIFIED IDEOGRAPH
+0x8E6C,0x56DB, //#CJK UNIFIED IDEOGRAPH
+0x8E6D,0x58EB, //#CJK UNIFIED IDEOGRAPH
+0x8E6E,0x59CB, //#CJK UNIFIED IDEOGRAPH
+0x8E6F,0x59C9, //#CJK UNIFIED IDEOGRAPH
+0x8E70,0x59FF, //#CJK UNIFIED IDEOGRAPH
+0x8E71,0x5B50, //#CJK UNIFIED IDEOGRAPH
+0x8E72,0x5C4D, //#CJK UNIFIED IDEOGRAPH
+0x8E73,0x5E02, //#CJK UNIFIED IDEOGRAPH
+0x8E74,0x5E2B, //#CJK UNIFIED IDEOGRAPH
+0x8E75,0x5FD7, //#CJK UNIFIED IDEOGRAPH
+0x8E76,0x601D, //#CJK UNIFIED IDEOGRAPH
+0x8E77,0x6307, //#CJK UNIFIED IDEOGRAPH
+0x8E78,0x652F, //#CJK UNIFIED IDEOGRAPH
+0x8E79,0x5B5C, //#CJK UNIFIED IDEOGRAPH
+0x8E7A,0x65AF, //#CJK UNIFIED IDEOGRAPH
+0x8E7B,0x65BD, //#CJK UNIFIED IDEOGRAPH
+0x8E7C,0x65E8, //#CJK UNIFIED IDEOGRAPH
+0x8E7D,0x679D, //#CJK UNIFIED IDEOGRAPH
+0x8E7E,0x6B62, //#CJK UNIFIED IDEOGRAPH
+0x8E80,0x6B7B, //#CJK UNIFIED IDEOGRAPH
+0x8E81,0x6C0F, //#CJK UNIFIED IDEOGRAPH
+0x8E82,0x7345, //#CJK UNIFIED IDEOGRAPH
+0x8E83,0x7949, //#CJK UNIFIED IDEOGRAPH
+0x8E84,0x79C1, //#CJK UNIFIED IDEOGRAPH
+0x8E85,0x7CF8, //#CJK UNIFIED IDEOGRAPH
+0x8E86,0x7D19, //#CJK UNIFIED IDEOGRAPH
+0x8E87,0x7D2B, //#CJK UNIFIED IDEOGRAPH
+0x8E88,0x80A2, //#CJK UNIFIED IDEOGRAPH
+0x8E89,0x8102, //#CJK UNIFIED IDEOGRAPH
+0x8E8A,0x81F3, //#CJK UNIFIED IDEOGRAPH
+0x8E8B,0x8996, //#CJK UNIFIED IDEOGRAPH
+0x8E8C,0x8A5E, //#CJK UNIFIED IDEOGRAPH
+0x8E8D,0x8A69, //#CJK UNIFIED IDEOGRAPH
+0x8E8E,0x8A66, //#CJK UNIFIED IDEOGRAPH
+0x8E8F,0x8A8C, //#CJK UNIFIED IDEOGRAPH
+0x8E90,0x8AEE, //#CJK UNIFIED IDEOGRAPH
+0x8E91,0x8CC7, //#CJK UNIFIED IDEOGRAPH
+0x8E92,0x8CDC, //#CJK UNIFIED IDEOGRAPH
+0x8E93,0x96CC, //#CJK UNIFIED IDEOGRAPH
+0x8E94,0x98FC, //#CJK UNIFIED IDEOGRAPH
+0x8E95,0x6B6F, //#CJK UNIFIED IDEOGRAPH
+0x8E96,0x4E8B, //#CJK UNIFIED IDEOGRAPH
+0x8E97,0x4F3C, //#CJK UNIFIED IDEOGRAPH
+0x8E98,0x4F8D, //#CJK UNIFIED IDEOGRAPH
+0x8E99,0x5150, //#CJK UNIFIED IDEOGRAPH
+0x8E9A,0x5B57, //#CJK UNIFIED IDEOGRAPH
+0x8E9B,0x5BFA, //#CJK UNIFIED IDEOGRAPH
+0x8E9C,0x6148, //#CJK UNIFIED IDEOGRAPH
+0x8E9D,0x6301, //#CJK UNIFIED IDEOGRAPH
+0x8E9E,0x6642, //#CJK UNIFIED IDEOGRAPH
+0x8E9F,0x6B21, //#CJK UNIFIED IDEOGRAPH
+0x8EA0,0x6ECB, //#CJK UNIFIED IDEOGRAPH
+0x8EA1,0x6CBB, //#CJK UNIFIED IDEOGRAPH
+0x8EA2,0x723E, //#CJK UNIFIED IDEOGRAPH
+0x8EA3,0x74BD, //#CJK UNIFIED IDEOGRAPH
+0x8EA4,0x75D4, //#CJK UNIFIED IDEOGRAPH
+0x8EA5,0x78C1, //#CJK UNIFIED IDEOGRAPH
+0x8EA6,0x793A, //#CJK UNIFIED IDEOGRAPH
+0x8EA7,0x800C, //#CJK UNIFIED IDEOGRAPH
+0x8EA8,0x8033, //#CJK UNIFIED IDEOGRAPH
+0x8EA9,0x81EA, //#CJK UNIFIED IDEOGRAPH
+0x8EAA,0x8494, //#CJK UNIFIED IDEOGRAPH
+0x8EAB,0x8F9E, //#CJK UNIFIED IDEOGRAPH
+0x8EAC,0x6C50, //#CJK UNIFIED IDEOGRAPH
+0x8EAD,0x9E7F, //#CJK UNIFIED IDEOGRAPH
+0x8EAE,0x5F0F, //#CJK UNIFIED IDEOGRAPH
+0x8EAF,0x8B58, //#CJK UNIFIED IDEOGRAPH
+0x8EB0,0x9D2B, //#CJK UNIFIED IDEOGRAPH
+0x8EB1,0x7AFA, //#CJK UNIFIED IDEOGRAPH
+0x8EB2,0x8EF8, //#CJK UNIFIED IDEOGRAPH
+0x8EB3,0x5B8D, //#CJK UNIFIED IDEOGRAPH
+0x8EB4,0x96EB, //#CJK UNIFIED IDEOGRAPH
+0x8EB5,0x4E03, //#CJK UNIFIED IDEOGRAPH
+0x8EB6,0x53F1, //#CJK UNIFIED IDEOGRAPH
+0x8EB7,0x57F7, //#CJK UNIFIED IDEOGRAPH
+0x8EB8,0x5931, //#CJK UNIFIED IDEOGRAPH
+0x8EB9,0x5AC9, //#CJK UNIFIED IDEOGRAPH
+0x8EBA,0x5BA4, //#CJK UNIFIED IDEOGRAPH
+0x8EBB,0x6089, //#CJK UNIFIED IDEOGRAPH
+0x8EBC,0x6E7F, //#CJK UNIFIED IDEOGRAPH
+0x8EBD,0x6F06, //#CJK UNIFIED IDEOGRAPH
+0x8EBE,0x75BE, //#CJK UNIFIED IDEOGRAPH
+0x8EBF,0x8CEA, //#CJK UNIFIED IDEOGRAPH
+0x8EC0,0x5B9F, //#CJK UNIFIED IDEOGRAPH
+0x8EC1,0x8500, //#CJK UNIFIED IDEOGRAPH
+0x8EC2,0x7BE0, //#CJK UNIFIED IDEOGRAPH
+0x8EC3,0x5072, //#CJK UNIFIED IDEOGRAPH
+0x8EC4,0x67F4, //#CJK UNIFIED IDEOGRAPH
+0x8EC5,0x829D, //#CJK UNIFIED IDEOGRAPH
+0x8EC6,0x5C61, //#CJK UNIFIED IDEOGRAPH
+0x8EC7,0x854A, //#CJK UNIFIED IDEOGRAPH
+0x8EC8,0x7E1E, //#CJK UNIFIED IDEOGRAPH
+0x8EC9,0x820E, //#CJK UNIFIED IDEOGRAPH
+0x8ECA,0x5199, //#CJK UNIFIED IDEOGRAPH
+0x8ECB,0x5C04, //#CJK UNIFIED IDEOGRAPH
+0x8ECC,0x6368, //#CJK UNIFIED IDEOGRAPH
+0x8ECD,0x8D66, //#CJK UNIFIED IDEOGRAPH
+0x8ECE,0x659C, //#CJK UNIFIED IDEOGRAPH
+0x8ECF,0x716E, //#CJK UNIFIED IDEOGRAPH
+0x8ED0,0x793E, //#CJK UNIFIED IDEOGRAPH
+0x8ED1,0x7D17, //#CJK UNIFIED IDEOGRAPH
+0x8ED2,0x8005, //#CJK UNIFIED IDEOGRAPH
+0x8ED3,0x8B1D, //#CJK UNIFIED IDEOGRAPH
+0x8ED4,0x8ECA, //#CJK UNIFIED IDEOGRAPH
+0x8ED5,0x906E, //#CJK UNIFIED IDEOGRAPH
+0x8ED6,0x86C7, //#CJK UNIFIED IDEOGRAPH
+0x8ED7,0x90AA, //#CJK UNIFIED IDEOGRAPH
+0x8ED8,0x501F, //#CJK UNIFIED IDEOGRAPH
+0x8ED9,0x52FA, //#CJK UNIFIED IDEOGRAPH
+0x8EDA,0x5C3A, //#CJK UNIFIED IDEOGRAPH
+0x8EDB,0x6753, //#CJK UNIFIED IDEOGRAPH
+0x8EDC,0x707C, //#CJK UNIFIED IDEOGRAPH
+0x8EDD,0x7235, //#CJK UNIFIED IDEOGRAPH
+0x8EDE,0x914C, //#CJK UNIFIED IDEOGRAPH
+0x8EDF,0x91C8, //#CJK UNIFIED IDEOGRAPH
+0x8EE0,0x932B, //#CJK UNIFIED IDEOGRAPH
+0x8EE1,0x82E5, //#CJK UNIFIED IDEOGRAPH
+0x8EE2,0x5BC2, //#CJK UNIFIED IDEOGRAPH
+0x8EE3,0x5F31, //#CJK UNIFIED IDEOGRAPH
+0x8EE4,0x60F9, //#CJK UNIFIED IDEOGRAPH
+0x8EE5,0x4E3B, //#CJK UNIFIED IDEOGRAPH
+0x8EE6,0x53D6, //#CJK UNIFIED IDEOGRAPH
+0x8EE7,0x5B88, //#CJK UNIFIED IDEOGRAPH
+0x8EE8,0x624B, //#CJK UNIFIED IDEOGRAPH
+0x8EE9,0x6731, //#CJK UNIFIED IDEOGRAPH
+0x8EEA,0x6B8A, //#CJK UNIFIED IDEOGRAPH
+0x8EEB,0x72E9, //#CJK UNIFIED IDEOGRAPH
+0x8EEC,0x73E0, //#CJK UNIFIED IDEOGRAPH
+0x8EED,0x7A2E, //#CJK UNIFIED IDEOGRAPH
+0x8EEE,0x816B, //#CJK UNIFIED IDEOGRAPH
+0x8EEF,0x8DA3, //#CJK UNIFIED IDEOGRAPH
+0x8EF0,0x9152, //#CJK UNIFIED IDEOGRAPH
+0x8EF1,0x9996, //#CJK UNIFIED IDEOGRAPH
+0x8EF2,0x5112, //#CJK UNIFIED IDEOGRAPH
+0x8EF3,0x53D7, //#CJK UNIFIED IDEOGRAPH
+0x8EF4,0x546A, //#CJK UNIFIED IDEOGRAPH
+0x8EF5,0x5BFF, //#CJK UNIFIED IDEOGRAPH
+0x8EF6,0x6388, //#CJK UNIFIED IDEOGRAPH
+0x8EF7,0x6A39, //#CJK UNIFIED IDEOGRAPH
+0x8EF8,0x7DAC, //#CJK UNIFIED IDEOGRAPH
+0x8EF9,0x9700, //#CJK UNIFIED IDEOGRAPH
+0x8EFA,0x56DA, //#CJK UNIFIED IDEOGRAPH
+0x8EFB,0x53CE, //#CJK UNIFIED IDEOGRAPH
+0x8EFC,0x5468, //#CJK UNIFIED IDEOGRAPH
+0x8F40,0x5B97, //#CJK UNIFIED IDEOGRAPH
+0x8F41,0x5C31, //#CJK UNIFIED IDEOGRAPH
+0x8F42,0x5DDE, //#CJK UNIFIED IDEOGRAPH
+0x8F43,0x4FEE, //#CJK UNIFIED IDEOGRAPH
+0x8F44,0x6101, //#CJK UNIFIED IDEOGRAPH
+0x8F45,0x62FE, //#CJK UNIFIED IDEOGRAPH
+0x8F46,0x6D32, //#CJK UNIFIED IDEOGRAPH
+0x8F47,0x79C0, //#CJK UNIFIED IDEOGRAPH
+0x8F48,0x79CB, //#CJK UNIFIED IDEOGRAPH
+0x8F49,0x7D42, //#CJK UNIFIED IDEOGRAPH
+0x8F4A,0x7E4D, //#CJK UNIFIED IDEOGRAPH
+0x8F4B,0x7FD2, //#CJK UNIFIED IDEOGRAPH
+0x8F4C,0x81ED, //#CJK UNIFIED IDEOGRAPH
+0x8F4D,0x821F, //#CJK UNIFIED IDEOGRAPH
+0x8F4E,0x8490, //#CJK UNIFIED IDEOGRAPH
+0x8F4F,0x8846, //#CJK UNIFIED IDEOGRAPH
+0x8F50,0x8972, //#CJK UNIFIED IDEOGRAPH
+0x8F51,0x8B90, //#CJK UNIFIED IDEOGRAPH
+0x8F52,0x8E74, //#CJK UNIFIED IDEOGRAPH
+0x8F53,0x8F2F, //#CJK UNIFIED IDEOGRAPH
+0x8F54,0x9031, //#CJK UNIFIED IDEOGRAPH
+0x8F55,0x914B, //#CJK UNIFIED IDEOGRAPH
+0x8F56,0x916C, //#CJK UNIFIED IDEOGRAPH
+0x8F57,0x96C6, //#CJK UNIFIED IDEOGRAPH
+0x8F58,0x919C, //#CJK UNIFIED IDEOGRAPH
+0x8F59,0x4EC0, //#CJK UNIFIED IDEOGRAPH
+0x8F5A,0x4F4F, //#CJK UNIFIED IDEOGRAPH
+0x8F5B,0x5145, //#CJK UNIFIED IDEOGRAPH
+0x8F5C,0x5341, //#CJK UNIFIED IDEOGRAPH
+0x8F5D,0x5F93, //#CJK UNIFIED IDEOGRAPH
+0x8F5E,0x620E, //#CJK UNIFIED IDEOGRAPH
+0x8F5F,0x67D4, //#CJK UNIFIED IDEOGRAPH
+0x8F60,0x6C41, //#CJK UNIFIED IDEOGRAPH
+0x8F61,0x6E0B, //#CJK UNIFIED IDEOGRAPH
+0x8F62,0x7363, //#CJK UNIFIED IDEOGRAPH
+0x8F63,0x7E26, //#CJK UNIFIED IDEOGRAPH
+0x8F64,0x91CD, //#CJK UNIFIED IDEOGRAPH
+0x8F65,0x9283, //#CJK UNIFIED IDEOGRAPH
+0x8F66,0x53D4, //#CJK UNIFIED IDEOGRAPH
+0x8F67,0x5919, //#CJK UNIFIED IDEOGRAPH
+0x8F68,0x5BBF, //#CJK UNIFIED IDEOGRAPH
+0x8F69,0x6DD1, //#CJK UNIFIED IDEOGRAPH
+0x8F6A,0x795D, //#CJK UNIFIED IDEOGRAPH
+0x8F6B,0x7E2E, //#CJK UNIFIED IDEOGRAPH
+0x8F6C,0x7C9B, //#CJK UNIFIED IDEOGRAPH
+0x8F6D,0x587E, //#CJK UNIFIED IDEOGRAPH
+0x8F6E,0x719F, //#CJK UNIFIED IDEOGRAPH
+0x8F6F,0x51FA, //#CJK UNIFIED IDEOGRAPH
+0x8F70,0x8853, //#CJK UNIFIED IDEOGRAPH
+0x8F71,0x8FF0, //#CJK UNIFIED IDEOGRAPH
+0x8F72,0x4FCA, //#CJK UNIFIED IDEOGRAPH
+0x8F73,0x5CFB, //#CJK UNIFIED IDEOGRAPH
+0x8F74,0x6625, //#CJK UNIFIED IDEOGRAPH
+0x8F75,0x77AC, //#CJK UNIFIED IDEOGRAPH
+0x8F76,0x7AE3, //#CJK UNIFIED IDEOGRAPH
+0x8F77,0x821C, //#CJK UNIFIED IDEOGRAPH
+0x8F78,0x99FF, //#CJK UNIFIED IDEOGRAPH
+0x8F79,0x51C6, //#CJK UNIFIED IDEOGRAPH
+0x8F7A,0x5FAA, //#CJK UNIFIED IDEOGRAPH
+0x8F7B,0x65EC, //#CJK UNIFIED IDEOGRAPH
+0x8F7C,0x696F, //#CJK UNIFIED IDEOGRAPH
+0x8F7D,0x6B89, //#CJK UNIFIED IDEOGRAPH
+0x8F7E,0x6DF3, //#CJK UNIFIED IDEOGRAPH
+0x8F80,0x6E96, //#CJK UNIFIED IDEOGRAPH
+0x8F81,0x6F64, //#CJK UNIFIED IDEOGRAPH
+0x8F82,0x76FE, //#CJK UNIFIED IDEOGRAPH
+0x8F83,0x7D14, //#CJK UNIFIED IDEOGRAPH
+0x8F84,0x5DE1, //#CJK UNIFIED IDEOGRAPH
+0x8F85,0x9075, //#CJK UNIFIED IDEOGRAPH
+0x8F86,0x9187, //#CJK UNIFIED IDEOGRAPH
+0x8F87,0x9806, //#CJK UNIFIED IDEOGRAPH
+0x8F88,0x51E6, //#CJK UNIFIED IDEOGRAPH
+0x8F89,0x521D, //#CJK UNIFIED IDEOGRAPH
+0x8F8A,0x6240, //#CJK UNIFIED IDEOGRAPH
+0x8F8B,0x6691, //#CJK UNIFIED IDEOGRAPH
+0x8F8C,0x66D9, //#CJK UNIFIED IDEOGRAPH
+0x8F8D,0x6E1A, //#CJK UNIFIED IDEOGRAPH
+0x8F8E,0x5EB6, //#CJK UNIFIED IDEOGRAPH
+0x8F8F,0x7DD2, //#CJK UNIFIED IDEOGRAPH
+0x8F90,0x7F72, //#CJK UNIFIED IDEOGRAPH
+0x8F91,0x66F8, //#CJK UNIFIED IDEOGRAPH
+0x8F92,0x85AF, //#CJK UNIFIED IDEOGRAPH
+0x8F93,0x85F7, //#CJK UNIFIED IDEOGRAPH
+0x8F94,0x8AF8, //#CJK UNIFIED IDEOGRAPH
+0x8F95,0x52A9, //#CJK UNIFIED IDEOGRAPH
+0x8F96,0x53D9, //#CJK UNIFIED IDEOGRAPH
+0x8F97,0x5973, //#CJK UNIFIED IDEOGRAPH
+0x8F98,0x5E8F, //#CJK UNIFIED IDEOGRAPH
+0x8F99,0x5F90, //#CJK UNIFIED IDEOGRAPH
+0x8F9A,0x6055, //#CJK UNIFIED IDEOGRAPH
+0x8F9B,0x92E4, //#CJK UNIFIED IDEOGRAPH
+0x8F9C,0x9664, //#CJK UNIFIED IDEOGRAPH
+0x8F9D,0x50B7, //#CJK UNIFIED IDEOGRAPH
+0x8F9E,0x511F, //#CJK UNIFIED IDEOGRAPH
+0x8F9F,0x52DD, //#CJK UNIFIED IDEOGRAPH
+0x8FA0,0x5320, //#CJK UNIFIED IDEOGRAPH
+0x8FA1,0x5347, //#CJK UNIFIED IDEOGRAPH
+0x8FA2,0x53EC, //#CJK UNIFIED IDEOGRAPH
+0x8FA3,0x54E8, //#CJK UNIFIED IDEOGRAPH
+0x8FA4,0x5546, //#CJK UNIFIED IDEOGRAPH
+0x8FA5,0x5531, //#CJK UNIFIED IDEOGRAPH
+0x8FA6,0x5617, //#CJK UNIFIED IDEOGRAPH
+0x8FA7,0x5968, //#CJK UNIFIED IDEOGRAPH
+0x8FA8,0x59BE, //#CJK UNIFIED IDEOGRAPH
+0x8FA9,0x5A3C, //#CJK UNIFIED IDEOGRAPH
+0x8FAA,0x5BB5, //#CJK UNIFIED IDEOGRAPH
+0x8FAB,0x5C06, //#CJK UNIFIED IDEOGRAPH
+0x8FAC,0x5C0F, //#CJK UNIFIED IDEOGRAPH
+0x8FAD,0x5C11, //#CJK UNIFIED IDEOGRAPH
+0x8FAE,0x5C1A, //#CJK UNIFIED IDEOGRAPH
+0x8FAF,0x5E84, //#CJK UNIFIED IDEOGRAPH
+0x8FB0,0x5E8A, //#CJK UNIFIED IDEOGRAPH
+0x8FB1,0x5EE0, //#CJK UNIFIED IDEOGRAPH
+0x8FB2,0x5F70, //#CJK UNIFIED IDEOGRAPH
+0x8FB3,0x627F, //#CJK UNIFIED IDEOGRAPH
+0x8FB4,0x6284, //#CJK UNIFIED IDEOGRAPH
+0x8FB5,0x62DB, //#CJK UNIFIED IDEOGRAPH
+0x8FB6,0x638C, //#CJK UNIFIED IDEOGRAPH
+0x8FB7,0x6377, //#CJK UNIFIED IDEOGRAPH
+0x8FB8,0x6607, //#CJK UNIFIED IDEOGRAPH
+0x8FB9,0x660C, //#CJK UNIFIED IDEOGRAPH
+0x8FBA,0x662D, //#CJK UNIFIED IDEOGRAPH
+0x8FBB,0x6676, //#CJK UNIFIED IDEOGRAPH
+0x8FBC,0x677E, //#CJK UNIFIED IDEOGRAPH
+0x8FBD,0x68A2, //#CJK UNIFIED IDEOGRAPH
+0x8FBE,0x6A1F, //#CJK UNIFIED IDEOGRAPH
+0x8FBF,0x6A35, //#CJK UNIFIED IDEOGRAPH
+0x8FC0,0x6CBC, //#CJK UNIFIED IDEOGRAPH
+0x8FC1,0x6D88, //#CJK UNIFIED IDEOGRAPH
+0x8FC2,0x6E09, //#CJK UNIFIED IDEOGRAPH
+0x8FC3,0x6E58, //#CJK UNIFIED IDEOGRAPH
+0x8FC4,0x713C, //#CJK UNIFIED IDEOGRAPH
+0x8FC5,0x7126, //#CJK UNIFIED IDEOGRAPH
+0x8FC6,0x7167, //#CJK UNIFIED IDEOGRAPH
+0x8FC7,0x75C7, //#CJK UNIFIED IDEOGRAPH
+0x8FC8,0x7701, //#CJK UNIFIED IDEOGRAPH
+0x8FC9,0x785D, //#CJK UNIFIED IDEOGRAPH
+0x8FCA,0x7901, //#CJK UNIFIED IDEOGRAPH
+0x8FCB,0x7965, //#CJK UNIFIED IDEOGRAPH
+0x8FCC,0x79F0, //#CJK UNIFIED IDEOGRAPH
+0x8FCD,0x7AE0, //#CJK UNIFIED IDEOGRAPH
+0x8FCE,0x7B11, //#CJK UNIFIED IDEOGRAPH
+0x8FCF,0x7CA7, //#CJK UNIFIED IDEOGRAPH
+0x8FD0,0x7D39, //#CJK UNIFIED IDEOGRAPH
+0x8FD1,0x8096, //#CJK UNIFIED IDEOGRAPH
+0x8FD2,0x83D6, //#CJK UNIFIED IDEOGRAPH
+0x8FD3,0x848B, //#CJK UNIFIED IDEOGRAPH
+0x8FD4,0x8549, //#CJK UNIFIED IDEOGRAPH
+0x8FD5,0x885D, //#CJK UNIFIED IDEOGRAPH
+0x8FD6,0x88F3, //#CJK UNIFIED IDEOGRAPH
+0x8FD7,0x8A1F, //#CJK UNIFIED IDEOGRAPH
+0x8FD8,0x8A3C, //#CJK UNIFIED IDEOGRAPH
+0x8FD9,0x8A54, //#CJK UNIFIED IDEOGRAPH
+0x8FDA,0x8A73, //#CJK UNIFIED IDEOGRAPH
+0x8FDB,0x8C61, //#CJK UNIFIED IDEOGRAPH
+0x8FDC,0x8CDE, //#CJK UNIFIED IDEOGRAPH
+0x8FDD,0x91A4, //#CJK UNIFIED IDEOGRAPH
+0x8FDE,0x9266, //#CJK UNIFIED IDEOGRAPH
+0x8FDF,0x937E, //#CJK UNIFIED IDEOGRAPH
+0x8FE0,0x9418, //#CJK UNIFIED IDEOGRAPH
+0x8FE1,0x969C, //#CJK UNIFIED IDEOGRAPH
+0x8FE2,0x9798, //#CJK UNIFIED IDEOGRAPH
+0x8FE3,0x4E0A, //#CJK UNIFIED IDEOGRAPH
+0x8FE4,0x4E08, //#CJK UNIFIED IDEOGRAPH
+0x8FE5,0x4E1E, //#CJK UNIFIED IDEOGRAPH
+0x8FE6,0x4E57, //#CJK UNIFIED IDEOGRAPH
+0x8FE7,0x5197, //#CJK UNIFIED IDEOGRAPH
+0x8FE8,0x5270, //#CJK UNIFIED IDEOGRAPH
+0x8FE9,0x57CE, //#CJK UNIFIED IDEOGRAPH
+0x8FEA,0x5834, //#CJK UNIFIED IDEOGRAPH
+0x8FEB,0x58CC, //#CJK UNIFIED IDEOGRAPH
+0x8FEC,0x5B22, //#CJK UNIFIED IDEOGRAPH
+0x8FED,0x5E38, //#CJK UNIFIED IDEOGRAPH
+0x8FEE,0x60C5, //#CJK UNIFIED IDEOGRAPH
+0x8FEF,0x64FE, //#CJK UNIFIED IDEOGRAPH
+0x8FF0,0x6761, //#CJK UNIFIED IDEOGRAPH
+0x8FF1,0x6756, //#CJK UNIFIED IDEOGRAPH
+0x8FF2,0x6D44, //#CJK UNIFIED IDEOGRAPH
+0x8FF3,0x72B6, //#CJK UNIFIED IDEOGRAPH
+0x8FF4,0x7573, //#CJK UNIFIED IDEOGRAPH
+0x8FF5,0x7A63, //#CJK UNIFIED IDEOGRAPH
+0x8FF6,0x84B8, //#CJK UNIFIED IDEOGRAPH
+0x8FF7,0x8B72, //#CJK UNIFIED IDEOGRAPH
+0x8FF8,0x91B8, //#CJK UNIFIED IDEOGRAPH
+0x8FF9,0x9320, //#CJK UNIFIED IDEOGRAPH
+0x8FFA,0x5631, //#CJK UNIFIED IDEOGRAPH
+0x8FFB,0x57F4, //#CJK UNIFIED IDEOGRAPH
+0x8FFC,0x98FE, //#CJK UNIFIED IDEOGRAPH
+0x9040,0x62ED, //#CJK UNIFIED IDEOGRAPH
+0x9041,0x690D, //#CJK UNIFIED IDEOGRAPH
+0x9042,0x6B96, //#CJK UNIFIED IDEOGRAPH
+0x9043,0x71ED, //#CJK UNIFIED IDEOGRAPH
+0x9044,0x7E54, //#CJK UNIFIED IDEOGRAPH
+0x9045,0x8077, //#CJK UNIFIED IDEOGRAPH
+0x9046,0x8272, //#CJK UNIFIED IDEOGRAPH
+0x9047,0x89E6, //#CJK UNIFIED IDEOGRAPH
+0x9048,0x98DF, //#CJK UNIFIED IDEOGRAPH
+0x9049,0x8755, //#CJK UNIFIED IDEOGRAPH
+0x904A,0x8FB1, //#CJK UNIFIED IDEOGRAPH
+0x904B,0x5C3B, //#CJK UNIFIED IDEOGRAPH
+0x904C,0x4F38, //#CJK UNIFIED IDEOGRAPH
+0x904D,0x4FE1, //#CJK UNIFIED IDEOGRAPH
+0x904E,0x4FB5, //#CJK UNIFIED IDEOGRAPH
+0x904F,0x5507, //#CJK UNIFIED IDEOGRAPH
+0x9050,0x5A20, //#CJK UNIFIED IDEOGRAPH
+0x9051,0x5BDD, //#CJK UNIFIED IDEOGRAPH
+0x9052,0x5BE9, //#CJK UNIFIED IDEOGRAPH
+0x9053,0x5FC3, //#CJK UNIFIED IDEOGRAPH
+0x9054,0x614E, //#CJK UNIFIED IDEOGRAPH
+0x9055,0x632F, //#CJK UNIFIED IDEOGRAPH
+0x9056,0x65B0, //#CJK UNIFIED IDEOGRAPH
+0x9057,0x664B, //#CJK UNIFIED IDEOGRAPH
+0x9058,0x68EE, //#CJK UNIFIED IDEOGRAPH
+0x9059,0x699B, //#CJK UNIFIED IDEOGRAPH
+0x905A,0x6D78, //#CJK UNIFIED IDEOGRAPH
+0x905B,0x6DF1, //#CJK UNIFIED IDEOGRAPH
+0x905C,0x7533, //#CJK UNIFIED IDEOGRAPH
+0x905D,0x75B9, //#CJK UNIFIED IDEOGRAPH
+0x905E,0x771F, //#CJK UNIFIED IDEOGRAPH
+0x905F,0x795E, //#CJK UNIFIED IDEOGRAPH
+0x9060,0x79E6, //#CJK UNIFIED IDEOGRAPH
+0x9061,0x7D33, //#CJK UNIFIED IDEOGRAPH
+0x9062,0x81E3, //#CJK UNIFIED IDEOGRAPH
+0x9063,0x82AF, //#CJK UNIFIED IDEOGRAPH
+0x9064,0x85AA, //#CJK UNIFIED IDEOGRAPH
+0x9065,0x89AA, //#CJK UNIFIED IDEOGRAPH
+0x9066,0x8A3A, //#CJK UNIFIED IDEOGRAPH
+0x9067,0x8EAB, //#CJK UNIFIED IDEOGRAPH
+0x9068,0x8F9B, //#CJK UNIFIED IDEOGRAPH
+0x9069,0x9032, //#CJK UNIFIED IDEOGRAPH
+0x906A,0x91DD, //#CJK UNIFIED IDEOGRAPH
+0x906B,0x9707, //#CJK UNIFIED IDEOGRAPH
+0x906C,0x4EBA, //#CJK UNIFIED IDEOGRAPH
+0x906D,0x4EC1, //#CJK UNIFIED IDEOGRAPH
+0x906E,0x5203, //#CJK UNIFIED IDEOGRAPH
+0x906F,0x5875, //#CJK UNIFIED IDEOGRAPH
+0x9070,0x58EC, //#CJK UNIFIED IDEOGRAPH
+0x9071,0x5C0B, //#CJK UNIFIED IDEOGRAPH
+0x9072,0x751A, //#CJK UNIFIED IDEOGRAPH
+0x9073,0x5C3D, //#CJK UNIFIED IDEOGRAPH
+0x9074,0x814E, //#CJK UNIFIED IDEOGRAPH
+0x9075,0x8A0A, //#CJK UNIFIED IDEOGRAPH
+0x9076,0x8FC5, //#CJK UNIFIED IDEOGRAPH
+0x9077,0x9663, //#CJK UNIFIED IDEOGRAPH
+0x9078,0x976D, //#CJK UNIFIED IDEOGRAPH
+0x9079,0x7B25, //#CJK UNIFIED IDEOGRAPH
+0x907A,0x8ACF, //#CJK UNIFIED IDEOGRAPH
+0x907B,0x9808, //#CJK UNIFIED IDEOGRAPH
+0x907C,0x9162, //#CJK UNIFIED IDEOGRAPH
+0x907D,0x56F3, //#CJK UNIFIED IDEOGRAPH
+0x907E,0x53A8, //#CJK UNIFIED IDEOGRAPH
+0x9080,0x9017, //#CJK UNIFIED IDEOGRAPH
+0x9081,0x5439, //#CJK UNIFIED IDEOGRAPH
+0x9082,0x5782, //#CJK UNIFIED IDEOGRAPH
+0x9083,0x5E25, //#CJK UNIFIED IDEOGRAPH
+0x9084,0x63A8, //#CJK UNIFIED IDEOGRAPH
+0x9085,0x6C34, //#CJK UNIFIED IDEOGRAPH
+0x9086,0x708A, //#CJK UNIFIED IDEOGRAPH
+0x9087,0x7761, //#CJK UNIFIED IDEOGRAPH
+0x9088,0x7C8B, //#CJK UNIFIED IDEOGRAPH
+0x9089,0x7FE0, //#CJK UNIFIED IDEOGRAPH
+0x908A,0x8870, //#CJK UNIFIED IDEOGRAPH
+0x908B,0x9042, //#CJK UNIFIED IDEOGRAPH
+0x908C,0x9154, //#CJK UNIFIED IDEOGRAPH
+0x908D,0x9310, //#CJK UNIFIED IDEOGRAPH
+0x908E,0x9318, //#CJK UNIFIED IDEOGRAPH
+0x908F,0x968F, //#CJK UNIFIED IDEOGRAPH
+0x9090,0x745E, //#CJK UNIFIED IDEOGRAPH
+0x9091,0x9AC4, //#CJK UNIFIED IDEOGRAPH
+0x9092,0x5D07, //#CJK UNIFIED IDEOGRAPH
+0x9093,0x5D69, //#CJK UNIFIED IDEOGRAPH
+0x9094,0x6570, //#CJK UNIFIED IDEOGRAPH
+0x9095,0x67A2, //#CJK UNIFIED IDEOGRAPH
+0x9096,0x8DA8, //#CJK UNIFIED IDEOGRAPH
+0x9097,0x96DB, //#CJK UNIFIED IDEOGRAPH
+0x9098,0x636E, //#CJK UNIFIED IDEOGRAPH
+0x9099,0x6749, //#CJK UNIFIED IDEOGRAPH
+0x909A,0x6919, //#CJK UNIFIED IDEOGRAPH
+0x909B,0x83C5, //#CJK UNIFIED IDEOGRAPH
+0x909C,0x9817, //#CJK UNIFIED IDEOGRAPH
+0x909D,0x96C0, //#CJK UNIFIED IDEOGRAPH
+0x909E,0x88FE, //#CJK UNIFIED IDEOGRAPH
+0x909F,0x6F84, //#CJK UNIFIED IDEOGRAPH
+0x90A0,0x647A, //#CJK UNIFIED IDEOGRAPH
+0x90A1,0x5BF8, //#CJK UNIFIED IDEOGRAPH
+0x90A2,0x4E16, //#CJK UNIFIED IDEOGRAPH
+0x90A3,0x702C, //#CJK UNIFIED IDEOGRAPH
+0x90A4,0x755D, //#CJK UNIFIED IDEOGRAPH
+0x90A5,0x662F, //#CJK UNIFIED IDEOGRAPH
+0x90A6,0x51C4, //#CJK UNIFIED IDEOGRAPH
+0x90A7,0x5236, //#CJK UNIFIED IDEOGRAPH
+0x90A8,0x52E2, //#CJK UNIFIED IDEOGRAPH
+0x90A9,0x59D3, //#CJK UNIFIED IDEOGRAPH
+0x90AA,0x5F81, //#CJK UNIFIED IDEOGRAPH
+0x90AB,0x6027, //#CJK UNIFIED IDEOGRAPH
+0x90AC,0x6210, //#CJK UNIFIED IDEOGRAPH
+0x90AD,0x653F, //#CJK UNIFIED IDEOGRAPH
+0x90AE,0x6574, //#CJK UNIFIED IDEOGRAPH
+0x90AF,0x661F, //#CJK UNIFIED IDEOGRAPH
+0x90B0,0x6674, //#CJK UNIFIED IDEOGRAPH
+0x90B1,0x68F2, //#CJK UNIFIED IDEOGRAPH
+0x90B2,0x6816, //#CJK UNIFIED IDEOGRAPH
+0x90B3,0x6B63, //#CJK UNIFIED IDEOGRAPH
+0x90B4,0x6E05, //#CJK UNIFIED IDEOGRAPH
+0x90B5,0x7272, //#CJK UNIFIED IDEOGRAPH
+0x90B6,0x751F, //#CJK UNIFIED IDEOGRAPH
+0x90B7,0x76DB, //#CJK UNIFIED IDEOGRAPH
+0x90B8,0x7CBE, //#CJK UNIFIED IDEOGRAPH
+0x90B9,0x8056, //#CJK UNIFIED IDEOGRAPH
+0x90BA,0x58F0, //#CJK UNIFIED IDEOGRAPH
+0x90BB,0x88FD, //#CJK UNIFIED IDEOGRAPH
+0x90BC,0x897F, //#CJK UNIFIED IDEOGRAPH
+0x90BD,0x8AA0, //#CJK UNIFIED IDEOGRAPH
+0x90BE,0x8A93, //#CJK UNIFIED IDEOGRAPH
+0x90BF,0x8ACB, //#CJK UNIFIED IDEOGRAPH
+0x90C0,0x901D, //#CJK UNIFIED IDEOGRAPH
+0x90C1,0x9192, //#CJK UNIFIED IDEOGRAPH
+0x90C2,0x9752, //#CJK UNIFIED IDEOGRAPH
+0x90C3,0x9759, //#CJK UNIFIED IDEOGRAPH
+0x90C4,0x6589, //#CJK UNIFIED IDEOGRAPH
+0x90C5,0x7A0E, //#CJK UNIFIED IDEOGRAPH
+0x90C6,0x8106, //#CJK UNIFIED IDEOGRAPH
+0x90C7,0x96BB, //#CJK UNIFIED IDEOGRAPH
+0x90C8,0x5E2D, //#CJK UNIFIED IDEOGRAPH
+0x90C9,0x60DC, //#CJK UNIFIED IDEOGRAPH
+0x90CA,0x621A, //#CJK UNIFIED IDEOGRAPH
+0x90CB,0x65A5, //#CJK UNIFIED IDEOGRAPH
+0x90CC,0x6614, //#CJK UNIFIED IDEOGRAPH
+0x90CD,0x6790, //#CJK UNIFIED IDEOGRAPH
+0x90CE,0x77F3, //#CJK UNIFIED IDEOGRAPH
+0x90CF,0x7A4D, //#CJK UNIFIED IDEOGRAPH
+0x90D0,0x7C4D, //#CJK UNIFIED IDEOGRAPH
+0x90D1,0x7E3E, //#CJK UNIFIED IDEOGRAPH
+0x90D2,0x810A, //#CJK UNIFIED IDEOGRAPH
+0x90D3,0x8CAC, //#CJK UNIFIED IDEOGRAPH
+0x90D4,0x8D64, //#CJK UNIFIED IDEOGRAPH
+0x90D5,0x8DE1, //#CJK UNIFIED IDEOGRAPH
+0x90D6,0x8E5F, //#CJK UNIFIED IDEOGRAPH
+0x90D7,0x78A9, //#CJK UNIFIED IDEOGRAPH
+0x90D8,0x5207, //#CJK UNIFIED IDEOGRAPH
+0x90D9,0x62D9, //#CJK UNIFIED IDEOGRAPH
+0x90DA,0x63A5, //#CJK UNIFIED IDEOGRAPH
+0x90DB,0x6442, //#CJK UNIFIED IDEOGRAPH
+0x90DC,0x6298, //#CJK UNIFIED IDEOGRAPH
+0x90DD,0x8A2D, //#CJK UNIFIED IDEOGRAPH
+0x90DE,0x7A83, //#CJK UNIFIED IDEOGRAPH
+0x90DF,0x7BC0, //#CJK UNIFIED IDEOGRAPH
+0x90E0,0x8AAC, //#CJK UNIFIED IDEOGRAPH
+0x90E1,0x96EA, //#CJK UNIFIED IDEOGRAPH
+0x90E2,0x7D76, //#CJK UNIFIED IDEOGRAPH
+0x90E3,0x820C, //#CJK UNIFIED IDEOGRAPH
+0x90E4,0x8749, //#CJK UNIFIED IDEOGRAPH
+0x90E5,0x4ED9, //#CJK UNIFIED IDEOGRAPH
+0x90E6,0x5148, //#CJK UNIFIED IDEOGRAPH
+0x90E7,0x5343, //#CJK UNIFIED IDEOGRAPH
+0x90E8,0x5360, //#CJK UNIFIED IDEOGRAPH
+0x90E9,0x5BA3, //#CJK UNIFIED IDEOGRAPH
+0x90EA,0x5C02, //#CJK UNIFIED IDEOGRAPH
+0x90EB,0x5C16, //#CJK UNIFIED IDEOGRAPH
+0x90EC,0x5DDD, //#CJK UNIFIED IDEOGRAPH
+0x90ED,0x6226, //#CJK UNIFIED IDEOGRAPH
+0x90EE,0x6247, //#CJK UNIFIED IDEOGRAPH
+0x90EF,0x64B0, //#CJK UNIFIED IDEOGRAPH
+0x90F0,0x6813, //#CJK UNIFIED IDEOGRAPH
+0x90F1,0x6834, //#CJK UNIFIED IDEOGRAPH
+0x90F2,0x6CC9, //#CJK UNIFIED IDEOGRAPH
+0x90F3,0x6D45, //#CJK UNIFIED IDEOGRAPH
+0x90F4,0x6D17, //#CJK UNIFIED IDEOGRAPH
+0x90F5,0x67D3, //#CJK UNIFIED IDEOGRAPH
+0x90F6,0x6F5C, //#CJK UNIFIED IDEOGRAPH
+0x90F7,0x714E, //#CJK UNIFIED IDEOGRAPH
+0x90F8,0x717D, //#CJK UNIFIED IDEOGRAPH
+0x90F9,0x65CB, //#CJK UNIFIED IDEOGRAPH
+0x90FA,0x7A7F, //#CJK UNIFIED IDEOGRAPH
+0x90FB,0x7BAD, //#CJK UNIFIED IDEOGRAPH
+0x90FC,0x7DDA, //#CJK UNIFIED IDEOGRAPH
+0x9140,0x7E4A, //#CJK UNIFIED IDEOGRAPH
+0x9141,0x7FA8, //#CJK UNIFIED IDEOGRAPH
+0x9142,0x817A, //#CJK UNIFIED IDEOGRAPH
+0x9143,0x821B, //#CJK UNIFIED IDEOGRAPH
+0x9144,0x8239, //#CJK UNIFIED IDEOGRAPH
+0x9145,0x85A6, //#CJK UNIFIED IDEOGRAPH
+0x9146,0x8A6E, //#CJK UNIFIED IDEOGRAPH
+0x9147,0x8CCE, //#CJK UNIFIED IDEOGRAPH
+0x9148,0x8DF5, //#CJK UNIFIED IDEOGRAPH
+0x9149,0x9078, //#CJK UNIFIED IDEOGRAPH
+0x914A,0x9077, //#CJK UNIFIED IDEOGRAPH
+0x914B,0x92AD, //#CJK UNIFIED IDEOGRAPH
+0x914C,0x9291, //#CJK UNIFIED IDEOGRAPH
+0x914D,0x9583, //#CJK UNIFIED IDEOGRAPH
+0x914E,0x9BAE, //#CJK UNIFIED IDEOGRAPH
+0x914F,0x524D, //#CJK UNIFIED IDEOGRAPH
+0x9150,0x5584, //#CJK UNIFIED IDEOGRAPH
+0x9151,0x6F38, //#CJK UNIFIED IDEOGRAPH
+0x9152,0x7136, //#CJK UNIFIED IDEOGRAPH
+0x9153,0x5168, //#CJK UNIFIED IDEOGRAPH
+0x9154,0x7985, //#CJK UNIFIED IDEOGRAPH
+0x9155,0x7E55, //#CJK UNIFIED IDEOGRAPH
+0x9156,0x81B3, //#CJK UNIFIED IDEOGRAPH
+0x9157,0x7CCE, //#CJK UNIFIED IDEOGRAPH
+0x9158,0x564C, //#CJK UNIFIED IDEOGRAPH
+0x9159,0x5851, //#CJK UNIFIED IDEOGRAPH
+0x915A,0x5CA8, //#CJK UNIFIED IDEOGRAPH
+0x915B,0x63AA, //#CJK UNIFIED IDEOGRAPH
+0x915C,0x66FE, //#CJK UNIFIED IDEOGRAPH
+0x915D,0x66FD, //#CJK UNIFIED IDEOGRAPH
+0x915E,0x695A, //#CJK UNIFIED IDEOGRAPH
+0x915F,0x72D9, //#CJK UNIFIED IDEOGRAPH
+0x9160,0x758F, //#CJK UNIFIED IDEOGRAPH
+0x9161,0x758E, //#CJK UNIFIED IDEOGRAPH
+0x9162,0x790E, //#CJK UNIFIED IDEOGRAPH
+0x9163,0x7956, //#CJK UNIFIED IDEOGRAPH
+0x9164,0x79DF, //#CJK UNIFIED IDEOGRAPH
+0x9165,0x7C97, //#CJK UNIFIED IDEOGRAPH
+0x9166,0x7D20, //#CJK UNIFIED IDEOGRAPH
+0x9167,0x7D44, //#CJK UNIFIED IDEOGRAPH
+0x9168,0x8607, //#CJK UNIFIED IDEOGRAPH
+0x9169,0x8A34, //#CJK UNIFIED IDEOGRAPH
+0x916A,0x963B, //#CJK UNIFIED IDEOGRAPH
+0x916B,0x9061, //#CJK UNIFIED IDEOGRAPH
+0x916C,0x9F20, //#CJK UNIFIED IDEOGRAPH
+0x916D,0x50E7, //#CJK UNIFIED IDEOGRAPH
+0x916E,0x5275, //#CJK UNIFIED IDEOGRAPH
+0x916F,0x53CC, //#CJK UNIFIED IDEOGRAPH
+0x9170,0x53E2, //#CJK UNIFIED IDEOGRAPH
+0x9171,0x5009, //#CJK UNIFIED IDEOGRAPH
+0x9172,0x55AA, //#CJK UNIFIED IDEOGRAPH
+0x9173,0x58EE, //#CJK UNIFIED IDEOGRAPH
+0x9174,0x594F, //#CJK UNIFIED IDEOGRAPH
+0x9175,0x723D, //#CJK UNIFIED IDEOGRAPH
+0x9176,0x5B8B, //#CJK UNIFIED IDEOGRAPH
+0x9177,0x5C64, //#CJK UNIFIED IDEOGRAPH
+0x9178,0x531D, //#CJK UNIFIED IDEOGRAPH
+0x9179,0x60E3, //#CJK UNIFIED IDEOGRAPH
+0x917A,0x60F3, //#CJK UNIFIED IDEOGRAPH
+0x917B,0x635C, //#CJK UNIFIED IDEOGRAPH
+0x917C,0x6383, //#CJK UNIFIED IDEOGRAPH
+0x917D,0x633F, //#CJK UNIFIED IDEOGRAPH
+0x917E,0x63BB, //#CJK UNIFIED IDEOGRAPH
+0x9180,0x64CD, //#CJK UNIFIED IDEOGRAPH
+0x9181,0x65E9, //#CJK UNIFIED IDEOGRAPH
+0x9182,0x66F9, //#CJK UNIFIED IDEOGRAPH
+0x9183,0x5DE3, //#CJK UNIFIED IDEOGRAPH
+0x9184,0x69CD, //#CJK UNIFIED IDEOGRAPH
+0x9185,0x69FD, //#CJK UNIFIED IDEOGRAPH
+0x9186,0x6F15, //#CJK UNIFIED IDEOGRAPH
+0x9187,0x71E5, //#CJK UNIFIED IDEOGRAPH
+0x9188,0x4E89, //#CJK UNIFIED IDEOGRAPH
+0x9189,0x75E9, //#CJK UNIFIED IDEOGRAPH
+0x918A,0x76F8, //#CJK UNIFIED IDEOGRAPH
+0x918B,0x7A93, //#CJK UNIFIED IDEOGRAPH
+0x918C,0x7CDF, //#CJK UNIFIED IDEOGRAPH
+0x918D,0x7DCF, //#CJK UNIFIED IDEOGRAPH
+0x918E,0x7D9C, //#CJK UNIFIED IDEOGRAPH
+0x918F,0x8061, //#CJK UNIFIED IDEOGRAPH
+0x9190,0x8349, //#CJK UNIFIED IDEOGRAPH
+0x9191,0x8358, //#CJK UNIFIED IDEOGRAPH
+0x9192,0x846C, //#CJK UNIFIED IDEOGRAPH
+0x9193,0x84BC, //#CJK UNIFIED IDEOGRAPH
+0x9194,0x85FB, //#CJK UNIFIED IDEOGRAPH
+0x9195,0x88C5, //#CJK UNIFIED IDEOGRAPH
+0x9196,0x8D70, //#CJK UNIFIED IDEOGRAPH
+0x9197,0x9001, //#CJK UNIFIED IDEOGRAPH
+0x9198,0x906D, //#CJK UNIFIED IDEOGRAPH
+0x9199,0x9397, //#CJK UNIFIED IDEOGRAPH
+0x919A,0x971C, //#CJK UNIFIED IDEOGRAPH
+0x919B,0x9A12, //#CJK UNIFIED IDEOGRAPH
+0x919C,0x50CF, //#CJK UNIFIED IDEOGRAPH
+0x919D,0x5897, //#CJK UNIFIED IDEOGRAPH
+0x919E,0x618E, //#CJK UNIFIED IDEOGRAPH
+0x919F,0x81D3, //#CJK UNIFIED IDEOGRAPH
+0x91A0,0x8535, //#CJK UNIFIED IDEOGRAPH
+0x91A1,0x8D08, //#CJK UNIFIED IDEOGRAPH
+0x91A2,0x9020, //#CJK UNIFIED IDEOGRAPH
+0x91A3,0x4FC3, //#CJK UNIFIED IDEOGRAPH
+0x91A4,0x5074, //#CJK UNIFIED IDEOGRAPH
+0x91A5,0x5247, //#CJK UNIFIED IDEOGRAPH
+0x91A6,0x5373, //#CJK UNIFIED IDEOGRAPH
+0x91A7,0x606F, //#CJK UNIFIED IDEOGRAPH
+0x91A8,0x6349, //#CJK UNIFIED IDEOGRAPH
+0x91A9,0x675F, //#CJK UNIFIED IDEOGRAPH
+0x91AA,0x6E2C, //#CJK UNIFIED IDEOGRAPH
+0x91AB,0x8DB3, //#CJK UNIFIED IDEOGRAPH
+0x91AC,0x901F, //#CJK UNIFIED IDEOGRAPH
+0x91AD,0x4FD7, //#CJK UNIFIED IDEOGRAPH
+0x91AE,0x5C5E, //#CJK UNIFIED IDEOGRAPH
+0x91AF,0x8CCA, //#CJK UNIFIED IDEOGRAPH
+0x91B0,0x65CF, //#CJK UNIFIED IDEOGRAPH
+0x91B1,0x7D9A, //#CJK UNIFIED IDEOGRAPH
+0x91B2,0x5352, //#CJK UNIFIED IDEOGRAPH
+0x91B3,0x8896, //#CJK UNIFIED IDEOGRAPH
+0x91B4,0x5176, //#CJK UNIFIED IDEOGRAPH
+0x91B5,0x63C3, //#CJK UNIFIED IDEOGRAPH
+0x91B6,0x5B58, //#CJK UNIFIED IDEOGRAPH
+0x91B7,0x5B6B, //#CJK UNIFIED IDEOGRAPH
+0x91B8,0x5C0A, //#CJK UNIFIED IDEOGRAPH
+0x91B9,0x640D, //#CJK UNIFIED IDEOGRAPH
+0x91BA,0x6751, //#CJK UNIFIED IDEOGRAPH
+0x91BB,0x905C, //#CJK UNIFIED IDEOGRAPH
+0x91BC,0x4ED6, //#CJK UNIFIED IDEOGRAPH
+0x91BD,0x591A, //#CJK UNIFIED IDEOGRAPH
+0x91BE,0x592A, //#CJK UNIFIED IDEOGRAPH
+0x91BF,0x6C70, //#CJK UNIFIED IDEOGRAPH
+0x91C0,0x8A51, //#CJK UNIFIED IDEOGRAPH
+0x91C1,0x553E, //#CJK UNIFIED IDEOGRAPH
+0x91C2,0x5815, //#CJK UNIFIED IDEOGRAPH
+0x91C3,0x59A5, //#CJK UNIFIED IDEOGRAPH
+0x91C4,0x60F0, //#CJK UNIFIED IDEOGRAPH
+0x91C5,0x6253, //#CJK UNIFIED IDEOGRAPH
+0x91C6,0x67C1, //#CJK UNIFIED IDEOGRAPH
+0x91C7,0x8235, //#CJK UNIFIED IDEOGRAPH
+0x91C8,0x6955, //#CJK UNIFIED IDEOGRAPH
+0x91C9,0x9640, //#CJK UNIFIED IDEOGRAPH
+0x91CA,0x99C4, //#CJK UNIFIED IDEOGRAPH
+0x91CB,0x9A28, //#CJK UNIFIED IDEOGRAPH
+0x91CC,0x4F53, //#CJK UNIFIED IDEOGRAPH
+0x91CD,0x5806, //#CJK UNIFIED IDEOGRAPH
+0x91CE,0x5BFE, //#CJK UNIFIED IDEOGRAPH
+0x91CF,0x8010, //#CJK UNIFIED IDEOGRAPH
+0x91D0,0x5CB1, //#CJK UNIFIED IDEOGRAPH
+0x91D1,0x5E2F, //#CJK UNIFIED IDEOGRAPH
+0x91D2,0x5F85, //#CJK UNIFIED IDEOGRAPH
+0x91D3,0x6020, //#CJK UNIFIED IDEOGRAPH
+0x91D4,0x614B, //#CJK UNIFIED IDEOGRAPH
+0x91D5,0x6234, //#CJK UNIFIED IDEOGRAPH
+0x91D6,0x66FF, //#CJK UNIFIED IDEOGRAPH
+0x91D7,0x6CF0, //#CJK UNIFIED IDEOGRAPH
+0x91D8,0x6EDE, //#CJK UNIFIED IDEOGRAPH
+0x91D9,0x80CE, //#CJK UNIFIED IDEOGRAPH
+0x91DA,0x817F, //#CJK UNIFIED IDEOGRAPH
+0x91DB,0x82D4, //#CJK UNIFIED IDEOGRAPH
+0x91DC,0x888B, //#CJK UNIFIED IDEOGRAPH
+0x91DD,0x8CB8, //#CJK UNIFIED IDEOGRAPH
+0x91DE,0x9000, //#CJK UNIFIED IDEOGRAPH
+0x91DF,0x902E, //#CJK UNIFIED IDEOGRAPH
+0x91E0,0x968A, //#CJK UNIFIED IDEOGRAPH
+0x91E1,0x9EDB, //#CJK UNIFIED IDEOGRAPH
+0x91E2,0x9BDB, //#CJK UNIFIED IDEOGRAPH
+0x91E3,0x4EE3, //#CJK UNIFIED IDEOGRAPH
+0x91E4,0x53F0, //#CJK UNIFIED IDEOGRAPH
+0x91E5,0x5927, //#CJK UNIFIED IDEOGRAPH
+0x91E6,0x7B2C, //#CJK UNIFIED IDEOGRAPH
+0x91E7,0x918D, //#CJK UNIFIED IDEOGRAPH
+0x91E8,0x984C, //#CJK UNIFIED IDEOGRAPH
+0x91E9,0x9DF9, //#CJK UNIFIED IDEOGRAPH
+0x91EA,0x6EDD, //#CJK UNIFIED IDEOGRAPH
+0x91EB,0x7027, //#CJK UNIFIED IDEOGRAPH
+0x91EC,0x5353, //#CJK UNIFIED IDEOGRAPH
+0x91ED,0x5544, //#CJK UNIFIED IDEOGRAPH
+0x91EE,0x5B85, //#CJK UNIFIED IDEOGRAPH
+0x91EF,0x6258, //#CJK UNIFIED IDEOGRAPH
+0x91F0,0x629E, //#CJK UNIFIED IDEOGRAPH
+0x91F1,0x62D3, //#CJK UNIFIED IDEOGRAPH
+0x91F2,0x6CA2, //#CJK UNIFIED IDEOGRAPH
+0x91F3,0x6FEF, //#CJK UNIFIED IDEOGRAPH
+0x91F4,0x7422, //#CJK UNIFIED IDEOGRAPH
+0x91F5,0x8A17, //#CJK UNIFIED IDEOGRAPH
+0x91F6,0x9438, //#CJK UNIFIED IDEOGRAPH
+0x91F7,0x6FC1, //#CJK UNIFIED IDEOGRAPH
+0x91F8,0x8AFE, //#CJK UNIFIED IDEOGRAPH
+0x91F9,0x8338, //#CJK UNIFIED IDEOGRAPH
+0x91FA,0x51E7, //#CJK UNIFIED IDEOGRAPH
+0x91FB,0x86F8, //#CJK UNIFIED IDEOGRAPH
+0x91FC,0x53EA, //#CJK UNIFIED IDEOGRAPH
+0x9240,0x53E9, //#CJK UNIFIED IDEOGRAPH
+0x9241,0x4F46, //#CJK UNIFIED IDEOGRAPH
+0x9242,0x9054, //#CJK UNIFIED IDEOGRAPH
+0x9243,0x8FB0, //#CJK UNIFIED IDEOGRAPH
+0x9244,0x596A, //#CJK UNIFIED IDEOGRAPH
+0x9245,0x8131, //#CJK UNIFIED IDEOGRAPH
+0x9246,0x5DFD, //#CJK UNIFIED IDEOGRAPH
+0x9247,0x7AEA, //#CJK UNIFIED IDEOGRAPH
+0x9248,0x8FBF, //#CJK UNIFIED IDEOGRAPH
+0x9249,0x68DA, //#CJK UNIFIED IDEOGRAPH
+0x924A,0x8C37, //#CJK UNIFIED IDEOGRAPH
+0x924B,0x72F8, //#CJK UNIFIED IDEOGRAPH
+0x924C,0x9C48, //#CJK UNIFIED IDEOGRAPH
+0x924D,0x6A3D, //#CJK UNIFIED IDEOGRAPH
+0x924E,0x8AB0, //#CJK UNIFIED IDEOGRAPH
+0x924F,0x4E39, //#CJK UNIFIED IDEOGRAPH
+0x9250,0x5358, //#CJK UNIFIED IDEOGRAPH
+0x9251,0x5606, //#CJK UNIFIED IDEOGRAPH
+0x9252,0x5766, //#CJK UNIFIED IDEOGRAPH
+0x9253,0x62C5, //#CJK UNIFIED IDEOGRAPH
+0x9254,0x63A2, //#CJK UNIFIED IDEOGRAPH
+0x9255,0x65E6, //#CJK UNIFIED IDEOGRAPH
+0x9256,0x6B4E, //#CJK UNIFIED IDEOGRAPH
+0x9257,0x6DE1, //#CJK UNIFIED IDEOGRAPH
+0x9258,0x6E5B, //#CJK UNIFIED IDEOGRAPH
+0x9259,0x70AD, //#CJK UNIFIED IDEOGRAPH
+0x925A,0x77ED, //#CJK UNIFIED IDEOGRAPH
+0x925B,0x7AEF, //#CJK UNIFIED IDEOGRAPH
+0x925C,0x7BAA, //#CJK UNIFIED IDEOGRAPH
+0x925D,0x7DBB, //#CJK UNIFIED IDEOGRAPH
+0x925E,0x803D, //#CJK UNIFIED IDEOGRAPH
+0x925F,0x80C6, //#CJK UNIFIED IDEOGRAPH
+0x9260,0x86CB, //#CJK UNIFIED IDEOGRAPH
+0x9261,0x8A95, //#CJK UNIFIED IDEOGRAPH
+0x9262,0x935B, //#CJK UNIFIED IDEOGRAPH
+0x9263,0x56E3, //#CJK UNIFIED IDEOGRAPH
+0x9264,0x58C7, //#CJK UNIFIED IDEOGRAPH
+0x9265,0x5F3E, //#CJK UNIFIED IDEOGRAPH
+0x9266,0x65AD, //#CJK UNIFIED IDEOGRAPH
+0x9267,0x6696, //#CJK UNIFIED IDEOGRAPH
+0x9268,0x6A80, //#CJK UNIFIED IDEOGRAPH
+0x9269,0x6BB5, //#CJK UNIFIED IDEOGRAPH
+0x926A,0x7537, //#CJK UNIFIED IDEOGRAPH
+0x926B,0x8AC7, //#CJK UNIFIED IDEOGRAPH
+0x926C,0x5024, //#CJK UNIFIED IDEOGRAPH
+0x926D,0x77E5, //#CJK UNIFIED IDEOGRAPH
+0x926E,0x5730, //#CJK UNIFIED IDEOGRAPH
+0x926F,0x5F1B, //#CJK UNIFIED IDEOGRAPH
+0x9270,0x6065, //#CJK UNIFIED IDEOGRAPH
+0x9271,0x667A, //#CJK UNIFIED IDEOGRAPH
+0x9272,0x6C60, //#CJK UNIFIED IDEOGRAPH
+0x9273,0x75F4, //#CJK UNIFIED IDEOGRAPH
+0x9274,0x7A1A, //#CJK UNIFIED IDEOGRAPH
+0x9275,0x7F6E, //#CJK UNIFIED IDEOGRAPH
+0x9276,0x81F4, //#CJK UNIFIED IDEOGRAPH
+0x9277,0x8718, //#CJK UNIFIED IDEOGRAPH
+0x9278,0x9045, //#CJK UNIFIED IDEOGRAPH
+0x9279,0x99B3, //#CJK UNIFIED IDEOGRAPH
+0x927A,0x7BC9, //#CJK UNIFIED IDEOGRAPH
+0x927B,0x755C, //#CJK UNIFIED IDEOGRAPH
+0x927C,0x7AF9, //#CJK UNIFIED IDEOGRAPH
+0x927D,0x7B51, //#CJK UNIFIED IDEOGRAPH
+0x927E,0x84C4, //#CJK UNIFIED IDEOGRAPH
+0x9280,0x9010, //#CJK UNIFIED IDEOGRAPH
+0x9281,0x79E9, //#CJK UNIFIED IDEOGRAPH
+0x9282,0x7A92, //#CJK UNIFIED IDEOGRAPH
+0x9283,0x8336, //#CJK UNIFIED IDEOGRAPH
+0x9284,0x5AE1, //#CJK UNIFIED IDEOGRAPH
+0x9285,0x7740, //#CJK UNIFIED IDEOGRAPH
+0x9286,0x4E2D, //#CJK UNIFIED IDEOGRAPH
+0x9287,0x4EF2, //#CJK UNIFIED IDEOGRAPH
+0x9288,0x5B99, //#CJK UNIFIED IDEOGRAPH
+0x9289,0x5FE0, //#CJK UNIFIED IDEOGRAPH
+0x928A,0x62BD, //#CJK UNIFIED IDEOGRAPH
+0x928B,0x663C, //#CJK UNIFIED IDEOGRAPH
+0x928C,0x67F1, //#CJK UNIFIED IDEOGRAPH
+0x928D,0x6CE8, //#CJK UNIFIED IDEOGRAPH
+0x928E,0x866B, //#CJK UNIFIED IDEOGRAPH
+0x928F,0x8877, //#CJK UNIFIED IDEOGRAPH
+0x9290,0x8A3B, //#CJK UNIFIED IDEOGRAPH
+0x9291,0x914E, //#CJK UNIFIED IDEOGRAPH
+0x9292,0x92F3, //#CJK UNIFIED IDEOGRAPH
+0x9293,0x99D0, //#CJK UNIFIED IDEOGRAPH
+0x9294,0x6A17, //#CJK UNIFIED IDEOGRAPH
+0x9295,0x7026, //#CJK UNIFIED IDEOGRAPH
+0x9296,0x732A, //#CJK UNIFIED IDEOGRAPH
+0x9297,0x82E7, //#CJK UNIFIED IDEOGRAPH
+0x9298,0x8457, //#CJK UNIFIED IDEOGRAPH
+0x9299,0x8CAF, //#CJK UNIFIED IDEOGRAPH
+0x929A,0x4E01, //#CJK UNIFIED IDEOGRAPH
+0x929B,0x5146, //#CJK UNIFIED IDEOGRAPH
+0x929C,0x51CB, //#CJK UNIFIED IDEOGRAPH
+0x929D,0x558B, //#CJK UNIFIED IDEOGRAPH
+0x929E,0x5BF5, //#CJK UNIFIED IDEOGRAPH
+0x929F,0x5E16, //#CJK UNIFIED IDEOGRAPH
+0x92A0,0x5E33, //#CJK UNIFIED IDEOGRAPH
+0x92A1,0x5E81, //#CJK UNIFIED IDEOGRAPH
+0x92A2,0x5F14, //#CJK UNIFIED IDEOGRAPH
+0x92A3,0x5F35, //#CJK UNIFIED IDEOGRAPH
+0x92A4,0x5F6B, //#CJK UNIFIED IDEOGRAPH
+0x92A5,0x5FB4, //#CJK UNIFIED IDEOGRAPH
+0x92A6,0x61F2, //#CJK UNIFIED IDEOGRAPH
+0x92A7,0x6311, //#CJK UNIFIED IDEOGRAPH
+0x92A8,0x66A2, //#CJK UNIFIED IDEOGRAPH
+0x92A9,0x671D, //#CJK UNIFIED IDEOGRAPH
+0x92AA,0x6F6E, //#CJK UNIFIED IDEOGRAPH
+0x92AB,0x7252, //#CJK UNIFIED IDEOGRAPH
+0x92AC,0x753A, //#CJK UNIFIED IDEOGRAPH
+0x92AD,0x773A, //#CJK UNIFIED IDEOGRAPH
+0x92AE,0x8074, //#CJK UNIFIED IDEOGRAPH
+0x92AF,0x8139, //#CJK UNIFIED IDEOGRAPH
+0x92B0,0x8178, //#CJK UNIFIED IDEOGRAPH
+0x92B1,0x8776, //#CJK UNIFIED IDEOGRAPH
+0x92B2,0x8ABF, //#CJK UNIFIED IDEOGRAPH
+0x92B3,0x8ADC, //#CJK UNIFIED IDEOGRAPH
+0x92B4,0x8D85, //#CJK UNIFIED IDEOGRAPH
+0x92B5,0x8DF3, //#CJK UNIFIED IDEOGRAPH
+0x92B6,0x929A, //#CJK UNIFIED IDEOGRAPH
+0x92B7,0x9577, //#CJK UNIFIED IDEOGRAPH
+0x92B8,0x9802, //#CJK UNIFIED IDEOGRAPH
+0x92B9,0x9CE5, //#CJK UNIFIED IDEOGRAPH
+0x92BA,0x52C5, //#CJK UNIFIED IDEOGRAPH
+0x92BB,0x6357, //#CJK UNIFIED IDEOGRAPH
+0x92BC,0x76F4, //#CJK UNIFIED IDEOGRAPH
+0x92BD,0x6715, //#CJK UNIFIED IDEOGRAPH
+0x92BE,0x6C88, //#CJK UNIFIED IDEOGRAPH
+0x92BF,0x73CD, //#CJK UNIFIED IDEOGRAPH
+0x92C0,0x8CC3, //#CJK UNIFIED IDEOGRAPH
+0x92C1,0x93AE, //#CJK UNIFIED IDEOGRAPH
+0x92C2,0x9673, //#CJK UNIFIED IDEOGRAPH
+0x92C3,0x6D25, //#CJK UNIFIED IDEOGRAPH
+0x92C4,0x589C, //#CJK UNIFIED IDEOGRAPH
+0x92C5,0x690E, //#CJK UNIFIED IDEOGRAPH
+0x92C6,0x69CC, //#CJK UNIFIED IDEOGRAPH
+0x92C7,0x8FFD, //#CJK UNIFIED IDEOGRAPH
+0x92C8,0x939A, //#CJK UNIFIED IDEOGRAPH
+0x92C9,0x75DB, //#CJK UNIFIED IDEOGRAPH
+0x92CA,0x901A, //#CJK UNIFIED IDEOGRAPH
+0x92CB,0x585A, //#CJK UNIFIED IDEOGRAPH
+0x92CC,0x6802, //#CJK UNIFIED IDEOGRAPH
+0x92CD,0x63B4, //#CJK UNIFIED IDEOGRAPH
+0x92CE,0x69FB, //#CJK UNIFIED IDEOGRAPH
+0x92CF,0x4F43, //#CJK UNIFIED IDEOGRAPH
+0x92D0,0x6F2C, //#CJK UNIFIED IDEOGRAPH
+0x92D1,0x67D8, //#CJK UNIFIED IDEOGRAPH
+0x92D2,0x8FBB, //#CJK UNIFIED IDEOGRAPH
+0x92D3,0x8526, //#CJK UNIFIED IDEOGRAPH
+0x92D4,0x7DB4, //#CJK UNIFIED IDEOGRAPH
+0x92D5,0x9354, //#CJK UNIFIED IDEOGRAPH
+0x92D6,0x693F, //#CJK UNIFIED IDEOGRAPH
+0x92D7,0x6F70, //#CJK UNIFIED IDEOGRAPH
+0x92D8,0x576A, //#CJK UNIFIED IDEOGRAPH
+0x92D9,0x58F7, //#CJK UNIFIED IDEOGRAPH
+0x92DA,0x5B2C, //#CJK UNIFIED IDEOGRAPH
+0x92DB,0x7D2C, //#CJK UNIFIED IDEOGRAPH
+0x92DC,0x722A, //#CJK UNIFIED IDEOGRAPH
+0x92DD,0x540A, //#CJK UNIFIED IDEOGRAPH
+0x92DE,0x91E3, //#CJK UNIFIED IDEOGRAPH
+0x92DF,0x9DB4, //#CJK UNIFIED IDEOGRAPH
+0x92E0,0x4EAD, //#CJK UNIFIED IDEOGRAPH
+0x92E1,0x4F4E, //#CJK UNIFIED IDEOGRAPH
+0x92E2,0x505C, //#CJK UNIFIED IDEOGRAPH
+0x92E3,0x5075, //#CJK UNIFIED IDEOGRAPH
+0x92E4,0x5243, //#CJK UNIFIED IDEOGRAPH
+0x92E5,0x8C9E, //#CJK UNIFIED IDEOGRAPH
+0x92E6,0x5448, //#CJK UNIFIED IDEOGRAPH
+0x92E7,0x5824, //#CJK UNIFIED IDEOGRAPH
+0x92E8,0x5B9A, //#CJK UNIFIED IDEOGRAPH
+0x92E9,0x5E1D, //#CJK UNIFIED IDEOGRAPH
+0x92EA,0x5E95, //#CJK UNIFIED IDEOGRAPH
+0x92EB,0x5EAD, //#CJK UNIFIED IDEOGRAPH
+0x92EC,0x5EF7, //#CJK UNIFIED IDEOGRAPH
+0x92ED,0x5F1F, //#CJK UNIFIED IDEOGRAPH
+0x92EE,0x608C, //#CJK UNIFIED IDEOGRAPH
+0x92EF,0x62B5, //#CJK UNIFIED IDEOGRAPH
+0x92F0,0x633A, //#CJK UNIFIED IDEOGRAPH
+0x92F1,0x63D0, //#CJK UNIFIED IDEOGRAPH
+0x92F2,0x68AF, //#CJK UNIFIED IDEOGRAPH
+0x92F3,0x6C40, //#CJK UNIFIED IDEOGRAPH
+0x92F4,0x7887, //#CJK UNIFIED IDEOGRAPH
+0x92F5,0x798E, //#CJK UNIFIED IDEOGRAPH
+0x92F6,0x7A0B, //#CJK UNIFIED IDEOGRAPH
+0x92F7,0x7DE0, //#CJK UNIFIED IDEOGRAPH
+0x92F8,0x8247, //#CJK UNIFIED IDEOGRAPH
+0x92F9,0x8A02, //#CJK UNIFIED IDEOGRAPH
+0x92FA,0x8AE6, //#CJK UNIFIED IDEOGRAPH
+0x92FB,0x8E44, //#CJK UNIFIED IDEOGRAPH
+0x92FC,0x9013, //#CJK UNIFIED IDEOGRAPH
+0x9340,0x90B8, //#CJK UNIFIED IDEOGRAPH
+0x9341,0x912D, //#CJK UNIFIED IDEOGRAPH
+0x9342,0x91D8, //#CJK UNIFIED IDEOGRAPH
+0x9343,0x9F0E, //#CJK UNIFIED IDEOGRAPH
+0x9344,0x6CE5, //#CJK UNIFIED IDEOGRAPH
+0x9345,0x6458, //#CJK UNIFIED IDEOGRAPH
+0x9346,0x64E2, //#CJK UNIFIED IDEOGRAPH
+0x9347,0x6575, //#CJK UNIFIED IDEOGRAPH
+0x9348,0x6EF4, //#CJK UNIFIED IDEOGRAPH
+0x9349,0x7684, //#CJK UNIFIED IDEOGRAPH
+0x934A,0x7B1B, //#CJK UNIFIED IDEOGRAPH
+0x934B,0x9069, //#CJK UNIFIED IDEOGRAPH
+0x934C,0x93D1, //#CJK UNIFIED IDEOGRAPH
+0x934D,0x6EBA, //#CJK UNIFIED IDEOGRAPH
+0x934E,0x54F2, //#CJK UNIFIED IDEOGRAPH
+0x934F,0x5FB9, //#CJK UNIFIED IDEOGRAPH
+0x9350,0x64A4, //#CJK UNIFIED IDEOGRAPH
+0x9351,0x8F4D, //#CJK UNIFIED IDEOGRAPH
+0x9352,0x8FED, //#CJK UNIFIED IDEOGRAPH
+0x9353,0x9244, //#CJK UNIFIED IDEOGRAPH
+0x9354,0x5178, //#CJK UNIFIED IDEOGRAPH
+0x9355,0x586B, //#CJK UNIFIED IDEOGRAPH
+0x9356,0x5929, //#CJK UNIFIED IDEOGRAPH
+0x9357,0x5C55, //#CJK UNIFIED IDEOGRAPH
+0x9358,0x5E97, //#CJK UNIFIED IDEOGRAPH
+0x9359,0x6DFB, //#CJK UNIFIED IDEOGRAPH
+0x935A,0x7E8F, //#CJK UNIFIED IDEOGRAPH
+0x935B,0x751C, //#CJK UNIFIED IDEOGRAPH
+0x935C,0x8CBC, //#CJK UNIFIED IDEOGRAPH
+0x935D,0x8EE2, //#CJK UNIFIED IDEOGRAPH
+0x935E,0x985B, //#CJK UNIFIED IDEOGRAPH
+0x935F,0x70B9, //#CJK UNIFIED IDEOGRAPH
+0x9360,0x4F1D, //#CJK UNIFIED IDEOGRAPH
+0x9361,0x6BBF, //#CJK UNIFIED IDEOGRAPH
+0x9362,0x6FB1, //#CJK UNIFIED IDEOGRAPH
+0x9363,0x7530, //#CJK UNIFIED IDEOGRAPH
+0x9364,0x96FB, //#CJK UNIFIED IDEOGRAPH
+0x9365,0x514E, //#CJK UNIFIED IDEOGRAPH
+0x9366,0x5410, //#CJK UNIFIED IDEOGRAPH
+0x9367,0x5835, //#CJK UNIFIED IDEOGRAPH
+0x9368,0x5857, //#CJK UNIFIED IDEOGRAPH
+0x9369,0x59AC, //#CJK UNIFIED IDEOGRAPH
+0x936A,0x5C60, //#CJK UNIFIED IDEOGRAPH
+0x936B,0x5F92, //#CJK UNIFIED IDEOGRAPH
+0x936C,0x6597, //#CJK UNIFIED IDEOGRAPH
+0x936D,0x675C, //#CJK UNIFIED IDEOGRAPH
+0x936E,0x6E21, //#CJK UNIFIED IDEOGRAPH
+0x936F,0x767B, //#CJK UNIFIED IDEOGRAPH
+0x9370,0x83DF, //#CJK UNIFIED IDEOGRAPH
+0x9371,0x8CED, //#CJK UNIFIED IDEOGRAPH
+0x9372,0x9014, //#CJK UNIFIED IDEOGRAPH
+0x9373,0x90FD, //#CJK UNIFIED IDEOGRAPH
+0x9374,0x934D, //#CJK UNIFIED IDEOGRAPH
+0x9375,0x7825, //#CJK UNIFIED IDEOGRAPH
+0x9376,0x783A, //#CJK UNIFIED IDEOGRAPH
+0x9377,0x52AA, //#CJK UNIFIED IDEOGRAPH
+0x9378,0x5EA6, //#CJK UNIFIED IDEOGRAPH
+0x9379,0x571F, //#CJK UNIFIED IDEOGRAPH
+0x937A,0x5974, //#CJK UNIFIED IDEOGRAPH
+0x937B,0x6012, //#CJK UNIFIED IDEOGRAPH
+0x937C,0x5012, //#CJK UNIFIED IDEOGRAPH
+0x937D,0x515A, //#CJK UNIFIED IDEOGRAPH
+0x937E,0x51AC, //#CJK UNIFIED IDEOGRAPH
+0x9380,0x51CD, //#CJK UNIFIED IDEOGRAPH
+0x9381,0x5200, //#CJK UNIFIED IDEOGRAPH
+0x9382,0x5510, //#CJK UNIFIED IDEOGRAPH
+0x9383,0x5854, //#CJK UNIFIED IDEOGRAPH
+0x9384,0x5858, //#CJK UNIFIED IDEOGRAPH
+0x9385,0x5957, //#CJK UNIFIED IDEOGRAPH
+0x9386,0x5B95, //#CJK UNIFIED IDEOGRAPH
+0x9387,0x5CF6, //#CJK UNIFIED IDEOGRAPH
+0x9388,0x5D8B, //#CJK UNIFIED IDEOGRAPH
+0x9389,0x60BC, //#CJK UNIFIED IDEOGRAPH
+0x938A,0x6295, //#CJK UNIFIED IDEOGRAPH
+0x938B,0x642D, //#CJK UNIFIED IDEOGRAPH
+0x938C,0x6771, //#CJK UNIFIED IDEOGRAPH
+0x938D,0x6843, //#CJK UNIFIED IDEOGRAPH
+0x938E,0x68BC, //#CJK UNIFIED IDEOGRAPH
+0x938F,0x68DF, //#CJK UNIFIED IDEOGRAPH
+0x9390,0x76D7, //#CJK UNIFIED IDEOGRAPH
+0x9391,0x6DD8, //#CJK UNIFIED IDEOGRAPH
+0x9392,0x6E6F, //#CJK UNIFIED IDEOGRAPH
+0x9393,0x6D9B, //#CJK UNIFIED IDEOGRAPH
+0x9394,0x706F, //#CJK UNIFIED IDEOGRAPH
+0x9395,0x71C8, //#CJK UNIFIED IDEOGRAPH
+0x9396,0x5F53, //#CJK UNIFIED IDEOGRAPH
+0x9397,0x75D8, //#CJK UNIFIED IDEOGRAPH
+0x9398,0x7977, //#CJK UNIFIED IDEOGRAPH
+0x9399,0x7B49, //#CJK UNIFIED IDEOGRAPH
+0x939A,0x7B54, //#CJK UNIFIED IDEOGRAPH
+0x939B,0x7B52, //#CJK UNIFIED IDEOGRAPH
+0x939C,0x7CD6, //#CJK UNIFIED IDEOGRAPH
+0x939D,0x7D71, //#CJK UNIFIED IDEOGRAPH
+0x939E,0x5230, //#CJK UNIFIED IDEOGRAPH
+0x939F,0x8463, //#CJK UNIFIED IDEOGRAPH
+0x93A0,0x8569, //#CJK UNIFIED IDEOGRAPH
+0x93A1,0x85E4, //#CJK UNIFIED IDEOGRAPH
+0x93A2,0x8A0E, //#CJK UNIFIED IDEOGRAPH
+0x93A3,0x8B04, //#CJK UNIFIED IDEOGRAPH
+0x93A4,0x8C46, //#CJK UNIFIED IDEOGRAPH
+0x93A5,0x8E0F, //#CJK UNIFIED IDEOGRAPH
+0x93A6,0x9003, //#CJK UNIFIED IDEOGRAPH
+0x93A7,0x900F, //#CJK UNIFIED IDEOGRAPH
+0x93A8,0x9419, //#CJK UNIFIED IDEOGRAPH
+0x93A9,0x9676, //#CJK UNIFIED IDEOGRAPH
+0x93AA,0x982D, //#CJK UNIFIED IDEOGRAPH
+0x93AB,0x9A30, //#CJK UNIFIED IDEOGRAPH
+0x93AC,0x95D8, //#CJK UNIFIED IDEOGRAPH
+0x93AD,0x50CD, //#CJK UNIFIED IDEOGRAPH
+0x93AE,0x52D5, //#CJK UNIFIED IDEOGRAPH
+0x93AF,0x540C, //#CJK UNIFIED IDEOGRAPH
+0x93B0,0x5802, //#CJK UNIFIED IDEOGRAPH
+0x93B1,0x5C0E, //#CJK UNIFIED IDEOGRAPH
+0x93B2,0x61A7, //#CJK UNIFIED IDEOGRAPH
+0x93B3,0x649E, //#CJK UNIFIED IDEOGRAPH
+0x93B4,0x6D1E, //#CJK UNIFIED IDEOGRAPH
+0x93B5,0x77B3, //#CJK UNIFIED IDEOGRAPH
+0x93B6,0x7AE5, //#CJK UNIFIED IDEOGRAPH
+0x93B7,0x80F4, //#CJK UNIFIED IDEOGRAPH
+0x93B8,0x8404, //#CJK UNIFIED IDEOGRAPH
+0x93B9,0x9053, //#CJK UNIFIED IDEOGRAPH
+0x93BA,0x9285, //#CJK UNIFIED IDEOGRAPH
+0x93BB,0x5CE0, //#CJK UNIFIED IDEOGRAPH
+0x93BC,0x9D07, //#CJK UNIFIED IDEOGRAPH
+0x93BD,0x533F, //#CJK UNIFIED IDEOGRAPH
+0x93BE,0x5F97, //#CJK UNIFIED IDEOGRAPH
+0x93BF,0x5FB3, //#CJK UNIFIED IDEOGRAPH
+0x93C0,0x6D9C, //#CJK UNIFIED IDEOGRAPH
+0x93C1,0x7279, //#CJK UNIFIED IDEOGRAPH
+0x93C2,0x7763, //#CJK UNIFIED IDEOGRAPH
+0x93C3,0x79BF, //#CJK UNIFIED IDEOGRAPH
+0x93C4,0x7BE4, //#CJK UNIFIED IDEOGRAPH
+0x93C5,0x6BD2, //#CJK UNIFIED IDEOGRAPH
+0x93C6,0x72EC, //#CJK UNIFIED IDEOGRAPH
+0x93C7,0x8AAD, //#CJK UNIFIED IDEOGRAPH
+0x93C8,0x6803, //#CJK UNIFIED IDEOGRAPH
+0x93C9,0x6A61, //#CJK UNIFIED IDEOGRAPH
+0x93CA,0x51F8, //#CJK UNIFIED IDEOGRAPH
+0x93CB,0x7A81, //#CJK UNIFIED IDEOGRAPH
+0x93CC,0x6934, //#CJK UNIFIED IDEOGRAPH
+0x93CD,0x5C4A, //#CJK UNIFIED IDEOGRAPH
+0x93CE,0x9CF6, //#CJK UNIFIED IDEOGRAPH
+0x93CF,0x82EB, //#CJK UNIFIED IDEOGRAPH
+0x93D0,0x5BC5, //#CJK UNIFIED IDEOGRAPH
+0x93D1,0x9149, //#CJK UNIFIED IDEOGRAPH
+0x93D2,0x701E, //#CJK UNIFIED IDEOGRAPH
+0x93D3,0x5678, //#CJK UNIFIED IDEOGRAPH
+0x93D4,0x5C6F, //#CJK UNIFIED IDEOGRAPH
+0x93D5,0x60C7, //#CJK UNIFIED IDEOGRAPH
+0x93D6,0x6566, //#CJK UNIFIED IDEOGRAPH
+0x93D7,0x6C8C, //#CJK UNIFIED IDEOGRAPH
+0x93D8,0x8C5A, //#CJK UNIFIED IDEOGRAPH
+0x93D9,0x9041, //#CJK UNIFIED IDEOGRAPH
+0x93DA,0x9813, //#CJK UNIFIED IDEOGRAPH
+0x93DB,0x5451, //#CJK UNIFIED IDEOGRAPH
+0x93DC,0x66C7, //#CJK UNIFIED IDEOGRAPH
+0x93DD,0x920D, //#CJK UNIFIED IDEOGRAPH
+0x93DE,0x5948, //#CJK UNIFIED IDEOGRAPH
+0x93DF,0x90A3, //#CJK UNIFIED IDEOGRAPH
+0x93E0,0x5185, //#CJK UNIFIED IDEOGRAPH
+0x93E1,0x4E4D, //#CJK UNIFIED IDEOGRAPH
+0x93E2,0x51EA, //#CJK UNIFIED IDEOGRAPH
+0x93E3,0x8599, //#CJK UNIFIED IDEOGRAPH
+0x93E4,0x8B0E, //#CJK UNIFIED IDEOGRAPH
+0x93E5,0x7058, //#CJK UNIFIED IDEOGRAPH
+0x93E6,0x637A, //#CJK UNIFIED IDEOGRAPH
+0x93E7,0x934B, //#CJK UNIFIED IDEOGRAPH
+0x93E8,0x6962, //#CJK UNIFIED IDEOGRAPH
+0x93E9,0x99B4, //#CJK UNIFIED IDEOGRAPH
+0x93EA,0x7E04, //#CJK UNIFIED IDEOGRAPH
+0x93EB,0x7577, //#CJK UNIFIED IDEOGRAPH
+0x93EC,0x5357, //#CJK UNIFIED IDEOGRAPH
+0x93ED,0x6960, //#CJK UNIFIED IDEOGRAPH
+0x93EE,0x8EDF, //#CJK UNIFIED IDEOGRAPH
+0x93EF,0x96E3, //#CJK UNIFIED IDEOGRAPH
+0x93F0,0x6C5D, //#CJK UNIFIED IDEOGRAPH
+0x93F1,0x4E8C, //#CJK UNIFIED IDEOGRAPH
+0x93F2,0x5C3C, //#CJK UNIFIED IDEOGRAPH
+0x93F3,0x5F10, //#CJK UNIFIED IDEOGRAPH
+0x93F4,0x8FE9, //#CJK UNIFIED IDEOGRAPH
+0x93F5,0x5302, //#CJK UNIFIED IDEOGRAPH
+0x93F6,0x8CD1, //#CJK UNIFIED IDEOGRAPH
+0x93F7,0x8089, //#CJK UNIFIED IDEOGRAPH
+0x93F8,0x8679, //#CJK UNIFIED IDEOGRAPH
+0x93F9,0x5EFF, //#CJK UNIFIED IDEOGRAPH
+0x93FA,0x65E5, //#CJK UNIFIED IDEOGRAPH
+0x93FB,0x4E73, //#CJK UNIFIED IDEOGRAPH
+0x93FC,0x5165, //#CJK UNIFIED IDEOGRAPH
+0x9440,0x5982, //#CJK UNIFIED IDEOGRAPH
+0x9441,0x5C3F, //#CJK UNIFIED IDEOGRAPH
+0x9442,0x97EE, //#CJK UNIFIED IDEOGRAPH
+0x9443,0x4EFB, //#CJK UNIFIED IDEOGRAPH
+0x9444,0x598A, //#CJK UNIFIED IDEOGRAPH
+0x9445,0x5FCD, //#CJK UNIFIED IDEOGRAPH
+0x9446,0x8A8D, //#CJK UNIFIED IDEOGRAPH
+0x9447,0x6FE1, //#CJK UNIFIED IDEOGRAPH
+0x9448,0x79B0, //#CJK UNIFIED IDEOGRAPH
+0x9449,0x7962, //#CJK UNIFIED IDEOGRAPH
+0x944A,0x5BE7, //#CJK UNIFIED IDEOGRAPH
+0x944B,0x8471, //#CJK UNIFIED IDEOGRAPH
+0x944C,0x732B, //#CJK UNIFIED IDEOGRAPH
+0x944D,0x71B1, //#CJK UNIFIED IDEOGRAPH
+0x944E,0x5E74, //#CJK UNIFIED IDEOGRAPH
+0x944F,0x5FF5, //#CJK UNIFIED IDEOGRAPH
+0x9450,0x637B, //#CJK UNIFIED IDEOGRAPH
+0x9451,0x649A, //#CJK UNIFIED IDEOGRAPH
+0x9452,0x71C3, //#CJK UNIFIED IDEOGRAPH
+0x9453,0x7C98, //#CJK UNIFIED IDEOGRAPH
+0x9454,0x4E43, //#CJK UNIFIED IDEOGRAPH
+0x9455,0x5EFC, //#CJK UNIFIED IDEOGRAPH
+0x9456,0x4E4B, //#CJK UNIFIED IDEOGRAPH
+0x9457,0x57DC, //#CJK UNIFIED IDEOGRAPH
+0x9458,0x56A2, //#CJK UNIFIED IDEOGRAPH
+0x9459,0x60A9, //#CJK UNIFIED IDEOGRAPH
+0x945A,0x6FC3, //#CJK UNIFIED IDEOGRAPH
+0x945B,0x7D0D, //#CJK UNIFIED IDEOGRAPH
+0x945C,0x80FD, //#CJK UNIFIED IDEOGRAPH
+0x945D,0x8133, //#CJK UNIFIED IDEOGRAPH
+0x945E,0x81BF, //#CJK UNIFIED IDEOGRAPH
+0x945F,0x8FB2, //#CJK UNIFIED IDEOGRAPH
+0x9460,0x8997, //#CJK UNIFIED IDEOGRAPH
+0x9461,0x86A4, //#CJK UNIFIED IDEOGRAPH
+0x9462,0x5DF4, //#CJK UNIFIED IDEOGRAPH
+0x9463,0x628A, //#CJK UNIFIED IDEOGRAPH
+0x9464,0x64AD, //#CJK UNIFIED IDEOGRAPH
+0x9465,0x8987, //#CJK UNIFIED IDEOGRAPH
+0x9466,0x6777, //#CJK UNIFIED IDEOGRAPH
+0x9467,0x6CE2, //#CJK UNIFIED IDEOGRAPH
+0x9468,0x6D3E, //#CJK UNIFIED IDEOGRAPH
+0x9469,0x7436, //#CJK UNIFIED IDEOGRAPH
+0x946A,0x7834, //#CJK UNIFIED IDEOGRAPH
+0x946B,0x5A46, //#CJK UNIFIED IDEOGRAPH
+0x946C,0x7F75, //#CJK UNIFIED IDEOGRAPH
+0x946D,0x82AD, //#CJK UNIFIED IDEOGRAPH
+0x946E,0x99AC, //#CJK UNIFIED IDEOGRAPH
+0x946F,0x4FF3, //#CJK UNIFIED IDEOGRAPH
+0x9470,0x5EC3, //#CJK UNIFIED IDEOGRAPH
+0x9471,0x62DD, //#CJK UNIFIED IDEOGRAPH
+0x9472,0x6392, //#CJK UNIFIED IDEOGRAPH
+0x9473,0x6557, //#CJK UNIFIED IDEOGRAPH
+0x9474,0x676F, //#CJK UNIFIED IDEOGRAPH
+0x9475,0x76C3, //#CJK UNIFIED IDEOGRAPH
+0x9476,0x724C, //#CJK UNIFIED IDEOGRAPH
+0x9477,0x80CC, //#CJK UNIFIED IDEOGRAPH
+0x9478,0x80BA, //#CJK UNIFIED IDEOGRAPH
+0x9479,0x8F29, //#CJK UNIFIED IDEOGRAPH
+0x947A,0x914D, //#CJK UNIFIED IDEOGRAPH
+0x947B,0x500D, //#CJK UNIFIED IDEOGRAPH
+0x947C,0x57F9, //#CJK UNIFIED IDEOGRAPH
+0x947D,0x5A92, //#CJK UNIFIED IDEOGRAPH
+0x947E,0x6885, //#CJK UNIFIED IDEOGRAPH
+0x9480,0x6973, //#CJK UNIFIED IDEOGRAPH
+0x9481,0x7164, //#CJK UNIFIED IDEOGRAPH
+0x9482,0x72FD, //#CJK UNIFIED IDEOGRAPH
+0x9483,0x8CB7, //#CJK UNIFIED IDEOGRAPH
+0x9484,0x58F2, //#CJK UNIFIED IDEOGRAPH
+0x9485,0x8CE0, //#CJK UNIFIED IDEOGRAPH
+0x9486,0x966A, //#CJK UNIFIED IDEOGRAPH
+0x9487,0x9019, //#CJK UNIFIED IDEOGRAPH
+0x9488,0x877F, //#CJK UNIFIED IDEOGRAPH
+0x9489,0x79E4, //#CJK UNIFIED IDEOGRAPH
+0x948A,0x77E7, //#CJK UNIFIED IDEOGRAPH
+0x948B,0x8429, //#CJK UNIFIED IDEOGRAPH
+0x948C,0x4F2F, //#CJK UNIFIED IDEOGRAPH
+0x948D,0x5265, //#CJK UNIFIED IDEOGRAPH
+0x948E,0x535A, //#CJK UNIFIED IDEOGRAPH
+0x948F,0x62CD, //#CJK UNIFIED IDEOGRAPH
+0x9490,0x67CF, //#CJK UNIFIED IDEOGRAPH
+0x9491,0x6CCA, //#CJK UNIFIED IDEOGRAPH
+0x9492,0x767D, //#CJK UNIFIED IDEOGRAPH
+0x9493,0x7B94, //#CJK UNIFIED IDEOGRAPH
+0x9494,0x7C95, //#CJK UNIFIED IDEOGRAPH
+0x9495,0x8236, //#CJK UNIFIED IDEOGRAPH
+0x9496,0x8584, //#CJK UNIFIED IDEOGRAPH
+0x9497,0x8FEB, //#CJK UNIFIED IDEOGRAPH
+0x9498,0x66DD, //#CJK UNIFIED IDEOGRAPH
+0x9499,0x6F20, //#CJK UNIFIED IDEOGRAPH
+0x949A,0x7206, //#CJK UNIFIED IDEOGRAPH
+0x949B,0x7E1B, //#CJK UNIFIED IDEOGRAPH
+0x949C,0x83AB, //#CJK UNIFIED IDEOGRAPH
+0x949D,0x99C1, //#CJK UNIFIED IDEOGRAPH
+0x949E,0x9EA6, //#CJK UNIFIED IDEOGRAPH
+0x949F,0x51FD, //#CJK UNIFIED IDEOGRAPH
+0x94A0,0x7BB1, //#CJK UNIFIED IDEOGRAPH
+0x94A1,0x7872, //#CJK UNIFIED IDEOGRAPH
+0x94A2,0x7BB8, //#CJK UNIFIED IDEOGRAPH
+0x94A3,0x8087, //#CJK UNIFIED IDEOGRAPH
+0x94A4,0x7B48, //#CJK UNIFIED IDEOGRAPH
+0x94A5,0x6AE8, //#CJK UNIFIED IDEOGRAPH
+0x94A6,0x5E61, //#CJK UNIFIED IDEOGRAPH
+0x94A7,0x808C, //#CJK UNIFIED IDEOGRAPH
+0x94A8,0x7551, //#CJK UNIFIED IDEOGRAPH
+0x94A9,0x7560, //#CJK UNIFIED IDEOGRAPH
+0x94AA,0x516B, //#CJK UNIFIED IDEOGRAPH
+0x94AB,0x9262, //#CJK UNIFIED IDEOGRAPH
+0x94AC,0x6E8C, //#CJK UNIFIED IDEOGRAPH
+0x94AD,0x767A, //#CJK UNIFIED IDEOGRAPH
+0x94AE,0x9197, //#CJK UNIFIED IDEOGRAPH
+0x94AF,0x9AEA, //#CJK UNIFIED IDEOGRAPH
+0x94B0,0x4F10, //#CJK UNIFIED IDEOGRAPH
+0x94B1,0x7F70, //#CJK UNIFIED IDEOGRAPH
+0x94B2,0x629C, //#CJK UNIFIED IDEOGRAPH
+0x94B3,0x7B4F, //#CJK UNIFIED IDEOGRAPH
+0x94B4,0x95A5, //#CJK UNIFIED IDEOGRAPH
+0x94B5,0x9CE9, //#CJK UNIFIED IDEOGRAPH
+0x94B6,0x567A, //#CJK UNIFIED IDEOGRAPH
+0x94B7,0x5859, //#CJK UNIFIED IDEOGRAPH
+0x94B8,0x86E4, //#CJK UNIFIED IDEOGRAPH
+0x94B9,0x96BC, //#CJK UNIFIED IDEOGRAPH
+0x94BA,0x4F34, //#CJK UNIFIED IDEOGRAPH
+0x94BB,0x5224, //#CJK UNIFIED IDEOGRAPH
+0x94BC,0x534A, //#CJK UNIFIED IDEOGRAPH
+0x94BD,0x53CD, //#CJK UNIFIED IDEOGRAPH
+0x94BE,0x53DB, //#CJK UNIFIED IDEOGRAPH
+0x94BF,0x5E06, //#CJK UNIFIED IDEOGRAPH
+0x94C0,0x642C, //#CJK UNIFIED IDEOGRAPH
+0x94C1,0x6591, //#CJK UNIFIED IDEOGRAPH
+0x94C2,0x677F, //#CJK UNIFIED IDEOGRAPH
+0x94C3,0x6C3E, //#CJK UNIFIED IDEOGRAPH
+0x94C4,0x6C4E, //#CJK UNIFIED IDEOGRAPH
+0x94C5,0x7248, //#CJK UNIFIED IDEOGRAPH
+0x94C6,0x72AF, //#CJK UNIFIED IDEOGRAPH
+0x94C7,0x73ED, //#CJK UNIFIED IDEOGRAPH
+0x94C8,0x7554, //#CJK UNIFIED IDEOGRAPH
+0x94C9,0x7E41, //#CJK UNIFIED IDEOGRAPH
+0x94CA,0x822C, //#CJK UNIFIED IDEOGRAPH
+0x94CB,0x85E9, //#CJK UNIFIED IDEOGRAPH
+0x94CC,0x8CA9, //#CJK UNIFIED IDEOGRAPH
+0x94CD,0x7BC4, //#CJK UNIFIED IDEOGRAPH
+0x94CE,0x91C6, //#CJK UNIFIED IDEOGRAPH
+0x94CF,0x7169, //#CJK UNIFIED IDEOGRAPH
+0x94D0,0x9812, //#CJK UNIFIED IDEOGRAPH
+0x94D1,0x98EF, //#CJK UNIFIED IDEOGRAPH
+0x94D2,0x633D, //#CJK UNIFIED IDEOGRAPH
+0x94D3,0x6669, //#CJK UNIFIED IDEOGRAPH
+0x94D4,0x756A, //#CJK UNIFIED IDEOGRAPH
+0x94D5,0x76E4, //#CJK UNIFIED IDEOGRAPH
+0x94D6,0x78D0, //#CJK UNIFIED IDEOGRAPH
+0x94D7,0x8543, //#CJK UNIFIED IDEOGRAPH
+0x94D8,0x86EE, //#CJK UNIFIED IDEOGRAPH
+0x94D9,0x532A, //#CJK UNIFIED IDEOGRAPH
+0x94DA,0x5351, //#CJK UNIFIED IDEOGRAPH
+0x94DB,0x5426, //#CJK UNIFIED IDEOGRAPH
+0x94DC,0x5983, //#CJK UNIFIED IDEOGRAPH
+0x94DD,0x5E87, //#CJK UNIFIED IDEOGRAPH
+0x94DE,0x5F7C, //#CJK UNIFIED IDEOGRAPH
+0x94DF,0x60B2, //#CJK UNIFIED IDEOGRAPH
+0x94E0,0x6249, //#CJK UNIFIED IDEOGRAPH
+0x94E1,0x6279, //#CJK UNIFIED IDEOGRAPH
+0x94E2,0x62AB, //#CJK UNIFIED IDEOGRAPH
+0x94E3,0x6590, //#CJK UNIFIED IDEOGRAPH
+0x94E4,0x6BD4, //#CJK UNIFIED IDEOGRAPH
+0x94E5,0x6CCC, //#CJK UNIFIED IDEOGRAPH
+0x94E6,0x75B2, //#CJK UNIFIED IDEOGRAPH
+0x94E7,0x76AE, //#CJK UNIFIED IDEOGRAPH
+0x94E8,0x7891, //#CJK UNIFIED IDEOGRAPH
+0x94E9,0x79D8, //#CJK UNIFIED IDEOGRAPH
+0x94EA,0x7DCB, //#CJK UNIFIED IDEOGRAPH
+0x94EB,0x7F77, //#CJK UNIFIED IDEOGRAPH
+0x94EC,0x80A5, //#CJK UNIFIED IDEOGRAPH
+0x94ED,0x88AB, //#CJK UNIFIED IDEOGRAPH
+0x94EE,0x8AB9, //#CJK UNIFIED IDEOGRAPH
+0x94EF,0x8CBB, //#CJK UNIFIED IDEOGRAPH
+0x94F0,0x907F, //#CJK UNIFIED IDEOGRAPH
+0x94F1,0x975E, //#CJK UNIFIED IDEOGRAPH
+0x94F2,0x98DB, //#CJK UNIFIED IDEOGRAPH
+0x94F3,0x6A0B, //#CJK UNIFIED IDEOGRAPH
+0x94F4,0x7C38, //#CJK UNIFIED IDEOGRAPH
+0x94F5,0x5099, //#CJK UNIFIED IDEOGRAPH
+0x94F6,0x5C3E, //#CJK UNIFIED IDEOGRAPH
+0x94F7,0x5FAE, //#CJK UNIFIED IDEOGRAPH
+0x94F8,0x6787, //#CJK UNIFIED IDEOGRAPH
+0x94F9,0x6BD8, //#CJK UNIFIED IDEOGRAPH
+0x94FA,0x7435, //#CJK UNIFIED IDEOGRAPH
+0x94FB,0x7709, //#CJK UNIFIED IDEOGRAPH
+0x94FC,0x7F8E, //#CJK UNIFIED IDEOGRAPH
+0x9540,0x9F3B, //#CJK UNIFIED IDEOGRAPH
+0x9541,0x67CA, //#CJK UNIFIED IDEOGRAPH
+0x9542,0x7A17, //#CJK UNIFIED IDEOGRAPH
+0x9543,0x5339, //#CJK UNIFIED IDEOGRAPH
+0x9544,0x758B, //#CJK UNIFIED IDEOGRAPH
+0x9545,0x9AED, //#CJK UNIFIED IDEOGRAPH
+0x9546,0x5F66, //#CJK UNIFIED IDEOGRAPH
+0x9547,0x819D, //#CJK UNIFIED IDEOGRAPH
+0x9548,0x83F1, //#CJK UNIFIED IDEOGRAPH
+0x9549,0x8098, //#CJK UNIFIED IDEOGRAPH
+0x954A,0x5F3C, //#CJK UNIFIED IDEOGRAPH
+0x954B,0x5FC5, //#CJK UNIFIED IDEOGRAPH
+0x954C,0x7562, //#CJK UNIFIED IDEOGRAPH
+0x954D,0x7B46, //#CJK UNIFIED IDEOGRAPH
+0x954E,0x903C, //#CJK UNIFIED IDEOGRAPH
+0x954F,0x6867, //#CJK UNIFIED IDEOGRAPH
+0x9550,0x59EB, //#CJK UNIFIED IDEOGRAPH
+0x9551,0x5A9B, //#CJK UNIFIED IDEOGRAPH
+0x9552,0x7D10, //#CJK UNIFIED IDEOGRAPH
+0x9553,0x767E, //#CJK UNIFIED IDEOGRAPH
+0x9554,0x8B2C, //#CJK UNIFIED IDEOGRAPH
+0x9555,0x4FF5, //#CJK UNIFIED IDEOGRAPH
+0x9556,0x5F6A, //#CJK UNIFIED IDEOGRAPH
+0x9557,0x6A19, //#CJK UNIFIED IDEOGRAPH
+0x9558,0x6C37, //#CJK UNIFIED IDEOGRAPH
+0x9559,0x6F02, //#CJK UNIFIED IDEOGRAPH
+0x955A,0x74E2, //#CJK UNIFIED IDEOGRAPH
+0x955B,0x7968, //#CJK UNIFIED IDEOGRAPH
+0x955C,0x8868, //#CJK UNIFIED IDEOGRAPH
+0x955D,0x8A55, //#CJK UNIFIED IDEOGRAPH
+0x955E,0x8C79, //#CJK UNIFIED IDEOGRAPH
+0x955F,0x5EDF, //#CJK UNIFIED IDEOGRAPH
+0x9560,0x63CF, //#CJK UNIFIED IDEOGRAPH
+0x9561,0x75C5, //#CJK UNIFIED IDEOGRAPH
+0x9562,0x79D2, //#CJK UNIFIED IDEOGRAPH
+0x9563,0x82D7, //#CJK UNIFIED IDEOGRAPH
+0x9564,0x9328, //#CJK UNIFIED IDEOGRAPH
+0x9565,0x92F2, //#CJK UNIFIED IDEOGRAPH
+0x9566,0x849C, //#CJK UNIFIED IDEOGRAPH
+0x9567,0x86ED, //#CJK UNIFIED IDEOGRAPH
+0x9568,0x9C2D, //#CJK UNIFIED IDEOGRAPH
+0x9569,0x54C1, //#CJK UNIFIED IDEOGRAPH
+0x956A,0x5F6C, //#CJK UNIFIED IDEOGRAPH
+0x956B,0x658C, //#CJK UNIFIED IDEOGRAPH
+0x956C,0x6D5C, //#CJK UNIFIED IDEOGRAPH
+0x956D,0x7015, //#CJK UNIFIED IDEOGRAPH
+0x956E,0x8CA7, //#CJK UNIFIED IDEOGRAPH
+0x956F,0x8CD3, //#CJK UNIFIED IDEOGRAPH
+0x9570,0x983B, //#CJK UNIFIED IDEOGRAPH
+0x9571,0x654F, //#CJK UNIFIED IDEOGRAPH
+0x9572,0x74F6, //#CJK UNIFIED IDEOGRAPH
+0x9573,0x4E0D, //#CJK UNIFIED IDEOGRAPH
+0x9574,0x4ED8, //#CJK UNIFIED IDEOGRAPH
+0x9575,0x57E0, //#CJK UNIFIED IDEOGRAPH
+0x9576,0x592B, //#CJK UNIFIED IDEOGRAPH
+0x9577,0x5A66, //#CJK UNIFIED IDEOGRAPH
+0x9578,0x5BCC, //#CJK UNIFIED IDEOGRAPH
+0x9579,0x51A8, //#CJK UNIFIED IDEOGRAPH
+0x957A,0x5E03, //#CJK UNIFIED IDEOGRAPH
+0x957B,0x5E9C, //#CJK UNIFIED IDEOGRAPH
+0x957C,0x6016, //#CJK UNIFIED IDEOGRAPH
+0x957D,0x6276, //#CJK UNIFIED IDEOGRAPH
+0x957E,0x6577, //#CJK UNIFIED IDEOGRAPH
+0x9580,0x65A7, //#CJK UNIFIED IDEOGRAPH
+0x9581,0x666E, //#CJK UNIFIED IDEOGRAPH
+0x9582,0x6D6E, //#CJK UNIFIED IDEOGRAPH
+0x9583,0x7236, //#CJK UNIFIED IDEOGRAPH
+0x9584,0x7B26, //#CJK UNIFIED IDEOGRAPH
+0x9585,0x8150, //#CJK UNIFIED IDEOGRAPH
+0x9586,0x819A, //#CJK UNIFIED IDEOGRAPH
+0x9587,0x8299, //#CJK UNIFIED IDEOGRAPH
+0x9588,0x8B5C, //#CJK UNIFIED IDEOGRAPH
+0x9589,0x8CA0, //#CJK UNIFIED IDEOGRAPH
+0x958A,0x8CE6, //#CJK UNIFIED IDEOGRAPH
+0x958B,0x8D74, //#CJK UNIFIED IDEOGRAPH
+0x958C,0x961C, //#CJK UNIFIED IDEOGRAPH
+0x958D,0x9644, //#CJK UNIFIED IDEOGRAPH
+0x958E,0x4FAE, //#CJK UNIFIED IDEOGRAPH
+0x958F,0x64AB, //#CJK UNIFIED IDEOGRAPH
+0x9590,0x6B66, //#CJK UNIFIED IDEOGRAPH
+0x9591,0x821E, //#CJK UNIFIED IDEOGRAPH
+0x9592,0x8461, //#CJK UNIFIED IDEOGRAPH
+0x9593,0x856A, //#CJK UNIFIED IDEOGRAPH
+0x9594,0x90E8, //#CJK UNIFIED IDEOGRAPH
+0x9595,0x5C01, //#CJK UNIFIED IDEOGRAPH
+0x9596,0x6953, //#CJK UNIFIED IDEOGRAPH
+0x9597,0x98A8, //#CJK UNIFIED IDEOGRAPH
+0x9598,0x847A, //#CJK UNIFIED IDEOGRAPH
+0x9599,0x8557, //#CJK UNIFIED IDEOGRAPH
+0x959A,0x4F0F, //#CJK UNIFIED IDEOGRAPH
+0x959B,0x526F, //#CJK UNIFIED IDEOGRAPH
+0x959C,0x5FA9, //#CJK UNIFIED IDEOGRAPH
+0x959D,0x5E45, //#CJK UNIFIED IDEOGRAPH
+0x959E,0x670D, //#CJK UNIFIED IDEOGRAPH
+0x959F,0x798F, //#CJK UNIFIED IDEOGRAPH
+0x95A0,0x8179, //#CJK UNIFIED IDEOGRAPH
+0x95A1,0x8907, //#CJK UNIFIED IDEOGRAPH
+0x95A2,0x8986, //#CJK UNIFIED IDEOGRAPH
+0x95A3,0x6DF5, //#CJK UNIFIED IDEOGRAPH
+0x95A4,0x5F17, //#CJK UNIFIED IDEOGRAPH
+0x95A5,0x6255, //#CJK UNIFIED IDEOGRAPH
+0x95A6,0x6CB8, //#CJK UNIFIED IDEOGRAPH
+0x95A7,0x4ECF, //#CJK UNIFIED IDEOGRAPH
+0x95A8,0x7269, //#CJK UNIFIED IDEOGRAPH
+0x95A9,0x9B92, //#CJK UNIFIED IDEOGRAPH
+0x95AA,0x5206, //#CJK UNIFIED IDEOGRAPH
+0x95AB,0x543B, //#CJK UNIFIED IDEOGRAPH
+0x95AC,0x5674, //#CJK UNIFIED IDEOGRAPH
+0x95AD,0x58B3, //#CJK UNIFIED IDEOGRAPH
+0x95AE,0x61A4, //#CJK UNIFIED IDEOGRAPH
+0x95AF,0x626E, //#CJK UNIFIED IDEOGRAPH
+0x95B0,0x711A, //#CJK UNIFIED IDEOGRAPH
+0x95B1,0x596E, //#CJK UNIFIED IDEOGRAPH
+0x95B2,0x7C89, //#CJK UNIFIED IDEOGRAPH
+0x95B3,0x7CDE, //#CJK UNIFIED IDEOGRAPH
+0x95B4,0x7D1B, //#CJK UNIFIED IDEOGRAPH
+0x95B5,0x96F0, //#CJK UNIFIED IDEOGRAPH
+0x95B6,0x6587, //#CJK UNIFIED IDEOGRAPH
+0x95B7,0x805E, //#CJK UNIFIED IDEOGRAPH
+0x95B8,0x4E19, //#CJK UNIFIED IDEOGRAPH
+0x95B9,0x4F75, //#CJK UNIFIED IDEOGRAPH
+0x95BA,0x5175, //#CJK UNIFIED IDEOGRAPH
+0x95BB,0x5840, //#CJK UNIFIED IDEOGRAPH
+0x95BC,0x5E63, //#CJK UNIFIED IDEOGRAPH
+0x95BD,0x5E73, //#CJK UNIFIED IDEOGRAPH
+0x95BE,0x5F0A, //#CJK UNIFIED IDEOGRAPH
+0x95BF,0x67C4, //#CJK UNIFIED IDEOGRAPH
+0x95C0,0x4E26, //#CJK UNIFIED IDEOGRAPH
+0x95C1,0x853D, //#CJK UNIFIED IDEOGRAPH
+0x95C2,0x9589, //#CJK UNIFIED IDEOGRAPH
+0x95C3,0x965B, //#CJK UNIFIED IDEOGRAPH
+0x95C4,0x7C73, //#CJK UNIFIED IDEOGRAPH
+0x95C5,0x9801, //#CJK UNIFIED IDEOGRAPH
+0x95C6,0x50FB, //#CJK UNIFIED IDEOGRAPH
+0x95C7,0x58C1, //#CJK UNIFIED IDEOGRAPH
+0x95C8,0x7656, //#CJK UNIFIED IDEOGRAPH
+0x95C9,0x78A7, //#CJK UNIFIED IDEOGRAPH
+0x95CA,0x5225, //#CJK UNIFIED IDEOGRAPH
+0x95CB,0x77A5, //#CJK UNIFIED IDEOGRAPH
+0x95CC,0x8511, //#CJK UNIFIED IDEOGRAPH
+0x95CD,0x7B86, //#CJK UNIFIED IDEOGRAPH
+0x95CE,0x504F, //#CJK UNIFIED IDEOGRAPH
+0x95CF,0x5909, //#CJK UNIFIED IDEOGRAPH
+0x95D0,0x7247, //#CJK UNIFIED IDEOGRAPH
+0x95D1,0x7BC7, //#CJK UNIFIED IDEOGRAPH
+0x95D2,0x7DE8, //#CJK UNIFIED IDEOGRAPH
+0x95D3,0x8FBA, //#CJK UNIFIED IDEOGRAPH
+0x95D4,0x8FD4, //#CJK UNIFIED IDEOGRAPH
+0x95D5,0x904D, //#CJK UNIFIED IDEOGRAPH
+0x95D6,0x4FBF, //#CJK UNIFIED IDEOGRAPH
+0x95D7,0x52C9, //#CJK UNIFIED IDEOGRAPH
+0x95D8,0x5A29, //#CJK UNIFIED IDEOGRAPH
+0x95D9,0x5F01, //#CJK UNIFIED IDEOGRAPH
+0x95DA,0x97AD, //#CJK UNIFIED IDEOGRAPH
+0x95DB,0x4FDD, //#CJK UNIFIED IDEOGRAPH
+0x95DC,0x8217, //#CJK UNIFIED IDEOGRAPH
+0x95DD,0x92EA, //#CJK UNIFIED IDEOGRAPH
+0x95DE,0x5703, //#CJK UNIFIED IDEOGRAPH
+0x95DF,0x6355, //#CJK UNIFIED IDEOGRAPH
+0x95E0,0x6B69, //#CJK UNIFIED IDEOGRAPH
+0x95E1,0x752B, //#CJK UNIFIED IDEOGRAPH
+0x95E2,0x88DC, //#CJK UNIFIED IDEOGRAPH
+0x95E3,0x8F14, //#CJK UNIFIED IDEOGRAPH
+0x95E4,0x7A42, //#CJK UNIFIED IDEOGRAPH
+0x95E5,0x52DF, //#CJK UNIFIED IDEOGRAPH
+0x95E6,0x5893, //#CJK UNIFIED IDEOGRAPH
+0x95E7,0x6155, //#CJK UNIFIED IDEOGRAPH
+0x95E8,0x620A, //#CJK UNIFIED IDEOGRAPH
+0x95E9,0x66AE, //#CJK UNIFIED IDEOGRAPH
+0x95EA,0x6BCD, //#CJK UNIFIED IDEOGRAPH
+0x95EB,0x7C3F, //#CJK UNIFIED IDEOGRAPH
+0x95EC,0x83E9, //#CJK UNIFIED IDEOGRAPH
+0x95ED,0x5023, //#CJK UNIFIED IDEOGRAPH
+0x95EE,0x4FF8, //#CJK UNIFIED IDEOGRAPH
+0x95EF,0x5305, //#CJK UNIFIED IDEOGRAPH
+0x95F0,0x5446, //#CJK UNIFIED IDEOGRAPH
+0x95F1,0x5831, //#CJK UNIFIED IDEOGRAPH
+0x95F2,0x5949, //#CJK UNIFIED IDEOGRAPH
+0x95F3,0x5B9D, //#CJK UNIFIED IDEOGRAPH
+0x95F4,0x5CF0, //#CJK UNIFIED IDEOGRAPH
+0x95F5,0x5CEF, //#CJK UNIFIED IDEOGRAPH
+0x95F6,0x5D29, //#CJK UNIFIED IDEOGRAPH
+0x95F7,0x5E96, //#CJK UNIFIED IDEOGRAPH
+0x95F8,0x62B1, //#CJK UNIFIED IDEOGRAPH
+0x95F9,0x6367, //#CJK UNIFIED IDEOGRAPH
+0x95FA,0x653E, //#CJK UNIFIED IDEOGRAPH
+0x95FB,0x65B9, //#CJK UNIFIED IDEOGRAPH
+0x95FC,0x670B, //#CJK UNIFIED IDEOGRAPH
+0x9640,0x6CD5, //#CJK UNIFIED IDEOGRAPH
+0x9641,0x6CE1, //#CJK UNIFIED IDEOGRAPH
+0x9642,0x70F9, //#CJK UNIFIED IDEOGRAPH
+0x9643,0x7832, //#CJK UNIFIED IDEOGRAPH
+0x9644,0x7E2B, //#CJK UNIFIED IDEOGRAPH
+0x9645,0x80DE, //#CJK UNIFIED IDEOGRAPH
+0x9646,0x82B3, //#CJK UNIFIED IDEOGRAPH
+0x9647,0x840C, //#CJK UNIFIED IDEOGRAPH
+0x9648,0x84EC, //#CJK UNIFIED IDEOGRAPH
+0x9649,0x8702, //#CJK UNIFIED IDEOGRAPH
+0x964A,0x8912, //#CJK UNIFIED IDEOGRAPH
+0x964B,0x8A2A, //#CJK UNIFIED IDEOGRAPH
+0x964C,0x8C4A, //#CJK UNIFIED IDEOGRAPH
+0x964D,0x90A6, //#CJK UNIFIED IDEOGRAPH
+0x964E,0x92D2, //#CJK UNIFIED IDEOGRAPH
+0x964F,0x98FD, //#CJK UNIFIED IDEOGRAPH
+0x9650,0x9CF3, //#CJK UNIFIED IDEOGRAPH
+0x9651,0x9D6C, //#CJK UNIFIED IDEOGRAPH
+0x9652,0x4E4F, //#CJK UNIFIED IDEOGRAPH
+0x9653,0x4EA1, //#CJK UNIFIED IDEOGRAPH
+0x9654,0x508D, //#CJK UNIFIED IDEOGRAPH
+0x9655,0x5256, //#CJK UNIFIED IDEOGRAPH
+0x9656,0x574A, //#CJK UNIFIED IDEOGRAPH
+0x9657,0x59A8, //#CJK UNIFIED IDEOGRAPH
+0x9658,0x5E3D, //#CJK UNIFIED IDEOGRAPH
+0x9659,0x5FD8, //#CJK UNIFIED IDEOGRAPH
+0x965A,0x5FD9, //#CJK UNIFIED IDEOGRAPH
+0x965B,0x623F, //#CJK UNIFIED IDEOGRAPH
+0x965C,0x66B4, //#CJK UNIFIED IDEOGRAPH
+0x965D,0x671B, //#CJK UNIFIED IDEOGRAPH
+0x965E,0x67D0, //#CJK UNIFIED IDEOGRAPH
+0x965F,0x68D2, //#CJK UNIFIED IDEOGRAPH
+0x9660,0x5192, //#CJK UNIFIED IDEOGRAPH
+0x9661,0x7D21, //#CJK UNIFIED IDEOGRAPH
+0x9662,0x80AA, //#CJK UNIFIED IDEOGRAPH
+0x9663,0x81A8, //#CJK UNIFIED IDEOGRAPH
+0x9664,0x8B00, //#CJK UNIFIED IDEOGRAPH
+0x9665,0x8C8C, //#CJK UNIFIED IDEOGRAPH
+0x9666,0x8CBF, //#CJK UNIFIED IDEOGRAPH
+0x9667,0x927E, //#CJK UNIFIED IDEOGRAPH
+0x9668,0x9632, //#CJK UNIFIED IDEOGRAPH
+0x9669,0x5420, //#CJK UNIFIED IDEOGRAPH
+0x966A,0x982C, //#CJK UNIFIED IDEOGRAPH
+0x966B,0x5317, //#CJK UNIFIED IDEOGRAPH
+0x966C,0x50D5, //#CJK UNIFIED IDEOGRAPH
+0x966D,0x535C, //#CJK UNIFIED IDEOGRAPH
+0x966E,0x58A8, //#CJK UNIFIED IDEOGRAPH
+0x966F,0x64B2, //#CJK UNIFIED IDEOGRAPH
+0x9670,0x6734, //#CJK UNIFIED IDEOGRAPH
+0x9671,0x7267, //#CJK UNIFIED IDEOGRAPH
+0x9672,0x7766, //#CJK UNIFIED IDEOGRAPH
+0x9673,0x7A46, //#CJK UNIFIED IDEOGRAPH
+0x9674,0x91E6, //#CJK UNIFIED IDEOGRAPH
+0x9675,0x52C3, //#CJK UNIFIED IDEOGRAPH
+0x9676,0x6CA1, //#CJK UNIFIED IDEOGRAPH
+0x9677,0x6B86, //#CJK UNIFIED IDEOGRAPH
+0x9678,0x5800, //#CJK UNIFIED IDEOGRAPH
+0x9679,0x5E4C, //#CJK UNIFIED IDEOGRAPH
+0x967A,0x5954, //#CJK UNIFIED IDEOGRAPH
+0x967B,0x672C, //#CJK UNIFIED IDEOGRAPH
+0x967C,0x7FFB, //#CJK UNIFIED IDEOGRAPH
+0x967D,0x51E1, //#CJK UNIFIED IDEOGRAPH
+0x967E,0x76C6, //#CJK UNIFIED IDEOGRAPH
+0x9680,0x6469, //#CJK UNIFIED IDEOGRAPH
+0x9681,0x78E8, //#CJK UNIFIED IDEOGRAPH
+0x9682,0x9B54, //#CJK UNIFIED IDEOGRAPH
+0x9683,0x9EBB, //#CJK UNIFIED IDEOGRAPH
+0x9684,0x57CB, //#CJK UNIFIED IDEOGRAPH
+0x9685,0x59B9, //#CJK UNIFIED IDEOGRAPH
+0x9686,0x6627, //#CJK UNIFIED IDEOGRAPH
+0x9687,0x679A, //#CJK UNIFIED IDEOGRAPH
+0x9688,0x6BCE, //#CJK UNIFIED IDEOGRAPH
+0x9689,0x54E9, //#CJK UNIFIED IDEOGRAPH
+0x968A,0x69D9, //#CJK UNIFIED IDEOGRAPH
+0x968B,0x5E55, //#CJK UNIFIED IDEOGRAPH
+0x968C,0x819C, //#CJK UNIFIED IDEOGRAPH
+0x968D,0x6795, //#CJK UNIFIED IDEOGRAPH
+0x968E,0x9BAA, //#CJK UNIFIED IDEOGRAPH
+0x968F,0x67FE, //#CJK UNIFIED IDEOGRAPH
+0x9690,0x9C52, //#CJK UNIFIED IDEOGRAPH
+0x9691,0x685D, //#CJK UNIFIED IDEOGRAPH
+0x9692,0x4EA6, //#CJK UNIFIED IDEOGRAPH
+0x9693,0x4FE3, //#CJK UNIFIED IDEOGRAPH
+0x9694,0x53C8, //#CJK UNIFIED IDEOGRAPH
+0x9695,0x62B9, //#CJK UNIFIED IDEOGRAPH
+0x9696,0x672B, //#CJK UNIFIED IDEOGRAPH
+0x9697,0x6CAB, //#CJK UNIFIED IDEOGRAPH
+0x9698,0x8FC4, //#CJK UNIFIED IDEOGRAPH
+0x9699,0x4FAD, //#CJK UNIFIED IDEOGRAPH
+0x969A,0x7E6D, //#CJK UNIFIED IDEOGRAPH
+0x969B,0x9EBF, //#CJK UNIFIED IDEOGRAPH
+0x969C,0x4E07, //#CJK UNIFIED IDEOGRAPH
+0x969D,0x6162, //#CJK UNIFIED IDEOGRAPH
+0x969E,0x6E80, //#CJK UNIFIED IDEOGRAPH
+0x969F,0x6F2B, //#CJK UNIFIED IDEOGRAPH
+0x96A0,0x8513, //#CJK UNIFIED IDEOGRAPH
+0x96A1,0x5473, //#CJK UNIFIED IDEOGRAPH
+0x96A2,0x672A, //#CJK UNIFIED IDEOGRAPH
+0x96A3,0x9B45, //#CJK UNIFIED IDEOGRAPH
+0x96A4,0x5DF3, //#CJK UNIFIED IDEOGRAPH
+0x96A5,0x7B95, //#CJK UNIFIED IDEOGRAPH
+0x96A6,0x5CAC, //#CJK UNIFIED IDEOGRAPH
+0x96A7,0x5BC6, //#CJK UNIFIED IDEOGRAPH
+0x96A8,0x871C, //#CJK UNIFIED IDEOGRAPH
+0x96A9,0x6E4A, //#CJK UNIFIED IDEOGRAPH
+0x96AA,0x84D1, //#CJK UNIFIED IDEOGRAPH
+0x96AB,0x7A14, //#CJK UNIFIED IDEOGRAPH
+0x96AC,0x8108, //#CJK UNIFIED IDEOGRAPH
+0x96AD,0x5999, //#CJK UNIFIED IDEOGRAPH
+0x96AE,0x7C8D, //#CJK UNIFIED IDEOGRAPH
+0x96AF,0x6C11, //#CJK UNIFIED IDEOGRAPH
+0x96B0,0x7720, //#CJK UNIFIED IDEOGRAPH
+0x96B1,0x52D9, //#CJK UNIFIED IDEOGRAPH
+0x96B2,0x5922, //#CJK UNIFIED IDEOGRAPH
+0x96B3,0x7121, //#CJK UNIFIED IDEOGRAPH
+0x96B4,0x725F, //#CJK UNIFIED IDEOGRAPH
+0x96B5,0x77DB, //#CJK UNIFIED IDEOGRAPH
+0x96B6,0x9727, //#CJK UNIFIED IDEOGRAPH
+0x96B7,0x9D61, //#CJK UNIFIED IDEOGRAPH
+0x96B8,0x690B, //#CJK UNIFIED IDEOGRAPH
+0x96B9,0x5A7F, //#CJK UNIFIED IDEOGRAPH
+0x96BA,0x5A18, //#CJK UNIFIED IDEOGRAPH
+0x96BB,0x51A5, //#CJK UNIFIED IDEOGRAPH
+0x96BC,0x540D, //#CJK UNIFIED IDEOGRAPH
+0x96BD,0x547D, //#CJK UNIFIED IDEOGRAPH
+0x96BE,0x660E, //#CJK UNIFIED IDEOGRAPH
+0x96BF,0x76DF, //#CJK UNIFIED IDEOGRAPH
+0x96C0,0x8FF7, //#CJK UNIFIED IDEOGRAPH
+0x96C1,0x9298, //#CJK UNIFIED IDEOGRAPH
+0x96C2,0x9CF4, //#CJK UNIFIED IDEOGRAPH
+0x96C3,0x59EA, //#CJK UNIFIED IDEOGRAPH
+0x96C4,0x725D, //#CJK UNIFIED IDEOGRAPH
+0x96C5,0x6EC5, //#CJK UNIFIED IDEOGRAPH
+0x96C6,0x514D, //#CJK UNIFIED IDEOGRAPH
+0x96C7,0x68C9, //#CJK UNIFIED IDEOGRAPH
+0x96C8,0x7DBF, //#CJK UNIFIED IDEOGRAPH
+0x96C9,0x7DEC, //#CJK UNIFIED IDEOGRAPH
+0x96CA,0x9762, //#CJK UNIFIED IDEOGRAPH
+0x96CB,0x9EBA, //#CJK UNIFIED IDEOGRAPH
+0x96CC,0x6478, //#CJK UNIFIED IDEOGRAPH
+0x96CD,0x6A21, //#CJK UNIFIED IDEOGRAPH
+0x96CE,0x8302, //#CJK UNIFIED IDEOGRAPH
+0x96CF,0x5984, //#CJK UNIFIED IDEOGRAPH
+0x96D0,0x5B5F, //#CJK UNIFIED IDEOGRAPH
+0x96D1,0x6BDB, //#CJK UNIFIED IDEOGRAPH
+0x96D2,0x731B, //#CJK UNIFIED IDEOGRAPH
+0x96D3,0x76F2, //#CJK UNIFIED IDEOGRAPH
+0x96D4,0x7DB2, //#CJK UNIFIED IDEOGRAPH
+0x96D5,0x8017, //#CJK UNIFIED IDEOGRAPH
+0x96D6,0x8499, //#CJK UNIFIED IDEOGRAPH
+0x96D7,0x5132, //#CJK UNIFIED IDEOGRAPH
+0x96D8,0x6728, //#CJK UNIFIED IDEOGRAPH
+0x96D9,0x9ED9, //#CJK UNIFIED IDEOGRAPH
+0x96DA,0x76EE, //#CJK UNIFIED IDEOGRAPH
+0x96DB,0x6762, //#CJK UNIFIED IDEOGRAPH
+0x96DC,0x52FF, //#CJK UNIFIED IDEOGRAPH
+0x96DD,0x9905, //#CJK UNIFIED IDEOGRAPH
+0x96DE,0x5C24, //#CJK UNIFIED IDEOGRAPH
+0x96DF,0x623B, //#CJK UNIFIED IDEOGRAPH
+0x96E0,0x7C7E, //#CJK UNIFIED IDEOGRAPH
+0x96E1,0x8CB0, //#CJK UNIFIED IDEOGRAPH
+0x96E2,0x554F, //#CJK UNIFIED IDEOGRAPH
+0x96E3,0x60B6, //#CJK UNIFIED IDEOGRAPH
+0x96E4,0x7D0B, //#CJK UNIFIED IDEOGRAPH
+0x96E5,0x9580, //#CJK UNIFIED IDEOGRAPH
+0x96E6,0x5301, //#CJK UNIFIED IDEOGRAPH
+0x96E7,0x4E5F, //#CJK UNIFIED IDEOGRAPH
+0x96E8,0x51B6, //#CJK UNIFIED IDEOGRAPH
+0x96E9,0x591C, //#CJK UNIFIED IDEOGRAPH
+0x96EA,0x723A, //#CJK UNIFIED IDEOGRAPH
+0x96EB,0x8036, //#CJK UNIFIED IDEOGRAPH
+0x96EC,0x91CE, //#CJK UNIFIED IDEOGRAPH
+0x96ED,0x5F25, //#CJK UNIFIED IDEOGRAPH
+0x96EE,0x77E2, //#CJK UNIFIED IDEOGRAPH
+0x96EF,0x5384, //#CJK UNIFIED IDEOGRAPH
+0x96F0,0x5F79, //#CJK UNIFIED IDEOGRAPH
+0x96F1,0x7D04, //#CJK UNIFIED IDEOGRAPH
+0x96F2,0x85AC, //#CJK UNIFIED IDEOGRAPH
+0x96F3,0x8A33, //#CJK UNIFIED IDEOGRAPH
+0x96F4,0x8E8D, //#CJK UNIFIED IDEOGRAPH
+0x96F5,0x9756, //#CJK UNIFIED IDEOGRAPH
+0x96F6,0x67F3, //#CJK UNIFIED IDEOGRAPH
+0x96F7,0x85AE, //#CJK UNIFIED IDEOGRAPH
+0x96F8,0x9453, //#CJK UNIFIED IDEOGRAPH
+0x96F9,0x6109, //#CJK UNIFIED IDEOGRAPH
+0x96FA,0x6108, //#CJK UNIFIED IDEOGRAPH
+0x96FB,0x6CB9, //#CJK UNIFIED IDEOGRAPH
+0x96FC,0x7652, //#CJK UNIFIED IDEOGRAPH
+0x9740,0x8AED, //#CJK UNIFIED IDEOGRAPH
+0x9741,0x8F38, //#CJK UNIFIED IDEOGRAPH
+0x9742,0x552F, //#CJK UNIFIED IDEOGRAPH
+0x9743,0x4F51, //#CJK UNIFIED IDEOGRAPH
+0x9744,0x512A, //#CJK UNIFIED IDEOGRAPH
+0x9745,0x52C7, //#CJK UNIFIED IDEOGRAPH
+0x9746,0x53CB, //#CJK UNIFIED IDEOGRAPH
+0x9747,0x5BA5, //#CJK UNIFIED IDEOGRAPH
+0x9748,0x5E7D, //#CJK UNIFIED IDEOGRAPH
+0x9749,0x60A0, //#CJK UNIFIED IDEOGRAPH
+0x974A,0x6182, //#CJK UNIFIED IDEOGRAPH
+0x974B,0x63D6, //#CJK UNIFIED IDEOGRAPH
+0x974C,0x6709, //#CJK UNIFIED IDEOGRAPH
+0x974D,0x67DA, //#CJK UNIFIED IDEOGRAPH
+0x974E,0x6E67, //#CJK UNIFIED IDEOGRAPH
+0x974F,0x6D8C, //#CJK UNIFIED IDEOGRAPH
+0x9750,0x7336, //#CJK UNIFIED IDEOGRAPH
+0x9751,0x7337, //#CJK UNIFIED IDEOGRAPH
+0x9752,0x7531, //#CJK UNIFIED IDEOGRAPH
+0x9753,0x7950, //#CJK UNIFIED IDEOGRAPH
+0x9754,0x88D5, //#CJK UNIFIED IDEOGRAPH
+0x9755,0x8A98, //#CJK UNIFIED IDEOGRAPH
+0x9756,0x904A, //#CJK UNIFIED IDEOGRAPH
+0x9757,0x9091, //#CJK UNIFIED IDEOGRAPH
+0x9758,0x90F5, //#CJK UNIFIED IDEOGRAPH
+0x9759,0x96C4, //#CJK UNIFIED IDEOGRAPH
+0x975A,0x878D, //#CJK UNIFIED IDEOGRAPH
+0x975B,0x5915, //#CJK UNIFIED IDEOGRAPH
+0x975C,0x4E88, //#CJK UNIFIED IDEOGRAPH
+0x975D,0x4F59, //#CJK UNIFIED IDEOGRAPH
+0x975E,0x4E0E, //#CJK UNIFIED IDEOGRAPH
+0x975F,0x8A89, //#CJK UNIFIED IDEOGRAPH
+0x9760,0x8F3F, //#CJK UNIFIED IDEOGRAPH
+0x9761,0x9810, //#CJK UNIFIED IDEOGRAPH
+0x9762,0x50AD, //#CJK UNIFIED IDEOGRAPH
+0x9763,0x5E7C, //#CJK UNIFIED IDEOGRAPH
+0x9764,0x5996, //#CJK UNIFIED IDEOGRAPH
+0x9765,0x5BB9, //#CJK UNIFIED IDEOGRAPH
+0x9766,0x5EB8, //#CJK UNIFIED IDEOGRAPH
+0x9767,0x63DA, //#CJK UNIFIED IDEOGRAPH
+0x9768,0x63FA, //#CJK UNIFIED IDEOGRAPH
+0x9769,0x64C1, //#CJK UNIFIED IDEOGRAPH
+0x976A,0x66DC, //#CJK UNIFIED IDEOGRAPH
+0x976B,0x694A, //#CJK UNIFIED IDEOGRAPH
+0x976C,0x69D8, //#CJK UNIFIED IDEOGRAPH
+0x976D,0x6D0B, //#CJK UNIFIED IDEOGRAPH
+0x976E,0x6EB6, //#CJK UNIFIED IDEOGRAPH
+0x976F,0x7194, //#CJK UNIFIED IDEOGRAPH
+0x9770,0x7528, //#CJK UNIFIED IDEOGRAPH
+0x9771,0x7AAF, //#CJK UNIFIED IDEOGRAPH
+0x9772,0x7F8A, //#CJK UNIFIED IDEOGRAPH
+0x9773,0x8000, //#CJK UNIFIED IDEOGRAPH
+0x9774,0x8449, //#CJK UNIFIED IDEOGRAPH
+0x9775,0x84C9, //#CJK UNIFIED IDEOGRAPH
+0x9776,0x8981, //#CJK UNIFIED IDEOGRAPH
+0x9777,0x8B21, //#CJK UNIFIED IDEOGRAPH
+0x9778,0x8E0A, //#CJK UNIFIED IDEOGRAPH
+0x9779,0x9065, //#CJK UNIFIED IDEOGRAPH
+0x977A,0x967D, //#CJK UNIFIED IDEOGRAPH
+0x977B,0x990A, //#CJK UNIFIED IDEOGRAPH
+0x977C,0x617E, //#CJK UNIFIED IDEOGRAPH
+0x977D,0x6291, //#CJK UNIFIED IDEOGRAPH
+0x977E,0x6B32, //#CJK UNIFIED IDEOGRAPH
+0x9780,0x6C83, //#CJK UNIFIED IDEOGRAPH
+0x9781,0x6D74, //#CJK UNIFIED IDEOGRAPH
+0x9782,0x7FCC, //#CJK UNIFIED IDEOGRAPH
+0x9783,0x7FFC, //#CJK UNIFIED IDEOGRAPH
+0x9784,0x6DC0, //#CJK UNIFIED IDEOGRAPH
+0x9785,0x7F85, //#CJK UNIFIED IDEOGRAPH
+0x9786,0x87BA, //#CJK UNIFIED IDEOGRAPH
+0x9787,0x88F8, //#CJK UNIFIED IDEOGRAPH
+0x9788,0x6765, //#CJK UNIFIED IDEOGRAPH
+0x9789,0x83B1, //#CJK UNIFIED IDEOGRAPH
+0x978A,0x983C, //#CJK UNIFIED IDEOGRAPH
+0x978B,0x96F7, //#CJK UNIFIED IDEOGRAPH
+0x978C,0x6D1B, //#CJK UNIFIED IDEOGRAPH
+0x978D,0x7D61, //#CJK UNIFIED IDEOGRAPH
+0x978E,0x843D, //#CJK UNIFIED IDEOGRAPH
+0x978F,0x916A, //#CJK UNIFIED IDEOGRAPH
+0x9790,0x4E71, //#CJK UNIFIED IDEOGRAPH
+0x9791,0x5375, //#CJK UNIFIED IDEOGRAPH
+0x9792,0x5D50, //#CJK UNIFIED IDEOGRAPH
+0x9793,0x6B04, //#CJK UNIFIED IDEOGRAPH
+0x9794,0x6FEB, //#CJK UNIFIED IDEOGRAPH
+0x9795,0x85CD, //#CJK UNIFIED IDEOGRAPH
+0x9796,0x862D, //#CJK UNIFIED IDEOGRAPH
+0x9797,0x89A7, //#CJK UNIFIED IDEOGRAPH
+0x9798,0x5229, //#CJK UNIFIED IDEOGRAPH
+0x9799,0x540F, //#CJK UNIFIED IDEOGRAPH
+0x979A,0x5C65, //#CJK UNIFIED IDEOGRAPH
+0x979B,0x674E, //#CJK UNIFIED IDEOGRAPH
+0x979C,0x68A8, //#CJK UNIFIED IDEOGRAPH
+0x979D,0x7406, //#CJK UNIFIED IDEOGRAPH
+0x979E,0x7483, //#CJK UNIFIED IDEOGRAPH
+0x979F,0x75E2, //#CJK UNIFIED IDEOGRAPH
+0x97A0,0x88CF, //#CJK UNIFIED IDEOGRAPH
+0x97A1,0x88E1, //#CJK UNIFIED IDEOGRAPH
+0x97A2,0x91CC, //#CJK UNIFIED IDEOGRAPH
+0x97A3,0x96E2, //#CJK UNIFIED IDEOGRAPH
+0x97A4,0x9678, //#CJK UNIFIED IDEOGRAPH
+0x97A5,0x5F8B, //#CJK UNIFIED IDEOGRAPH
+0x97A6,0x7387, //#CJK UNIFIED IDEOGRAPH
+0x97A7,0x7ACB, //#CJK UNIFIED IDEOGRAPH
+0x97A8,0x844E, //#CJK UNIFIED IDEOGRAPH
+0x97A9,0x63A0, //#CJK UNIFIED IDEOGRAPH
+0x97AA,0x7565, //#CJK UNIFIED IDEOGRAPH
+0x97AB,0x5289, //#CJK UNIFIED IDEOGRAPH
+0x97AC,0x6D41, //#CJK UNIFIED IDEOGRAPH
+0x97AD,0x6E9C, //#CJK UNIFIED IDEOGRAPH
+0x97AE,0x7409, //#CJK UNIFIED IDEOGRAPH
+0x97AF,0x7559, //#CJK UNIFIED IDEOGRAPH
+0x97B0,0x786B, //#CJK UNIFIED IDEOGRAPH
+0x97B1,0x7C92, //#CJK UNIFIED IDEOGRAPH
+0x97B2,0x9686, //#CJK UNIFIED IDEOGRAPH
+0x97B3,0x7ADC, //#CJK UNIFIED IDEOGRAPH
+0x97B4,0x9F8D, //#CJK UNIFIED IDEOGRAPH
+0x97B5,0x4FB6, //#CJK UNIFIED IDEOGRAPH
+0x97B6,0x616E, //#CJK UNIFIED IDEOGRAPH
+0x97B7,0x65C5, //#CJK UNIFIED IDEOGRAPH
+0x97B8,0x865C, //#CJK UNIFIED IDEOGRAPH
+0x97B9,0x4E86, //#CJK UNIFIED IDEOGRAPH
+0x97BA,0x4EAE, //#CJK UNIFIED IDEOGRAPH
+0x97BB,0x50DA, //#CJK UNIFIED IDEOGRAPH
+0x97BC,0x4E21, //#CJK UNIFIED IDEOGRAPH
+0x97BD,0x51CC, //#CJK UNIFIED IDEOGRAPH
+0x97BE,0x5BEE, //#CJK UNIFIED IDEOGRAPH
+0x97BF,0x6599, //#CJK UNIFIED IDEOGRAPH
+0x97C0,0x6881, //#CJK UNIFIED IDEOGRAPH
+0x97C1,0x6DBC, //#CJK UNIFIED IDEOGRAPH
+0x97C2,0x731F, //#CJK UNIFIED IDEOGRAPH
+0x97C3,0x7642, //#CJK UNIFIED IDEOGRAPH
+0x97C4,0x77AD, //#CJK UNIFIED IDEOGRAPH
+0x97C5,0x7A1C, //#CJK UNIFIED IDEOGRAPH
+0x97C6,0x7CE7, //#CJK UNIFIED IDEOGRAPH
+0x97C7,0x826F, //#CJK UNIFIED IDEOGRAPH
+0x97C8,0x8AD2, //#CJK UNIFIED IDEOGRAPH
+0x97C9,0x907C, //#CJK UNIFIED IDEOGRAPH
+0x97CA,0x91CF, //#CJK UNIFIED IDEOGRAPH
+0x97CB,0x9675, //#CJK UNIFIED IDEOGRAPH
+0x97CC,0x9818, //#CJK UNIFIED IDEOGRAPH
+0x97CD,0x529B, //#CJK UNIFIED IDEOGRAPH
+0x97CE,0x7DD1, //#CJK UNIFIED IDEOGRAPH
+0x97CF,0x502B, //#CJK UNIFIED IDEOGRAPH
+0x97D0,0x5398, //#CJK UNIFIED IDEOGRAPH
+0x97D1,0x6797, //#CJK UNIFIED IDEOGRAPH
+0x97D2,0x6DCB, //#CJK UNIFIED IDEOGRAPH
+0x97D3,0x71D0, //#CJK UNIFIED IDEOGRAPH
+0x97D4,0x7433, //#CJK UNIFIED IDEOGRAPH
+0x97D5,0x81E8, //#CJK UNIFIED IDEOGRAPH
+0x97D6,0x8F2A, //#CJK UNIFIED IDEOGRAPH
+0x97D7,0x96A3, //#CJK UNIFIED IDEOGRAPH
+0x97D8,0x9C57, //#CJK UNIFIED IDEOGRAPH
+0x97D9,0x9E9F, //#CJK UNIFIED IDEOGRAPH
+0x97DA,0x7460, //#CJK UNIFIED IDEOGRAPH
+0x97DB,0x5841, //#CJK UNIFIED IDEOGRAPH
+0x97DC,0x6D99, //#CJK UNIFIED IDEOGRAPH
+0x97DD,0x7D2F, //#CJK UNIFIED IDEOGRAPH
+0x97DE,0x985E, //#CJK UNIFIED IDEOGRAPH
+0x97DF,0x4EE4, //#CJK UNIFIED IDEOGRAPH
+0x97E0,0x4F36, //#CJK UNIFIED IDEOGRAPH
+0x97E1,0x4F8B, //#CJK UNIFIED IDEOGRAPH
+0x97E2,0x51B7, //#CJK UNIFIED IDEOGRAPH
+0x97E3,0x52B1, //#CJK UNIFIED IDEOGRAPH
+0x97E4,0x5DBA, //#CJK UNIFIED IDEOGRAPH
+0x97E5,0x601C, //#CJK UNIFIED IDEOGRAPH
+0x97E6,0x73B2, //#CJK UNIFIED IDEOGRAPH
+0x97E7,0x793C, //#CJK UNIFIED IDEOGRAPH
+0x97E8,0x82D3, //#CJK UNIFIED IDEOGRAPH
+0x97E9,0x9234, //#CJK UNIFIED IDEOGRAPH
+0x97EA,0x96B7, //#CJK UNIFIED IDEOGRAPH
+0x97EB,0x96F6, //#CJK UNIFIED IDEOGRAPH
+0x97EC,0x970A, //#CJK UNIFIED IDEOGRAPH
+0x97ED,0x9E97, //#CJK UNIFIED IDEOGRAPH
+0x97EE,0x9F62, //#CJK UNIFIED IDEOGRAPH
+0x97EF,0x66A6, //#CJK UNIFIED IDEOGRAPH
+0x97F0,0x6B74, //#CJK UNIFIED IDEOGRAPH
+0x97F1,0x5217, //#CJK UNIFIED IDEOGRAPH
+0x97F2,0x52A3, //#CJK UNIFIED IDEOGRAPH
+0x97F3,0x70C8, //#CJK UNIFIED IDEOGRAPH
+0x97F4,0x88C2, //#CJK UNIFIED IDEOGRAPH
+0x97F5,0x5EC9, //#CJK UNIFIED IDEOGRAPH
+0x97F6,0x604B, //#CJK UNIFIED IDEOGRAPH
+0x97F7,0x6190, //#CJK UNIFIED IDEOGRAPH
+0x97F8,0x6F23, //#CJK UNIFIED IDEOGRAPH
+0x97F9,0x7149, //#CJK UNIFIED IDEOGRAPH
+0x97FA,0x7C3E, //#CJK UNIFIED IDEOGRAPH
+0x97FB,0x7DF4, //#CJK UNIFIED IDEOGRAPH
+0x97FC,0x806F, //#CJK UNIFIED IDEOGRAPH
+0x9840,0x84EE, //#CJK UNIFIED IDEOGRAPH
+0x9841,0x9023, //#CJK UNIFIED IDEOGRAPH
+0x9842,0x932C, //#CJK UNIFIED IDEOGRAPH
+0x9843,0x5442, //#CJK UNIFIED IDEOGRAPH
+0x9844,0x9B6F, //#CJK UNIFIED IDEOGRAPH
+0x9845,0x6AD3, //#CJK UNIFIED IDEOGRAPH
+0x9846,0x7089, //#CJK UNIFIED IDEOGRAPH
+0x9847,0x8CC2, //#CJK UNIFIED IDEOGRAPH
+0x9848,0x8DEF, //#CJK UNIFIED IDEOGRAPH
+0x9849,0x9732, //#CJK UNIFIED IDEOGRAPH
+0x984A,0x52B4, //#CJK UNIFIED IDEOGRAPH
+0x984B,0x5A41, //#CJK UNIFIED IDEOGRAPH
+0x984C,0x5ECA, //#CJK UNIFIED IDEOGRAPH
+0x984D,0x5F04, //#CJK UNIFIED IDEOGRAPH
+0x984E,0x6717, //#CJK UNIFIED IDEOGRAPH
+0x984F,0x697C, //#CJK UNIFIED IDEOGRAPH
+0x9850,0x6994, //#CJK UNIFIED IDEOGRAPH
+0x9851,0x6D6A, //#CJK UNIFIED IDEOGRAPH
+0x9852,0x6F0F, //#CJK UNIFIED IDEOGRAPH
+0x9853,0x7262, //#CJK UNIFIED IDEOGRAPH
+0x9854,0x72FC, //#CJK UNIFIED IDEOGRAPH
+0x9855,0x7BED, //#CJK UNIFIED IDEOGRAPH
+0x9856,0x8001, //#CJK UNIFIED IDEOGRAPH
+0x9857,0x807E, //#CJK UNIFIED IDEOGRAPH
+0x9858,0x874B, //#CJK UNIFIED IDEOGRAPH
+0x9859,0x90CE, //#CJK UNIFIED IDEOGRAPH
+0x985A,0x516D, //#CJK UNIFIED IDEOGRAPH
+0x985B,0x9E93, //#CJK UNIFIED IDEOGRAPH
+0x985C,0x7984, //#CJK UNIFIED IDEOGRAPH
+0x985D,0x808B, //#CJK UNIFIED IDEOGRAPH
+0x985E,0x9332, //#CJK UNIFIED IDEOGRAPH
+0x985F,0x8AD6, //#CJK UNIFIED IDEOGRAPH
+0x9860,0x502D, //#CJK UNIFIED IDEOGRAPH
+0x9861,0x548C, //#CJK UNIFIED IDEOGRAPH
+0x9862,0x8A71, //#CJK UNIFIED IDEOGRAPH
+0x9863,0x6B6A, //#CJK UNIFIED IDEOGRAPH
+0x9864,0x8CC4, //#CJK UNIFIED IDEOGRAPH
+0x9865,0x8107, //#CJK UNIFIED IDEOGRAPH
+0x9866,0x60D1, //#CJK UNIFIED IDEOGRAPH
+0x9867,0x67A0, //#CJK UNIFIED IDEOGRAPH
+0x9868,0x9DF2, //#CJK UNIFIED IDEOGRAPH
+0x9869,0x4E99, //#CJK UNIFIED IDEOGRAPH
+0x986A,0x4E98, //#CJK UNIFIED IDEOGRAPH
+0x986B,0x9C10, //#CJK UNIFIED IDEOGRAPH
+0x986C,0x8A6B, //#CJK UNIFIED IDEOGRAPH
+0x986D,0x85C1, //#CJK UNIFIED IDEOGRAPH
+0x986E,0x8568, //#CJK UNIFIED IDEOGRAPH
+0x986F,0x6900, //#CJK UNIFIED IDEOGRAPH
+0x9870,0x6E7E, //#CJK UNIFIED IDEOGRAPH
+0x9871,0x7897, //#CJK UNIFIED IDEOGRAPH
+0x9872,0x8155, //#CJK UNIFIED IDEOGRAPH
+0x989F,0x5F0C, //#CJK UNIFIED IDEOGRAPH
+0x98A0,0x4E10, //#CJK UNIFIED IDEOGRAPH
+0x98A1,0x4E15, //#CJK UNIFIED IDEOGRAPH
+0x98A2,0x4E2A, //#CJK UNIFIED IDEOGRAPH
+0x98A3,0x4E31, //#CJK UNIFIED IDEOGRAPH
+0x98A4,0x4E36, //#CJK UNIFIED IDEOGRAPH
+0x98A5,0x4E3C, //#CJK UNIFIED IDEOGRAPH
+0x98A6,0x4E3F, //#CJK UNIFIED IDEOGRAPH
+0x98A7,0x4E42, //#CJK UNIFIED IDEOGRAPH
+0x98A8,0x4E56, //#CJK UNIFIED IDEOGRAPH
+0x98A9,0x4E58, //#CJK UNIFIED IDEOGRAPH
+0x98AA,0x4E82, //#CJK UNIFIED IDEOGRAPH
+0x98AB,0x4E85, //#CJK UNIFIED IDEOGRAPH
+0x98AC,0x8C6B, //#CJK UNIFIED IDEOGRAPH
+0x98AD,0x4E8A, //#CJK UNIFIED IDEOGRAPH
+0x98AE,0x8212, //#CJK UNIFIED IDEOGRAPH
+0x98AF,0x5F0D, //#CJK UNIFIED IDEOGRAPH
+0x98B0,0x4E8E, //#CJK UNIFIED IDEOGRAPH
+0x98B1,0x4E9E, //#CJK UNIFIED IDEOGRAPH
+0x98B2,0x4E9F, //#CJK UNIFIED IDEOGRAPH
+0x98B3,0x4EA0, //#CJK UNIFIED IDEOGRAPH
+0x98B4,0x4EA2, //#CJK UNIFIED IDEOGRAPH
+0x98B5,0x4EB0, //#CJK UNIFIED IDEOGRAPH
+0x98B6,0x4EB3, //#CJK UNIFIED IDEOGRAPH
+0x98B7,0x4EB6, //#CJK UNIFIED IDEOGRAPH
+0x98B8,0x4ECE, //#CJK UNIFIED IDEOGRAPH
+0x98B9,0x4ECD, //#CJK UNIFIED IDEOGRAPH
+0x98BA,0x4EC4, //#CJK UNIFIED IDEOGRAPH
+0x98BB,0x4EC6, //#CJK UNIFIED IDEOGRAPH
+0x98BC,0x4EC2, //#CJK UNIFIED IDEOGRAPH
+0x98BD,0x4ED7, //#CJK UNIFIED IDEOGRAPH
+0x98BE,0x4EDE, //#CJK UNIFIED IDEOGRAPH
+0x98BF,0x4EED, //#CJK UNIFIED IDEOGRAPH
+0x98C0,0x4EDF, //#CJK UNIFIED IDEOGRAPH
+0x98C1,0x4EF7, //#CJK UNIFIED IDEOGRAPH
+0x98C2,0x4F09, //#CJK UNIFIED IDEOGRAPH
+0x98C3,0x4F5A, //#CJK UNIFIED IDEOGRAPH
+0x98C4,0x4F30, //#CJK UNIFIED IDEOGRAPH
+0x98C5,0x4F5B, //#CJK UNIFIED IDEOGRAPH
+0x98C6,0x4F5D, //#CJK UNIFIED IDEOGRAPH
+0x98C7,0x4F57, //#CJK UNIFIED IDEOGRAPH
+0x98C8,0x4F47, //#CJK UNIFIED IDEOGRAPH
+0x98C9,0x4F76, //#CJK UNIFIED IDEOGRAPH
+0x98CA,0x4F88, //#CJK UNIFIED IDEOGRAPH
+0x98CB,0x4F8F, //#CJK UNIFIED IDEOGRAPH
+0x98CC,0x4F98, //#CJK UNIFIED IDEOGRAPH
+0x98CD,0x4F7B, //#CJK UNIFIED IDEOGRAPH
+0x98CE,0x4F69, //#CJK UNIFIED IDEOGRAPH
+0x98CF,0x4F70, //#CJK UNIFIED IDEOGRAPH
+0x98D0,0x4F91, //#CJK UNIFIED IDEOGRAPH
+0x98D1,0x4F6F, //#CJK UNIFIED IDEOGRAPH
+0x98D2,0x4F86, //#CJK UNIFIED IDEOGRAPH
+0x98D3,0x4F96, //#CJK UNIFIED IDEOGRAPH
+0x98D4,0x5118, //#CJK UNIFIED IDEOGRAPH
+0x98D5,0x4FD4, //#CJK UNIFIED IDEOGRAPH
+0x98D6,0x4FDF, //#CJK UNIFIED IDEOGRAPH
+0x98D7,0x4FCE, //#CJK UNIFIED IDEOGRAPH
+0x98D8,0x4FD8, //#CJK UNIFIED IDEOGRAPH
+0x98D9,0x4FDB, //#CJK UNIFIED IDEOGRAPH
+0x98DA,0x4FD1, //#CJK UNIFIED IDEOGRAPH
+0x98DB,0x4FDA, //#CJK UNIFIED IDEOGRAPH
+0x98DC,0x4FD0, //#CJK UNIFIED IDEOGRAPH
+0x98DD,0x4FE4, //#CJK UNIFIED IDEOGRAPH
+0x98DE,0x4FE5, //#CJK UNIFIED IDEOGRAPH
+0x98DF,0x501A, //#CJK UNIFIED IDEOGRAPH
+0x98E0,0x5028, //#CJK UNIFIED IDEOGRAPH
+0x98E1,0x5014, //#CJK UNIFIED IDEOGRAPH
+0x98E2,0x502A, //#CJK UNIFIED IDEOGRAPH
+0x98E3,0x5025, //#CJK UNIFIED IDEOGRAPH
+0x98E4,0x5005, //#CJK UNIFIED IDEOGRAPH
+0x98E5,0x4F1C, //#CJK UNIFIED IDEOGRAPH
+0x98E6,0x4FF6, //#CJK UNIFIED IDEOGRAPH
+0x98E7,0x5021, //#CJK UNIFIED IDEOGRAPH
+0x98E8,0x5029, //#CJK UNIFIED IDEOGRAPH
+0x98E9,0x502C, //#CJK UNIFIED IDEOGRAPH
+0x98EA,0x4FFE, //#CJK UNIFIED IDEOGRAPH
+0x98EB,0x4FEF, //#CJK UNIFIED IDEOGRAPH
+0x98EC,0x5011, //#CJK UNIFIED IDEOGRAPH
+0x98ED,0x5006, //#CJK UNIFIED IDEOGRAPH
+0x98EE,0x5043, //#CJK UNIFIED IDEOGRAPH
+0x98EF,0x5047, //#CJK UNIFIED IDEOGRAPH
+0x98F0,0x6703, //#CJK UNIFIED IDEOGRAPH
+0x98F1,0x5055, //#CJK UNIFIED IDEOGRAPH
+0x98F2,0x5050, //#CJK UNIFIED IDEOGRAPH
+0x98F3,0x5048, //#CJK UNIFIED IDEOGRAPH
+0x98F4,0x505A, //#CJK UNIFIED IDEOGRAPH
+0x98F5,0x5056, //#CJK UNIFIED IDEOGRAPH
+0x98F6,0x506C, //#CJK UNIFIED IDEOGRAPH
+0x98F7,0x5078, //#CJK UNIFIED IDEOGRAPH
+0x98F8,0x5080, //#CJK UNIFIED IDEOGRAPH
+0x98F9,0x509A, //#CJK UNIFIED IDEOGRAPH
+0x98FA,0x5085, //#CJK UNIFIED IDEOGRAPH
+0x98FB,0x50B4, //#CJK UNIFIED IDEOGRAPH
+0x98FC,0x50B2, //#CJK UNIFIED IDEOGRAPH
+0x9940,0x50C9, //#CJK UNIFIED IDEOGRAPH
+0x9941,0x50CA, //#CJK UNIFIED IDEOGRAPH
+0x9942,0x50B3, //#CJK UNIFIED IDEOGRAPH
+0x9943,0x50C2, //#CJK UNIFIED IDEOGRAPH
+0x9944,0x50D6, //#CJK UNIFIED IDEOGRAPH
+0x9945,0x50DE, //#CJK UNIFIED IDEOGRAPH
+0x9946,0x50E5, //#CJK UNIFIED IDEOGRAPH
+0x9947,0x50ED, //#CJK UNIFIED IDEOGRAPH
+0x9948,0x50E3, //#CJK UNIFIED IDEOGRAPH
+0x9949,0x50EE, //#CJK UNIFIED IDEOGRAPH
+0x994A,0x50F9, //#CJK UNIFIED IDEOGRAPH
+0x994B,0x50F5, //#CJK UNIFIED IDEOGRAPH
+0x994C,0x5109, //#CJK UNIFIED IDEOGRAPH
+0x994D,0x5101, //#CJK UNIFIED IDEOGRAPH
+0x994E,0x5102, //#CJK UNIFIED IDEOGRAPH
+0x994F,0x5116, //#CJK UNIFIED IDEOGRAPH
+0x9950,0x5115, //#CJK UNIFIED IDEOGRAPH
+0x9951,0x5114, //#CJK UNIFIED IDEOGRAPH
+0x9952,0x511A, //#CJK UNIFIED IDEOGRAPH
+0x9953,0x5121, //#CJK UNIFIED IDEOGRAPH
+0x9954,0x513A, //#CJK UNIFIED IDEOGRAPH
+0x9955,0x5137, //#CJK UNIFIED IDEOGRAPH
+0x9956,0x513C, //#CJK UNIFIED IDEOGRAPH
+0x9957,0x513B, //#CJK UNIFIED IDEOGRAPH
+0x9958,0x513F, //#CJK UNIFIED IDEOGRAPH
+0x9959,0x5140, //#CJK UNIFIED IDEOGRAPH
+0x995A,0x5152, //#CJK UNIFIED IDEOGRAPH
+0x995B,0x514C, //#CJK UNIFIED IDEOGRAPH
+0x995C,0x5154, //#CJK UNIFIED IDEOGRAPH
+0x995D,0x5162, //#CJK UNIFIED IDEOGRAPH
+0x995E,0x7AF8, //#CJK UNIFIED IDEOGRAPH
+0x995F,0x5169, //#CJK UNIFIED IDEOGRAPH
+0x9960,0x516A, //#CJK UNIFIED IDEOGRAPH
+0x9961,0x516E, //#CJK UNIFIED IDEOGRAPH
+0x9962,0x5180, //#CJK UNIFIED IDEOGRAPH
+0x9963,0x5182, //#CJK UNIFIED IDEOGRAPH
+0x9964,0x56D8, //#CJK UNIFIED IDEOGRAPH
+0x9965,0x518C, //#CJK UNIFIED IDEOGRAPH
+0x9966,0x5189, //#CJK UNIFIED IDEOGRAPH
+0x9967,0x518F, //#CJK UNIFIED IDEOGRAPH
+0x9968,0x5191, //#CJK UNIFIED IDEOGRAPH
+0x9969,0x5193, //#CJK UNIFIED IDEOGRAPH
+0x996A,0x5195, //#CJK UNIFIED IDEOGRAPH
+0x996B,0x5196, //#CJK UNIFIED IDEOGRAPH
+0x996C,0x51A4, //#CJK UNIFIED IDEOGRAPH
+0x996D,0x51A6, //#CJK UNIFIED IDEOGRAPH
+0x996E,0x51A2, //#CJK UNIFIED IDEOGRAPH
+0x996F,0x51A9, //#CJK UNIFIED IDEOGRAPH
+0x9970,0x51AA, //#CJK UNIFIED IDEOGRAPH
+0x9971,0x51AB, //#CJK UNIFIED IDEOGRAPH
+0x9972,0x51B3, //#CJK UNIFIED IDEOGRAPH
+0x9973,0x51B1, //#CJK UNIFIED IDEOGRAPH
+0x9974,0x51B2, //#CJK UNIFIED IDEOGRAPH
+0x9975,0x51B0, //#CJK UNIFIED IDEOGRAPH
+0x9976,0x51B5, //#CJK UNIFIED IDEOGRAPH
+0x9977,0x51BD, //#CJK UNIFIED IDEOGRAPH
+0x9978,0x51C5, //#CJK UNIFIED IDEOGRAPH
+0x9979,0x51C9, //#CJK UNIFIED IDEOGRAPH
+0x997A,0x51DB, //#CJK UNIFIED IDEOGRAPH
+0x997B,0x51E0, //#CJK UNIFIED IDEOGRAPH
+0x997C,0x8655, //#CJK UNIFIED IDEOGRAPH
+0x997D,0x51E9, //#CJK UNIFIED IDEOGRAPH
+0x997E,0x51ED, //#CJK UNIFIED IDEOGRAPH
+0x9980,0x51F0, //#CJK UNIFIED IDEOGRAPH
+0x9981,0x51F5, //#CJK UNIFIED IDEOGRAPH
+0x9982,0x51FE, //#CJK UNIFIED IDEOGRAPH
+0x9983,0x5204, //#CJK UNIFIED IDEOGRAPH
+0x9984,0x520B, //#CJK UNIFIED IDEOGRAPH
+0x9985,0x5214, //#CJK UNIFIED IDEOGRAPH
+0x9986,0x520E, //#CJK UNIFIED IDEOGRAPH
+0x9987,0x5227, //#CJK UNIFIED IDEOGRAPH
+0x9988,0x522A, //#CJK UNIFIED IDEOGRAPH
+0x9989,0x522E, //#CJK UNIFIED IDEOGRAPH
+0x998A,0x5233, //#CJK UNIFIED IDEOGRAPH
+0x998B,0x5239, //#CJK UNIFIED IDEOGRAPH
+0x998C,0x524F, //#CJK UNIFIED IDEOGRAPH
+0x998D,0x5244, //#CJK UNIFIED IDEOGRAPH
+0x998E,0x524B, //#CJK UNIFIED IDEOGRAPH
+0x998F,0x524C, //#CJK UNIFIED IDEOGRAPH
+0x9990,0x525E, //#CJK UNIFIED IDEOGRAPH
+0x9991,0x5254, //#CJK UNIFIED IDEOGRAPH
+0x9992,0x526A, //#CJK UNIFIED IDEOGRAPH
+0x9993,0x5274, //#CJK UNIFIED IDEOGRAPH
+0x9994,0x5269, //#CJK UNIFIED IDEOGRAPH
+0x9995,0x5273, //#CJK UNIFIED IDEOGRAPH
+0x9996,0x527F, //#CJK UNIFIED IDEOGRAPH
+0x9997,0x527D, //#CJK UNIFIED IDEOGRAPH
+0x9998,0x528D, //#CJK UNIFIED IDEOGRAPH
+0x9999,0x5294, //#CJK UNIFIED IDEOGRAPH
+0x999A,0x5292, //#CJK UNIFIED IDEOGRAPH
+0x999B,0x5271, //#CJK UNIFIED IDEOGRAPH
+0x999C,0x5288, //#CJK UNIFIED IDEOGRAPH
+0x999D,0x5291, //#CJK UNIFIED IDEOGRAPH
+0x999E,0x8FA8, //#CJK UNIFIED IDEOGRAPH
+0x999F,0x8FA7, //#CJK UNIFIED IDEOGRAPH
+0x99A0,0x52AC, //#CJK UNIFIED IDEOGRAPH
+0x99A1,0x52AD, //#CJK UNIFIED IDEOGRAPH
+0x99A2,0x52BC, //#CJK UNIFIED IDEOGRAPH
+0x99A3,0x52B5, //#CJK UNIFIED IDEOGRAPH
+0x99A4,0x52C1, //#CJK UNIFIED IDEOGRAPH
+0x99A5,0x52CD, //#CJK UNIFIED IDEOGRAPH
+0x99A6,0x52D7, //#CJK UNIFIED IDEOGRAPH
+0x99A7,0x52DE, //#CJK UNIFIED IDEOGRAPH
+0x99A8,0x52E3, //#CJK UNIFIED IDEOGRAPH
+0x99A9,0x52E6, //#CJK UNIFIED IDEOGRAPH
+0x99AA,0x98ED, //#CJK UNIFIED IDEOGRAPH
+0x99AB,0x52E0, //#CJK UNIFIED IDEOGRAPH
+0x99AC,0x52F3, //#CJK UNIFIED IDEOGRAPH
+0x99AD,0x52F5, //#CJK UNIFIED IDEOGRAPH
+0x99AE,0x52F8, //#CJK UNIFIED IDEOGRAPH
+0x99AF,0x52F9, //#CJK UNIFIED IDEOGRAPH
+0x99B0,0x5306, //#CJK UNIFIED IDEOGRAPH
+0x99B1,0x5308, //#CJK UNIFIED IDEOGRAPH
+0x99B2,0x7538, //#CJK UNIFIED IDEOGRAPH
+0x99B3,0x530D, //#CJK UNIFIED IDEOGRAPH
+0x99B4,0x5310, //#CJK UNIFIED IDEOGRAPH
+0x99B5,0x530F, //#CJK UNIFIED IDEOGRAPH
+0x99B6,0x5315, //#CJK UNIFIED IDEOGRAPH
+0x99B7,0x531A, //#CJK UNIFIED IDEOGRAPH
+0x99B8,0x5323, //#CJK UNIFIED IDEOGRAPH
+0x99B9,0x532F, //#CJK UNIFIED IDEOGRAPH
+0x99BA,0x5331, //#CJK UNIFIED IDEOGRAPH
+0x99BB,0x5333, //#CJK UNIFIED IDEOGRAPH
+0x99BC,0x5338, //#CJK UNIFIED IDEOGRAPH
+0x99BD,0x5340, //#CJK UNIFIED IDEOGRAPH
+0x99BE,0x5346, //#CJK UNIFIED IDEOGRAPH
+0x99BF,0x5345, //#CJK UNIFIED IDEOGRAPH
+0x99C0,0x4E17, //#CJK UNIFIED IDEOGRAPH
+0x99C1,0x5349, //#CJK UNIFIED IDEOGRAPH
+0x99C2,0x534D, //#CJK UNIFIED IDEOGRAPH
+0x99C3,0x51D6, //#CJK UNIFIED IDEOGRAPH
+0x99C4,0x535E, //#CJK UNIFIED IDEOGRAPH
+0x99C5,0x5369, //#CJK UNIFIED IDEOGRAPH
+0x99C6,0x536E, //#CJK UNIFIED IDEOGRAPH
+0x99C7,0x5918, //#CJK UNIFIED IDEOGRAPH
+0x99C8,0x537B, //#CJK UNIFIED IDEOGRAPH
+0x99C9,0x5377, //#CJK UNIFIED IDEOGRAPH
+0x99CA,0x5382, //#CJK UNIFIED IDEOGRAPH
+0x99CB,0x5396, //#CJK UNIFIED IDEOGRAPH
+0x99CC,0x53A0, //#CJK UNIFIED IDEOGRAPH
+0x99CD,0x53A6, //#CJK UNIFIED IDEOGRAPH
+0x99CE,0x53A5, //#CJK UNIFIED IDEOGRAPH
+0x99CF,0x53AE, //#CJK UNIFIED IDEOGRAPH
+0x99D0,0x53B0, //#CJK UNIFIED IDEOGRAPH
+0x99D1,0x53B6, //#CJK UNIFIED IDEOGRAPH
+0x99D2,0x53C3, //#CJK UNIFIED IDEOGRAPH
+0x99D3,0x7C12, //#CJK UNIFIED IDEOGRAPH
+0x99D4,0x96D9, //#CJK UNIFIED IDEOGRAPH
+0x99D5,0x53DF, //#CJK UNIFIED IDEOGRAPH
+0x99D6,0x66FC, //#CJK UNIFIED IDEOGRAPH
+0x99D7,0x71EE, //#CJK UNIFIED IDEOGRAPH
+0x99D8,0x53EE, //#CJK UNIFIED IDEOGRAPH
+0x99D9,0x53E8, //#CJK UNIFIED IDEOGRAPH
+0x99DA,0x53ED, //#CJK UNIFIED IDEOGRAPH
+0x99DB,0x53FA, //#CJK UNIFIED IDEOGRAPH
+0x99DC,0x5401, //#CJK UNIFIED IDEOGRAPH
+0x99DD,0x543D, //#CJK UNIFIED IDEOGRAPH
+0x99DE,0x5440, //#CJK UNIFIED IDEOGRAPH
+0x99DF,0x542C, //#CJK UNIFIED IDEOGRAPH
+0x99E0,0x542D, //#CJK UNIFIED IDEOGRAPH
+0x99E1,0x543C, //#CJK UNIFIED IDEOGRAPH
+0x99E2,0x542E, //#CJK UNIFIED IDEOGRAPH
+0x99E3,0x5436, //#CJK UNIFIED IDEOGRAPH
+0x99E4,0x5429, //#CJK UNIFIED IDEOGRAPH
+0x99E5,0x541D, //#CJK UNIFIED IDEOGRAPH
+0x99E6,0x544E, //#CJK UNIFIED IDEOGRAPH
+0x99E7,0x548F, //#CJK UNIFIED IDEOGRAPH
+0x99E8,0x5475, //#CJK UNIFIED IDEOGRAPH
+0x99E9,0x548E, //#CJK UNIFIED IDEOGRAPH
+0x99EA,0x545F, //#CJK UNIFIED IDEOGRAPH
+0x99EB,0x5471, //#CJK UNIFIED IDEOGRAPH
+0x99EC,0x5477, //#CJK UNIFIED IDEOGRAPH
+0x99ED,0x5470, //#CJK UNIFIED IDEOGRAPH
+0x99EE,0x5492, //#CJK UNIFIED IDEOGRAPH
+0x99EF,0x547B, //#CJK UNIFIED IDEOGRAPH
+0x99F0,0x5480, //#CJK UNIFIED IDEOGRAPH
+0x99F1,0x5476, //#CJK UNIFIED IDEOGRAPH
+0x99F2,0x5484, //#CJK UNIFIED IDEOGRAPH
+0x99F3,0x5490, //#CJK UNIFIED IDEOGRAPH
+0x99F4,0x5486, //#CJK UNIFIED IDEOGRAPH
+0x99F5,0x54C7, //#CJK UNIFIED IDEOGRAPH
+0x99F6,0x54A2, //#CJK UNIFIED IDEOGRAPH
+0x99F7,0x54B8, //#CJK UNIFIED IDEOGRAPH
+0x99F8,0x54A5, //#CJK UNIFIED IDEOGRAPH
+0x99F9,0x54AC, //#CJK UNIFIED IDEOGRAPH
+0x99FA,0x54C4, //#CJK UNIFIED IDEOGRAPH
+0x99FB,0x54C8, //#CJK UNIFIED IDEOGRAPH
+0x99FC,0x54A8, //#CJK UNIFIED IDEOGRAPH
+0x9A40,0x54AB, //#CJK UNIFIED IDEOGRAPH
+0x9A41,0x54C2, //#CJK UNIFIED IDEOGRAPH
+0x9A42,0x54A4, //#CJK UNIFIED IDEOGRAPH
+0x9A43,0x54BE, //#CJK UNIFIED IDEOGRAPH
+0x9A44,0x54BC, //#CJK UNIFIED IDEOGRAPH
+0x9A45,0x54D8, //#CJK UNIFIED IDEOGRAPH
+0x9A46,0x54E5, //#CJK UNIFIED IDEOGRAPH
+0x9A47,0x54E6, //#CJK UNIFIED IDEOGRAPH
+0x9A48,0x550F, //#CJK UNIFIED IDEOGRAPH
+0x9A49,0x5514, //#CJK UNIFIED IDEOGRAPH
+0x9A4A,0x54FD, //#CJK UNIFIED IDEOGRAPH
+0x9A4B,0x54EE, //#CJK UNIFIED IDEOGRAPH
+0x9A4C,0x54ED, //#CJK UNIFIED IDEOGRAPH
+0x9A4D,0x54FA, //#CJK UNIFIED IDEOGRAPH
+0x9A4E,0x54E2, //#CJK UNIFIED IDEOGRAPH
+0x9A4F,0x5539, //#CJK UNIFIED IDEOGRAPH
+0x9A50,0x5540, //#CJK UNIFIED IDEOGRAPH
+0x9A51,0x5563, //#CJK UNIFIED IDEOGRAPH
+0x9A52,0x554C, //#CJK UNIFIED IDEOGRAPH
+0x9A53,0x552E, //#CJK UNIFIED IDEOGRAPH
+0x9A54,0x555C, //#CJK UNIFIED IDEOGRAPH
+0x9A55,0x5545, //#CJK UNIFIED IDEOGRAPH
+0x9A56,0x5556, //#CJK UNIFIED IDEOGRAPH
+0x9A57,0x5557, //#CJK UNIFIED IDEOGRAPH
+0x9A58,0x5538, //#CJK UNIFIED IDEOGRAPH
+0x9A59,0x5533, //#CJK UNIFIED IDEOGRAPH
+0x9A5A,0x555D, //#CJK UNIFIED IDEOGRAPH
+0x9A5B,0x5599, //#CJK UNIFIED IDEOGRAPH
+0x9A5C,0x5580, //#CJK UNIFIED IDEOGRAPH
+0x9A5D,0x54AF, //#CJK UNIFIED IDEOGRAPH
+0x9A5E,0x558A, //#CJK UNIFIED IDEOGRAPH
+0x9A5F,0x559F, //#CJK UNIFIED IDEOGRAPH
+0x9A60,0x557B, //#CJK UNIFIED IDEOGRAPH
+0x9A61,0x557E, //#CJK UNIFIED IDEOGRAPH
+0x9A62,0x5598, //#CJK UNIFIED IDEOGRAPH
+0x9A63,0x559E, //#CJK UNIFIED IDEOGRAPH
+0x9A64,0x55AE, //#CJK UNIFIED IDEOGRAPH
+0x9A65,0x557C, //#CJK UNIFIED IDEOGRAPH
+0x9A66,0x5583, //#CJK UNIFIED IDEOGRAPH
+0x9A67,0x55A9, //#CJK UNIFIED IDEOGRAPH
+0x9A68,0x5587, //#CJK UNIFIED IDEOGRAPH
+0x9A69,0x55A8, //#CJK UNIFIED IDEOGRAPH
+0x9A6A,0x55DA, //#CJK UNIFIED IDEOGRAPH
+0x9A6B,0x55C5, //#CJK UNIFIED IDEOGRAPH
+0x9A6C,0x55DF, //#CJK UNIFIED IDEOGRAPH
+0x9A6D,0x55C4, //#CJK UNIFIED IDEOGRAPH
+0x9A6E,0x55DC, //#CJK UNIFIED IDEOGRAPH
+0x9A6F,0x55E4, //#CJK UNIFIED IDEOGRAPH
+0x9A70,0x55D4, //#CJK UNIFIED IDEOGRAPH
+0x9A71,0x5614, //#CJK UNIFIED IDEOGRAPH
+0x9A72,0x55F7, //#CJK UNIFIED IDEOGRAPH
+0x9A73,0x5616, //#CJK UNIFIED IDEOGRAPH
+0x9A74,0x55FE, //#CJK UNIFIED IDEOGRAPH
+0x9A75,0x55FD, //#CJK UNIFIED IDEOGRAPH
+0x9A76,0x561B, //#CJK UNIFIED IDEOGRAPH
+0x9A77,0x55F9, //#CJK UNIFIED IDEOGRAPH
+0x9A78,0x564E, //#CJK UNIFIED IDEOGRAPH
+0x9A79,0x5650, //#CJK UNIFIED IDEOGRAPH
+0x9A7A,0x71DF, //#CJK UNIFIED IDEOGRAPH
+0x9A7B,0x5634, //#CJK UNIFIED IDEOGRAPH
+0x9A7C,0x5636, //#CJK UNIFIED IDEOGRAPH
+0x9A7D,0x5632, //#CJK UNIFIED IDEOGRAPH
+0x9A7E,0x5638, //#CJK UNIFIED IDEOGRAPH
+0x9A80,0x566B, //#CJK UNIFIED IDEOGRAPH
+0x9A81,0x5664, //#CJK UNIFIED IDEOGRAPH
+0x9A82,0x562F, //#CJK UNIFIED IDEOGRAPH
+0x9A83,0x566C, //#CJK UNIFIED IDEOGRAPH
+0x9A84,0x566A, //#CJK UNIFIED IDEOGRAPH
+0x9A85,0x5686, //#CJK UNIFIED IDEOGRAPH
+0x9A86,0x5680, //#CJK UNIFIED IDEOGRAPH
+0x9A87,0x568A, //#CJK UNIFIED IDEOGRAPH
+0x9A88,0x56A0, //#CJK UNIFIED IDEOGRAPH
+0x9A89,0x5694, //#CJK UNIFIED IDEOGRAPH
+0x9A8A,0x568F, //#CJK UNIFIED IDEOGRAPH
+0x9A8B,0x56A5, //#CJK UNIFIED IDEOGRAPH
+0x9A8C,0x56AE, //#CJK UNIFIED IDEOGRAPH
+0x9A8D,0x56B6, //#CJK UNIFIED IDEOGRAPH
+0x9A8E,0x56B4, //#CJK UNIFIED IDEOGRAPH
+0x9A8F,0x56C2, //#CJK UNIFIED IDEOGRAPH
+0x9A90,0x56BC, //#CJK UNIFIED IDEOGRAPH
+0x9A91,0x56C1, //#CJK UNIFIED IDEOGRAPH
+0x9A92,0x56C3, //#CJK UNIFIED IDEOGRAPH
+0x9A93,0x56C0, //#CJK UNIFIED IDEOGRAPH
+0x9A94,0x56C8, //#CJK UNIFIED IDEOGRAPH
+0x9A95,0x56CE, //#CJK UNIFIED IDEOGRAPH
+0x9A96,0x56D1, //#CJK UNIFIED IDEOGRAPH
+0x9A97,0x56D3, //#CJK UNIFIED IDEOGRAPH
+0x9A98,0x56D7, //#CJK UNIFIED IDEOGRAPH
+0x9A99,0x56EE, //#CJK UNIFIED IDEOGRAPH
+0x9A9A,0x56F9, //#CJK UNIFIED IDEOGRAPH
+0x9A9B,0x5700, //#CJK UNIFIED IDEOGRAPH
+0x9A9C,0x56FF, //#CJK UNIFIED IDEOGRAPH
+0x9A9D,0x5704, //#CJK UNIFIED IDEOGRAPH
+0x9A9E,0x5709, //#CJK UNIFIED IDEOGRAPH
+0x9A9F,0x5708, //#CJK UNIFIED IDEOGRAPH
+0x9AA0,0x570B, //#CJK UNIFIED IDEOGRAPH
+0x9AA1,0x570D, //#CJK UNIFIED IDEOGRAPH
+0x9AA2,0x5713, //#CJK UNIFIED IDEOGRAPH
+0x9AA3,0x5718, //#CJK UNIFIED IDEOGRAPH
+0x9AA4,0x5716, //#CJK UNIFIED IDEOGRAPH
+0x9AA5,0x55C7, //#CJK UNIFIED IDEOGRAPH
+0x9AA6,0x571C, //#CJK UNIFIED IDEOGRAPH
+0x9AA7,0x5726, //#CJK UNIFIED IDEOGRAPH
+0x9AA8,0x5737, //#CJK UNIFIED IDEOGRAPH
+0x9AA9,0x5738, //#CJK UNIFIED IDEOGRAPH
+0x9AAA,0x574E, //#CJK UNIFIED IDEOGRAPH
+0x9AAB,0x573B, //#CJK UNIFIED IDEOGRAPH
+0x9AAC,0x5740, //#CJK UNIFIED IDEOGRAPH
+0x9AAD,0x574F, //#CJK UNIFIED IDEOGRAPH
+0x9AAE,0x5769, //#CJK UNIFIED IDEOGRAPH
+0x9AAF,0x57C0, //#CJK UNIFIED IDEOGRAPH
+0x9AB0,0x5788, //#CJK UNIFIED IDEOGRAPH
+0x9AB1,0x5761, //#CJK UNIFIED IDEOGRAPH
+0x9AB2,0x577F, //#CJK UNIFIED IDEOGRAPH
+0x9AB3,0x5789, //#CJK UNIFIED IDEOGRAPH
+0x9AB4,0x5793, //#CJK UNIFIED IDEOGRAPH
+0x9AB5,0x57A0, //#CJK UNIFIED IDEOGRAPH
+0x9AB6,0x57B3, //#CJK UNIFIED IDEOGRAPH
+0x9AB7,0x57A4, //#CJK UNIFIED IDEOGRAPH
+0x9AB8,0x57AA, //#CJK UNIFIED IDEOGRAPH
+0x9AB9,0x57B0, //#CJK UNIFIED IDEOGRAPH
+0x9ABA,0x57C3, //#CJK UNIFIED IDEOGRAPH
+0x9ABB,0x57C6, //#CJK UNIFIED IDEOGRAPH
+0x9ABC,0x57D4, //#CJK UNIFIED IDEOGRAPH
+0x9ABD,0x57D2, //#CJK UNIFIED IDEOGRAPH
+0x9ABE,0x57D3, //#CJK UNIFIED IDEOGRAPH
+0x9ABF,0x580A, //#CJK UNIFIED IDEOGRAPH
+0x9AC0,0x57D6, //#CJK UNIFIED IDEOGRAPH
+0x9AC1,0x57E3, //#CJK UNIFIED IDEOGRAPH
+0x9AC2,0x580B, //#CJK UNIFIED IDEOGRAPH
+0x9AC3,0x5819, //#CJK UNIFIED IDEOGRAPH
+0x9AC4,0x581D, //#CJK UNIFIED IDEOGRAPH
+0x9AC5,0x5872, //#CJK UNIFIED IDEOGRAPH
+0x9AC6,0x5821, //#CJK UNIFIED IDEOGRAPH
+0x9AC7,0x5862, //#CJK UNIFIED IDEOGRAPH
+0x9AC8,0x584B, //#CJK UNIFIED IDEOGRAPH
+0x9AC9,0x5870, //#CJK UNIFIED IDEOGRAPH
+0x9ACA,0x6BC0, //#CJK UNIFIED IDEOGRAPH
+0x9ACB,0x5852, //#CJK UNIFIED IDEOGRAPH
+0x9ACC,0x583D, //#CJK UNIFIED IDEOGRAPH
+0x9ACD,0x5879, //#CJK UNIFIED IDEOGRAPH
+0x9ACE,0x5885, //#CJK UNIFIED IDEOGRAPH
+0x9ACF,0x58B9, //#CJK UNIFIED IDEOGRAPH
+0x9AD0,0x589F, //#CJK UNIFIED IDEOGRAPH
+0x9AD1,0x58AB, //#CJK UNIFIED IDEOGRAPH
+0x9AD2,0x58BA, //#CJK UNIFIED IDEOGRAPH
+0x9AD3,0x58DE, //#CJK UNIFIED IDEOGRAPH
+0x9AD4,0x58BB, //#CJK UNIFIED IDEOGRAPH
+0x9AD5,0x58B8, //#CJK UNIFIED IDEOGRAPH
+0x9AD6,0x58AE, //#CJK UNIFIED IDEOGRAPH
+0x9AD7,0x58C5, //#CJK UNIFIED IDEOGRAPH
+0x9AD8,0x58D3, //#CJK UNIFIED IDEOGRAPH
+0x9AD9,0x58D1, //#CJK UNIFIED IDEOGRAPH
+0x9ADA,0x58D7, //#CJK UNIFIED IDEOGRAPH
+0x9ADB,0x58D9, //#CJK UNIFIED IDEOGRAPH
+0x9ADC,0x58D8, //#CJK UNIFIED IDEOGRAPH
+0x9ADD,0x58E5, //#CJK UNIFIED IDEOGRAPH
+0x9ADE,0x58DC, //#CJK UNIFIED IDEOGRAPH
+0x9ADF,0x58E4, //#CJK UNIFIED IDEOGRAPH
+0x9AE0,0x58DF, //#CJK UNIFIED IDEOGRAPH
+0x9AE1,0x58EF, //#CJK UNIFIED IDEOGRAPH
+0x9AE2,0x58FA, //#CJK UNIFIED IDEOGRAPH
+0x9AE3,0x58F9, //#CJK UNIFIED IDEOGRAPH
+0x9AE4,0x58FB, //#CJK UNIFIED IDEOGRAPH
+0x9AE5,0x58FC, //#CJK UNIFIED IDEOGRAPH
+0x9AE6,0x58FD, //#CJK UNIFIED IDEOGRAPH
+0x9AE7,0x5902, //#CJK UNIFIED IDEOGRAPH
+0x9AE8,0x590A, //#CJK UNIFIED IDEOGRAPH
+0x9AE9,0x5910, //#CJK UNIFIED IDEOGRAPH
+0x9AEA,0x591B, //#CJK UNIFIED IDEOGRAPH
+0x9AEB,0x68A6, //#CJK UNIFIED IDEOGRAPH
+0x9AEC,0x5925, //#CJK UNIFIED IDEOGRAPH
+0x9AED,0x592C, //#CJK UNIFIED IDEOGRAPH
+0x9AEE,0x592D, //#CJK UNIFIED IDEOGRAPH
+0x9AEF,0x5932, //#CJK UNIFIED IDEOGRAPH
+0x9AF0,0x5938, //#CJK UNIFIED IDEOGRAPH
+0x9AF1,0x593E, //#CJK UNIFIED IDEOGRAPH
+0x9AF2,0x7AD2, //#CJK UNIFIED IDEOGRAPH
+0x9AF3,0x5955, //#CJK UNIFIED IDEOGRAPH
+0x9AF4,0x5950, //#CJK UNIFIED IDEOGRAPH
+0x9AF5,0x594E, //#CJK UNIFIED IDEOGRAPH
+0x9AF6,0x595A, //#CJK UNIFIED IDEOGRAPH
+0x9AF7,0x5958, //#CJK UNIFIED IDEOGRAPH
+0x9AF8,0x5962, //#CJK UNIFIED IDEOGRAPH
+0x9AF9,0x5960, //#CJK UNIFIED IDEOGRAPH
+0x9AFA,0x5967, //#CJK UNIFIED IDEOGRAPH
+0x9AFB,0x596C, //#CJK UNIFIED IDEOGRAPH
+0x9AFC,0x5969, //#CJK UNIFIED IDEOGRAPH
+0x9B40,0x5978, //#CJK UNIFIED IDEOGRAPH
+0x9B41,0x5981, //#CJK UNIFIED IDEOGRAPH
+0x9B42,0x599D, //#CJK UNIFIED IDEOGRAPH
+0x9B43,0x4F5E, //#CJK UNIFIED IDEOGRAPH
+0x9B44,0x4FAB, //#CJK UNIFIED IDEOGRAPH
+0x9B45,0x59A3, //#CJK UNIFIED IDEOGRAPH
+0x9B46,0x59B2, //#CJK UNIFIED IDEOGRAPH
+0x9B47,0x59C6, //#CJK UNIFIED IDEOGRAPH
+0x9B48,0x59E8, //#CJK UNIFIED IDEOGRAPH
+0x9B49,0x59DC, //#CJK UNIFIED IDEOGRAPH
+0x9B4A,0x598D, //#CJK UNIFIED IDEOGRAPH
+0x9B4B,0x59D9, //#CJK UNIFIED IDEOGRAPH
+0x9B4C,0x59DA, //#CJK UNIFIED IDEOGRAPH
+0x9B4D,0x5A25, //#CJK UNIFIED IDEOGRAPH
+0x9B4E,0x5A1F, //#CJK UNIFIED IDEOGRAPH
+0x9B4F,0x5A11, //#CJK UNIFIED IDEOGRAPH
+0x9B50,0x5A1C, //#CJK UNIFIED IDEOGRAPH
+0x9B51,0x5A09, //#CJK UNIFIED IDEOGRAPH
+0x9B52,0x5A1A, //#CJK UNIFIED IDEOGRAPH
+0x9B53,0x5A40, //#CJK UNIFIED IDEOGRAPH
+0x9B54,0x5A6C, //#CJK UNIFIED IDEOGRAPH
+0x9B55,0x5A49, //#CJK UNIFIED IDEOGRAPH
+0x9B56,0x5A35, //#CJK UNIFIED IDEOGRAPH
+0x9B57,0x5A36, //#CJK UNIFIED IDEOGRAPH
+0x9B58,0x5A62, //#CJK UNIFIED IDEOGRAPH
+0x9B59,0x5A6A, //#CJK UNIFIED IDEOGRAPH
+0x9B5A,0x5A9A, //#CJK UNIFIED IDEOGRAPH
+0x9B5B,0x5ABC, //#CJK UNIFIED IDEOGRAPH
+0x9B5C,0x5ABE, //#CJK UNIFIED IDEOGRAPH
+0x9B5D,0x5ACB, //#CJK UNIFIED IDEOGRAPH
+0x9B5E,0x5AC2, //#CJK UNIFIED IDEOGRAPH
+0x9B5F,0x5ABD, //#CJK UNIFIED IDEOGRAPH
+0x9B60,0x5AE3, //#CJK UNIFIED IDEOGRAPH
+0x9B61,0x5AD7, //#CJK UNIFIED IDEOGRAPH
+0x9B62,0x5AE6, //#CJK UNIFIED IDEOGRAPH
+0x9B63,0x5AE9, //#CJK UNIFIED IDEOGRAPH
+0x9B64,0x5AD6, //#CJK UNIFIED IDEOGRAPH
+0x9B65,0x5AFA, //#CJK UNIFIED IDEOGRAPH
+0x9B66,0x5AFB, //#CJK UNIFIED IDEOGRAPH
+0x9B67,0x5B0C, //#CJK UNIFIED IDEOGRAPH
+0x9B68,0x5B0B, //#CJK UNIFIED IDEOGRAPH
+0x9B69,0x5B16, //#CJK UNIFIED IDEOGRAPH
+0x9B6A,0x5B32, //#CJK UNIFIED IDEOGRAPH
+0x9B6B,0x5AD0, //#CJK UNIFIED IDEOGRAPH
+0x9B6C,0x5B2A, //#CJK UNIFIED IDEOGRAPH
+0x9B6D,0x5B36, //#CJK UNIFIED IDEOGRAPH
+0x9B6E,0x5B3E, //#CJK UNIFIED IDEOGRAPH
+0x9B6F,0x5B43, //#CJK UNIFIED IDEOGRAPH
+0x9B70,0x5B45, //#CJK UNIFIED IDEOGRAPH
+0x9B71,0x5B40, //#CJK UNIFIED IDEOGRAPH
+0x9B72,0x5B51, //#CJK UNIFIED IDEOGRAPH
+0x9B73,0x5B55, //#CJK UNIFIED IDEOGRAPH
+0x9B74,0x5B5A, //#CJK UNIFIED IDEOGRAPH
+0x9B75,0x5B5B, //#CJK UNIFIED IDEOGRAPH
+0x9B76,0x5B65, //#CJK UNIFIED IDEOGRAPH
+0x9B77,0x5B69, //#CJK UNIFIED IDEOGRAPH
+0x9B78,0x5B70, //#CJK UNIFIED IDEOGRAPH
+0x9B79,0x5B73, //#CJK UNIFIED IDEOGRAPH
+0x9B7A,0x5B75, //#CJK UNIFIED IDEOGRAPH
+0x9B7B,0x5B78, //#CJK UNIFIED IDEOGRAPH
+0x9B7C,0x6588, //#CJK UNIFIED IDEOGRAPH
+0x9B7D,0x5B7A, //#CJK UNIFIED IDEOGRAPH
+0x9B7E,0x5B80, //#CJK UNIFIED IDEOGRAPH
+0x9B80,0x5B83, //#CJK UNIFIED IDEOGRAPH
+0x9B81,0x5BA6, //#CJK UNIFIED IDEOGRAPH
+0x9B82,0x5BB8, //#CJK UNIFIED IDEOGRAPH
+0x9B83,0x5BC3, //#CJK UNIFIED IDEOGRAPH
+0x9B84,0x5BC7, //#CJK UNIFIED IDEOGRAPH
+0x9B85,0x5BC9, //#CJK UNIFIED IDEOGRAPH
+0x9B86,0x5BD4, //#CJK UNIFIED IDEOGRAPH
+0x9B87,0x5BD0, //#CJK UNIFIED IDEOGRAPH
+0x9B88,0x5BE4, //#CJK UNIFIED IDEOGRAPH
+0x9B89,0x5BE6, //#CJK UNIFIED IDEOGRAPH
+0x9B8A,0x5BE2, //#CJK UNIFIED IDEOGRAPH
+0x9B8B,0x5BDE, //#CJK UNIFIED IDEOGRAPH
+0x9B8C,0x5BE5, //#CJK UNIFIED IDEOGRAPH
+0x9B8D,0x5BEB, //#CJK UNIFIED IDEOGRAPH
+0x9B8E,0x5BF0, //#CJK UNIFIED IDEOGRAPH
+0x9B8F,0x5BF6, //#CJK UNIFIED IDEOGRAPH
+0x9B90,0x5BF3, //#CJK UNIFIED IDEOGRAPH
+0x9B91,0x5C05, //#CJK UNIFIED IDEOGRAPH
+0x9B92,0x5C07, //#CJK UNIFIED IDEOGRAPH
+0x9B93,0x5C08, //#CJK UNIFIED IDEOGRAPH
+0x9B94,0x5C0D, //#CJK UNIFIED IDEOGRAPH
+0x9B95,0x5C13, //#CJK UNIFIED IDEOGRAPH
+0x9B96,0x5C20, //#CJK UNIFIED IDEOGRAPH
+0x9B97,0x5C22, //#CJK UNIFIED IDEOGRAPH
+0x9B98,0x5C28, //#CJK UNIFIED IDEOGRAPH
+0x9B99,0x5C38, //#CJK UNIFIED IDEOGRAPH
+0x9B9A,0x5C39, //#CJK UNIFIED IDEOGRAPH
+0x9B9B,0x5C41, //#CJK UNIFIED IDEOGRAPH
+0x9B9C,0x5C46, //#CJK UNIFIED IDEOGRAPH
+0x9B9D,0x5C4E, //#CJK UNIFIED IDEOGRAPH
+0x9B9E,0x5C53, //#CJK UNIFIED IDEOGRAPH
+0x9B9F,0x5C50, //#CJK UNIFIED IDEOGRAPH
+0x9BA0,0x5C4F, //#CJK UNIFIED IDEOGRAPH
+0x9BA1,0x5B71, //#CJK UNIFIED IDEOGRAPH
+0x9BA2,0x5C6C, //#CJK UNIFIED IDEOGRAPH
+0x9BA3,0x5C6E, //#CJK UNIFIED IDEOGRAPH
+0x9BA4,0x4E62, //#CJK UNIFIED IDEOGRAPH
+0x9BA5,0x5C76, //#CJK UNIFIED IDEOGRAPH
+0x9BA6,0x5C79, //#CJK UNIFIED IDEOGRAPH
+0x9BA7,0x5C8C, //#CJK UNIFIED IDEOGRAPH
+0x9BA8,0x5C91, //#CJK UNIFIED IDEOGRAPH
+0x9BA9,0x5C94, //#CJK UNIFIED IDEOGRAPH
+0x9BAA,0x599B, //#CJK UNIFIED IDEOGRAPH
+0x9BAB,0x5CAB, //#CJK UNIFIED IDEOGRAPH
+0x9BAC,0x5CBB, //#CJK UNIFIED IDEOGRAPH
+0x9BAD,0x5CB6, //#CJK UNIFIED IDEOGRAPH
+0x9BAE,0x5CBC, //#CJK UNIFIED IDEOGRAPH
+0x9BAF,0x5CB7, //#CJK UNIFIED IDEOGRAPH
+0x9BB0,0x5CC5, //#CJK UNIFIED IDEOGRAPH
+0x9BB1,0x5CBE, //#CJK UNIFIED IDEOGRAPH
+0x9BB2,0x5CC7, //#CJK UNIFIED IDEOGRAPH
+0x9BB3,0x5CD9, //#CJK UNIFIED IDEOGRAPH
+0x9BB4,0x5CE9, //#CJK UNIFIED IDEOGRAPH
+0x9BB5,0x5CFD, //#CJK UNIFIED IDEOGRAPH
+0x9BB6,0x5CFA, //#CJK UNIFIED IDEOGRAPH
+0x9BB7,0x5CED, //#CJK UNIFIED IDEOGRAPH
+0x9BB8,0x5D8C, //#CJK UNIFIED IDEOGRAPH
+0x9BB9,0x5CEA, //#CJK UNIFIED IDEOGRAPH
+0x9BBA,0x5D0B, //#CJK UNIFIED IDEOGRAPH
+0x9BBB,0x5D15, //#CJK UNIFIED IDEOGRAPH
+0x9BBC,0x5D17, //#CJK UNIFIED IDEOGRAPH
+0x9BBD,0x5D5C, //#CJK UNIFIED IDEOGRAPH
+0x9BBE,0x5D1F, //#CJK UNIFIED IDEOGRAPH
+0x9BBF,0x5D1B, //#CJK UNIFIED IDEOGRAPH
+0x9BC0,0x5D11, //#CJK UNIFIED IDEOGRAPH
+0x9BC1,0x5D14, //#CJK UNIFIED IDEOGRAPH
+0x9BC2,0x5D22, //#CJK UNIFIED IDEOGRAPH
+0x9BC3,0x5D1A, //#CJK UNIFIED IDEOGRAPH
+0x9BC4,0x5D19, //#CJK UNIFIED IDEOGRAPH
+0x9BC5,0x5D18, //#CJK UNIFIED IDEOGRAPH
+0x9BC6,0x5D4C, //#CJK UNIFIED IDEOGRAPH
+0x9BC7,0x5D52, //#CJK UNIFIED IDEOGRAPH
+0x9BC8,0x5D4E, //#CJK UNIFIED IDEOGRAPH
+0x9BC9,0x5D4B, //#CJK UNIFIED IDEOGRAPH
+0x9BCA,0x5D6C, //#CJK UNIFIED IDEOGRAPH
+0x9BCB,0x5D73, //#CJK UNIFIED IDEOGRAPH
+0x9BCC,0x5D76, //#CJK UNIFIED IDEOGRAPH
+0x9BCD,0x5D87, //#CJK UNIFIED IDEOGRAPH
+0x9BCE,0x5D84, //#CJK UNIFIED IDEOGRAPH
+0x9BCF,0x5D82, //#CJK UNIFIED IDEOGRAPH
+0x9BD0,0x5DA2, //#CJK UNIFIED IDEOGRAPH
+0x9BD1,0x5D9D, //#CJK UNIFIED IDEOGRAPH
+0x9BD2,0x5DAC, //#CJK UNIFIED IDEOGRAPH
+0x9BD3,0x5DAE, //#CJK UNIFIED IDEOGRAPH
+0x9BD4,0x5DBD, //#CJK UNIFIED IDEOGRAPH
+0x9BD5,0x5D90, //#CJK UNIFIED IDEOGRAPH
+0x9BD6,0x5DB7, //#CJK UNIFIED IDEOGRAPH
+0x9BD7,0x5DBC, //#CJK UNIFIED IDEOGRAPH
+0x9BD8,0x5DC9, //#CJK UNIFIED IDEOGRAPH
+0x9BD9,0x5DCD, //#CJK UNIFIED IDEOGRAPH
+0x9BDA,0x5DD3, //#CJK UNIFIED IDEOGRAPH
+0x9BDB,0x5DD2, //#CJK UNIFIED IDEOGRAPH
+0x9BDC,0x5DD6, //#CJK UNIFIED IDEOGRAPH
+0x9BDD,0x5DDB, //#CJK UNIFIED IDEOGRAPH
+0x9BDE,0x5DEB, //#CJK UNIFIED IDEOGRAPH
+0x9BDF,0x5DF2, //#CJK UNIFIED IDEOGRAPH
+0x9BE0,0x5DF5, //#CJK UNIFIED IDEOGRAPH
+0x9BE1,0x5E0B, //#CJK UNIFIED IDEOGRAPH
+0x9BE2,0x5E1A, //#CJK UNIFIED IDEOGRAPH
+0x9BE3,0x5E19, //#CJK UNIFIED IDEOGRAPH
+0x9BE4,0x5E11, //#CJK UNIFIED IDEOGRAPH
+0x9BE5,0x5E1B, //#CJK UNIFIED IDEOGRAPH
+0x9BE6,0x5E36, //#CJK UNIFIED IDEOGRAPH
+0x9BE7,0x5E37, //#CJK UNIFIED IDEOGRAPH
+0x9BE8,0x5E44, //#CJK UNIFIED IDEOGRAPH
+0x9BE9,0x5E43, //#CJK UNIFIED IDEOGRAPH
+0x9BEA,0x5E40, //#CJK UNIFIED IDEOGRAPH
+0x9BEB,0x5E4E, //#CJK UNIFIED IDEOGRAPH
+0x9BEC,0x5E57, //#CJK UNIFIED IDEOGRAPH
+0x9BED,0x5E54, //#CJK UNIFIED IDEOGRAPH
+0x9BEE,0x5E5F, //#CJK UNIFIED IDEOGRAPH
+0x9BEF,0x5E62, //#CJK UNIFIED IDEOGRAPH
+0x9BF0,0x5E64, //#CJK UNIFIED IDEOGRAPH
+0x9BF1,0x5E47, //#CJK UNIFIED IDEOGRAPH
+0x9BF2,0x5E75, //#CJK UNIFIED IDEOGRAPH
+0x9BF3,0x5E76, //#CJK UNIFIED IDEOGRAPH
+0x9BF4,0x5E7A, //#CJK UNIFIED IDEOGRAPH
+0x9BF5,0x9EBC, //#CJK UNIFIED IDEOGRAPH
+0x9BF6,0x5E7F, //#CJK UNIFIED IDEOGRAPH
+0x9BF7,0x5EA0, //#CJK UNIFIED IDEOGRAPH
+0x9BF8,0x5EC1, //#CJK UNIFIED IDEOGRAPH
+0x9BF9,0x5EC2, //#CJK UNIFIED IDEOGRAPH
+0x9BFA,0x5EC8, //#CJK UNIFIED IDEOGRAPH
+0x9BFB,0x5ED0, //#CJK UNIFIED IDEOGRAPH
+0x9BFC,0x5ECF, //#CJK UNIFIED IDEOGRAPH
+0x9C40,0x5ED6, //#CJK UNIFIED IDEOGRAPH
+0x9C41,0x5EE3, //#CJK UNIFIED IDEOGRAPH
+0x9C42,0x5EDD, //#CJK UNIFIED IDEOGRAPH
+0x9C43,0x5EDA, //#CJK UNIFIED IDEOGRAPH
+0x9C44,0x5EDB, //#CJK UNIFIED IDEOGRAPH
+0x9C45,0x5EE2, //#CJK UNIFIED IDEOGRAPH
+0x9C46,0x5EE1, //#CJK UNIFIED IDEOGRAPH
+0x9C47,0x5EE8, //#CJK UNIFIED IDEOGRAPH
+0x9C48,0x5EE9, //#CJK UNIFIED IDEOGRAPH
+0x9C49,0x5EEC, //#CJK UNIFIED IDEOGRAPH
+0x9C4A,0x5EF1, //#CJK UNIFIED IDEOGRAPH
+0x9C4B,0x5EF3, //#CJK UNIFIED IDEOGRAPH
+0x9C4C,0x5EF0, //#CJK UNIFIED IDEOGRAPH
+0x9C4D,0x5EF4, //#CJK UNIFIED IDEOGRAPH
+0x9C4E,0x5EF8, //#CJK UNIFIED IDEOGRAPH
+0x9C4F,0x5EFE, //#CJK UNIFIED IDEOGRAPH
+0x9C50,0x5F03, //#CJK UNIFIED IDEOGRAPH
+0x9C51,0x5F09, //#CJK UNIFIED IDEOGRAPH
+0x9C52,0x5F5D, //#CJK UNIFIED IDEOGRAPH
+0x9C53,0x5F5C, //#CJK UNIFIED IDEOGRAPH
+0x9C54,0x5F0B, //#CJK UNIFIED IDEOGRAPH
+0x9C55,0x5F11, //#CJK UNIFIED IDEOGRAPH
+0x9C56,0x5F16, //#CJK UNIFIED IDEOGRAPH
+0x9C57,0x5F29, //#CJK UNIFIED IDEOGRAPH
+0x9C58,0x5F2D, //#CJK UNIFIED IDEOGRAPH
+0x9C59,0x5F38, //#CJK UNIFIED IDEOGRAPH
+0x9C5A,0x5F41, //#CJK UNIFIED IDEOGRAPH
+0x9C5B,0x5F48, //#CJK UNIFIED IDEOGRAPH
+0x9C5C,0x5F4C, //#CJK UNIFIED IDEOGRAPH
+0x9C5D,0x5F4E, //#CJK UNIFIED IDEOGRAPH
+0x9C5E,0x5F2F, //#CJK UNIFIED IDEOGRAPH
+0x9C5F,0x5F51, //#CJK UNIFIED IDEOGRAPH
+0x9C60,0x5F56, //#CJK UNIFIED IDEOGRAPH
+0x9C61,0x5F57, //#CJK UNIFIED IDEOGRAPH
+0x9C62,0x5F59, //#CJK UNIFIED IDEOGRAPH
+0x9C63,0x5F61, //#CJK UNIFIED IDEOGRAPH
+0x9C64,0x5F6D, //#CJK UNIFIED IDEOGRAPH
+0x9C65,0x5F73, //#CJK UNIFIED IDEOGRAPH
+0x9C66,0x5F77, //#CJK UNIFIED IDEOGRAPH
+0x9C67,0x5F83, //#CJK UNIFIED IDEOGRAPH
+0x9C68,0x5F82, //#CJK UNIFIED IDEOGRAPH
+0x9C69,0x5F7F, //#CJK UNIFIED IDEOGRAPH
+0x9C6A,0x5F8A, //#CJK UNIFIED IDEOGRAPH
+0x9C6B,0x5F88, //#CJK UNIFIED IDEOGRAPH
+0x9C6C,0x5F91, //#CJK UNIFIED IDEOGRAPH
+0x9C6D,0x5F87, //#CJK UNIFIED IDEOGRAPH
+0x9C6E,0x5F9E, //#CJK UNIFIED IDEOGRAPH
+0x9C6F,0x5F99, //#CJK UNIFIED IDEOGRAPH
+0x9C70,0x5F98, //#CJK UNIFIED IDEOGRAPH
+0x9C71,0x5FA0, //#CJK UNIFIED IDEOGRAPH
+0x9C72,0x5FA8, //#CJK UNIFIED IDEOGRAPH
+0x9C73,0x5FAD, //#CJK UNIFIED IDEOGRAPH
+0x9C74,0x5FBC, //#CJK UNIFIED IDEOGRAPH
+0x9C75,0x5FD6, //#CJK UNIFIED IDEOGRAPH
+0x9C76,0x5FFB, //#CJK UNIFIED IDEOGRAPH
+0x9C77,0x5FE4, //#CJK UNIFIED IDEOGRAPH
+0x9C78,0x5FF8, //#CJK UNIFIED IDEOGRAPH
+0x9C79,0x5FF1, //#CJK UNIFIED IDEOGRAPH
+0x9C7A,0x5FDD, //#CJK UNIFIED IDEOGRAPH
+0x9C7B,0x60B3, //#CJK UNIFIED IDEOGRAPH
+0x9C7C,0x5FFF, //#CJK UNIFIED IDEOGRAPH
+0x9C7D,0x6021, //#CJK UNIFIED IDEOGRAPH
+0x9C7E,0x6060, //#CJK UNIFIED IDEOGRAPH
+0x9C80,0x6019, //#CJK UNIFIED IDEOGRAPH
+0x9C81,0x6010, //#CJK UNIFIED IDEOGRAPH
+0x9C82,0x6029, //#CJK UNIFIED IDEOGRAPH
+0x9C83,0x600E, //#CJK UNIFIED IDEOGRAPH
+0x9C84,0x6031, //#CJK UNIFIED IDEOGRAPH
+0x9C85,0x601B, //#CJK UNIFIED IDEOGRAPH
+0x9C86,0x6015, //#CJK UNIFIED IDEOGRAPH
+0x9C87,0x602B, //#CJK UNIFIED IDEOGRAPH
+0x9C88,0x6026, //#CJK UNIFIED IDEOGRAPH
+0x9C89,0x600F, //#CJK UNIFIED IDEOGRAPH
+0x9C8A,0x603A, //#CJK UNIFIED IDEOGRAPH
+0x9C8B,0x605A, //#CJK UNIFIED IDEOGRAPH
+0x9C8C,0x6041, //#CJK UNIFIED IDEOGRAPH
+0x9C8D,0x606A, //#CJK UNIFIED IDEOGRAPH
+0x9C8E,0x6077, //#CJK UNIFIED IDEOGRAPH
+0x9C8F,0x605F, //#CJK UNIFIED IDEOGRAPH
+0x9C90,0x604A, //#CJK UNIFIED IDEOGRAPH
+0x9C91,0x6046, //#CJK UNIFIED IDEOGRAPH
+0x9C92,0x604D, //#CJK UNIFIED IDEOGRAPH
+0x9C93,0x6063, //#CJK UNIFIED IDEOGRAPH
+0x9C94,0x6043, //#CJK UNIFIED IDEOGRAPH
+0x9C95,0x6064, //#CJK UNIFIED IDEOGRAPH
+0x9C96,0x6042, //#CJK UNIFIED IDEOGRAPH
+0x9C97,0x606C, //#CJK UNIFIED IDEOGRAPH
+0x9C98,0x606B, //#CJK UNIFIED IDEOGRAPH
+0x9C99,0x6059, //#CJK UNIFIED IDEOGRAPH
+0x9C9A,0x6081, //#CJK UNIFIED IDEOGRAPH
+0x9C9B,0x608D, //#CJK UNIFIED IDEOGRAPH
+0x9C9C,0x60E7, //#CJK UNIFIED IDEOGRAPH
+0x9C9D,0x6083, //#CJK UNIFIED IDEOGRAPH
+0x9C9E,0x609A, //#CJK UNIFIED IDEOGRAPH
+0x9C9F,0x6084, //#CJK UNIFIED IDEOGRAPH
+0x9CA0,0x609B, //#CJK UNIFIED IDEOGRAPH
+0x9CA1,0x6096, //#CJK UNIFIED IDEOGRAPH
+0x9CA2,0x6097, //#CJK UNIFIED IDEOGRAPH
+0x9CA3,0x6092, //#CJK UNIFIED IDEOGRAPH
+0x9CA4,0x60A7, //#CJK UNIFIED IDEOGRAPH
+0x9CA5,0x608B, //#CJK UNIFIED IDEOGRAPH
+0x9CA6,0x60E1, //#CJK UNIFIED IDEOGRAPH
+0x9CA7,0x60B8, //#CJK UNIFIED IDEOGRAPH
+0x9CA8,0x60E0, //#CJK UNIFIED IDEOGRAPH
+0x9CA9,0x60D3, //#CJK UNIFIED IDEOGRAPH
+0x9CAA,0x60B4, //#CJK UNIFIED IDEOGRAPH
+0x9CAB,0x5FF0, //#CJK UNIFIED IDEOGRAPH
+0x9CAC,0x60BD, //#CJK UNIFIED IDEOGRAPH
+0x9CAD,0x60C6, //#CJK UNIFIED IDEOGRAPH
+0x9CAE,0x60B5, //#CJK UNIFIED IDEOGRAPH
+0x9CAF,0x60D8, //#CJK UNIFIED IDEOGRAPH
+0x9CB0,0x614D, //#CJK UNIFIED IDEOGRAPH
+0x9CB1,0x6115, //#CJK UNIFIED IDEOGRAPH
+0x9CB2,0x6106, //#CJK UNIFIED IDEOGRAPH
+0x9CB3,0x60F6, //#CJK UNIFIED IDEOGRAPH
+0x9CB4,0x60F7, //#CJK UNIFIED IDEOGRAPH
+0x9CB5,0x6100, //#CJK UNIFIED IDEOGRAPH
+0x9CB6,0x60F4, //#CJK UNIFIED IDEOGRAPH
+0x9CB7,0x60FA, //#CJK UNIFIED IDEOGRAPH
+0x9CB8,0x6103, //#CJK UNIFIED IDEOGRAPH
+0x9CB9,0x6121, //#CJK UNIFIED IDEOGRAPH
+0x9CBA,0x60FB, //#CJK UNIFIED IDEOGRAPH
+0x9CBB,0x60F1, //#CJK UNIFIED IDEOGRAPH
+0x9CBC,0x610D, //#CJK UNIFIED IDEOGRAPH
+0x9CBD,0x610E, //#CJK UNIFIED IDEOGRAPH
+0x9CBE,0x6147, //#CJK UNIFIED IDEOGRAPH
+0x9CBF,0x613E, //#CJK UNIFIED IDEOGRAPH
+0x9CC0,0x6128, //#CJK UNIFIED IDEOGRAPH
+0x9CC1,0x6127, //#CJK UNIFIED IDEOGRAPH
+0x9CC2,0x614A, //#CJK UNIFIED IDEOGRAPH
+0x9CC3,0x613F, //#CJK UNIFIED IDEOGRAPH
+0x9CC4,0x613C, //#CJK UNIFIED IDEOGRAPH
+0x9CC5,0x612C, //#CJK UNIFIED IDEOGRAPH
+0x9CC6,0x6134, //#CJK UNIFIED IDEOGRAPH
+0x9CC7,0x613D, //#CJK UNIFIED IDEOGRAPH
+0x9CC8,0x6142, //#CJK UNIFIED IDEOGRAPH
+0x9CC9,0x6144, //#CJK UNIFIED IDEOGRAPH
+0x9CCA,0x6173, //#CJK UNIFIED IDEOGRAPH
+0x9CCB,0x6177, //#CJK UNIFIED IDEOGRAPH
+0x9CCC,0x6158, //#CJK UNIFIED IDEOGRAPH
+0x9CCD,0x6159, //#CJK UNIFIED IDEOGRAPH
+0x9CCE,0x615A, //#CJK UNIFIED IDEOGRAPH
+0x9CCF,0x616B, //#CJK UNIFIED IDEOGRAPH
+0x9CD0,0x6174, //#CJK UNIFIED IDEOGRAPH
+0x9CD1,0x616F, //#CJK UNIFIED IDEOGRAPH
+0x9CD2,0x6165, //#CJK UNIFIED IDEOGRAPH
+0x9CD3,0x6171, //#CJK UNIFIED IDEOGRAPH
+0x9CD4,0x615F, //#CJK UNIFIED IDEOGRAPH
+0x9CD5,0x615D, //#CJK UNIFIED IDEOGRAPH
+0x9CD6,0x6153, //#CJK UNIFIED IDEOGRAPH
+0x9CD7,0x6175, //#CJK UNIFIED IDEOGRAPH
+0x9CD8,0x6199, //#CJK UNIFIED IDEOGRAPH
+0x9CD9,0x6196, //#CJK UNIFIED IDEOGRAPH
+0x9CDA,0x6187, //#CJK UNIFIED IDEOGRAPH
+0x9CDB,0x61AC, //#CJK UNIFIED IDEOGRAPH
+0x9CDC,0x6194, //#CJK UNIFIED IDEOGRAPH
+0x9CDD,0x619A, //#CJK UNIFIED IDEOGRAPH
+0x9CDE,0x618A, //#CJK UNIFIED IDEOGRAPH
+0x9CDF,0x6191, //#CJK UNIFIED IDEOGRAPH
+0x9CE0,0x61AB, //#CJK UNIFIED IDEOGRAPH
+0x9CE1,0x61AE, //#CJK UNIFIED IDEOGRAPH
+0x9CE2,0x61CC, //#CJK UNIFIED IDEOGRAPH
+0x9CE3,0x61CA, //#CJK UNIFIED IDEOGRAPH
+0x9CE4,0x61C9, //#CJK UNIFIED IDEOGRAPH
+0x9CE5,0x61F7, //#CJK UNIFIED IDEOGRAPH
+0x9CE6,0x61C8, //#CJK UNIFIED IDEOGRAPH
+0x9CE7,0x61C3, //#CJK UNIFIED IDEOGRAPH
+0x9CE8,0x61C6, //#CJK UNIFIED IDEOGRAPH
+0x9CE9,0x61BA, //#CJK UNIFIED IDEOGRAPH
+0x9CEA,0x61CB, //#CJK UNIFIED IDEOGRAPH
+0x9CEB,0x7F79, //#CJK UNIFIED IDEOGRAPH
+0x9CEC,0x61CD, //#CJK UNIFIED IDEOGRAPH
+0x9CED,0x61E6, //#CJK UNIFIED IDEOGRAPH
+0x9CEE,0x61E3, //#CJK UNIFIED IDEOGRAPH
+0x9CEF,0x61F6, //#CJK UNIFIED IDEOGRAPH
+0x9CF0,0x61FA, //#CJK UNIFIED IDEOGRAPH
+0x9CF1,0x61F4, //#CJK UNIFIED IDEOGRAPH
+0x9CF2,0x61FF, //#CJK UNIFIED IDEOGRAPH
+0x9CF3,0x61FD, //#CJK UNIFIED IDEOGRAPH
+0x9CF4,0x61FC, //#CJK UNIFIED IDEOGRAPH
+0x9CF5,0x61FE, //#CJK UNIFIED IDEOGRAPH
+0x9CF6,0x6200, //#CJK UNIFIED IDEOGRAPH
+0x9CF7,0x6208, //#CJK UNIFIED IDEOGRAPH
+0x9CF8,0x6209, //#CJK UNIFIED IDEOGRAPH
+0x9CF9,0x620D, //#CJK UNIFIED IDEOGRAPH
+0x9CFA,0x620C, //#CJK UNIFIED IDEOGRAPH
+0x9CFB,0x6214, //#CJK UNIFIED IDEOGRAPH
+0x9CFC,0x621B, //#CJK UNIFIED IDEOGRAPH
+0x9D40,0x621E, //#CJK UNIFIED IDEOGRAPH
+0x9D41,0x6221, //#CJK UNIFIED IDEOGRAPH
+0x9D42,0x622A, //#CJK UNIFIED IDEOGRAPH
+0x9D43,0x622E, //#CJK UNIFIED IDEOGRAPH
+0x9D44,0x6230, //#CJK UNIFIED IDEOGRAPH
+0x9D45,0x6232, //#CJK UNIFIED IDEOGRAPH
+0x9D46,0x6233, //#CJK UNIFIED IDEOGRAPH
+0x9D47,0x6241, //#CJK UNIFIED IDEOGRAPH
+0x9D48,0x624E, //#CJK UNIFIED IDEOGRAPH
+0x9D49,0x625E, //#CJK UNIFIED IDEOGRAPH
+0x9D4A,0x6263, //#CJK UNIFIED IDEOGRAPH
+0x9D4B,0x625B, //#CJK UNIFIED IDEOGRAPH
+0x9D4C,0x6260, //#CJK UNIFIED IDEOGRAPH
+0x9D4D,0x6268, //#CJK UNIFIED IDEOGRAPH
+0x9D4E,0x627C, //#CJK UNIFIED IDEOGRAPH
+0x9D4F,0x6282, //#CJK UNIFIED IDEOGRAPH
+0x9D50,0x6289, //#CJK UNIFIED IDEOGRAPH
+0x9D51,0x627E, //#CJK UNIFIED IDEOGRAPH
+0x9D52,0x6292, //#CJK UNIFIED IDEOGRAPH
+0x9D53,0x6293, //#CJK UNIFIED IDEOGRAPH
+0x9D54,0x6296, //#CJK UNIFIED IDEOGRAPH
+0x9D55,0x62D4, //#CJK UNIFIED IDEOGRAPH
+0x9D56,0x6283, //#CJK UNIFIED IDEOGRAPH
+0x9D57,0x6294, //#CJK UNIFIED IDEOGRAPH
+0x9D58,0x62D7, //#CJK UNIFIED IDEOGRAPH
+0x9D59,0x62D1, //#CJK UNIFIED IDEOGRAPH
+0x9D5A,0x62BB, //#CJK UNIFIED IDEOGRAPH
+0x9D5B,0x62CF, //#CJK UNIFIED IDEOGRAPH
+0x9D5C,0x62FF, //#CJK UNIFIED IDEOGRAPH
+0x9D5D,0x62C6, //#CJK UNIFIED IDEOGRAPH
+0x9D5E,0x64D4, //#CJK UNIFIED IDEOGRAPH
+0x9D5F,0x62C8, //#CJK UNIFIED IDEOGRAPH
+0x9D60,0x62DC, //#CJK UNIFIED IDEOGRAPH
+0x9D61,0x62CC, //#CJK UNIFIED IDEOGRAPH
+0x9D62,0x62CA, //#CJK UNIFIED IDEOGRAPH
+0x9D63,0x62C2, //#CJK UNIFIED IDEOGRAPH
+0x9D64,0x62C7, //#CJK UNIFIED IDEOGRAPH
+0x9D65,0x629B, //#CJK UNIFIED IDEOGRAPH
+0x9D66,0x62C9, //#CJK UNIFIED IDEOGRAPH
+0x9D67,0x630C, //#CJK UNIFIED IDEOGRAPH
+0x9D68,0x62EE, //#CJK UNIFIED IDEOGRAPH
+0x9D69,0x62F1, //#CJK UNIFIED IDEOGRAPH
+0x9D6A,0x6327, //#CJK UNIFIED IDEOGRAPH
+0x9D6B,0x6302, //#CJK UNIFIED IDEOGRAPH
+0x9D6C,0x6308, //#CJK UNIFIED IDEOGRAPH
+0x9D6D,0x62EF, //#CJK UNIFIED IDEOGRAPH
+0x9D6E,0x62F5, //#CJK UNIFIED IDEOGRAPH
+0x9D6F,0x6350, //#CJK UNIFIED IDEOGRAPH
+0x9D70,0x633E, //#CJK UNIFIED IDEOGRAPH
+0x9D71,0x634D, //#CJK UNIFIED IDEOGRAPH
+0x9D72,0x641C, //#CJK UNIFIED IDEOGRAPH
+0x9D73,0x634F, //#CJK UNIFIED IDEOGRAPH
+0x9D74,0x6396, //#CJK UNIFIED IDEOGRAPH
+0x9D75,0x638E, //#CJK UNIFIED IDEOGRAPH
+0x9D76,0x6380, //#CJK UNIFIED IDEOGRAPH
+0x9D77,0x63AB, //#CJK UNIFIED IDEOGRAPH
+0x9D78,0x6376, //#CJK UNIFIED IDEOGRAPH
+0x9D79,0x63A3, //#CJK UNIFIED IDEOGRAPH
+0x9D7A,0x638F, //#CJK UNIFIED IDEOGRAPH
+0x9D7B,0x6389, //#CJK UNIFIED IDEOGRAPH
+0x9D7C,0x639F, //#CJK UNIFIED IDEOGRAPH
+0x9D7D,0x63B5, //#CJK UNIFIED IDEOGRAPH
+0x9D7E,0x636B, //#CJK UNIFIED IDEOGRAPH
+0x9D80,0x6369, //#CJK UNIFIED IDEOGRAPH
+0x9D81,0x63BE, //#CJK UNIFIED IDEOGRAPH
+0x9D82,0x63E9, //#CJK UNIFIED IDEOGRAPH
+0x9D83,0x63C0, //#CJK UNIFIED IDEOGRAPH
+0x9D84,0x63C6, //#CJK UNIFIED IDEOGRAPH
+0x9D85,0x63E3, //#CJK UNIFIED IDEOGRAPH
+0x9D86,0x63C9, //#CJK UNIFIED IDEOGRAPH
+0x9D87,0x63D2, //#CJK UNIFIED IDEOGRAPH
+0x9D88,0x63F6, //#CJK UNIFIED IDEOGRAPH
+0x9D89,0x63C4, //#CJK UNIFIED IDEOGRAPH
+0x9D8A,0x6416, //#CJK UNIFIED IDEOGRAPH
+0x9D8B,0x6434, //#CJK UNIFIED IDEOGRAPH
+0x9D8C,0x6406, //#CJK UNIFIED IDEOGRAPH
+0x9D8D,0x6413, //#CJK UNIFIED IDEOGRAPH
+0x9D8E,0x6426, //#CJK UNIFIED IDEOGRAPH
+0x9D8F,0x6436, //#CJK UNIFIED IDEOGRAPH
+0x9D90,0x651D, //#CJK UNIFIED IDEOGRAPH
+0x9D91,0x6417, //#CJK UNIFIED IDEOGRAPH
+0x9D92,0x6428, //#CJK UNIFIED IDEOGRAPH
+0x9D93,0x640F, //#CJK UNIFIED IDEOGRAPH
+0x9D94,0x6467, //#CJK UNIFIED IDEOGRAPH
+0x9D95,0x646F, //#CJK UNIFIED IDEOGRAPH
+0x9D96,0x6476, //#CJK UNIFIED IDEOGRAPH
+0x9D97,0x644E, //#CJK UNIFIED IDEOGRAPH
+0x9D98,0x652A, //#CJK UNIFIED IDEOGRAPH
+0x9D99,0x6495, //#CJK UNIFIED IDEOGRAPH
+0x9D9A,0x6493, //#CJK UNIFIED IDEOGRAPH
+0x9D9B,0x64A5, //#CJK UNIFIED IDEOGRAPH
+0x9D9C,0x64A9, //#CJK UNIFIED IDEOGRAPH
+0x9D9D,0x6488, //#CJK UNIFIED IDEOGRAPH
+0x9D9E,0x64BC, //#CJK UNIFIED IDEOGRAPH
+0x9D9F,0x64DA, //#CJK UNIFIED IDEOGRAPH
+0x9DA0,0x64D2, //#CJK UNIFIED IDEOGRAPH
+0x9DA1,0x64C5, //#CJK UNIFIED IDEOGRAPH
+0x9DA2,0x64C7, //#CJK UNIFIED IDEOGRAPH
+0x9DA3,0x64BB, //#CJK UNIFIED IDEOGRAPH
+0x9DA4,0x64D8, //#CJK UNIFIED IDEOGRAPH
+0x9DA5,0x64C2, //#CJK UNIFIED IDEOGRAPH
+0x9DA6,0x64F1, //#CJK UNIFIED IDEOGRAPH
+0x9DA7,0x64E7, //#CJK UNIFIED IDEOGRAPH
+0x9DA8,0x8209, //#CJK UNIFIED IDEOGRAPH
+0x9DA9,0x64E0, //#CJK UNIFIED IDEOGRAPH
+0x9DAA,0x64E1, //#CJK UNIFIED IDEOGRAPH
+0x9DAB,0x62AC, //#CJK UNIFIED IDEOGRAPH
+0x9DAC,0x64E3, //#CJK UNIFIED IDEOGRAPH
+0x9DAD,0x64EF, //#CJK UNIFIED IDEOGRAPH
+0x9DAE,0x652C, //#CJK UNIFIED IDEOGRAPH
+0x9DAF,0x64F6, //#CJK UNIFIED IDEOGRAPH
+0x9DB0,0x64F4, //#CJK UNIFIED IDEOGRAPH
+0x9DB1,0x64F2, //#CJK UNIFIED IDEOGRAPH
+0x9DB2,0x64FA, //#CJK UNIFIED IDEOGRAPH
+0x9DB3,0x6500, //#CJK UNIFIED IDEOGRAPH
+0x9DB4,0x64FD, //#CJK UNIFIED IDEOGRAPH
+0x9DB5,0x6518, //#CJK UNIFIED IDEOGRAPH
+0x9DB6,0x651C, //#CJK UNIFIED IDEOGRAPH
+0x9DB7,0x6505, //#CJK UNIFIED IDEOGRAPH
+0x9DB8,0x6524, //#CJK UNIFIED IDEOGRAPH
+0x9DB9,0x6523, //#CJK UNIFIED IDEOGRAPH
+0x9DBA,0x652B, //#CJK UNIFIED IDEOGRAPH
+0x9DBB,0x6534, //#CJK UNIFIED IDEOGRAPH
+0x9DBC,0x6535, //#CJK UNIFIED IDEOGRAPH
+0x9DBD,0x6537, //#CJK UNIFIED IDEOGRAPH
+0x9DBE,0x6536, //#CJK UNIFIED IDEOGRAPH
+0x9DBF,0x6538, //#CJK UNIFIED IDEOGRAPH
+0x9DC0,0x754B, //#CJK UNIFIED IDEOGRAPH
+0x9DC1,0x6548, //#CJK UNIFIED IDEOGRAPH
+0x9DC2,0x6556, //#CJK UNIFIED IDEOGRAPH
+0x9DC3,0x6555, //#CJK UNIFIED IDEOGRAPH
+0x9DC4,0x654D, //#CJK UNIFIED IDEOGRAPH
+0x9DC5,0x6558, //#CJK UNIFIED IDEOGRAPH
+0x9DC6,0x655E, //#CJK UNIFIED IDEOGRAPH
+0x9DC7,0x655D, //#CJK UNIFIED IDEOGRAPH
+0x9DC8,0x6572, //#CJK UNIFIED IDEOGRAPH
+0x9DC9,0x6578, //#CJK UNIFIED IDEOGRAPH
+0x9DCA,0x6582, //#CJK UNIFIED IDEOGRAPH
+0x9DCB,0x6583, //#CJK UNIFIED IDEOGRAPH
+0x9DCC,0x8B8A, //#CJK UNIFIED IDEOGRAPH
+0x9DCD,0x659B, //#CJK UNIFIED IDEOGRAPH
+0x9DCE,0x659F, //#CJK UNIFIED IDEOGRAPH
+0x9DCF,0x65AB, //#CJK UNIFIED IDEOGRAPH
+0x9DD0,0x65B7, //#CJK UNIFIED IDEOGRAPH
+0x9DD1,0x65C3, //#CJK UNIFIED IDEOGRAPH
+0x9DD2,0x65C6, //#CJK UNIFIED IDEOGRAPH
+0x9DD3,0x65C1, //#CJK UNIFIED IDEOGRAPH
+0x9DD4,0x65C4, //#CJK UNIFIED IDEOGRAPH
+0x9DD5,0x65CC, //#CJK UNIFIED IDEOGRAPH
+0x9DD6,0x65D2, //#CJK UNIFIED IDEOGRAPH
+0x9DD7,0x65DB, //#CJK UNIFIED IDEOGRAPH
+0x9DD8,0x65D9, //#CJK UNIFIED IDEOGRAPH
+0x9DD9,0x65E0, //#CJK UNIFIED IDEOGRAPH
+0x9DDA,0x65E1, //#CJK UNIFIED IDEOGRAPH
+0x9DDB,0x65F1, //#CJK UNIFIED IDEOGRAPH
+0x9DDC,0x6772, //#CJK UNIFIED IDEOGRAPH
+0x9DDD,0x660A, //#CJK UNIFIED IDEOGRAPH
+0x9DDE,0x6603, //#CJK UNIFIED IDEOGRAPH
+0x9DDF,0x65FB, //#CJK UNIFIED IDEOGRAPH
+0x9DE0,0x6773, //#CJK UNIFIED IDEOGRAPH
+0x9DE1,0x6635, //#CJK UNIFIED IDEOGRAPH
+0x9DE2,0x6636, //#CJK UNIFIED IDEOGRAPH
+0x9DE3,0x6634, //#CJK UNIFIED IDEOGRAPH
+0x9DE4,0x661C, //#CJK UNIFIED IDEOGRAPH
+0x9DE5,0x664F, //#CJK UNIFIED IDEOGRAPH
+0x9DE6,0x6644, //#CJK UNIFIED IDEOGRAPH
+0x9DE7,0x6649, //#CJK UNIFIED IDEOGRAPH
+0x9DE8,0x6641, //#CJK UNIFIED IDEOGRAPH
+0x9DE9,0x665E, //#CJK UNIFIED IDEOGRAPH
+0x9DEA,0x665D, //#CJK UNIFIED IDEOGRAPH
+0x9DEB,0x6664, //#CJK UNIFIED IDEOGRAPH
+0x9DEC,0x6667, //#CJK UNIFIED IDEOGRAPH
+0x9DED,0x6668, //#CJK UNIFIED IDEOGRAPH
+0x9DEE,0x665F, //#CJK UNIFIED IDEOGRAPH
+0x9DEF,0x6662, //#CJK UNIFIED IDEOGRAPH
+0x9DF0,0x6670, //#CJK UNIFIED IDEOGRAPH
+0x9DF1,0x6683, //#CJK UNIFIED IDEOGRAPH
+0x9DF2,0x6688, //#CJK UNIFIED IDEOGRAPH
+0x9DF3,0x668E, //#CJK UNIFIED IDEOGRAPH
+0x9DF4,0x6689, //#CJK UNIFIED IDEOGRAPH
+0x9DF5,0x6684, //#CJK UNIFIED IDEOGRAPH
+0x9DF6,0x6698, //#CJK UNIFIED IDEOGRAPH
+0x9DF7,0x669D, //#CJK UNIFIED IDEOGRAPH
+0x9DF8,0x66C1, //#CJK UNIFIED IDEOGRAPH
+0x9DF9,0x66B9, //#CJK UNIFIED IDEOGRAPH
+0x9DFA,0x66C9, //#CJK UNIFIED IDEOGRAPH
+0x9DFB,0x66BE, //#CJK UNIFIED IDEOGRAPH
+0x9DFC,0x66BC, //#CJK UNIFIED IDEOGRAPH
+0x9E40,0x66C4, //#CJK UNIFIED IDEOGRAPH
+0x9E41,0x66B8, //#CJK UNIFIED IDEOGRAPH
+0x9E42,0x66D6, //#CJK UNIFIED IDEOGRAPH
+0x9E43,0x66DA, //#CJK UNIFIED IDEOGRAPH
+0x9E44,0x66E0, //#CJK UNIFIED IDEOGRAPH
+0x9E45,0x663F, //#CJK UNIFIED IDEOGRAPH
+0x9E46,0x66E6, //#CJK UNIFIED IDEOGRAPH
+0x9E47,0x66E9, //#CJK UNIFIED IDEOGRAPH
+0x9E48,0x66F0, //#CJK UNIFIED IDEOGRAPH
+0x9E49,0x66F5, //#CJK UNIFIED IDEOGRAPH
+0x9E4A,0x66F7, //#CJK UNIFIED IDEOGRAPH
+0x9E4B,0x670F, //#CJK UNIFIED IDEOGRAPH
+0x9E4C,0x6716, //#CJK UNIFIED IDEOGRAPH
+0x9E4D,0x671E, //#CJK UNIFIED IDEOGRAPH
+0x9E4E,0x6726, //#CJK UNIFIED IDEOGRAPH
+0x9E4F,0x6727, //#CJK UNIFIED IDEOGRAPH
+0x9E50,0x9738, //#CJK UNIFIED IDEOGRAPH
+0x9E51,0x672E, //#CJK UNIFIED IDEOGRAPH
+0x9E52,0x673F, //#CJK UNIFIED IDEOGRAPH
+0x9E53,0x6736, //#CJK UNIFIED IDEOGRAPH
+0x9E54,0x6741, //#CJK UNIFIED IDEOGRAPH
+0x9E55,0x6738, //#CJK UNIFIED IDEOGRAPH
+0x9E56,0x6737, //#CJK UNIFIED IDEOGRAPH
+0x9E57,0x6746, //#CJK UNIFIED IDEOGRAPH
+0x9E58,0x675E, //#CJK UNIFIED IDEOGRAPH
+0x9E59,0x6760, //#CJK UNIFIED IDEOGRAPH
+0x9E5A,0x6759, //#CJK UNIFIED IDEOGRAPH
+0x9E5B,0x6763, //#CJK UNIFIED IDEOGRAPH
+0x9E5C,0x6764, //#CJK UNIFIED IDEOGRAPH
+0x9E5D,0x6789, //#CJK UNIFIED IDEOGRAPH
+0x9E5E,0x6770, //#CJK UNIFIED IDEOGRAPH
+0x9E5F,0x67A9, //#CJK UNIFIED IDEOGRAPH
+0x9E60,0x677C, //#CJK UNIFIED IDEOGRAPH
+0x9E61,0x676A, //#CJK UNIFIED IDEOGRAPH
+0x9E62,0x678C, //#CJK UNIFIED IDEOGRAPH
+0x9E63,0x678B, //#CJK UNIFIED IDEOGRAPH
+0x9E64,0x67A6, //#CJK UNIFIED IDEOGRAPH
+0x9E65,0x67A1, //#CJK UNIFIED IDEOGRAPH
+0x9E66,0x6785, //#CJK UNIFIED IDEOGRAPH
+0x9E67,0x67B7, //#CJK UNIFIED IDEOGRAPH
+0x9E68,0x67EF, //#CJK UNIFIED IDEOGRAPH
+0x9E69,0x67B4, //#CJK UNIFIED IDEOGRAPH
+0x9E6A,0x67EC, //#CJK UNIFIED IDEOGRAPH
+0x9E6B,0x67B3, //#CJK UNIFIED IDEOGRAPH
+0x9E6C,0x67E9, //#CJK UNIFIED IDEOGRAPH
+0x9E6D,0x67B8, //#CJK UNIFIED IDEOGRAPH
+0x9E6E,0x67E4, //#CJK UNIFIED IDEOGRAPH
+0x9E6F,0x67DE, //#CJK UNIFIED IDEOGRAPH
+0x9E70,0x67DD, //#CJK UNIFIED IDEOGRAPH
+0x9E71,0x67E2, //#CJK UNIFIED IDEOGRAPH
+0x9E72,0x67EE, //#CJK UNIFIED IDEOGRAPH
+0x9E73,0x67B9, //#CJK UNIFIED IDEOGRAPH
+0x9E74,0x67CE, //#CJK UNIFIED IDEOGRAPH
+0x9E75,0x67C6, //#CJK UNIFIED IDEOGRAPH
+0x9E76,0x67E7, //#CJK UNIFIED IDEOGRAPH
+0x9E77,0x6A9C, //#CJK UNIFIED IDEOGRAPH
+0x9E78,0x681E, //#CJK UNIFIED IDEOGRAPH
+0x9E79,0x6846, //#CJK UNIFIED IDEOGRAPH
+0x9E7A,0x6829, //#CJK UNIFIED IDEOGRAPH
+0x9E7B,0x6840, //#CJK UNIFIED IDEOGRAPH
+0x9E7C,0x684D, //#CJK UNIFIED IDEOGRAPH
+0x9E7D,0x6832, //#CJK UNIFIED IDEOGRAPH
+0x9E7E,0x684E, //#CJK UNIFIED IDEOGRAPH
+0x9E80,0x68B3, //#CJK UNIFIED IDEOGRAPH
+0x9E81,0x682B, //#CJK UNIFIED IDEOGRAPH
+0x9E82,0x6859, //#CJK UNIFIED IDEOGRAPH
+0x9E83,0x6863, //#CJK UNIFIED IDEOGRAPH
+0x9E84,0x6877, //#CJK UNIFIED IDEOGRAPH
+0x9E85,0x687F, //#CJK UNIFIED IDEOGRAPH
+0x9E86,0x689F, //#CJK UNIFIED IDEOGRAPH
+0x9E87,0x688F, //#CJK UNIFIED IDEOGRAPH
+0x9E88,0x68AD, //#CJK UNIFIED IDEOGRAPH
+0x9E89,0x6894, //#CJK UNIFIED IDEOGRAPH
+0x9E8A,0x689D, //#CJK UNIFIED IDEOGRAPH
+0x9E8B,0x689B, //#CJK UNIFIED IDEOGRAPH
+0x9E8C,0x6883, //#CJK UNIFIED IDEOGRAPH
+0x9E8D,0x6AAE, //#CJK UNIFIED IDEOGRAPH
+0x9E8E,0x68B9, //#CJK UNIFIED IDEOGRAPH
+0x9E8F,0x6874, //#CJK UNIFIED IDEOGRAPH
+0x9E90,0x68B5, //#CJK UNIFIED IDEOGRAPH
+0x9E91,0x68A0, //#CJK UNIFIED IDEOGRAPH
+0x9E92,0x68BA, //#CJK UNIFIED IDEOGRAPH
+0x9E93,0x690F, //#CJK UNIFIED IDEOGRAPH
+0x9E94,0x688D, //#CJK UNIFIED IDEOGRAPH
+0x9E95,0x687E, //#CJK UNIFIED IDEOGRAPH
+0x9E96,0x6901, //#CJK UNIFIED IDEOGRAPH
+0x9E97,0x68CA, //#CJK UNIFIED IDEOGRAPH
+0x9E98,0x6908, //#CJK UNIFIED IDEOGRAPH
+0x9E99,0x68D8, //#CJK UNIFIED IDEOGRAPH
+0x9E9A,0x6922, //#CJK UNIFIED IDEOGRAPH
+0x9E9B,0x6926, //#CJK UNIFIED IDEOGRAPH
+0x9E9C,0x68E1, //#CJK UNIFIED IDEOGRAPH
+0x9E9D,0x690C, //#CJK UNIFIED IDEOGRAPH
+0x9E9E,0x68CD, //#CJK UNIFIED IDEOGRAPH
+0x9E9F,0x68D4, //#CJK UNIFIED IDEOGRAPH
+0x9EA0,0x68E7, //#CJK UNIFIED IDEOGRAPH
+0x9EA1,0x68D5, //#CJK UNIFIED IDEOGRAPH
+0x9EA2,0x6936, //#CJK UNIFIED IDEOGRAPH
+0x9EA3,0x6912, //#CJK UNIFIED IDEOGRAPH
+0x9EA4,0x6904, //#CJK UNIFIED IDEOGRAPH
+0x9EA5,0x68D7, //#CJK UNIFIED IDEOGRAPH
+0x9EA6,0x68E3, //#CJK UNIFIED IDEOGRAPH
+0x9EA7,0x6925, //#CJK UNIFIED IDEOGRAPH
+0x9EA8,0x68F9, //#CJK UNIFIED IDEOGRAPH
+0x9EA9,0x68E0, //#CJK UNIFIED IDEOGRAPH
+0x9EAA,0x68EF, //#CJK UNIFIED IDEOGRAPH
+0x9EAB,0x6928, //#CJK UNIFIED IDEOGRAPH
+0x9EAC,0x692A, //#CJK UNIFIED IDEOGRAPH
+0x9EAD,0x691A, //#CJK UNIFIED IDEOGRAPH
+0x9EAE,0x6923, //#CJK UNIFIED IDEOGRAPH
+0x9EAF,0x6921, //#CJK UNIFIED IDEOGRAPH
+0x9EB0,0x68C6, //#CJK UNIFIED IDEOGRAPH
+0x9EB1,0x6979, //#CJK UNIFIED IDEOGRAPH
+0x9EB2,0x6977, //#CJK UNIFIED IDEOGRAPH
+0x9EB3,0x695C, //#CJK UNIFIED IDEOGRAPH
+0x9EB4,0x6978, //#CJK UNIFIED IDEOGRAPH
+0x9EB5,0x696B, //#CJK UNIFIED IDEOGRAPH
+0x9EB6,0x6954, //#CJK UNIFIED IDEOGRAPH
+0x9EB7,0x697E, //#CJK UNIFIED IDEOGRAPH
+0x9EB8,0x696E, //#CJK UNIFIED IDEOGRAPH
+0x9EB9,0x6939, //#CJK UNIFIED IDEOGRAPH
+0x9EBA,0x6974, //#CJK UNIFIED IDEOGRAPH
+0x9EBB,0x693D, //#CJK UNIFIED IDEOGRAPH
+0x9EBC,0x6959, //#CJK UNIFIED IDEOGRAPH
+0x9EBD,0x6930, //#CJK UNIFIED IDEOGRAPH
+0x9EBE,0x6961, //#CJK UNIFIED IDEOGRAPH
+0x9EBF,0x695E, //#CJK UNIFIED IDEOGRAPH
+0x9EC0,0x695D, //#CJK UNIFIED IDEOGRAPH
+0x9EC1,0x6981, //#CJK UNIFIED IDEOGRAPH
+0x9EC2,0x696A, //#CJK UNIFIED IDEOGRAPH
+0x9EC3,0x69B2, //#CJK UNIFIED IDEOGRAPH
+0x9EC4,0x69AE, //#CJK UNIFIED IDEOGRAPH
+0x9EC5,0x69D0, //#CJK UNIFIED IDEOGRAPH
+0x9EC6,0x69BF, //#CJK UNIFIED IDEOGRAPH
+0x9EC7,0x69C1, //#CJK UNIFIED IDEOGRAPH
+0x9EC8,0x69D3, //#CJK UNIFIED IDEOGRAPH
+0x9EC9,0x69BE, //#CJK UNIFIED IDEOGRAPH
+0x9ECA,0x69CE, //#CJK UNIFIED IDEOGRAPH
+0x9ECB,0x5BE8, //#CJK UNIFIED IDEOGRAPH
+0x9ECC,0x69CA, //#CJK UNIFIED IDEOGRAPH
+0x9ECD,0x69DD, //#CJK UNIFIED IDEOGRAPH
+0x9ECE,0x69BB, //#CJK UNIFIED IDEOGRAPH
+0x9ECF,0x69C3, //#CJK UNIFIED IDEOGRAPH
+0x9ED0,0x69A7, //#CJK UNIFIED IDEOGRAPH
+0x9ED1,0x6A2E, //#CJK UNIFIED IDEOGRAPH
+0x9ED2,0x6991, //#CJK UNIFIED IDEOGRAPH
+0x9ED3,0x69A0, //#CJK UNIFIED IDEOGRAPH
+0x9ED4,0x699C, //#CJK UNIFIED IDEOGRAPH
+0x9ED5,0x6995, //#CJK UNIFIED IDEOGRAPH
+0x9ED6,0x69B4, //#CJK UNIFIED IDEOGRAPH
+0x9ED7,0x69DE, //#CJK UNIFIED IDEOGRAPH
+0x9ED8,0x69E8, //#CJK UNIFIED IDEOGRAPH
+0x9ED9,0x6A02, //#CJK UNIFIED IDEOGRAPH
+0x9EDA,0x6A1B, //#CJK UNIFIED IDEOGRAPH
+0x9EDB,0x69FF, //#CJK UNIFIED IDEOGRAPH
+0x9EDC,0x6B0A, //#CJK UNIFIED IDEOGRAPH
+0x9EDD,0x69F9, //#CJK UNIFIED IDEOGRAPH
+0x9EDE,0x69F2, //#CJK UNIFIED IDEOGRAPH
+0x9EDF,0x69E7, //#CJK UNIFIED IDEOGRAPH
+0x9EE0,0x6A05, //#CJK UNIFIED IDEOGRAPH
+0x9EE1,0x69B1, //#CJK UNIFIED IDEOGRAPH
+0x9EE2,0x6A1E, //#CJK UNIFIED IDEOGRAPH
+0x9EE3,0x69ED, //#CJK UNIFIED IDEOGRAPH
+0x9EE4,0x6A14, //#CJK UNIFIED IDEOGRAPH
+0x9EE5,0x69EB, //#CJK UNIFIED IDEOGRAPH
+0x9EE6,0x6A0A, //#CJK UNIFIED IDEOGRAPH
+0x9EE7,0x6A12, //#CJK UNIFIED IDEOGRAPH
+0x9EE8,0x6AC1, //#CJK UNIFIED IDEOGRAPH
+0x9EE9,0x6A23, //#CJK UNIFIED IDEOGRAPH
+0x9EEA,0x6A13, //#CJK UNIFIED IDEOGRAPH
+0x9EEB,0x6A44, //#CJK UNIFIED IDEOGRAPH
+0x9EEC,0x6A0C, //#CJK UNIFIED IDEOGRAPH
+0x9EED,0x6A72, //#CJK UNIFIED IDEOGRAPH
+0x9EEE,0x6A36, //#CJK UNIFIED IDEOGRAPH
+0x9EEF,0x6A78, //#CJK UNIFIED IDEOGRAPH
+0x9EF0,0x6A47, //#CJK UNIFIED IDEOGRAPH
+0x9EF1,0x6A62, //#CJK UNIFIED IDEOGRAPH
+0x9EF2,0x6A59, //#CJK UNIFIED IDEOGRAPH
+0x9EF3,0x6A66, //#CJK UNIFIED IDEOGRAPH
+0x9EF4,0x6A48, //#CJK UNIFIED IDEOGRAPH
+0x9EF5,0x6A38, //#CJK UNIFIED IDEOGRAPH
+0x9EF6,0x6A22, //#CJK UNIFIED IDEOGRAPH
+0x9EF7,0x6A90, //#CJK UNIFIED IDEOGRAPH
+0x9EF8,0x6A8D, //#CJK UNIFIED IDEOGRAPH
+0x9EF9,0x6AA0, //#CJK UNIFIED IDEOGRAPH
+0x9EFA,0x6A84, //#CJK UNIFIED IDEOGRAPH
+0x9EFB,0x6AA2, //#CJK UNIFIED IDEOGRAPH
+0x9EFC,0x6AA3, //#CJK UNIFIED IDEOGRAPH
+0x9F40,0x6A97, //#CJK UNIFIED IDEOGRAPH
+0x9F41,0x8617, //#CJK UNIFIED IDEOGRAPH
+0x9F42,0x6ABB, //#CJK UNIFIED IDEOGRAPH
+0x9F43,0x6AC3, //#CJK UNIFIED IDEOGRAPH
+0x9F44,0x6AC2, //#CJK UNIFIED IDEOGRAPH
+0x9F45,0x6AB8, //#CJK UNIFIED IDEOGRAPH
+0x9F46,0x6AB3, //#CJK UNIFIED IDEOGRAPH
+0x9F47,0x6AAC, //#CJK UNIFIED IDEOGRAPH
+0x9F48,0x6ADE, //#CJK UNIFIED IDEOGRAPH
+0x9F49,0x6AD1, //#CJK UNIFIED IDEOGRAPH
+0x9F4A,0x6ADF, //#CJK UNIFIED IDEOGRAPH
+0x9F4B,0x6AAA, //#CJK UNIFIED IDEOGRAPH
+0x9F4C,0x6ADA, //#CJK UNIFIED IDEOGRAPH
+0x9F4D,0x6AEA, //#CJK UNIFIED IDEOGRAPH
+0x9F4E,0x6AFB, //#CJK UNIFIED IDEOGRAPH
+0x9F4F,0x6B05, //#CJK UNIFIED IDEOGRAPH
+0x9F50,0x8616, //#CJK UNIFIED IDEOGRAPH
+0x9F51,0x6AFA, //#CJK UNIFIED IDEOGRAPH
+0x9F52,0x6B12, //#CJK UNIFIED IDEOGRAPH
+0x9F53,0x6B16, //#CJK UNIFIED IDEOGRAPH
+0x9F54,0x9B31, //#CJK UNIFIED IDEOGRAPH
+0x9F55,0x6B1F, //#CJK UNIFIED IDEOGRAPH
+0x9F56,0x6B38, //#CJK UNIFIED IDEOGRAPH
+0x9F57,0x6B37, //#CJK UNIFIED IDEOGRAPH
+0x9F58,0x76DC, //#CJK UNIFIED IDEOGRAPH
+0x9F59,0x6B39, //#CJK UNIFIED IDEOGRAPH
+0x9F5A,0x98EE, //#CJK UNIFIED IDEOGRAPH
+0x9F5B,0x6B47, //#CJK UNIFIED IDEOGRAPH
+0x9F5C,0x6B43, //#CJK UNIFIED IDEOGRAPH
+0x9F5D,0x6B49, //#CJK UNIFIED IDEOGRAPH
+0x9F5E,0x6B50, //#CJK UNIFIED IDEOGRAPH
+0x9F5F,0x6B59, //#CJK UNIFIED IDEOGRAPH
+0x9F60,0x6B54, //#CJK UNIFIED IDEOGRAPH
+0x9F61,0x6B5B, //#CJK UNIFIED IDEOGRAPH
+0x9F62,0x6B5F, //#CJK UNIFIED IDEOGRAPH
+0x9F63,0x6B61, //#CJK UNIFIED IDEOGRAPH
+0x9F64,0x6B78, //#CJK UNIFIED IDEOGRAPH
+0x9F65,0x6B79, //#CJK UNIFIED IDEOGRAPH
+0x9F66,0x6B7F, //#CJK UNIFIED IDEOGRAPH
+0x9F67,0x6B80, //#CJK UNIFIED IDEOGRAPH
+0x9F68,0x6B84, //#CJK UNIFIED IDEOGRAPH
+0x9F69,0x6B83, //#CJK UNIFIED IDEOGRAPH
+0x9F6A,0x6B8D, //#CJK UNIFIED IDEOGRAPH
+0x9F6B,0x6B98, //#CJK UNIFIED IDEOGRAPH
+0x9F6C,0x6B95, //#CJK UNIFIED IDEOGRAPH
+0x9F6D,0x6B9E, //#CJK UNIFIED IDEOGRAPH
+0x9F6E,0x6BA4, //#CJK UNIFIED IDEOGRAPH
+0x9F6F,0x6BAA, //#CJK UNIFIED IDEOGRAPH
+0x9F70,0x6BAB, //#CJK UNIFIED IDEOGRAPH
+0x9F71,0x6BAF, //#CJK UNIFIED IDEOGRAPH
+0x9F72,0x6BB2, //#CJK UNIFIED IDEOGRAPH
+0x9F73,0x6BB1, //#CJK UNIFIED IDEOGRAPH
+0x9F74,0x6BB3, //#CJK UNIFIED IDEOGRAPH
+0x9F75,0x6BB7, //#CJK UNIFIED IDEOGRAPH
+0x9F76,0x6BBC, //#CJK UNIFIED IDEOGRAPH
+0x9F77,0x6BC6, //#CJK UNIFIED IDEOGRAPH
+0x9F78,0x6BCB, //#CJK UNIFIED IDEOGRAPH
+0x9F79,0x6BD3, //#CJK UNIFIED IDEOGRAPH
+0x9F7A,0x6BDF, //#CJK UNIFIED IDEOGRAPH
+0x9F7B,0x6BEC, //#CJK UNIFIED IDEOGRAPH
+0x9F7C,0x6BEB, //#CJK UNIFIED IDEOGRAPH
+0x9F7D,0x6BF3, //#CJK UNIFIED IDEOGRAPH
+0x9F7E,0x6BEF, //#CJK UNIFIED IDEOGRAPH
+0x9F80,0x9EBE, //#CJK UNIFIED IDEOGRAPH
+0x9F81,0x6C08, //#CJK UNIFIED IDEOGRAPH
+0x9F82,0x6C13, //#CJK UNIFIED IDEOGRAPH
+0x9F83,0x6C14, //#CJK UNIFIED IDEOGRAPH
+0x9F84,0x6C1B, //#CJK UNIFIED IDEOGRAPH
+0x9F85,0x6C24, //#CJK UNIFIED IDEOGRAPH
+0x9F86,0x6C23, //#CJK UNIFIED IDEOGRAPH
+0x9F87,0x6C5E, //#CJK UNIFIED IDEOGRAPH
+0x9F88,0x6C55, //#CJK UNIFIED IDEOGRAPH
+0x9F89,0x6C62, //#CJK UNIFIED IDEOGRAPH
+0x9F8A,0x6C6A, //#CJK UNIFIED IDEOGRAPH
+0x9F8B,0x6C82, //#CJK UNIFIED IDEOGRAPH
+0x9F8C,0x6C8D, //#CJK UNIFIED IDEOGRAPH
+0x9F8D,0x6C9A, //#CJK UNIFIED IDEOGRAPH
+0x9F8E,0x6C81, //#CJK UNIFIED IDEOGRAPH
+0x9F8F,0x6C9B, //#CJK UNIFIED IDEOGRAPH
+0x9F90,0x6C7E, //#CJK UNIFIED IDEOGRAPH
+0x9F91,0x6C68, //#CJK UNIFIED IDEOGRAPH
+0x9F92,0x6C73, //#CJK UNIFIED IDEOGRAPH
+0x9F93,0x6C92, //#CJK UNIFIED IDEOGRAPH
+0x9F94,0x6C90, //#CJK UNIFIED IDEOGRAPH
+0x9F95,0x6CC4, //#CJK UNIFIED IDEOGRAPH
+0x9F96,0x6CF1, //#CJK UNIFIED IDEOGRAPH
+0x9F97,0x6CD3, //#CJK UNIFIED IDEOGRAPH
+0x9F98,0x6CBD, //#CJK UNIFIED IDEOGRAPH
+0x9F99,0x6CD7, //#CJK UNIFIED IDEOGRAPH
+0x9F9A,0x6CC5, //#CJK UNIFIED IDEOGRAPH
+0x9F9B,0x6CDD, //#CJK UNIFIED IDEOGRAPH
+0x9F9C,0x6CAE, //#CJK UNIFIED IDEOGRAPH
+0x9F9D,0x6CB1, //#CJK UNIFIED IDEOGRAPH
+0x9F9E,0x6CBE, //#CJK UNIFIED IDEOGRAPH
+0x9F9F,0x6CBA, //#CJK UNIFIED IDEOGRAPH
+0x9FA0,0x6CDB, //#CJK UNIFIED IDEOGRAPH
+0x9FA1,0x6CEF, //#CJK UNIFIED IDEOGRAPH
+0x9FA2,0x6CD9, //#CJK UNIFIED IDEOGRAPH
+0x9FA3,0x6CEA, //#CJK UNIFIED IDEOGRAPH
+0x9FA4,0x6D1F, //#CJK UNIFIED IDEOGRAPH
+0x9FA5,0x884D, //#CJK UNIFIED IDEOGRAPH
+0x9FA6,0x6D36, //#CJK UNIFIED IDEOGRAPH
+0x9FA7,0x6D2B, //#CJK UNIFIED IDEOGRAPH
+0x9FA8,0x6D3D, //#CJK UNIFIED IDEOGRAPH
+0x9FA9,0x6D38, //#CJK UNIFIED IDEOGRAPH
+0x9FAA,0x6D19, //#CJK UNIFIED IDEOGRAPH
+0x9FAB,0x6D35, //#CJK UNIFIED IDEOGRAPH
+0x9FAC,0x6D33, //#CJK UNIFIED IDEOGRAPH
+0x9FAD,0x6D12, //#CJK UNIFIED IDEOGRAPH
+0x9FAE,0x6D0C, //#CJK UNIFIED IDEOGRAPH
+0x9FAF,0x6D63, //#CJK UNIFIED IDEOGRAPH
+0x9FB0,0x6D93, //#CJK UNIFIED IDEOGRAPH
+0x9FB1,0x6D64, //#CJK UNIFIED IDEOGRAPH
+0x9FB2,0x6D5A, //#CJK UNIFIED IDEOGRAPH
+0x9FB3,0x6D79, //#CJK UNIFIED IDEOGRAPH
+0x9FB4,0x6D59, //#CJK UNIFIED IDEOGRAPH
+0x9FB5,0x6D8E, //#CJK UNIFIED IDEOGRAPH
+0x9FB6,0x6D95, //#CJK UNIFIED IDEOGRAPH
+0x9FB7,0x6FE4, //#CJK UNIFIED IDEOGRAPH
+0x9FB8,0x6D85, //#CJK UNIFIED IDEOGRAPH
+0x9FB9,0x6DF9, //#CJK UNIFIED IDEOGRAPH
+0x9FBA,0x6E15, //#CJK UNIFIED IDEOGRAPH
+0x9FBB,0x6E0A, //#CJK UNIFIED IDEOGRAPH
+0x9FBC,0x6DB5, //#CJK UNIFIED IDEOGRAPH
+0x9FBD,0x6DC7, //#CJK UNIFIED IDEOGRAPH
+0x9FBE,0x6DE6, //#CJK UNIFIED IDEOGRAPH
+0x9FBF,0x6DB8, //#CJK UNIFIED IDEOGRAPH
+0x9FC0,0x6DC6, //#CJK UNIFIED IDEOGRAPH
+0x9FC1,0x6DEC, //#CJK UNIFIED IDEOGRAPH
+0x9FC2,0x6DDE, //#CJK UNIFIED IDEOGRAPH
+0x9FC3,0x6DCC, //#CJK UNIFIED IDEOGRAPH
+0x9FC4,0x6DE8, //#CJK UNIFIED IDEOGRAPH
+0x9FC5,0x6DD2, //#CJK UNIFIED IDEOGRAPH
+0x9FC6,0x6DC5, //#CJK UNIFIED IDEOGRAPH
+0x9FC7,0x6DFA, //#CJK UNIFIED IDEOGRAPH
+0x9FC8,0x6DD9, //#CJK UNIFIED IDEOGRAPH
+0x9FC9,0x6DE4, //#CJK UNIFIED IDEOGRAPH
+0x9FCA,0x6DD5, //#CJK UNIFIED IDEOGRAPH
+0x9FCB,0x6DEA, //#CJK UNIFIED IDEOGRAPH
+0x9FCC,0x6DEE, //#CJK UNIFIED IDEOGRAPH
+0x9FCD,0x6E2D, //#CJK UNIFIED IDEOGRAPH
+0x9FCE,0x6E6E, //#CJK UNIFIED IDEOGRAPH
+0x9FCF,0x6E2E, //#CJK UNIFIED IDEOGRAPH
+0x9FD0,0x6E19, //#CJK UNIFIED IDEOGRAPH
+0x9FD1,0x6E72, //#CJK UNIFIED IDEOGRAPH
+0x9FD2,0x6E5F, //#CJK UNIFIED IDEOGRAPH
+0x9FD3,0x6E3E, //#CJK UNIFIED IDEOGRAPH
+0x9FD4,0x6E23, //#CJK UNIFIED IDEOGRAPH
+0x9FD5,0x6E6B, //#CJK UNIFIED IDEOGRAPH
+0x9FD6,0x6E2B, //#CJK UNIFIED IDEOGRAPH
+0x9FD7,0x6E76, //#CJK UNIFIED IDEOGRAPH
+0x9FD8,0x6E4D, //#CJK UNIFIED IDEOGRAPH
+0x9FD9,0x6E1F, //#CJK UNIFIED IDEOGRAPH
+0x9FDA,0x6E43, //#CJK UNIFIED IDEOGRAPH
+0x9FDB,0x6E3A, //#CJK UNIFIED IDEOGRAPH
+0x9FDC,0x6E4E, //#CJK UNIFIED IDEOGRAPH
+0x9FDD,0x6E24, //#CJK UNIFIED IDEOGRAPH
+0x9FDE,0x6EFF, //#CJK UNIFIED IDEOGRAPH
+0x9FDF,0x6E1D, //#CJK UNIFIED IDEOGRAPH
+0x9FE0,0x6E38, //#CJK UNIFIED IDEOGRAPH
+0x9FE1,0x6E82, //#CJK UNIFIED IDEOGRAPH
+0x9FE2,0x6EAA, //#CJK UNIFIED IDEOGRAPH
+0x9FE3,0x6E98, //#CJK UNIFIED IDEOGRAPH
+0x9FE4,0x6EC9, //#CJK UNIFIED IDEOGRAPH
+0x9FE5,0x6EB7, //#CJK UNIFIED IDEOGRAPH
+0x9FE6,0x6ED3, //#CJK UNIFIED IDEOGRAPH
+0x9FE7,0x6EBD, //#CJK UNIFIED IDEOGRAPH
+0x9FE8,0x6EAF, //#CJK UNIFIED IDEOGRAPH
+0x9FE9,0x6EC4, //#CJK UNIFIED IDEOGRAPH
+0x9FEA,0x6EB2, //#CJK UNIFIED IDEOGRAPH
+0x9FEB,0x6ED4, //#CJK UNIFIED IDEOGRAPH
+0x9FEC,0x6ED5, //#CJK UNIFIED IDEOGRAPH
+0x9FED,0x6E8F, //#CJK UNIFIED IDEOGRAPH
+0x9FEE,0x6EA5, //#CJK UNIFIED IDEOGRAPH
+0x9FEF,0x6EC2, //#CJK UNIFIED IDEOGRAPH
+0x9FF0,0x6E9F, //#CJK UNIFIED IDEOGRAPH
+0x9FF1,0x6F41, //#CJK UNIFIED IDEOGRAPH
+0x9FF2,0x6F11, //#CJK UNIFIED IDEOGRAPH
+0x9FF3,0x704C, //#CJK UNIFIED IDEOGRAPH
+0x9FF4,0x6EEC, //#CJK UNIFIED IDEOGRAPH
+0x9FF5,0x6EF8, //#CJK UNIFIED IDEOGRAPH
+0x9FF6,0x6EFE, //#CJK UNIFIED IDEOGRAPH
+0x9FF7,0x6F3F, //#CJK UNIFIED IDEOGRAPH
+0x9FF8,0x6EF2, //#CJK UNIFIED IDEOGRAPH
+0x9FF9,0x6F31, //#CJK UNIFIED IDEOGRAPH
+0x9FFA,0x6EEF, //#CJK UNIFIED IDEOGRAPH
+0x9FFB,0x6F32, //#CJK UNIFIED IDEOGRAPH
+0x9FFC,0x6ECC, //#CJK UNIFIED IDEOGRAPH
+0xE040,0x6F3E, //#CJK UNIFIED IDEOGRAPH
+0xE041,0x6F13, //#CJK UNIFIED IDEOGRAPH
+0xE042,0x6EF7, //#CJK UNIFIED IDEOGRAPH
+0xE043,0x6F86, //#CJK UNIFIED IDEOGRAPH
+0xE044,0x6F7A, //#CJK UNIFIED IDEOGRAPH
+0xE045,0x6F78, //#CJK UNIFIED IDEOGRAPH
+0xE046,0x6F81, //#CJK UNIFIED IDEOGRAPH
+0xE047,0x6F80, //#CJK UNIFIED IDEOGRAPH
+0xE048,0x6F6F, //#CJK UNIFIED IDEOGRAPH
+0xE049,0x6F5B, //#CJK UNIFIED IDEOGRAPH
+0xE04A,0x6FF3, //#CJK UNIFIED IDEOGRAPH
+0xE04B,0x6F6D, //#CJK UNIFIED IDEOGRAPH
+0xE04C,0x6F82, //#CJK UNIFIED IDEOGRAPH
+0xE04D,0x6F7C, //#CJK UNIFIED IDEOGRAPH
+0xE04E,0x6F58, //#CJK UNIFIED IDEOGRAPH
+0xE04F,0x6F8E, //#CJK UNIFIED IDEOGRAPH
+0xE050,0x6F91, //#CJK UNIFIED IDEOGRAPH
+0xE051,0x6FC2, //#CJK UNIFIED IDEOGRAPH
+0xE052,0x6F66, //#CJK UNIFIED IDEOGRAPH
+0xE053,0x6FB3, //#CJK UNIFIED IDEOGRAPH
+0xE054,0x6FA3, //#CJK UNIFIED IDEOGRAPH
+0xE055,0x6FA1, //#CJK UNIFIED IDEOGRAPH
+0xE056,0x6FA4, //#CJK UNIFIED IDEOGRAPH
+0xE057,0x6FB9, //#CJK UNIFIED IDEOGRAPH
+0xE058,0x6FC6, //#CJK UNIFIED IDEOGRAPH
+0xE059,0x6FAA, //#CJK UNIFIED IDEOGRAPH
+0xE05A,0x6FDF, //#CJK UNIFIED IDEOGRAPH
+0xE05B,0x6FD5, //#CJK UNIFIED IDEOGRAPH
+0xE05C,0x6FEC, //#CJK UNIFIED IDEOGRAPH
+0xE05D,0x6FD4, //#CJK UNIFIED IDEOGRAPH
+0xE05E,0x6FD8, //#CJK UNIFIED IDEOGRAPH
+0xE05F,0x6FF1, //#CJK UNIFIED IDEOGRAPH
+0xE060,0x6FEE, //#CJK UNIFIED IDEOGRAPH
+0xE061,0x6FDB, //#CJK UNIFIED IDEOGRAPH
+0xE062,0x7009, //#CJK UNIFIED IDEOGRAPH
+0xE063,0x700B, //#CJK UNIFIED IDEOGRAPH
+0xE064,0x6FFA, //#CJK UNIFIED IDEOGRAPH
+0xE065,0x7011, //#CJK UNIFIED IDEOGRAPH
+0xE066,0x7001, //#CJK UNIFIED IDEOGRAPH
+0xE067,0x700F, //#CJK UNIFIED IDEOGRAPH
+0xE068,0x6FFE, //#CJK UNIFIED IDEOGRAPH
+0xE069,0x701B, //#CJK UNIFIED IDEOGRAPH
+0xE06A,0x701A, //#CJK UNIFIED IDEOGRAPH
+0xE06B,0x6F74, //#CJK UNIFIED IDEOGRAPH
+0xE06C,0x701D, //#CJK UNIFIED IDEOGRAPH
+0xE06D,0x7018, //#CJK UNIFIED IDEOGRAPH
+0xE06E,0x701F, //#CJK UNIFIED IDEOGRAPH
+0xE06F,0x7030, //#CJK UNIFIED IDEOGRAPH
+0xE070,0x703E, //#CJK UNIFIED IDEOGRAPH
+0xE071,0x7032, //#CJK UNIFIED IDEOGRAPH
+0xE072,0x7051, //#CJK UNIFIED IDEOGRAPH
+0xE073,0x7063, //#CJK UNIFIED IDEOGRAPH
+0xE074,0x7099, //#CJK UNIFIED IDEOGRAPH
+0xE075,0x7092, //#CJK UNIFIED IDEOGRAPH
+0xE076,0x70AF, //#CJK UNIFIED IDEOGRAPH
+0xE077,0x70F1, //#CJK UNIFIED IDEOGRAPH
+0xE078,0x70AC, //#CJK UNIFIED IDEOGRAPH
+0xE079,0x70B8, //#CJK UNIFIED IDEOGRAPH
+0xE07A,0x70B3, //#CJK UNIFIED IDEOGRAPH
+0xE07B,0x70AE, //#CJK UNIFIED IDEOGRAPH
+0xE07C,0x70DF, //#CJK UNIFIED IDEOGRAPH
+0xE07D,0x70CB, //#CJK UNIFIED IDEOGRAPH
+0xE07E,0x70DD, //#CJK UNIFIED IDEOGRAPH
+0xE080,0x70D9, //#CJK UNIFIED IDEOGRAPH
+0xE081,0x7109, //#CJK UNIFIED IDEOGRAPH
+0xE082,0x70FD, //#CJK UNIFIED IDEOGRAPH
+0xE083,0x711C, //#CJK UNIFIED IDEOGRAPH
+0xE084,0x7119, //#CJK UNIFIED IDEOGRAPH
+0xE085,0x7165, //#CJK UNIFIED IDEOGRAPH
+0xE086,0x7155, //#CJK UNIFIED IDEOGRAPH
+0xE087,0x7188, //#CJK UNIFIED IDEOGRAPH
+0xE088,0x7166, //#CJK UNIFIED IDEOGRAPH
+0xE089,0x7162, //#CJK UNIFIED IDEOGRAPH
+0xE08A,0x714C, //#CJK UNIFIED IDEOGRAPH
+0xE08B,0x7156, //#CJK UNIFIED IDEOGRAPH
+0xE08C,0x716C, //#CJK UNIFIED IDEOGRAPH
+0xE08D,0x718F, //#CJK UNIFIED IDEOGRAPH
+0xE08E,0x71FB, //#CJK UNIFIED IDEOGRAPH
+0xE08F,0x7184, //#CJK UNIFIED IDEOGRAPH
+0xE090,0x7195, //#CJK UNIFIED IDEOGRAPH
+0xE091,0x71A8, //#CJK UNIFIED IDEOGRAPH
+0xE092,0x71AC, //#CJK UNIFIED IDEOGRAPH
+0xE093,0x71D7, //#CJK UNIFIED IDEOGRAPH
+0xE094,0x71B9, //#CJK UNIFIED IDEOGRAPH
+0xE095,0x71BE, //#CJK UNIFIED IDEOGRAPH
+0xE096,0x71D2, //#CJK UNIFIED IDEOGRAPH
+0xE097,0x71C9, //#CJK UNIFIED IDEOGRAPH
+0xE098,0x71D4, //#CJK UNIFIED IDEOGRAPH
+0xE099,0x71CE, //#CJK UNIFIED IDEOGRAPH
+0xE09A,0x71E0, //#CJK UNIFIED IDEOGRAPH
+0xE09B,0x71EC, //#CJK UNIFIED IDEOGRAPH
+0xE09C,0x71E7, //#CJK UNIFIED IDEOGRAPH
+0xE09D,0x71F5, //#CJK UNIFIED IDEOGRAPH
+0xE09E,0x71FC, //#CJK UNIFIED IDEOGRAPH
+0xE09F,0x71F9, //#CJK UNIFIED IDEOGRAPH
+0xE0A0,0x71FF, //#CJK UNIFIED IDEOGRAPH
+0xE0A1,0x720D, //#CJK UNIFIED IDEOGRAPH
+0xE0A2,0x7210, //#CJK UNIFIED IDEOGRAPH
+0xE0A3,0x721B, //#CJK UNIFIED IDEOGRAPH
+0xE0A4,0x7228, //#CJK UNIFIED IDEOGRAPH
+0xE0A5,0x722D, //#CJK UNIFIED IDEOGRAPH
+0xE0A6,0x722C, //#CJK UNIFIED IDEOGRAPH
+0xE0A7,0x7230, //#CJK UNIFIED IDEOGRAPH
+0xE0A8,0x7232, //#CJK UNIFIED IDEOGRAPH
+0xE0A9,0x723B, //#CJK UNIFIED IDEOGRAPH
+0xE0AA,0x723C, //#CJK UNIFIED IDEOGRAPH
+0xE0AB,0x723F, //#CJK UNIFIED IDEOGRAPH
+0xE0AC,0x7240, //#CJK UNIFIED IDEOGRAPH
+0xE0AD,0x7246, //#CJK UNIFIED IDEOGRAPH
+0xE0AE,0x724B, //#CJK UNIFIED IDEOGRAPH
+0xE0AF,0x7258, //#CJK UNIFIED IDEOGRAPH
+0xE0B0,0x7274, //#CJK UNIFIED IDEOGRAPH
+0xE0B1,0x727E, //#CJK UNIFIED IDEOGRAPH
+0xE0B2,0x7282, //#CJK UNIFIED IDEOGRAPH
+0xE0B3,0x7281, //#CJK UNIFIED IDEOGRAPH
+0xE0B4,0x7287, //#CJK UNIFIED IDEOGRAPH
+0xE0B5,0x7292, //#CJK UNIFIED IDEOGRAPH
+0xE0B6,0x7296, //#CJK UNIFIED IDEOGRAPH
+0xE0B7,0x72A2, //#CJK UNIFIED IDEOGRAPH
+0xE0B8,0x72A7, //#CJK UNIFIED IDEOGRAPH
+0xE0B9,0x72B9, //#CJK UNIFIED IDEOGRAPH
+0xE0BA,0x72B2, //#CJK UNIFIED IDEOGRAPH
+0xE0BB,0x72C3, //#CJK UNIFIED IDEOGRAPH
+0xE0BC,0x72C6, //#CJK UNIFIED IDEOGRAPH
+0xE0BD,0x72C4, //#CJK UNIFIED IDEOGRAPH
+0xE0BE,0x72CE, //#CJK UNIFIED IDEOGRAPH
+0xE0BF,0x72D2, //#CJK UNIFIED IDEOGRAPH
+0xE0C0,0x72E2, //#CJK UNIFIED IDEOGRAPH
+0xE0C1,0x72E0, //#CJK UNIFIED IDEOGRAPH
+0xE0C2,0x72E1, //#CJK UNIFIED IDEOGRAPH
+0xE0C3,0x72F9, //#CJK UNIFIED IDEOGRAPH
+0xE0C4,0x72F7, //#CJK UNIFIED IDEOGRAPH
+0xE0C5,0x500F, //#CJK UNIFIED IDEOGRAPH
+0xE0C6,0x7317, //#CJK UNIFIED IDEOGRAPH
+0xE0C7,0x730A, //#CJK UNIFIED IDEOGRAPH
+0xE0C8,0x731C, //#CJK UNIFIED IDEOGRAPH
+0xE0C9,0x7316, //#CJK UNIFIED IDEOGRAPH
+0xE0CA,0x731D, //#CJK UNIFIED IDEOGRAPH
+0xE0CB,0x7334, //#CJK UNIFIED IDEOGRAPH
+0xE0CC,0x732F, //#CJK UNIFIED IDEOGRAPH
+0xE0CD,0x7329, //#CJK UNIFIED IDEOGRAPH
+0xE0CE,0x7325, //#CJK UNIFIED IDEOGRAPH
+0xE0CF,0x733E, //#CJK UNIFIED IDEOGRAPH
+0xE0D0,0x734E, //#CJK UNIFIED IDEOGRAPH
+0xE0D1,0x734F, //#CJK UNIFIED IDEOGRAPH
+0xE0D2,0x9ED8, //#CJK UNIFIED IDEOGRAPH
+0xE0D3,0x7357, //#CJK UNIFIED IDEOGRAPH
+0xE0D4,0x736A, //#CJK UNIFIED IDEOGRAPH
+0xE0D5,0x7368, //#CJK UNIFIED IDEOGRAPH
+0xE0D6,0x7370, //#CJK UNIFIED IDEOGRAPH
+0xE0D7,0x7378, //#CJK UNIFIED IDEOGRAPH
+0xE0D8,0x7375, //#CJK UNIFIED IDEOGRAPH
+0xE0D9,0x737B, //#CJK UNIFIED IDEOGRAPH
+0xE0DA,0x737A, //#CJK UNIFIED IDEOGRAPH
+0xE0DB,0x73C8, //#CJK UNIFIED IDEOGRAPH
+0xE0DC,0x73B3, //#CJK UNIFIED IDEOGRAPH
+0xE0DD,0x73CE, //#CJK UNIFIED IDEOGRAPH
+0xE0DE,0x73BB, //#CJK UNIFIED IDEOGRAPH
+0xE0DF,0x73C0, //#CJK UNIFIED IDEOGRAPH
+0xE0E0,0x73E5, //#CJK UNIFIED IDEOGRAPH
+0xE0E1,0x73EE, //#CJK UNIFIED IDEOGRAPH
+0xE0E2,0x73DE, //#CJK UNIFIED IDEOGRAPH
+0xE0E3,0x74A2, //#CJK UNIFIED IDEOGRAPH
+0xE0E4,0x7405, //#CJK UNIFIED IDEOGRAPH
+0xE0E5,0x746F, //#CJK UNIFIED IDEOGRAPH
+0xE0E6,0x7425, //#CJK UNIFIED IDEOGRAPH
+0xE0E7,0x73F8, //#CJK UNIFIED IDEOGRAPH
+0xE0E8,0x7432, //#CJK UNIFIED IDEOGRAPH
+0xE0E9,0x743A, //#CJK UNIFIED IDEOGRAPH
+0xE0EA,0x7455, //#CJK UNIFIED IDEOGRAPH
+0xE0EB,0x743F, //#CJK UNIFIED IDEOGRAPH
+0xE0EC,0x745F, //#CJK UNIFIED IDEOGRAPH
+0xE0ED,0x7459, //#CJK UNIFIED IDEOGRAPH
+0xE0EE,0x7441, //#CJK UNIFIED IDEOGRAPH
+0xE0EF,0x745C, //#CJK UNIFIED IDEOGRAPH
+0xE0F0,0x7469, //#CJK UNIFIED IDEOGRAPH
+0xE0F1,0x7470, //#CJK UNIFIED IDEOGRAPH
+0xE0F2,0x7463, //#CJK UNIFIED IDEOGRAPH
+0xE0F3,0x746A, //#CJK UNIFIED IDEOGRAPH
+0xE0F4,0x7476, //#CJK UNIFIED IDEOGRAPH
+0xE0F5,0x747E, //#CJK UNIFIED IDEOGRAPH
+0xE0F6,0x748B, //#CJK UNIFIED IDEOGRAPH
+0xE0F7,0x749E, //#CJK UNIFIED IDEOGRAPH
+0xE0F8,0x74A7, //#CJK UNIFIED IDEOGRAPH
+0xE0F9,0x74CA, //#CJK UNIFIED IDEOGRAPH
+0xE0FA,0x74CF, //#CJK UNIFIED IDEOGRAPH
+0xE0FB,0x74D4, //#CJK UNIFIED IDEOGRAPH
+0xE0FC,0x73F1, //#CJK UNIFIED IDEOGRAPH
+0xE140,0x74E0, //#CJK UNIFIED IDEOGRAPH
+0xE141,0x74E3, //#CJK UNIFIED IDEOGRAPH
+0xE142,0x74E7, //#CJK UNIFIED IDEOGRAPH
+0xE143,0x74E9, //#CJK UNIFIED IDEOGRAPH
+0xE144,0x74EE, //#CJK UNIFIED IDEOGRAPH
+0xE145,0x74F2, //#CJK UNIFIED IDEOGRAPH
+0xE146,0x74F0, //#CJK UNIFIED IDEOGRAPH
+0xE147,0x74F1, //#CJK UNIFIED IDEOGRAPH
+0xE148,0x74F8, //#CJK UNIFIED IDEOGRAPH
+0xE149,0x74F7, //#CJK UNIFIED IDEOGRAPH
+0xE14A,0x7504, //#CJK UNIFIED IDEOGRAPH
+0xE14B,0x7503, //#CJK UNIFIED IDEOGRAPH
+0xE14C,0x7505, //#CJK UNIFIED IDEOGRAPH
+0xE14D,0x750C, //#CJK UNIFIED IDEOGRAPH
+0xE14E,0x750E, //#CJK UNIFIED IDEOGRAPH
+0xE14F,0x750D, //#CJK UNIFIED IDEOGRAPH
+0xE150,0x7515, //#CJK UNIFIED IDEOGRAPH
+0xE151,0x7513, //#CJK UNIFIED IDEOGRAPH
+0xE152,0x751E, //#CJK UNIFIED IDEOGRAPH
+0xE153,0x7526, //#CJK UNIFIED IDEOGRAPH
+0xE154,0x752C, //#CJK UNIFIED IDEOGRAPH
+0xE155,0x753C, //#CJK UNIFIED IDEOGRAPH
+0xE156,0x7544, //#CJK UNIFIED IDEOGRAPH
+0xE157,0x754D, //#CJK UNIFIED IDEOGRAPH
+0xE158,0x754A, //#CJK UNIFIED IDEOGRAPH
+0xE159,0x7549, //#CJK UNIFIED IDEOGRAPH
+0xE15A,0x755B, //#CJK UNIFIED IDEOGRAPH
+0xE15B,0x7546, //#CJK UNIFIED IDEOGRAPH
+0xE15C,0x755A, //#CJK UNIFIED IDEOGRAPH
+0xE15D,0x7569, //#CJK UNIFIED IDEOGRAPH
+0xE15E,0x7564, //#CJK UNIFIED IDEOGRAPH
+0xE15F,0x7567, //#CJK UNIFIED IDEOGRAPH
+0xE160,0x756B, //#CJK UNIFIED IDEOGRAPH
+0xE161,0x756D, //#CJK UNIFIED IDEOGRAPH
+0xE162,0x7578, //#CJK UNIFIED IDEOGRAPH
+0xE163,0x7576, //#CJK UNIFIED IDEOGRAPH
+0xE164,0x7586, //#CJK UNIFIED IDEOGRAPH
+0xE165,0x7587, //#CJK UNIFIED IDEOGRAPH
+0xE166,0x7574, //#CJK UNIFIED IDEOGRAPH
+0xE167,0x758A, //#CJK UNIFIED IDEOGRAPH
+0xE168,0x7589, //#CJK UNIFIED IDEOGRAPH
+0xE169,0x7582, //#CJK UNIFIED IDEOGRAPH
+0xE16A,0x7594, //#CJK UNIFIED IDEOGRAPH
+0xE16B,0x759A, //#CJK UNIFIED IDEOGRAPH
+0xE16C,0x759D, //#CJK UNIFIED IDEOGRAPH
+0xE16D,0x75A5, //#CJK UNIFIED IDEOGRAPH
+0xE16E,0x75A3, //#CJK UNIFIED IDEOGRAPH
+0xE16F,0x75C2, //#CJK UNIFIED IDEOGRAPH
+0xE170,0x75B3, //#CJK UNIFIED IDEOGRAPH
+0xE171,0x75C3, //#CJK UNIFIED IDEOGRAPH
+0xE172,0x75B5, //#CJK UNIFIED IDEOGRAPH
+0xE173,0x75BD, //#CJK UNIFIED IDEOGRAPH
+0xE174,0x75B8, //#CJK UNIFIED IDEOGRAPH
+0xE175,0x75BC, //#CJK UNIFIED IDEOGRAPH
+0xE176,0x75B1, //#CJK UNIFIED IDEOGRAPH
+0xE177,0x75CD, //#CJK UNIFIED IDEOGRAPH
+0xE178,0x75CA, //#CJK UNIFIED IDEOGRAPH
+0xE179,0x75D2, //#CJK UNIFIED IDEOGRAPH
+0xE17A,0x75D9, //#CJK UNIFIED IDEOGRAPH
+0xE17B,0x75E3, //#CJK UNIFIED IDEOGRAPH
+0xE17C,0x75DE, //#CJK UNIFIED IDEOGRAPH
+0xE17D,0x75FE, //#CJK UNIFIED IDEOGRAPH
+0xE17E,0x75FF, //#CJK UNIFIED IDEOGRAPH
+0xE180,0x75FC, //#CJK UNIFIED IDEOGRAPH
+0xE181,0x7601, //#CJK UNIFIED IDEOGRAPH
+0xE182,0x75F0, //#CJK UNIFIED IDEOGRAPH
+0xE183,0x75FA, //#CJK UNIFIED IDEOGRAPH
+0xE184,0x75F2, //#CJK UNIFIED IDEOGRAPH
+0xE185,0x75F3, //#CJK UNIFIED IDEOGRAPH
+0xE186,0x760B, //#CJK UNIFIED IDEOGRAPH
+0xE187,0x760D, //#CJK UNIFIED IDEOGRAPH
+0xE188,0x7609, //#CJK UNIFIED IDEOGRAPH
+0xE189,0x761F, //#CJK UNIFIED IDEOGRAPH
+0xE18A,0x7627, //#CJK UNIFIED IDEOGRAPH
+0xE18B,0x7620, //#CJK UNIFIED IDEOGRAPH
+0xE18C,0x7621, //#CJK UNIFIED IDEOGRAPH
+0xE18D,0x7622, //#CJK UNIFIED IDEOGRAPH
+0xE18E,0x7624, //#CJK UNIFIED IDEOGRAPH
+0xE18F,0x7634, //#CJK UNIFIED IDEOGRAPH
+0xE190,0x7630, //#CJK UNIFIED IDEOGRAPH
+0xE191,0x763B, //#CJK UNIFIED IDEOGRAPH
+0xE192,0x7647, //#CJK UNIFIED IDEOGRAPH
+0xE193,0x7648, //#CJK UNIFIED IDEOGRAPH
+0xE194,0x7646, //#CJK UNIFIED IDEOGRAPH
+0xE195,0x765C, //#CJK UNIFIED IDEOGRAPH
+0xE196,0x7658, //#CJK UNIFIED IDEOGRAPH
+0xE197,0x7661, //#CJK UNIFIED IDEOGRAPH
+0xE198,0x7662, //#CJK UNIFIED IDEOGRAPH
+0xE199,0x7668, //#CJK UNIFIED IDEOGRAPH
+0xE19A,0x7669, //#CJK UNIFIED IDEOGRAPH
+0xE19B,0x766A, //#CJK UNIFIED IDEOGRAPH
+0xE19C,0x7667, //#CJK UNIFIED IDEOGRAPH
+0xE19D,0x766C, //#CJK UNIFIED IDEOGRAPH
+0xE19E,0x7670, //#CJK UNIFIED IDEOGRAPH
+0xE19F,0x7672, //#CJK UNIFIED IDEOGRAPH
+0xE1A0,0x7676, //#CJK UNIFIED IDEOGRAPH
+0xE1A1,0x7678, //#CJK UNIFIED IDEOGRAPH
+0xE1A2,0x767C, //#CJK UNIFIED IDEOGRAPH
+0xE1A3,0x7680, //#CJK UNIFIED IDEOGRAPH
+0xE1A4,0x7683, //#CJK UNIFIED IDEOGRAPH
+0xE1A5,0x7688, //#CJK UNIFIED IDEOGRAPH
+0xE1A6,0x768B, //#CJK UNIFIED IDEOGRAPH
+0xE1A7,0x768E, //#CJK UNIFIED IDEOGRAPH
+0xE1A8,0x7696, //#CJK UNIFIED IDEOGRAPH
+0xE1A9,0x7693, //#CJK UNIFIED IDEOGRAPH
+0xE1AA,0x7699, //#CJK UNIFIED IDEOGRAPH
+0xE1AB,0x769A, //#CJK UNIFIED IDEOGRAPH
+0xE1AC,0x76B0, //#CJK UNIFIED IDEOGRAPH
+0xE1AD,0x76B4, //#CJK UNIFIED IDEOGRAPH
+0xE1AE,0x76B8, //#CJK UNIFIED IDEOGRAPH
+0xE1AF,0x76B9, //#CJK UNIFIED IDEOGRAPH
+0xE1B0,0x76BA, //#CJK UNIFIED IDEOGRAPH
+0xE1B1,0x76C2, //#CJK UNIFIED IDEOGRAPH
+0xE1B2,0x76CD, //#CJK UNIFIED IDEOGRAPH
+0xE1B3,0x76D6, //#CJK UNIFIED IDEOGRAPH
+0xE1B4,0x76D2, //#CJK UNIFIED IDEOGRAPH
+0xE1B5,0x76DE, //#CJK UNIFIED IDEOGRAPH
+0xE1B6,0x76E1, //#CJK UNIFIED IDEOGRAPH
+0xE1B7,0x76E5, //#CJK UNIFIED IDEOGRAPH
+0xE1B8,0x76E7, //#CJK UNIFIED IDEOGRAPH
+0xE1B9,0x76EA, //#CJK UNIFIED IDEOGRAPH
+0xE1BA,0x862F, //#CJK UNIFIED IDEOGRAPH
+0xE1BB,0x76FB, //#CJK UNIFIED IDEOGRAPH
+0xE1BC,0x7708, //#CJK UNIFIED IDEOGRAPH
+0xE1BD,0x7707, //#CJK UNIFIED IDEOGRAPH
+0xE1BE,0x7704, //#CJK UNIFIED IDEOGRAPH
+0xE1BF,0x7729, //#CJK UNIFIED IDEOGRAPH
+0xE1C0,0x7724, //#CJK UNIFIED IDEOGRAPH
+0xE1C1,0x771E, //#CJK UNIFIED IDEOGRAPH
+0xE1C2,0x7725, //#CJK UNIFIED IDEOGRAPH
+0xE1C3,0x7726, //#CJK UNIFIED IDEOGRAPH
+0xE1C4,0x771B, //#CJK UNIFIED IDEOGRAPH
+0xE1C5,0x7737, //#CJK UNIFIED IDEOGRAPH
+0xE1C6,0x7738, //#CJK UNIFIED IDEOGRAPH
+0xE1C7,0x7747, //#CJK UNIFIED IDEOGRAPH
+0xE1C8,0x775A, //#CJK UNIFIED IDEOGRAPH
+0xE1C9,0x7768, //#CJK UNIFIED IDEOGRAPH
+0xE1CA,0x776B, //#CJK UNIFIED IDEOGRAPH
+0xE1CB,0x775B, //#CJK UNIFIED IDEOGRAPH
+0xE1CC,0x7765, //#CJK UNIFIED IDEOGRAPH
+0xE1CD,0x777F, //#CJK UNIFIED IDEOGRAPH
+0xE1CE,0x777E, //#CJK UNIFIED IDEOGRAPH
+0xE1CF,0x7779, //#CJK UNIFIED IDEOGRAPH
+0xE1D0,0x778E, //#CJK UNIFIED IDEOGRAPH
+0xE1D1,0x778B, //#CJK UNIFIED IDEOGRAPH
+0xE1D2,0x7791, //#CJK UNIFIED IDEOGRAPH
+0xE1D3,0x77A0, //#CJK UNIFIED IDEOGRAPH
+0xE1D4,0x779E, //#CJK UNIFIED IDEOGRAPH
+0xE1D5,0x77B0, //#CJK UNIFIED IDEOGRAPH
+0xE1D6,0x77B6, //#CJK UNIFIED IDEOGRAPH
+0xE1D7,0x77B9, //#CJK UNIFIED IDEOGRAPH
+0xE1D8,0x77BF, //#CJK UNIFIED IDEOGRAPH
+0xE1D9,0x77BC, //#CJK UNIFIED IDEOGRAPH
+0xE1DA,0x77BD, //#CJK UNIFIED IDEOGRAPH
+0xE1DB,0x77BB, //#CJK UNIFIED IDEOGRAPH
+0xE1DC,0x77C7, //#CJK UNIFIED IDEOGRAPH
+0xE1DD,0x77CD, //#CJK UNIFIED IDEOGRAPH
+0xE1DE,0x77D7, //#CJK UNIFIED IDEOGRAPH
+0xE1DF,0x77DA, //#CJK UNIFIED IDEOGRAPH
+0xE1E0,0x77DC, //#CJK UNIFIED IDEOGRAPH
+0xE1E1,0x77E3, //#CJK UNIFIED IDEOGRAPH
+0xE1E2,0x77EE, //#CJK UNIFIED IDEOGRAPH
+0xE1E3,0x77FC, //#CJK UNIFIED IDEOGRAPH
+0xE1E4,0x780C, //#CJK UNIFIED IDEOGRAPH
+0xE1E5,0x7812, //#CJK UNIFIED IDEOGRAPH
+0xE1E6,0x7926, //#CJK UNIFIED IDEOGRAPH
+0xE1E7,0x7820, //#CJK UNIFIED IDEOGRAPH
+0xE1E8,0x792A, //#CJK UNIFIED IDEOGRAPH
+0xE1E9,0x7845, //#CJK UNIFIED IDEOGRAPH
+0xE1EA,0x788E, //#CJK UNIFIED IDEOGRAPH
+0xE1EB,0x7874, //#CJK UNIFIED IDEOGRAPH
+0xE1EC,0x7886, //#CJK UNIFIED IDEOGRAPH
+0xE1ED,0x787C, //#CJK UNIFIED IDEOGRAPH
+0xE1EE,0x789A, //#CJK UNIFIED IDEOGRAPH
+0xE1EF,0x788C, //#CJK UNIFIED IDEOGRAPH
+0xE1F0,0x78A3, //#CJK UNIFIED IDEOGRAPH
+0xE1F1,0x78B5, //#CJK UNIFIED IDEOGRAPH
+0xE1F2,0x78AA, //#CJK UNIFIED IDEOGRAPH
+0xE1F3,0x78AF, //#CJK UNIFIED IDEOGRAPH
+0xE1F4,0x78D1, //#CJK UNIFIED IDEOGRAPH
+0xE1F5,0x78C6, //#CJK UNIFIED IDEOGRAPH
+0xE1F6,0x78CB, //#CJK UNIFIED IDEOGRAPH
+0xE1F7,0x78D4, //#CJK UNIFIED IDEOGRAPH
+0xE1F8,0x78BE, //#CJK UNIFIED IDEOGRAPH
+0xE1F9,0x78BC, //#CJK UNIFIED IDEOGRAPH
+0xE1FA,0x78C5, //#CJK UNIFIED IDEOGRAPH
+0xE1FB,0x78CA, //#CJK UNIFIED IDEOGRAPH
+0xE1FC,0x78EC, //#CJK UNIFIED IDEOGRAPH
+0xE240,0x78E7, //#CJK UNIFIED IDEOGRAPH
+0xE241,0x78DA, //#CJK UNIFIED IDEOGRAPH
+0xE242,0x78FD, //#CJK UNIFIED IDEOGRAPH
+0xE243,0x78F4, //#CJK UNIFIED IDEOGRAPH
+0xE244,0x7907, //#CJK UNIFIED IDEOGRAPH
+0xE245,0x7912, //#CJK UNIFIED IDEOGRAPH
+0xE246,0x7911, //#CJK UNIFIED IDEOGRAPH
+0xE247,0x7919, //#CJK UNIFIED IDEOGRAPH
+0xE248,0x792C, //#CJK UNIFIED IDEOGRAPH
+0xE249,0x792B, //#CJK UNIFIED IDEOGRAPH
+0xE24A,0x7940, //#CJK UNIFIED IDEOGRAPH
+0xE24B,0x7960, //#CJK UNIFIED IDEOGRAPH
+0xE24C,0x7957, //#CJK UNIFIED IDEOGRAPH
+0xE24D,0x795F, //#CJK UNIFIED IDEOGRAPH
+0xE24E,0x795A, //#CJK UNIFIED IDEOGRAPH
+0xE24F,0x7955, //#CJK UNIFIED IDEOGRAPH
+0xE250,0x7953, //#CJK UNIFIED IDEOGRAPH
+0xE251,0x797A, //#CJK UNIFIED IDEOGRAPH
+0xE252,0x797F, //#CJK UNIFIED IDEOGRAPH
+0xE253,0x798A, //#CJK UNIFIED IDEOGRAPH
+0xE254,0x799D, //#CJK UNIFIED IDEOGRAPH
+0xE255,0x79A7, //#CJK UNIFIED IDEOGRAPH
+0xE256,0x9F4B, //#CJK UNIFIED IDEOGRAPH
+0xE257,0x79AA, //#CJK UNIFIED IDEOGRAPH
+0xE258,0x79AE, //#CJK UNIFIED IDEOGRAPH
+0xE259,0x79B3, //#CJK UNIFIED IDEOGRAPH
+0xE25A,0x79B9, //#CJK UNIFIED IDEOGRAPH
+0xE25B,0x79BA, //#CJK UNIFIED IDEOGRAPH
+0xE25C,0x79C9, //#CJK UNIFIED IDEOGRAPH
+0xE25D,0x79D5, //#CJK UNIFIED IDEOGRAPH
+0xE25E,0x79E7, //#CJK UNIFIED IDEOGRAPH
+0xE25F,0x79EC, //#CJK UNIFIED IDEOGRAPH
+0xE260,0x79E1, //#CJK UNIFIED IDEOGRAPH
+0xE261,0x79E3, //#CJK UNIFIED IDEOGRAPH
+0xE262,0x7A08, //#CJK UNIFIED IDEOGRAPH
+0xE263,0x7A0D, //#CJK UNIFIED IDEOGRAPH
+0xE264,0x7A18, //#CJK UNIFIED IDEOGRAPH
+0xE265,0x7A19, //#CJK UNIFIED IDEOGRAPH
+0xE266,0x7A20, //#CJK UNIFIED IDEOGRAPH
+0xE267,0x7A1F, //#CJK UNIFIED IDEOGRAPH
+0xE268,0x7980, //#CJK UNIFIED IDEOGRAPH
+0xE269,0x7A31, //#CJK UNIFIED IDEOGRAPH
+0xE26A,0x7A3B, //#CJK UNIFIED IDEOGRAPH
+0xE26B,0x7A3E, //#CJK UNIFIED IDEOGRAPH
+0xE26C,0x7A37, //#CJK UNIFIED IDEOGRAPH
+0xE26D,0x7A43, //#CJK UNIFIED IDEOGRAPH
+0xE26E,0x7A57, //#CJK UNIFIED IDEOGRAPH
+0xE26F,0x7A49, //#CJK UNIFIED IDEOGRAPH
+0xE270,0x7A61, //#CJK UNIFIED IDEOGRAPH
+0xE271,0x7A62, //#CJK UNIFIED IDEOGRAPH
+0xE272,0x7A69, //#CJK UNIFIED IDEOGRAPH
+0xE273,0x9F9D, //#CJK UNIFIED IDEOGRAPH
+0xE274,0x7A70, //#CJK UNIFIED IDEOGRAPH
+0xE275,0x7A79, //#CJK UNIFIED IDEOGRAPH
+0xE276,0x7A7D, //#CJK UNIFIED IDEOGRAPH
+0xE277,0x7A88, //#CJK UNIFIED IDEOGRAPH
+0xE278,0x7A97, //#CJK UNIFIED IDEOGRAPH
+0xE279,0x7A95, //#CJK UNIFIED IDEOGRAPH
+0xE27A,0x7A98, //#CJK UNIFIED IDEOGRAPH
+0xE27B,0x7A96, //#CJK UNIFIED IDEOGRAPH
+0xE27C,0x7AA9, //#CJK UNIFIED IDEOGRAPH
+0xE27D,0x7AC8, //#CJK UNIFIED IDEOGRAPH
+0xE27E,0x7AB0, //#CJK UNIFIED IDEOGRAPH
+0xE280,0x7AB6, //#CJK UNIFIED IDEOGRAPH
+0xE281,0x7AC5, //#CJK UNIFIED IDEOGRAPH
+0xE282,0x7AC4, //#CJK UNIFIED IDEOGRAPH
+0xE283,0x7ABF, //#CJK UNIFIED IDEOGRAPH
+0xE284,0x9083, //#CJK UNIFIED IDEOGRAPH
+0xE285,0x7AC7, //#CJK UNIFIED IDEOGRAPH
+0xE286,0x7ACA, //#CJK UNIFIED IDEOGRAPH
+0xE287,0x7ACD, //#CJK UNIFIED IDEOGRAPH
+0xE288,0x7ACF, //#CJK UNIFIED IDEOGRAPH
+0xE289,0x7AD5, //#CJK UNIFIED IDEOGRAPH
+0xE28A,0x7AD3, //#CJK UNIFIED IDEOGRAPH
+0xE28B,0x7AD9, //#CJK UNIFIED IDEOGRAPH
+0xE28C,0x7ADA, //#CJK UNIFIED IDEOGRAPH
+0xE28D,0x7ADD, //#CJK UNIFIED IDEOGRAPH
+0xE28E,0x7AE1, //#CJK UNIFIED IDEOGRAPH
+0xE28F,0x7AE2, //#CJK UNIFIED IDEOGRAPH
+0xE290,0x7AE6, //#CJK UNIFIED IDEOGRAPH
+0xE291,0x7AED, //#CJK UNIFIED IDEOGRAPH
+0xE292,0x7AF0, //#CJK UNIFIED IDEOGRAPH
+0xE293,0x7B02, //#CJK UNIFIED IDEOGRAPH
+0xE294,0x7B0F, //#CJK UNIFIED IDEOGRAPH
+0xE295,0x7B0A, //#CJK UNIFIED IDEOGRAPH
+0xE296,0x7B06, //#CJK UNIFIED IDEOGRAPH
+0xE297,0x7B33, //#CJK UNIFIED IDEOGRAPH
+0xE298,0x7B18, //#CJK UNIFIED IDEOGRAPH
+0xE299,0x7B19, //#CJK UNIFIED IDEOGRAPH
+0xE29A,0x7B1E, //#CJK UNIFIED IDEOGRAPH
+0xE29B,0x7B35, //#CJK UNIFIED IDEOGRAPH
+0xE29C,0x7B28, //#CJK UNIFIED IDEOGRAPH
+0xE29D,0x7B36, //#CJK UNIFIED IDEOGRAPH
+0xE29E,0x7B50, //#CJK UNIFIED IDEOGRAPH
+0xE29F,0x7B7A, //#CJK UNIFIED IDEOGRAPH
+0xE2A0,0x7B04, //#CJK UNIFIED IDEOGRAPH
+0xE2A1,0x7B4D, //#CJK UNIFIED IDEOGRAPH
+0xE2A2,0x7B0B, //#CJK UNIFIED IDEOGRAPH
+0xE2A3,0x7B4C, //#CJK UNIFIED IDEOGRAPH
+0xE2A4,0x7B45, //#CJK UNIFIED IDEOGRAPH
+0xE2A5,0x7B75, //#CJK UNIFIED IDEOGRAPH
+0xE2A6,0x7B65, //#CJK UNIFIED IDEOGRAPH
+0xE2A7,0x7B74, //#CJK UNIFIED IDEOGRAPH
+0xE2A8,0x7B67, //#CJK UNIFIED IDEOGRAPH
+0xE2A9,0x7B70, //#CJK UNIFIED IDEOGRAPH
+0xE2AA,0x7B71, //#CJK UNIFIED IDEOGRAPH
+0xE2AB,0x7B6C, //#CJK UNIFIED IDEOGRAPH
+0xE2AC,0x7B6E, //#CJK UNIFIED IDEOGRAPH
+0xE2AD,0x7B9D, //#CJK UNIFIED IDEOGRAPH
+0xE2AE,0x7B98, //#CJK UNIFIED IDEOGRAPH
+0xE2AF,0x7B9F, //#CJK UNIFIED IDEOGRAPH
+0xE2B0,0x7B8D, //#CJK UNIFIED IDEOGRAPH
+0xE2B1,0x7B9C, //#CJK UNIFIED IDEOGRAPH
+0xE2B2,0x7B9A, //#CJK UNIFIED IDEOGRAPH
+0xE2B3,0x7B8B, //#CJK UNIFIED IDEOGRAPH
+0xE2B4,0x7B92, //#CJK UNIFIED IDEOGRAPH
+0xE2B5,0x7B8F, //#CJK UNIFIED IDEOGRAPH
+0xE2B6,0x7B5D, //#CJK UNIFIED IDEOGRAPH
+0xE2B7,0x7B99, //#CJK UNIFIED IDEOGRAPH
+0xE2B8,0x7BCB, //#CJK UNIFIED IDEOGRAPH
+0xE2B9,0x7BC1, //#CJK UNIFIED IDEOGRAPH
+0xE2BA,0x7BCC, //#CJK UNIFIED IDEOGRAPH
+0xE2BB,0x7BCF, //#CJK UNIFIED IDEOGRAPH
+0xE2BC,0x7BB4, //#CJK UNIFIED IDEOGRAPH
+0xE2BD,0x7BC6, //#CJK UNIFIED IDEOGRAPH
+0xE2BE,0x7BDD, //#CJK UNIFIED IDEOGRAPH
+0xE2BF,0x7BE9, //#CJK UNIFIED IDEOGRAPH
+0xE2C0,0x7C11, //#CJK UNIFIED IDEOGRAPH
+0xE2C1,0x7C14, //#CJK UNIFIED IDEOGRAPH
+0xE2C2,0x7BE6, //#CJK UNIFIED IDEOGRAPH
+0xE2C3,0x7BE5, //#CJK UNIFIED IDEOGRAPH
+0xE2C4,0x7C60, //#CJK UNIFIED IDEOGRAPH
+0xE2C5,0x7C00, //#CJK UNIFIED IDEOGRAPH
+0xE2C6,0x7C07, //#CJK UNIFIED IDEOGRAPH
+0xE2C7,0x7C13, //#CJK UNIFIED IDEOGRAPH
+0xE2C8,0x7BF3, //#CJK UNIFIED IDEOGRAPH
+0xE2C9,0x7BF7, //#CJK UNIFIED IDEOGRAPH
+0xE2CA,0x7C17, //#CJK UNIFIED IDEOGRAPH
+0xE2CB,0x7C0D, //#CJK UNIFIED IDEOGRAPH
+0xE2CC,0x7BF6, //#CJK UNIFIED IDEOGRAPH
+0xE2CD,0x7C23, //#CJK UNIFIED IDEOGRAPH
+0xE2CE,0x7C27, //#CJK UNIFIED IDEOGRAPH
+0xE2CF,0x7C2A, //#CJK UNIFIED IDEOGRAPH
+0xE2D0,0x7C1F, //#CJK UNIFIED IDEOGRAPH
+0xE2D1,0x7C37, //#CJK UNIFIED IDEOGRAPH
+0xE2D2,0x7C2B, //#CJK UNIFIED IDEOGRAPH
+0xE2D3,0x7C3D, //#CJK UNIFIED IDEOGRAPH
+0xE2D4,0x7C4C, //#CJK UNIFIED IDEOGRAPH
+0xE2D5,0x7C43, //#CJK UNIFIED IDEOGRAPH
+0xE2D6,0x7C54, //#CJK UNIFIED IDEOGRAPH
+0xE2D7,0x7C4F, //#CJK UNIFIED IDEOGRAPH
+0xE2D8,0x7C40, //#CJK UNIFIED IDEOGRAPH
+0xE2D9,0x7C50, //#CJK UNIFIED IDEOGRAPH
+0xE2DA,0x7C58, //#CJK UNIFIED IDEOGRAPH
+0xE2DB,0x7C5F, //#CJK UNIFIED IDEOGRAPH
+0xE2DC,0x7C64, //#CJK UNIFIED IDEOGRAPH
+0xE2DD,0x7C56, //#CJK UNIFIED IDEOGRAPH
+0xE2DE,0x7C65, //#CJK UNIFIED IDEOGRAPH
+0xE2DF,0x7C6C, //#CJK UNIFIED IDEOGRAPH
+0xE2E0,0x7C75, //#CJK UNIFIED IDEOGRAPH
+0xE2E1,0x7C83, //#CJK UNIFIED IDEOGRAPH
+0xE2E2,0x7C90, //#CJK UNIFIED IDEOGRAPH
+0xE2E3,0x7CA4, //#CJK UNIFIED IDEOGRAPH
+0xE2E4,0x7CAD, //#CJK UNIFIED IDEOGRAPH
+0xE2E5,0x7CA2, //#CJK UNIFIED IDEOGRAPH
+0xE2E6,0x7CAB, //#CJK UNIFIED IDEOGRAPH
+0xE2E7,0x7CA1, //#CJK UNIFIED IDEOGRAPH
+0xE2E8,0x7CA8, //#CJK UNIFIED IDEOGRAPH
+0xE2E9,0x7CB3, //#CJK UNIFIED IDEOGRAPH
+0xE2EA,0x7CB2, //#CJK UNIFIED IDEOGRAPH
+0xE2EB,0x7CB1, //#CJK UNIFIED IDEOGRAPH
+0xE2EC,0x7CAE, //#CJK UNIFIED IDEOGRAPH
+0xE2ED,0x7CB9, //#CJK UNIFIED IDEOGRAPH
+0xE2EE,0x7CBD, //#CJK UNIFIED IDEOGRAPH
+0xE2EF,0x7CC0, //#CJK UNIFIED IDEOGRAPH
+0xE2F0,0x7CC5, //#CJK UNIFIED IDEOGRAPH
+0xE2F1,0x7CC2, //#CJK UNIFIED IDEOGRAPH
+0xE2F2,0x7CD8, //#CJK UNIFIED IDEOGRAPH
+0xE2F3,0x7CD2, //#CJK UNIFIED IDEOGRAPH
+0xE2F4,0x7CDC, //#CJK UNIFIED IDEOGRAPH
+0xE2F5,0x7CE2, //#CJK UNIFIED IDEOGRAPH
+0xE2F6,0x9B3B, //#CJK UNIFIED IDEOGRAPH
+0xE2F7,0x7CEF, //#CJK UNIFIED IDEOGRAPH
+0xE2F8,0x7CF2, //#CJK UNIFIED IDEOGRAPH
+0xE2F9,0x7CF4, //#CJK UNIFIED IDEOGRAPH
+0xE2FA,0x7CF6, //#CJK UNIFIED IDEOGRAPH
+0xE2FB,0x7CFA, //#CJK UNIFIED IDEOGRAPH
+0xE2FC,0x7D06, //#CJK UNIFIED IDEOGRAPH
+0xE340,0x7D02, //#CJK UNIFIED IDEOGRAPH
+0xE341,0x7D1C, //#CJK UNIFIED IDEOGRAPH
+0xE342,0x7D15, //#CJK UNIFIED IDEOGRAPH
+0xE343,0x7D0A, //#CJK UNIFIED IDEOGRAPH
+0xE344,0x7D45, //#CJK UNIFIED IDEOGRAPH
+0xE345,0x7D4B, //#CJK UNIFIED IDEOGRAPH
+0xE346,0x7D2E, //#CJK UNIFIED IDEOGRAPH
+0xE347,0x7D32, //#CJK UNIFIED IDEOGRAPH
+0xE348,0x7D3F, //#CJK UNIFIED IDEOGRAPH
+0xE349,0x7D35, //#CJK UNIFIED IDEOGRAPH
+0xE34A,0x7D46, //#CJK UNIFIED IDEOGRAPH
+0xE34B,0x7D73, //#CJK UNIFIED IDEOGRAPH
+0xE34C,0x7D56, //#CJK UNIFIED IDEOGRAPH
+0xE34D,0x7D4E, //#CJK UNIFIED IDEOGRAPH
+0xE34E,0x7D72, //#CJK UNIFIED IDEOGRAPH
+0xE34F,0x7D68, //#CJK UNIFIED IDEOGRAPH
+0xE350,0x7D6E, //#CJK UNIFIED IDEOGRAPH
+0xE351,0x7D4F, //#CJK UNIFIED IDEOGRAPH
+0xE352,0x7D63, //#CJK UNIFIED IDEOGRAPH
+0xE353,0x7D93, //#CJK UNIFIED IDEOGRAPH
+0xE354,0x7D89, //#CJK UNIFIED IDEOGRAPH
+0xE355,0x7D5B, //#CJK UNIFIED IDEOGRAPH
+0xE356,0x7D8F, //#CJK UNIFIED IDEOGRAPH
+0xE357,0x7D7D, //#CJK UNIFIED IDEOGRAPH
+0xE358,0x7D9B, //#CJK UNIFIED IDEOGRAPH
+0xE359,0x7DBA, //#CJK UNIFIED IDEOGRAPH
+0xE35A,0x7DAE, //#CJK UNIFIED IDEOGRAPH
+0xE35B,0x7DA3, //#CJK UNIFIED IDEOGRAPH
+0xE35C,0x7DB5, //#CJK UNIFIED IDEOGRAPH
+0xE35D,0x7DC7, //#CJK UNIFIED IDEOGRAPH
+0xE35E,0x7DBD, //#CJK UNIFIED IDEOGRAPH
+0xE35F,0x7DAB, //#CJK UNIFIED IDEOGRAPH
+0xE360,0x7E3D, //#CJK UNIFIED IDEOGRAPH
+0xE361,0x7DA2, //#CJK UNIFIED IDEOGRAPH
+0xE362,0x7DAF, //#CJK UNIFIED IDEOGRAPH
+0xE363,0x7DDC, //#CJK UNIFIED IDEOGRAPH
+0xE364,0x7DB8, //#CJK UNIFIED IDEOGRAPH
+0xE365,0x7D9F, //#CJK UNIFIED IDEOGRAPH
+0xE366,0x7DB0, //#CJK UNIFIED IDEOGRAPH
+0xE367,0x7DD8, //#CJK UNIFIED IDEOGRAPH
+0xE368,0x7DDD, //#CJK UNIFIED IDEOGRAPH
+0xE369,0x7DE4, //#CJK UNIFIED IDEOGRAPH
+0xE36A,0x7DDE, //#CJK UNIFIED IDEOGRAPH
+0xE36B,0x7DFB, //#CJK UNIFIED IDEOGRAPH
+0xE36C,0x7DF2, //#CJK UNIFIED IDEOGRAPH
+0xE36D,0x7DE1, //#CJK UNIFIED IDEOGRAPH
+0xE36E,0x7E05, //#CJK UNIFIED IDEOGRAPH
+0xE36F,0x7E0A, //#CJK UNIFIED IDEOGRAPH
+0xE370,0x7E23, //#CJK UNIFIED IDEOGRAPH
+0xE371,0x7E21, //#CJK UNIFIED IDEOGRAPH
+0xE372,0x7E12, //#CJK UNIFIED IDEOGRAPH
+0xE373,0x7E31, //#CJK UNIFIED IDEOGRAPH
+0xE374,0x7E1F, //#CJK UNIFIED IDEOGRAPH
+0xE375,0x7E09, //#CJK UNIFIED IDEOGRAPH
+0xE376,0x7E0B, //#CJK UNIFIED IDEOGRAPH
+0xE377,0x7E22, //#CJK UNIFIED IDEOGRAPH
+0xE378,0x7E46, //#CJK UNIFIED IDEOGRAPH
+0xE379,0x7E66, //#CJK UNIFIED IDEOGRAPH
+0xE37A,0x7E3B, //#CJK UNIFIED IDEOGRAPH
+0xE37B,0x7E35, //#CJK UNIFIED IDEOGRAPH
+0xE37C,0x7E39, //#CJK UNIFIED IDEOGRAPH
+0xE37D,0x7E43, //#CJK UNIFIED IDEOGRAPH
+0xE37E,0x7E37, //#CJK UNIFIED IDEOGRAPH
+0xE380,0x7E32, //#CJK UNIFIED IDEOGRAPH
+0xE381,0x7E3A, //#CJK UNIFIED IDEOGRAPH
+0xE382,0x7E67, //#CJK UNIFIED IDEOGRAPH
+0xE383,0x7E5D, //#CJK UNIFIED IDEOGRAPH
+0xE384,0x7E56, //#CJK UNIFIED IDEOGRAPH
+0xE385,0x7E5E, //#CJK UNIFIED IDEOGRAPH
+0xE386,0x7E59, //#CJK UNIFIED IDEOGRAPH
+0xE387,0x7E5A, //#CJK UNIFIED IDEOGRAPH
+0xE388,0x7E79, //#CJK UNIFIED IDEOGRAPH
+0xE389,0x7E6A, //#CJK UNIFIED IDEOGRAPH
+0xE38A,0x7E69, //#CJK UNIFIED IDEOGRAPH
+0xE38B,0x7E7C, //#CJK UNIFIED IDEOGRAPH
+0xE38C,0x7E7B, //#CJK UNIFIED IDEOGRAPH
+0xE38D,0x7E83, //#CJK UNIFIED IDEOGRAPH
+0xE38E,0x7DD5, //#CJK UNIFIED IDEOGRAPH
+0xE38F,0x7E7D, //#CJK UNIFIED IDEOGRAPH
+0xE390,0x8FAE, //#CJK UNIFIED IDEOGRAPH
+0xE391,0x7E7F, //#CJK UNIFIED IDEOGRAPH
+0xE392,0x7E88, //#CJK UNIFIED IDEOGRAPH
+0xE393,0x7E89, //#CJK UNIFIED IDEOGRAPH
+0xE394,0x7E8C, //#CJK UNIFIED IDEOGRAPH
+0xE395,0x7E92, //#CJK UNIFIED IDEOGRAPH
+0xE396,0x7E90, //#CJK UNIFIED IDEOGRAPH
+0xE397,0x7E93, //#CJK UNIFIED IDEOGRAPH
+0xE398,0x7E94, //#CJK UNIFIED IDEOGRAPH
+0xE399,0x7E96, //#CJK UNIFIED IDEOGRAPH
+0xE39A,0x7E8E, //#CJK UNIFIED IDEOGRAPH
+0xE39B,0x7E9B, //#CJK UNIFIED IDEOGRAPH
+0xE39C,0x7E9C, //#CJK UNIFIED IDEOGRAPH
+0xE39D,0x7F38, //#CJK UNIFIED IDEOGRAPH
+0xE39E,0x7F3A, //#CJK UNIFIED IDEOGRAPH
+0xE39F,0x7F45, //#CJK UNIFIED IDEOGRAPH
+0xE3A0,0x7F4C, //#CJK UNIFIED IDEOGRAPH
+0xE3A1,0x7F4D, //#CJK UNIFIED IDEOGRAPH
+0xE3A2,0x7F4E, //#CJK UNIFIED IDEOGRAPH
+0xE3A3,0x7F50, //#CJK UNIFIED IDEOGRAPH
+0xE3A4,0x7F51, //#CJK UNIFIED IDEOGRAPH
+0xE3A5,0x7F55, //#CJK UNIFIED IDEOGRAPH
+0xE3A6,0x7F54, //#CJK UNIFIED IDEOGRAPH
+0xE3A7,0x7F58, //#CJK UNIFIED IDEOGRAPH
+0xE3A8,0x7F5F, //#CJK UNIFIED IDEOGRAPH
+0xE3A9,0x7F60, //#CJK UNIFIED IDEOGRAPH
+0xE3AA,0x7F68, //#CJK UNIFIED IDEOGRAPH
+0xE3AB,0x7F69, //#CJK UNIFIED IDEOGRAPH
+0xE3AC,0x7F67, //#CJK UNIFIED IDEOGRAPH
+0xE3AD,0x7F78, //#CJK UNIFIED IDEOGRAPH
+0xE3AE,0x7F82, //#CJK UNIFIED IDEOGRAPH
+0xE3AF,0x7F86, //#CJK UNIFIED IDEOGRAPH
+0xE3B0,0x7F83, //#CJK UNIFIED IDEOGRAPH
+0xE3B1,0x7F88, //#CJK UNIFIED IDEOGRAPH
+0xE3B2,0x7F87, //#CJK UNIFIED IDEOGRAPH
+0xE3B3,0x7F8C, //#CJK UNIFIED IDEOGRAPH
+0xE3B4,0x7F94, //#CJK UNIFIED IDEOGRAPH
+0xE3B5,0x7F9E, //#CJK UNIFIED IDEOGRAPH
+0xE3B6,0x7F9D, //#CJK UNIFIED IDEOGRAPH
+0xE3B7,0x7F9A, //#CJK UNIFIED IDEOGRAPH
+0xE3B8,0x7FA3, //#CJK UNIFIED IDEOGRAPH
+0xE3B9,0x7FAF, //#CJK UNIFIED IDEOGRAPH
+0xE3BA,0x7FB2, //#CJK UNIFIED IDEOGRAPH
+0xE3BB,0x7FB9, //#CJK UNIFIED IDEOGRAPH
+0xE3BC,0x7FAE, //#CJK UNIFIED IDEOGRAPH
+0xE3BD,0x7FB6, //#CJK UNIFIED IDEOGRAPH
+0xE3BE,0x7FB8, //#CJK UNIFIED IDEOGRAPH
+0xE3BF,0x8B71, //#CJK UNIFIED IDEOGRAPH
+0xE3C0,0x7FC5, //#CJK UNIFIED IDEOGRAPH
+0xE3C1,0x7FC6, //#CJK UNIFIED IDEOGRAPH
+0xE3C2,0x7FCA, //#CJK UNIFIED IDEOGRAPH
+0xE3C3,0x7FD5, //#CJK UNIFIED IDEOGRAPH
+0xE3C4,0x7FD4, //#CJK UNIFIED IDEOGRAPH
+0xE3C5,0x7FE1, //#CJK UNIFIED IDEOGRAPH
+0xE3C6,0x7FE6, //#CJK UNIFIED IDEOGRAPH
+0xE3C7,0x7FE9, //#CJK UNIFIED IDEOGRAPH
+0xE3C8,0x7FF3, //#CJK UNIFIED IDEOGRAPH
+0xE3C9,0x7FF9, //#CJK UNIFIED IDEOGRAPH
+0xE3CA,0x98DC, //#CJK UNIFIED IDEOGRAPH
+0xE3CB,0x8006, //#CJK UNIFIED IDEOGRAPH
+0xE3CC,0x8004, //#CJK UNIFIED IDEOGRAPH
+0xE3CD,0x800B, //#CJK UNIFIED IDEOGRAPH
+0xE3CE,0x8012, //#CJK UNIFIED IDEOGRAPH
+0xE3CF,0x8018, //#CJK UNIFIED IDEOGRAPH
+0xE3D0,0x8019, //#CJK UNIFIED IDEOGRAPH
+0xE3D1,0x801C, //#CJK UNIFIED IDEOGRAPH
+0xE3D2,0x8021, //#CJK UNIFIED IDEOGRAPH
+0xE3D3,0x8028, //#CJK UNIFIED IDEOGRAPH
+0xE3D4,0x803F, //#CJK UNIFIED IDEOGRAPH
+0xE3D5,0x803B, //#CJK UNIFIED IDEOGRAPH
+0xE3D6,0x804A, //#CJK UNIFIED IDEOGRAPH
+0xE3D7,0x8046, //#CJK UNIFIED IDEOGRAPH
+0xE3D8,0x8052, //#CJK UNIFIED IDEOGRAPH
+0xE3D9,0x8058, //#CJK UNIFIED IDEOGRAPH
+0xE3DA,0x805A, //#CJK UNIFIED IDEOGRAPH
+0xE3DB,0x805F, //#CJK UNIFIED IDEOGRAPH
+0xE3DC,0x8062, //#CJK UNIFIED IDEOGRAPH
+0xE3DD,0x8068, //#CJK UNIFIED IDEOGRAPH
+0xE3DE,0x8073, //#CJK UNIFIED IDEOGRAPH
+0xE3DF,0x8072, //#CJK UNIFIED IDEOGRAPH
+0xE3E0,0x8070, //#CJK UNIFIED IDEOGRAPH
+0xE3E1,0x8076, //#CJK UNIFIED IDEOGRAPH
+0xE3E2,0x8079, //#CJK UNIFIED IDEOGRAPH
+0xE3E3,0x807D, //#CJK UNIFIED IDEOGRAPH
+0xE3E4,0x807F, //#CJK UNIFIED IDEOGRAPH
+0xE3E5,0x8084, //#CJK UNIFIED IDEOGRAPH
+0xE3E6,0x8086, //#CJK UNIFIED IDEOGRAPH
+0xE3E7,0x8085, //#CJK UNIFIED IDEOGRAPH
+0xE3E8,0x809B, //#CJK UNIFIED IDEOGRAPH
+0xE3E9,0x8093, //#CJK UNIFIED IDEOGRAPH
+0xE3EA,0x809A, //#CJK UNIFIED IDEOGRAPH
+0xE3EB,0x80AD, //#CJK UNIFIED IDEOGRAPH
+0xE3EC,0x5190, //#CJK UNIFIED IDEOGRAPH
+0xE3ED,0x80AC, //#CJK UNIFIED IDEOGRAPH
+0xE3EE,0x80DB, //#CJK UNIFIED IDEOGRAPH
+0xE3EF,0x80E5, //#CJK UNIFIED IDEOGRAPH
+0xE3F0,0x80D9, //#CJK UNIFIED IDEOGRAPH
+0xE3F1,0x80DD, //#CJK UNIFIED IDEOGRAPH
+0xE3F2,0x80C4, //#CJK UNIFIED IDEOGRAPH
+0xE3F3,0x80DA, //#CJK UNIFIED IDEOGRAPH
+0xE3F4,0x80D6, //#CJK UNIFIED IDEOGRAPH
+0xE3F5,0x8109, //#CJK UNIFIED IDEOGRAPH
+0xE3F6,0x80EF, //#CJK UNIFIED IDEOGRAPH
+0xE3F7,0x80F1, //#CJK UNIFIED IDEOGRAPH
+0xE3F8,0x811B, //#CJK UNIFIED IDEOGRAPH
+0xE3F9,0x8129, //#CJK UNIFIED IDEOGRAPH
+0xE3FA,0x8123, //#CJK UNIFIED IDEOGRAPH
+0xE3FB,0x812F, //#CJK UNIFIED IDEOGRAPH
+0xE3FC,0x814B, //#CJK UNIFIED IDEOGRAPH
+0xE440,0x968B, //#CJK UNIFIED IDEOGRAPH
+0xE441,0x8146, //#CJK UNIFIED IDEOGRAPH
+0xE442,0x813E, //#CJK UNIFIED IDEOGRAPH
+0xE443,0x8153, //#CJK UNIFIED IDEOGRAPH
+0xE444,0x8151, //#CJK UNIFIED IDEOGRAPH
+0xE445,0x80FC, //#CJK UNIFIED IDEOGRAPH
+0xE446,0x8171, //#CJK UNIFIED IDEOGRAPH
+0xE447,0x816E, //#CJK UNIFIED IDEOGRAPH
+0xE448,0x8165, //#CJK UNIFIED IDEOGRAPH
+0xE449,0x8166, //#CJK UNIFIED IDEOGRAPH
+0xE44A,0x8174, //#CJK UNIFIED IDEOGRAPH
+0xE44B,0x8183, //#CJK UNIFIED IDEOGRAPH
+0xE44C,0x8188, //#CJK UNIFIED IDEOGRAPH
+0xE44D,0x818A, //#CJK UNIFIED IDEOGRAPH
+0xE44E,0x8180, //#CJK UNIFIED IDEOGRAPH
+0xE44F,0x8182, //#CJK UNIFIED IDEOGRAPH
+0xE450,0x81A0, //#CJK UNIFIED IDEOGRAPH
+0xE451,0x8195, //#CJK UNIFIED IDEOGRAPH
+0xE452,0x81A4, //#CJK UNIFIED IDEOGRAPH
+0xE453,0x81A3, //#CJK UNIFIED IDEOGRAPH
+0xE454,0x815F, //#CJK UNIFIED IDEOGRAPH
+0xE455,0x8193, //#CJK UNIFIED IDEOGRAPH
+0xE456,0x81A9, //#CJK UNIFIED IDEOGRAPH
+0xE457,0x81B0, //#CJK UNIFIED IDEOGRAPH
+0xE458,0x81B5, //#CJK UNIFIED IDEOGRAPH
+0xE459,0x81BE, //#CJK UNIFIED IDEOGRAPH
+0xE45A,0x81B8, //#CJK UNIFIED IDEOGRAPH
+0xE45B,0x81BD, //#CJK UNIFIED IDEOGRAPH
+0xE45C,0x81C0, //#CJK UNIFIED IDEOGRAPH
+0xE45D,0x81C2, //#CJK UNIFIED IDEOGRAPH
+0xE45E,0x81BA, //#CJK UNIFIED IDEOGRAPH
+0xE45F,0x81C9, //#CJK UNIFIED IDEOGRAPH
+0xE460,0x81CD, //#CJK UNIFIED IDEOGRAPH
+0xE461,0x81D1, //#CJK UNIFIED IDEOGRAPH
+0xE462,0x81D9, //#CJK UNIFIED IDEOGRAPH
+0xE463,0x81D8, //#CJK UNIFIED IDEOGRAPH
+0xE464,0x81C8, //#CJK UNIFIED IDEOGRAPH
+0xE465,0x81DA, //#CJK UNIFIED IDEOGRAPH
+0xE466,0x81DF, //#CJK UNIFIED IDEOGRAPH
+0xE467,0x81E0, //#CJK UNIFIED IDEOGRAPH
+0xE468,0x81E7, //#CJK UNIFIED IDEOGRAPH
+0xE469,0x81FA, //#CJK UNIFIED IDEOGRAPH
+0xE46A,0x81FB, //#CJK UNIFIED IDEOGRAPH
+0xE46B,0x81FE, //#CJK UNIFIED IDEOGRAPH
+0xE46C,0x8201, //#CJK UNIFIED IDEOGRAPH
+0xE46D,0x8202, //#CJK UNIFIED IDEOGRAPH
+0xE46E,0x8205, //#CJK UNIFIED IDEOGRAPH
+0xE46F,0x8207, //#CJK UNIFIED IDEOGRAPH
+0xE470,0x820A, //#CJK UNIFIED IDEOGRAPH
+0xE471,0x820D, //#CJK UNIFIED IDEOGRAPH
+0xE472,0x8210, //#CJK UNIFIED IDEOGRAPH
+0xE473,0x8216, //#CJK UNIFIED IDEOGRAPH
+0xE474,0x8229, //#CJK UNIFIED IDEOGRAPH
+0xE475,0x822B, //#CJK UNIFIED IDEOGRAPH
+0xE476,0x8238, //#CJK UNIFIED IDEOGRAPH
+0xE477,0x8233, //#CJK UNIFIED IDEOGRAPH
+0xE478,0x8240, //#CJK UNIFIED IDEOGRAPH
+0xE479,0x8259, //#CJK UNIFIED IDEOGRAPH
+0xE47A,0x8258, //#CJK UNIFIED IDEOGRAPH
+0xE47B,0x825D, //#CJK UNIFIED IDEOGRAPH
+0xE47C,0x825A, //#CJK UNIFIED IDEOGRAPH
+0xE47D,0x825F, //#CJK UNIFIED IDEOGRAPH
+0xE47E,0x8264, //#CJK UNIFIED IDEOGRAPH
+0xE480,0x8262, //#CJK UNIFIED IDEOGRAPH
+0xE481,0x8268, //#CJK UNIFIED IDEOGRAPH
+0xE482,0x826A, //#CJK UNIFIED IDEOGRAPH
+0xE483,0x826B, //#CJK UNIFIED IDEOGRAPH
+0xE484,0x822E, //#CJK UNIFIED IDEOGRAPH
+0xE485,0x8271, //#CJK UNIFIED IDEOGRAPH
+0xE486,0x8277, //#CJK UNIFIED IDEOGRAPH
+0xE487,0x8278, //#CJK UNIFIED IDEOGRAPH
+0xE488,0x827E, //#CJK UNIFIED IDEOGRAPH
+0xE489,0x828D, //#CJK UNIFIED IDEOGRAPH
+0xE48A,0x8292, //#CJK UNIFIED IDEOGRAPH
+0xE48B,0x82AB, //#CJK UNIFIED IDEOGRAPH
+0xE48C,0x829F, //#CJK UNIFIED IDEOGRAPH
+0xE48D,0x82BB, //#CJK UNIFIED IDEOGRAPH
+0xE48E,0x82AC, //#CJK UNIFIED IDEOGRAPH
+0xE48F,0x82E1, //#CJK UNIFIED IDEOGRAPH
+0xE490,0x82E3, //#CJK UNIFIED IDEOGRAPH
+0xE491,0x82DF, //#CJK UNIFIED IDEOGRAPH
+0xE492,0x82D2, //#CJK UNIFIED IDEOGRAPH
+0xE493,0x82F4, //#CJK UNIFIED IDEOGRAPH
+0xE494,0x82F3, //#CJK UNIFIED IDEOGRAPH
+0xE495,0x82FA, //#CJK UNIFIED IDEOGRAPH
+0xE496,0x8393, //#CJK UNIFIED IDEOGRAPH
+0xE497,0x8303, //#CJK UNIFIED IDEOGRAPH
+0xE498,0x82FB, //#CJK UNIFIED IDEOGRAPH
+0xE499,0x82F9, //#CJK UNIFIED IDEOGRAPH
+0xE49A,0x82DE, //#CJK UNIFIED IDEOGRAPH
+0xE49B,0x8306, //#CJK UNIFIED IDEOGRAPH
+0xE49C,0x82DC, //#CJK UNIFIED IDEOGRAPH
+0xE49D,0x8309, //#CJK UNIFIED IDEOGRAPH
+0xE49E,0x82D9, //#CJK UNIFIED IDEOGRAPH
+0xE49F,0x8335, //#CJK UNIFIED IDEOGRAPH
+0xE4A0,0x8334, //#CJK UNIFIED IDEOGRAPH
+0xE4A1,0x8316, //#CJK UNIFIED IDEOGRAPH
+0xE4A2,0x8332, //#CJK UNIFIED IDEOGRAPH
+0xE4A3,0x8331, //#CJK UNIFIED IDEOGRAPH
+0xE4A4,0x8340, //#CJK UNIFIED IDEOGRAPH
+0xE4A5,0x8339, //#CJK UNIFIED IDEOGRAPH
+0xE4A6,0x8350, //#CJK UNIFIED IDEOGRAPH
+0xE4A7,0x8345, //#CJK UNIFIED IDEOGRAPH
+0xE4A8,0x832F, //#CJK UNIFIED IDEOGRAPH
+0xE4A9,0x832B, //#CJK UNIFIED IDEOGRAPH
+0xE4AA,0x8317, //#CJK UNIFIED IDEOGRAPH
+0xE4AB,0x8318, //#CJK UNIFIED IDEOGRAPH
+0xE4AC,0x8385, //#CJK UNIFIED IDEOGRAPH
+0xE4AD,0x839A, //#CJK UNIFIED IDEOGRAPH
+0xE4AE,0x83AA, //#CJK UNIFIED IDEOGRAPH
+0xE4AF,0x839F, //#CJK UNIFIED IDEOGRAPH
+0xE4B0,0x83A2, //#CJK UNIFIED IDEOGRAPH
+0xE4B1,0x8396, //#CJK UNIFIED IDEOGRAPH
+0xE4B2,0x8323, //#CJK UNIFIED IDEOGRAPH
+0xE4B3,0x838E, //#CJK UNIFIED IDEOGRAPH
+0xE4B4,0x8387, //#CJK UNIFIED IDEOGRAPH
+0xE4B5,0x838A, //#CJK UNIFIED IDEOGRAPH
+0xE4B6,0x837C, //#CJK UNIFIED IDEOGRAPH
+0xE4B7,0x83B5, //#CJK UNIFIED IDEOGRAPH
+0xE4B8,0x8373, //#CJK UNIFIED IDEOGRAPH
+0xE4B9,0x8375, //#CJK UNIFIED IDEOGRAPH
+0xE4BA,0x83A0, //#CJK UNIFIED IDEOGRAPH
+0xE4BB,0x8389, //#CJK UNIFIED IDEOGRAPH
+0xE4BC,0x83A8, //#CJK UNIFIED IDEOGRAPH
+0xE4BD,0x83F4, //#CJK UNIFIED IDEOGRAPH
+0xE4BE,0x8413, //#CJK UNIFIED IDEOGRAPH
+0xE4BF,0x83EB, //#CJK UNIFIED IDEOGRAPH
+0xE4C0,0x83CE, //#CJK UNIFIED IDEOGRAPH
+0xE4C1,0x83FD, //#CJK UNIFIED IDEOGRAPH
+0xE4C2,0x8403, //#CJK UNIFIED IDEOGRAPH
+0xE4C3,0x83D8, //#CJK UNIFIED IDEOGRAPH
+0xE4C4,0x840B, //#CJK UNIFIED IDEOGRAPH
+0xE4C5,0x83C1, //#CJK UNIFIED IDEOGRAPH
+0xE4C6,0x83F7, //#CJK UNIFIED IDEOGRAPH
+0xE4C7,0x8407, //#CJK UNIFIED IDEOGRAPH
+0xE4C8,0x83E0, //#CJK UNIFIED IDEOGRAPH
+0xE4C9,0x83F2, //#CJK UNIFIED IDEOGRAPH
+0xE4CA,0x840D, //#CJK UNIFIED IDEOGRAPH
+0xE4CB,0x8422, //#CJK UNIFIED IDEOGRAPH
+0xE4CC,0x8420, //#CJK UNIFIED IDEOGRAPH
+0xE4CD,0x83BD, //#CJK UNIFIED IDEOGRAPH
+0xE4CE,0x8438, //#CJK UNIFIED IDEOGRAPH
+0xE4CF,0x8506, //#CJK UNIFIED IDEOGRAPH
+0xE4D0,0x83FB, //#CJK UNIFIED IDEOGRAPH
+0xE4D1,0x846D, //#CJK UNIFIED IDEOGRAPH
+0xE4D2,0x842A, //#CJK UNIFIED IDEOGRAPH
+0xE4D3,0x843C, //#CJK UNIFIED IDEOGRAPH
+0xE4D4,0x855A, //#CJK UNIFIED IDEOGRAPH
+0xE4D5,0x8484, //#CJK UNIFIED IDEOGRAPH
+0xE4D6,0x8477, //#CJK UNIFIED IDEOGRAPH
+0xE4D7,0x846B, //#CJK UNIFIED IDEOGRAPH
+0xE4D8,0x84AD, //#CJK UNIFIED IDEOGRAPH
+0xE4D9,0x846E, //#CJK UNIFIED IDEOGRAPH
+0xE4DA,0x8482, //#CJK UNIFIED IDEOGRAPH
+0xE4DB,0x8469, //#CJK UNIFIED IDEOGRAPH
+0xE4DC,0x8446, //#CJK UNIFIED IDEOGRAPH
+0xE4DD,0x842C, //#CJK UNIFIED IDEOGRAPH
+0xE4DE,0x846F, //#CJK UNIFIED IDEOGRAPH
+0xE4DF,0x8479, //#CJK UNIFIED IDEOGRAPH
+0xE4E0,0x8435, //#CJK UNIFIED IDEOGRAPH
+0xE4E1,0x84CA, //#CJK UNIFIED IDEOGRAPH
+0xE4E2,0x8462, //#CJK UNIFIED IDEOGRAPH
+0xE4E3,0x84B9, //#CJK UNIFIED IDEOGRAPH
+0xE4E4,0x84BF, //#CJK UNIFIED IDEOGRAPH
+0xE4E5,0x849F, //#CJK UNIFIED IDEOGRAPH
+0xE4E6,0x84D9, //#CJK UNIFIED IDEOGRAPH
+0xE4E7,0x84CD, //#CJK UNIFIED IDEOGRAPH
+0xE4E8,0x84BB, //#CJK UNIFIED IDEOGRAPH
+0xE4E9,0x84DA, //#CJK UNIFIED IDEOGRAPH
+0xE4EA,0x84D0, //#CJK UNIFIED IDEOGRAPH
+0xE4EB,0x84C1, //#CJK UNIFIED IDEOGRAPH
+0xE4EC,0x84C6, //#CJK UNIFIED IDEOGRAPH
+0xE4ED,0x84D6, //#CJK UNIFIED IDEOGRAPH
+0xE4EE,0x84A1, //#CJK UNIFIED IDEOGRAPH
+0xE4EF,0x8521, //#CJK UNIFIED IDEOGRAPH
+0xE4F0,0x84FF, //#CJK UNIFIED IDEOGRAPH
+0xE4F1,0x84F4, //#CJK UNIFIED IDEOGRAPH
+0xE4F2,0x8517, //#CJK UNIFIED IDEOGRAPH
+0xE4F3,0x8518, //#CJK UNIFIED IDEOGRAPH
+0xE4F4,0x852C, //#CJK UNIFIED IDEOGRAPH
+0xE4F5,0x851F, //#CJK UNIFIED IDEOGRAPH
+0xE4F6,0x8515, //#CJK UNIFIED IDEOGRAPH
+0xE4F7,0x8514, //#CJK UNIFIED IDEOGRAPH
+0xE4F8,0x84FC, //#CJK UNIFIED IDEOGRAPH
+0xE4F9,0x8540, //#CJK UNIFIED IDEOGRAPH
+0xE4FA,0x8563, //#CJK UNIFIED IDEOGRAPH
+0xE4FB,0x8558, //#CJK UNIFIED IDEOGRAPH
+0xE4FC,0x8548, //#CJK UNIFIED IDEOGRAPH
+0xE540,0x8541, //#CJK UNIFIED IDEOGRAPH
+0xE541,0x8602, //#CJK UNIFIED IDEOGRAPH
+0xE542,0x854B, //#CJK UNIFIED IDEOGRAPH
+0xE543,0x8555, //#CJK UNIFIED IDEOGRAPH
+0xE544,0x8580, //#CJK UNIFIED IDEOGRAPH
+0xE545,0x85A4, //#CJK UNIFIED IDEOGRAPH
+0xE546,0x8588, //#CJK UNIFIED IDEOGRAPH
+0xE547,0x8591, //#CJK UNIFIED IDEOGRAPH
+0xE548,0x858A, //#CJK UNIFIED IDEOGRAPH
+0xE549,0x85A8, //#CJK UNIFIED IDEOGRAPH
+0xE54A,0x856D, //#CJK UNIFIED IDEOGRAPH
+0xE54B,0x8594, //#CJK UNIFIED IDEOGRAPH
+0xE54C,0x859B, //#CJK UNIFIED IDEOGRAPH
+0xE54D,0x85EA, //#CJK UNIFIED IDEOGRAPH
+0xE54E,0x8587, //#CJK UNIFIED IDEOGRAPH
+0xE54F,0x859C, //#CJK UNIFIED IDEOGRAPH
+0xE550,0x8577, //#CJK UNIFIED IDEOGRAPH
+0xE551,0x857E, //#CJK UNIFIED IDEOGRAPH
+0xE552,0x8590, //#CJK UNIFIED IDEOGRAPH
+0xE553,0x85C9, //#CJK UNIFIED IDEOGRAPH
+0xE554,0x85BA, //#CJK UNIFIED IDEOGRAPH
+0xE555,0x85CF, //#CJK UNIFIED IDEOGRAPH
+0xE556,0x85B9, //#CJK UNIFIED IDEOGRAPH
+0xE557,0x85D0, //#CJK UNIFIED IDEOGRAPH
+0xE558,0x85D5, //#CJK UNIFIED IDEOGRAPH
+0xE559,0x85DD, //#CJK UNIFIED IDEOGRAPH
+0xE55A,0x85E5, //#CJK UNIFIED IDEOGRAPH
+0xE55B,0x85DC, //#CJK UNIFIED IDEOGRAPH
+0xE55C,0x85F9, //#CJK UNIFIED IDEOGRAPH
+0xE55D,0x860A, //#CJK UNIFIED IDEOGRAPH
+0xE55E,0x8613, //#CJK UNIFIED IDEOGRAPH
+0xE55F,0x860B, //#CJK UNIFIED IDEOGRAPH
+0xE560,0x85FE, //#CJK UNIFIED IDEOGRAPH
+0xE561,0x85FA, //#CJK UNIFIED IDEOGRAPH
+0xE562,0x8606, //#CJK UNIFIED IDEOGRAPH
+0xE563,0x8622, //#CJK UNIFIED IDEOGRAPH
+0xE564,0x861A, //#CJK UNIFIED IDEOGRAPH
+0xE565,0x8630, //#CJK UNIFIED IDEOGRAPH
+0xE566,0x863F, //#CJK UNIFIED IDEOGRAPH
+0xE567,0x864D, //#CJK UNIFIED IDEOGRAPH
+0xE568,0x4E55, //#CJK UNIFIED IDEOGRAPH
+0xE569,0x8654, //#CJK UNIFIED IDEOGRAPH
+0xE56A,0x865F, //#CJK UNIFIED IDEOGRAPH
+0xE56B,0x8667, //#CJK UNIFIED IDEOGRAPH
+0xE56C,0x8671, //#CJK UNIFIED IDEOGRAPH
+0xE56D,0x8693, //#CJK UNIFIED IDEOGRAPH
+0xE56E,0x86A3, //#CJK UNIFIED IDEOGRAPH
+0xE56F,0x86A9, //#CJK UNIFIED IDEOGRAPH
+0xE570,0x86AA, //#CJK UNIFIED IDEOGRAPH
+0xE571,0x868B, //#CJK UNIFIED IDEOGRAPH
+0xE572,0x868C, //#CJK UNIFIED IDEOGRAPH
+0xE573,0x86B6, //#CJK UNIFIED IDEOGRAPH
+0xE574,0x86AF, //#CJK UNIFIED IDEOGRAPH
+0xE575,0x86C4, //#CJK UNIFIED IDEOGRAPH
+0xE576,0x86C6, //#CJK UNIFIED IDEOGRAPH
+0xE577,0x86B0, //#CJK UNIFIED IDEOGRAPH
+0xE578,0x86C9, //#CJK UNIFIED IDEOGRAPH
+0xE579,0x8823, //#CJK UNIFIED IDEOGRAPH
+0xE57A,0x86AB, //#CJK UNIFIED IDEOGRAPH
+0xE57B,0x86D4, //#CJK UNIFIED IDEOGRAPH
+0xE57C,0x86DE, //#CJK UNIFIED IDEOGRAPH
+0xE57D,0x86E9, //#CJK UNIFIED IDEOGRAPH
+0xE57E,0x86EC, //#CJK UNIFIED IDEOGRAPH
+0xE580,0x86DF, //#CJK UNIFIED IDEOGRAPH
+0xE581,0x86DB, //#CJK UNIFIED IDEOGRAPH
+0xE582,0x86EF, //#CJK UNIFIED IDEOGRAPH
+0xE583,0x8712, //#CJK UNIFIED IDEOGRAPH
+0xE584,0x8706, //#CJK UNIFIED IDEOGRAPH
+0xE585,0x8708, //#CJK UNIFIED IDEOGRAPH
+0xE586,0x8700, //#CJK UNIFIED IDEOGRAPH
+0xE587,0x8703, //#CJK UNIFIED IDEOGRAPH
+0xE588,0x86FB, //#CJK UNIFIED IDEOGRAPH
+0xE589,0x8711, //#CJK UNIFIED IDEOGRAPH
+0xE58A,0x8709, //#CJK UNIFIED IDEOGRAPH
+0xE58B,0x870D, //#CJK UNIFIED IDEOGRAPH
+0xE58C,0x86F9, //#CJK UNIFIED IDEOGRAPH
+0xE58D,0x870A, //#CJK UNIFIED IDEOGRAPH
+0xE58E,0x8734, //#CJK UNIFIED IDEOGRAPH
+0xE58F,0x873F, //#CJK UNIFIED IDEOGRAPH
+0xE590,0x8737, //#CJK UNIFIED IDEOGRAPH
+0xE591,0x873B, //#CJK UNIFIED IDEOGRAPH
+0xE592,0x8725, //#CJK UNIFIED IDEOGRAPH
+0xE593,0x8729, //#CJK UNIFIED IDEOGRAPH
+0xE594,0x871A, //#CJK UNIFIED IDEOGRAPH
+0xE595,0x8760, //#CJK UNIFIED IDEOGRAPH
+0xE596,0x875F, //#CJK UNIFIED IDEOGRAPH
+0xE597,0x8778, //#CJK UNIFIED IDEOGRAPH
+0xE598,0x874C, //#CJK UNIFIED IDEOGRAPH
+0xE599,0x874E, //#CJK UNIFIED IDEOGRAPH
+0xE59A,0x8774, //#CJK UNIFIED IDEOGRAPH
+0xE59B,0x8757, //#CJK UNIFIED IDEOGRAPH
+0xE59C,0x8768, //#CJK UNIFIED IDEOGRAPH
+0xE59D,0x876E, //#CJK UNIFIED IDEOGRAPH
+0xE59E,0x8759, //#CJK UNIFIED IDEOGRAPH
+0xE59F,0x8753, //#CJK UNIFIED IDEOGRAPH
+0xE5A0,0x8763, //#CJK UNIFIED IDEOGRAPH
+0xE5A1,0x876A, //#CJK UNIFIED IDEOGRAPH
+0xE5A2,0x8805, //#CJK UNIFIED IDEOGRAPH
+0xE5A3,0x87A2, //#CJK UNIFIED IDEOGRAPH
+0xE5A4,0x879F, //#CJK UNIFIED IDEOGRAPH
+0xE5A5,0x8782, //#CJK UNIFIED IDEOGRAPH
+0xE5A6,0x87AF, //#CJK UNIFIED IDEOGRAPH
+0xE5A7,0x87CB, //#CJK UNIFIED IDEOGRAPH
+0xE5A8,0x87BD, //#CJK UNIFIED IDEOGRAPH
+0xE5A9,0x87C0, //#CJK UNIFIED IDEOGRAPH
+0xE5AA,0x87D0, //#CJK UNIFIED IDEOGRAPH
+0xE5AB,0x96D6, //#CJK UNIFIED IDEOGRAPH
+0xE5AC,0x87AB, //#CJK UNIFIED IDEOGRAPH
+0xE5AD,0x87C4, //#CJK UNIFIED IDEOGRAPH
+0xE5AE,0x87B3, //#CJK UNIFIED IDEOGRAPH
+0xE5AF,0x87C7, //#CJK UNIFIED IDEOGRAPH
+0xE5B0,0x87C6, //#CJK UNIFIED IDEOGRAPH
+0xE5B1,0x87BB, //#CJK UNIFIED IDEOGRAPH
+0xE5B2,0x87EF, //#CJK UNIFIED IDEOGRAPH
+0xE5B3,0x87F2, //#CJK UNIFIED IDEOGRAPH
+0xE5B4,0x87E0, //#CJK UNIFIED IDEOGRAPH
+0xE5B5,0x880F, //#CJK UNIFIED IDEOGRAPH
+0xE5B6,0x880D, //#CJK UNIFIED IDEOGRAPH
+0xE5B7,0x87FE, //#CJK UNIFIED IDEOGRAPH
+0xE5B8,0x87F6, //#CJK UNIFIED IDEOGRAPH
+0xE5B9,0x87F7, //#CJK UNIFIED IDEOGRAPH
+0xE5BA,0x880E, //#CJK UNIFIED IDEOGRAPH
+0xE5BB,0x87D2, //#CJK UNIFIED IDEOGRAPH
+0xE5BC,0x8811, //#CJK UNIFIED IDEOGRAPH
+0xE5BD,0x8816, //#CJK UNIFIED IDEOGRAPH
+0xE5BE,0x8815, //#CJK UNIFIED IDEOGRAPH
+0xE5BF,0x8822, //#CJK UNIFIED IDEOGRAPH
+0xE5C0,0x8821, //#CJK UNIFIED IDEOGRAPH
+0xE5C1,0x8831, //#CJK UNIFIED IDEOGRAPH
+0xE5C2,0x8836, //#CJK UNIFIED IDEOGRAPH
+0xE5C3,0x8839, //#CJK UNIFIED IDEOGRAPH
+0xE5C4,0x8827, //#CJK UNIFIED IDEOGRAPH
+0xE5C5,0x883B, //#CJK UNIFIED IDEOGRAPH
+0xE5C6,0x8844, //#CJK UNIFIED IDEOGRAPH
+0xE5C7,0x8842, //#CJK UNIFIED IDEOGRAPH
+0xE5C8,0x8852, //#CJK UNIFIED IDEOGRAPH
+0xE5C9,0x8859, //#CJK UNIFIED IDEOGRAPH
+0xE5CA,0x885E, //#CJK UNIFIED IDEOGRAPH
+0xE5CB,0x8862, //#CJK UNIFIED IDEOGRAPH
+0xE5CC,0x886B, //#CJK UNIFIED IDEOGRAPH
+0xE5CD,0x8881, //#CJK UNIFIED IDEOGRAPH
+0xE5CE,0x887E, //#CJK UNIFIED IDEOGRAPH
+0xE5CF,0x889E, //#CJK UNIFIED IDEOGRAPH
+0xE5D0,0x8875, //#CJK UNIFIED IDEOGRAPH
+0xE5D1,0x887D, //#CJK UNIFIED IDEOGRAPH
+0xE5D2,0x88B5, //#CJK UNIFIED IDEOGRAPH
+0xE5D3,0x8872, //#CJK UNIFIED IDEOGRAPH
+0xE5D4,0x8882, //#CJK UNIFIED IDEOGRAPH
+0xE5D5,0x8897, //#CJK UNIFIED IDEOGRAPH
+0xE5D6,0x8892, //#CJK UNIFIED IDEOGRAPH
+0xE5D7,0x88AE, //#CJK UNIFIED IDEOGRAPH
+0xE5D8,0x8899, //#CJK UNIFIED IDEOGRAPH
+0xE5D9,0x88A2, //#CJK UNIFIED IDEOGRAPH
+0xE5DA,0x888D, //#CJK UNIFIED IDEOGRAPH
+0xE5DB,0x88A4, //#CJK UNIFIED IDEOGRAPH
+0xE5DC,0x88B0, //#CJK UNIFIED IDEOGRAPH
+0xE5DD,0x88BF, //#CJK UNIFIED IDEOGRAPH
+0xE5DE,0x88B1, //#CJK UNIFIED IDEOGRAPH
+0xE5DF,0x88C3, //#CJK UNIFIED IDEOGRAPH
+0xE5E0,0x88C4, //#CJK UNIFIED IDEOGRAPH
+0xE5E1,0x88D4, //#CJK UNIFIED IDEOGRAPH
+0xE5E2,0x88D8, //#CJK UNIFIED IDEOGRAPH
+0xE5E3,0x88D9, //#CJK UNIFIED IDEOGRAPH
+0xE5E4,0x88DD, //#CJK UNIFIED IDEOGRAPH
+0xE5E5,0x88F9, //#CJK UNIFIED IDEOGRAPH
+0xE5E6,0x8902, //#CJK UNIFIED IDEOGRAPH
+0xE5E7,0x88FC, //#CJK UNIFIED IDEOGRAPH
+0xE5E8,0x88F4, //#CJK UNIFIED IDEOGRAPH
+0xE5E9,0x88E8, //#CJK UNIFIED IDEOGRAPH
+0xE5EA,0x88F2, //#CJK UNIFIED IDEOGRAPH
+0xE5EB,0x8904, //#CJK UNIFIED IDEOGRAPH
+0xE5EC,0x890C, //#CJK UNIFIED IDEOGRAPH
+0xE5ED,0x890A, //#CJK UNIFIED IDEOGRAPH
+0xE5EE,0x8913, //#CJK UNIFIED IDEOGRAPH
+0xE5EF,0x8943, //#CJK UNIFIED IDEOGRAPH
+0xE5F0,0x891E, //#CJK UNIFIED IDEOGRAPH
+0xE5F1,0x8925, //#CJK UNIFIED IDEOGRAPH
+0xE5F2,0x892A, //#CJK UNIFIED IDEOGRAPH
+0xE5F3,0x892B, //#CJK UNIFIED IDEOGRAPH
+0xE5F4,0x8941, //#CJK UNIFIED IDEOGRAPH
+0xE5F5,0x8944, //#CJK UNIFIED IDEOGRAPH
+0xE5F6,0x893B, //#CJK UNIFIED IDEOGRAPH
+0xE5F7,0x8936, //#CJK UNIFIED IDEOGRAPH
+0xE5F8,0x8938, //#CJK UNIFIED IDEOGRAPH
+0xE5F9,0x894C, //#CJK UNIFIED IDEOGRAPH
+0xE5FA,0x891D, //#CJK UNIFIED IDEOGRAPH
+0xE5FB,0x8960, //#CJK UNIFIED IDEOGRAPH
+0xE5FC,0x895E, //#CJK UNIFIED IDEOGRAPH
+0xE640,0x8966, //#CJK UNIFIED IDEOGRAPH
+0xE641,0x8964, //#CJK UNIFIED IDEOGRAPH
+0xE642,0x896D, //#CJK UNIFIED IDEOGRAPH
+0xE643,0x896A, //#CJK UNIFIED IDEOGRAPH
+0xE644,0x896F, //#CJK UNIFIED IDEOGRAPH
+0xE645,0x8974, //#CJK UNIFIED IDEOGRAPH
+0xE646,0x8977, //#CJK UNIFIED IDEOGRAPH
+0xE647,0x897E, //#CJK UNIFIED IDEOGRAPH
+0xE648,0x8983, //#CJK UNIFIED IDEOGRAPH
+0xE649,0x8988, //#CJK UNIFIED IDEOGRAPH
+0xE64A,0x898A, //#CJK UNIFIED IDEOGRAPH
+0xE64B,0x8993, //#CJK UNIFIED IDEOGRAPH
+0xE64C,0x8998, //#CJK UNIFIED IDEOGRAPH
+0xE64D,0x89A1, //#CJK UNIFIED IDEOGRAPH
+0xE64E,0x89A9, //#CJK UNIFIED IDEOGRAPH
+0xE64F,0x89A6, //#CJK UNIFIED IDEOGRAPH
+0xE650,0x89AC, //#CJK UNIFIED IDEOGRAPH
+0xE651,0x89AF, //#CJK UNIFIED IDEOGRAPH
+0xE652,0x89B2, //#CJK UNIFIED IDEOGRAPH
+0xE653,0x89BA, //#CJK UNIFIED IDEOGRAPH
+0xE654,0x89BD, //#CJK UNIFIED IDEOGRAPH
+0xE655,0x89BF, //#CJK UNIFIED IDEOGRAPH
+0xE656,0x89C0, //#CJK UNIFIED IDEOGRAPH
+0xE657,0x89DA, //#CJK UNIFIED IDEOGRAPH
+0xE658,0x89DC, //#CJK UNIFIED IDEOGRAPH
+0xE659,0x89DD, //#CJK UNIFIED IDEOGRAPH
+0xE65A,0x89E7, //#CJK UNIFIED IDEOGRAPH
+0xE65B,0x89F4, //#CJK UNIFIED IDEOGRAPH
+0xE65C,0x89F8, //#CJK UNIFIED IDEOGRAPH
+0xE65D,0x8A03, //#CJK UNIFIED IDEOGRAPH
+0xE65E,0x8A16, //#CJK UNIFIED IDEOGRAPH
+0xE65F,0x8A10, //#CJK UNIFIED IDEOGRAPH
+0xE660,0x8A0C, //#CJK UNIFIED IDEOGRAPH
+0xE661,0x8A1B, //#CJK UNIFIED IDEOGRAPH
+0xE662,0x8A1D, //#CJK UNIFIED IDEOGRAPH
+0xE663,0x8A25, //#CJK UNIFIED IDEOGRAPH
+0xE664,0x8A36, //#CJK UNIFIED IDEOGRAPH
+0xE665,0x8A41, //#CJK UNIFIED IDEOGRAPH
+0xE666,0x8A5B, //#CJK UNIFIED IDEOGRAPH
+0xE667,0x8A52, //#CJK UNIFIED IDEOGRAPH
+0xE668,0x8A46, //#CJK UNIFIED IDEOGRAPH
+0xE669,0x8A48, //#CJK UNIFIED IDEOGRAPH
+0xE66A,0x8A7C, //#CJK UNIFIED IDEOGRAPH
+0xE66B,0x8A6D, //#CJK UNIFIED IDEOGRAPH
+0xE66C,0x8A6C, //#CJK UNIFIED IDEOGRAPH
+0xE66D,0x8A62, //#CJK UNIFIED IDEOGRAPH
+0xE66E,0x8A85, //#CJK UNIFIED IDEOGRAPH
+0xE66F,0x8A82, //#CJK UNIFIED IDEOGRAPH
+0xE670,0x8A84, //#CJK UNIFIED IDEOGRAPH
+0xE671,0x8AA8, //#CJK UNIFIED IDEOGRAPH
+0xE672,0x8AA1, //#CJK UNIFIED IDEOGRAPH
+0xE673,0x8A91, //#CJK UNIFIED IDEOGRAPH
+0xE674,0x8AA5, //#CJK UNIFIED IDEOGRAPH
+0xE675,0x8AA6, //#CJK UNIFIED IDEOGRAPH
+0xE676,0x8A9A, //#CJK UNIFIED IDEOGRAPH
+0xE677,0x8AA3, //#CJK UNIFIED IDEOGRAPH
+0xE678,0x8AC4, //#CJK UNIFIED IDEOGRAPH
+0xE679,0x8ACD, //#CJK UNIFIED IDEOGRAPH
+0xE67A,0x8AC2, //#CJK UNIFIED IDEOGRAPH
+0xE67B,0x8ADA, //#CJK UNIFIED IDEOGRAPH
+0xE67C,0x8AEB, //#CJK UNIFIED IDEOGRAPH
+0xE67D,0x8AF3, //#CJK UNIFIED IDEOGRAPH
+0xE67E,0x8AE7, //#CJK UNIFIED IDEOGRAPH
+0xE680,0x8AE4, //#CJK UNIFIED IDEOGRAPH
+0xE681,0x8AF1, //#CJK UNIFIED IDEOGRAPH
+0xE682,0x8B14, //#CJK UNIFIED IDEOGRAPH
+0xE683,0x8AE0, //#CJK UNIFIED IDEOGRAPH
+0xE684,0x8AE2, //#CJK UNIFIED IDEOGRAPH
+0xE685,0x8AF7, //#CJK UNIFIED IDEOGRAPH
+0xE686,0x8ADE, //#CJK UNIFIED IDEOGRAPH
+0xE687,0x8ADB, //#CJK UNIFIED IDEOGRAPH
+0xE688,0x8B0C, //#CJK UNIFIED IDEOGRAPH
+0xE689,0x8B07, //#CJK UNIFIED IDEOGRAPH
+0xE68A,0x8B1A, //#CJK UNIFIED IDEOGRAPH
+0xE68B,0x8AE1, //#CJK UNIFIED IDEOGRAPH
+0xE68C,0x8B16, //#CJK UNIFIED IDEOGRAPH
+0xE68D,0x8B10, //#CJK UNIFIED IDEOGRAPH
+0xE68E,0x8B17, //#CJK UNIFIED IDEOGRAPH
+0xE68F,0x8B20, //#CJK UNIFIED IDEOGRAPH
+0xE690,0x8B33, //#CJK UNIFIED IDEOGRAPH
+0xE691,0x97AB, //#CJK UNIFIED IDEOGRAPH
+0xE692,0x8B26, //#CJK UNIFIED IDEOGRAPH
+0xE693,0x8B2B, //#CJK UNIFIED IDEOGRAPH
+0xE694,0x8B3E, //#CJK UNIFIED IDEOGRAPH
+0xE695,0x8B28, //#CJK UNIFIED IDEOGRAPH
+0xE696,0x8B41, //#CJK UNIFIED IDEOGRAPH
+0xE697,0x8B4C, //#CJK UNIFIED IDEOGRAPH
+0xE698,0x8B4F, //#CJK UNIFIED IDEOGRAPH
+0xE699,0x8B4E, //#CJK UNIFIED IDEOGRAPH
+0xE69A,0x8B49, //#CJK UNIFIED IDEOGRAPH
+0xE69B,0x8B56, //#CJK UNIFIED IDEOGRAPH
+0xE69C,0x8B5B, //#CJK UNIFIED IDEOGRAPH
+0xE69D,0x8B5A, //#CJK UNIFIED IDEOGRAPH
+0xE69E,0x8B6B, //#CJK UNIFIED IDEOGRAPH
+0xE69F,0x8B5F, //#CJK UNIFIED IDEOGRAPH
+0xE6A0,0x8B6C, //#CJK UNIFIED IDEOGRAPH
+0xE6A1,0x8B6F, //#CJK UNIFIED IDEOGRAPH
+0xE6A2,0x8B74, //#CJK UNIFIED IDEOGRAPH
+0xE6A3,0x8B7D, //#CJK UNIFIED IDEOGRAPH
+0xE6A4,0x8B80, //#CJK UNIFIED IDEOGRAPH
+0xE6A5,0x8B8C, //#CJK UNIFIED IDEOGRAPH
+0xE6A6,0x8B8E, //#CJK UNIFIED IDEOGRAPH
+0xE6A7,0x8B92, //#CJK UNIFIED IDEOGRAPH
+0xE6A8,0x8B93, //#CJK UNIFIED IDEOGRAPH
+0xE6A9,0x8B96, //#CJK UNIFIED IDEOGRAPH
+0xE6AA,0x8B99, //#CJK UNIFIED IDEOGRAPH
+0xE6AB,0x8B9A, //#CJK UNIFIED IDEOGRAPH
+0xE6AC,0x8C3A, //#CJK UNIFIED IDEOGRAPH
+0xE6AD,0x8C41, //#CJK UNIFIED IDEOGRAPH
+0xE6AE,0x8C3F, //#CJK UNIFIED IDEOGRAPH
+0xE6AF,0x8C48, //#CJK UNIFIED IDEOGRAPH
+0xE6B0,0x8C4C, //#CJK UNIFIED IDEOGRAPH
+0xE6B1,0x8C4E, //#CJK UNIFIED IDEOGRAPH
+0xE6B2,0x8C50, //#CJK UNIFIED IDEOGRAPH
+0xE6B3,0x8C55, //#CJK UNIFIED IDEOGRAPH
+0xE6B4,0x8C62, //#CJK UNIFIED IDEOGRAPH
+0xE6B5,0x8C6C, //#CJK UNIFIED IDEOGRAPH
+0xE6B6,0x8C78, //#CJK UNIFIED IDEOGRAPH
+0xE6B7,0x8C7A, //#CJK UNIFIED IDEOGRAPH
+0xE6B8,0x8C82, //#CJK UNIFIED IDEOGRAPH
+0xE6B9,0x8C89, //#CJK UNIFIED IDEOGRAPH
+0xE6BA,0x8C85, //#CJK UNIFIED IDEOGRAPH
+0xE6BB,0x8C8A, //#CJK UNIFIED IDEOGRAPH
+0xE6BC,0x8C8D, //#CJK UNIFIED IDEOGRAPH
+0xE6BD,0x8C8E, //#CJK UNIFIED IDEOGRAPH
+0xE6BE,0x8C94, //#CJK UNIFIED IDEOGRAPH
+0xE6BF,0x8C7C, //#CJK UNIFIED IDEOGRAPH
+0xE6C0,0x8C98, //#CJK UNIFIED IDEOGRAPH
+0xE6C1,0x621D, //#CJK UNIFIED IDEOGRAPH
+0xE6C2,0x8CAD, //#CJK UNIFIED IDEOGRAPH
+0xE6C3,0x8CAA, //#CJK UNIFIED IDEOGRAPH
+0xE6C4,0x8CBD, //#CJK UNIFIED IDEOGRAPH
+0xE6C5,0x8CB2, //#CJK UNIFIED IDEOGRAPH
+0xE6C6,0x8CB3, //#CJK UNIFIED IDEOGRAPH
+0xE6C7,0x8CAE, //#CJK UNIFIED IDEOGRAPH
+0xE6C8,0x8CB6, //#CJK UNIFIED IDEOGRAPH
+0xE6C9,0x8CC8, //#CJK UNIFIED IDEOGRAPH
+0xE6CA,0x8CC1, //#CJK UNIFIED IDEOGRAPH
+0xE6CB,0x8CE4, //#CJK UNIFIED IDEOGRAPH
+0xE6CC,0x8CE3, //#CJK UNIFIED IDEOGRAPH
+0xE6CD,0x8CDA, //#CJK UNIFIED IDEOGRAPH
+0xE6CE,0x8CFD, //#CJK UNIFIED IDEOGRAPH
+0xE6CF,0x8CFA, //#CJK UNIFIED IDEOGRAPH
+0xE6D0,0x8CFB, //#CJK UNIFIED IDEOGRAPH
+0xE6D1,0x8D04, //#CJK UNIFIED IDEOGRAPH
+0xE6D2,0x8D05, //#CJK UNIFIED IDEOGRAPH
+0xE6D3,0x8D0A, //#CJK UNIFIED IDEOGRAPH
+0xE6D4,0x8D07, //#CJK UNIFIED IDEOGRAPH
+0xE6D5,0x8D0F, //#CJK UNIFIED IDEOGRAPH
+0xE6D6,0x8D0D, //#CJK UNIFIED IDEOGRAPH
+0xE6D7,0x8D10, //#CJK UNIFIED IDEOGRAPH
+0xE6D8,0x9F4E, //#CJK UNIFIED IDEOGRAPH
+0xE6D9,0x8D13, //#CJK UNIFIED IDEOGRAPH
+0xE6DA,0x8CCD, //#CJK UNIFIED IDEOGRAPH
+0xE6DB,0x8D14, //#CJK UNIFIED IDEOGRAPH
+0xE6DC,0x8D16, //#CJK UNIFIED IDEOGRAPH
+0xE6DD,0x8D67, //#CJK UNIFIED IDEOGRAPH
+0xE6DE,0x8D6D, //#CJK UNIFIED IDEOGRAPH
+0xE6DF,0x8D71, //#CJK UNIFIED IDEOGRAPH
+0xE6E0,0x8D73, //#CJK UNIFIED IDEOGRAPH
+0xE6E1,0x8D81, //#CJK UNIFIED IDEOGRAPH
+0xE6E2,0x8D99, //#CJK UNIFIED IDEOGRAPH
+0xE6E3,0x8DC2, //#CJK UNIFIED IDEOGRAPH
+0xE6E4,0x8DBE, //#CJK UNIFIED IDEOGRAPH
+0xE6E5,0x8DBA, //#CJK UNIFIED IDEOGRAPH
+0xE6E6,0x8DCF, //#CJK UNIFIED IDEOGRAPH
+0xE6E7,0x8DDA, //#CJK UNIFIED IDEOGRAPH
+0xE6E8,0x8DD6, //#CJK UNIFIED IDEOGRAPH
+0xE6E9,0x8DCC, //#CJK UNIFIED IDEOGRAPH
+0xE6EA,0x8DDB, //#CJK UNIFIED IDEOGRAPH
+0xE6EB,0x8DCB, //#CJK UNIFIED IDEOGRAPH
+0xE6EC,0x8DEA, //#CJK UNIFIED IDEOGRAPH
+0xE6ED,0x8DEB, //#CJK UNIFIED IDEOGRAPH
+0xE6EE,0x8DDF, //#CJK UNIFIED IDEOGRAPH
+0xE6EF,0x8DE3, //#CJK UNIFIED IDEOGRAPH
+0xE6F0,0x8DFC, //#CJK UNIFIED IDEOGRAPH
+0xE6F1,0x8E08, //#CJK UNIFIED IDEOGRAPH
+0xE6F2,0x8E09, //#CJK UNIFIED IDEOGRAPH
+0xE6F3,0x8DFF, //#CJK UNIFIED IDEOGRAPH
+0xE6F4,0x8E1D, //#CJK UNIFIED IDEOGRAPH
+0xE6F5,0x8E1E, //#CJK UNIFIED IDEOGRAPH
+0xE6F6,0x8E10, //#CJK UNIFIED IDEOGRAPH
+0xE6F7,0x8E1F, //#CJK UNIFIED IDEOGRAPH
+0xE6F8,0x8E42, //#CJK UNIFIED IDEOGRAPH
+0xE6F9,0x8E35, //#CJK UNIFIED IDEOGRAPH
+0xE6FA,0x8E30, //#CJK UNIFIED IDEOGRAPH
+0xE6FB,0x8E34, //#CJK UNIFIED IDEOGRAPH
+0xE6FC,0x8E4A, //#CJK UNIFIED IDEOGRAPH
+0xE740,0x8E47, //#CJK UNIFIED IDEOGRAPH
+0xE741,0x8E49, //#CJK UNIFIED IDEOGRAPH
+0xE742,0x8E4C, //#CJK UNIFIED IDEOGRAPH
+0xE743,0x8E50, //#CJK UNIFIED IDEOGRAPH
+0xE744,0x8E48, //#CJK UNIFIED IDEOGRAPH
+0xE745,0x8E59, //#CJK UNIFIED IDEOGRAPH
+0xE746,0x8E64, //#CJK UNIFIED IDEOGRAPH
+0xE747,0x8E60, //#CJK UNIFIED IDEOGRAPH
+0xE748,0x8E2A, //#CJK UNIFIED IDEOGRAPH
+0xE749,0x8E63, //#CJK UNIFIED IDEOGRAPH
+0xE74A,0x8E55, //#CJK UNIFIED IDEOGRAPH
+0xE74B,0x8E76, //#CJK UNIFIED IDEOGRAPH
+0xE74C,0x8E72, //#CJK UNIFIED IDEOGRAPH
+0xE74D,0x8E7C, //#CJK UNIFIED IDEOGRAPH
+0xE74E,0x8E81, //#CJK UNIFIED IDEOGRAPH
+0xE74F,0x8E87, //#CJK UNIFIED IDEOGRAPH
+0xE750,0x8E85, //#CJK UNIFIED IDEOGRAPH
+0xE751,0x8E84, //#CJK UNIFIED IDEOGRAPH
+0xE752,0x8E8B, //#CJK UNIFIED IDEOGRAPH
+0xE753,0x8E8A, //#CJK UNIFIED IDEOGRAPH
+0xE754,0x8E93, //#CJK UNIFIED IDEOGRAPH
+0xE755,0x8E91, //#CJK UNIFIED IDEOGRAPH
+0xE756,0x8E94, //#CJK UNIFIED IDEOGRAPH
+0xE757,0x8E99, //#CJK UNIFIED IDEOGRAPH
+0xE758,0x8EAA, //#CJK UNIFIED IDEOGRAPH
+0xE759,0x8EA1, //#CJK UNIFIED IDEOGRAPH
+0xE75A,0x8EAC, //#CJK UNIFIED IDEOGRAPH
+0xE75B,0x8EB0, //#CJK UNIFIED IDEOGRAPH
+0xE75C,0x8EC6, //#CJK UNIFIED IDEOGRAPH
+0xE75D,0x8EB1, //#CJK UNIFIED IDEOGRAPH
+0xE75E,0x8EBE, //#CJK UNIFIED IDEOGRAPH
+0xE75F,0x8EC5, //#CJK UNIFIED IDEOGRAPH
+0xE760,0x8EC8, //#CJK UNIFIED IDEOGRAPH
+0xE761,0x8ECB, //#CJK UNIFIED IDEOGRAPH
+0xE762,0x8EDB, //#CJK UNIFIED IDEOGRAPH
+0xE763,0x8EE3, //#CJK UNIFIED IDEOGRAPH
+0xE764,0x8EFC, //#CJK UNIFIED IDEOGRAPH
+0xE765,0x8EFB, //#CJK UNIFIED IDEOGRAPH
+0xE766,0x8EEB, //#CJK UNIFIED IDEOGRAPH
+0xE767,0x8EFE, //#CJK UNIFIED IDEOGRAPH
+0xE768,0x8F0A, //#CJK UNIFIED IDEOGRAPH
+0xE769,0x8F05, //#CJK UNIFIED IDEOGRAPH
+0xE76A,0x8F15, //#CJK UNIFIED IDEOGRAPH
+0xE76B,0x8F12, //#CJK UNIFIED IDEOGRAPH
+0xE76C,0x8F19, //#CJK UNIFIED IDEOGRAPH
+0xE76D,0x8F13, //#CJK UNIFIED IDEOGRAPH
+0xE76E,0x8F1C, //#CJK UNIFIED IDEOGRAPH
+0xE76F,0x8F1F, //#CJK UNIFIED IDEOGRAPH
+0xE770,0x8F1B, //#CJK UNIFIED IDEOGRAPH
+0xE771,0x8F0C, //#CJK UNIFIED IDEOGRAPH
+0xE772,0x8F26, //#CJK UNIFIED IDEOGRAPH
+0xE773,0x8F33, //#CJK UNIFIED IDEOGRAPH
+0xE774,0x8F3B, //#CJK UNIFIED IDEOGRAPH
+0xE775,0x8F39, //#CJK UNIFIED IDEOGRAPH
+0xE776,0x8F45, //#CJK UNIFIED IDEOGRAPH
+0xE777,0x8F42, //#CJK UNIFIED IDEOGRAPH
+0xE778,0x8F3E, //#CJK UNIFIED IDEOGRAPH
+0xE779,0x8F4C, //#CJK UNIFIED IDEOGRAPH
+0xE77A,0x8F49, //#CJK UNIFIED IDEOGRAPH
+0xE77B,0x8F46, //#CJK UNIFIED IDEOGRAPH
+0xE77C,0x8F4E, //#CJK UNIFIED IDEOGRAPH
+0xE77D,0x8F57, //#CJK UNIFIED IDEOGRAPH
+0xE77E,0x8F5C, //#CJK UNIFIED IDEOGRAPH
+0xE780,0x8F62, //#CJK UNIFIED IDEOGRAPH
+0xE781,0x8F63, //#CJK UNIFIED IDEOGRAPH
+0xE782,0x8F64, //#CJK UNIFIED IDEOGRAPH
+0xE783,0x8F9C, //#CJK UNIFIED IDEOGRAPH
+0xE784,0x8F9F, //#CJK UNIFIED IDEOGRAPH
+0xE785,0x8FA3, //#CJK UNIFIED IDEOGRAPH
+0xE786,0x8FAD, //#CJK UNIFIED IDEOGRAPH
+0xE787,0x8FAF, //#CJK UNIFIED IDEOGRAPH
+0xE788,0x8FB7, //#CJK UNIFIED IDEOGRAPH
+0xE789,0x8FDA, //#CJK UNIFIED IDEOGRAPH
+0xE78A,0x8FE5, //#CJK UNIFIED IDEOGRAPH
+0xE78B,0x8FE2, //#CJK UNIFIED IDEOGRAPH
+0xE78C,0x8FEA, //#CJK UNIFIED IDEOGRAPH
+0xE78D,0x8FEF, //#CJK UNIFIED IDEOGRAPH
+0xE78E,0x9087, //#CJK UNIFIED IDEOGRAPH
+0xE78F,0x8FF4, //#CJK UNIFIED IDEOGRAPH
+0xE790,0x9005, //#CJK UNIFIED IDEOGRAPH
+0xE791,0x8FF9, //#CJK UNIFIED IDEOGRAPH
+0xE792,0x8FFA, //#CJK UNIFIED IDEOGRAPH
+0xE793,0x9011, //#CJK UNIFIED IDEOGRAPH
+0xE794,0x9015, //#CJK UNIFIED IDEOGRAPH
+0xE795,0x9021, //#CJK UNIFIED IDEOGRAPH
+0xE796,0x900D, //#CJK UNIFIED IDEOGRAPH
+0xE797,0x901E, //#CJK UNIFIED IDEOGRAPH
+0xE798,0x9016, //#CJK UNIFIED IDEOGRAPH
+0xE799,0x900B, //#CJK UNIFIED IDEOGRAPH
+0xE79A,0x9027, //#CJK UNIFIED IDEOGRAPH
+0xE79B,0x9036, //#CJK UNIFIED IDEOGRAPH
+0xE79C,0x9035, //#CJK UNIFIED IDEOGRAPH
+0xE79D,0x9039, //#CJK UNIFIED IDEOGRAPH
+0xE79E,0x8FF8, //#CJK UNIFIED IDEOGRAPH
+0xE79F,0x904F, //#CJK UNIFIED IDEOGRAPH
+0xE7A0,0x9050, //#CJK UNIFIED IDEOGRAPH
+0xE7A1,0x9051, //#CJK UNIFIED IDEOGRAPH
+0xE7A2,0x9052, //#CJK UNIFIED IDEOGRAPH
+0xE7A3,0x900E, //#CJK UNIFIED IDEOGRAPH
+0xE7A4,0x9049, //#CJK UNIFIED IDEOGRAPH
+0xE7A5,0x903E, //#CJK UNIFIED IDEOGRAPH
+0xE7A6,0x9056, //#CJK UNIFIED IDEOGRAPH
+0xE7A7,0x9058, //#CJK UNIFIED IDEOGRAPH
+0xE7A8,0x905E, //#CJK UNIFIED IDEOGRAPH
+0xE7A9,0x9068, //#CJK UNIFIED IDEOGRAPH
+0xE7AA,0x906F, //#CJK UNIFIED IDEOGRAPH
+0xE7AB,0x9076, //#CJK UNIFIED IDEOGRAPH
+0xE7AC,0x96A8, //#CJK UNIFIED IDEOGRAPH
+0xE7AD,0x9072, //#CJK UNIFIED IDEOGRAPH
+0xE7AE,0x9082, //#CJK UNIFIED IDEOGRAPH
+0xE7AF,0x907D, //#CJK UNIFIED IDEOGRAPH
+0xE7B0,0x9081, //#CJK UNIFIED IDEOGRAPH
+0xE7B1,0x9080, //#CJK UNIFIED IDEOGRAPH
+0xE7B2,0x908A, //#CJK UNIFIED IDEOGRAPH
+0xE7B3,0x9089, //#CJK UNIFIED IDEOGRAPH
+0xE7B4,0x908F, //#CJK UNIFIED IDEOGRAPH
+0xE7B5,0x90A8, //#CJK UNIFIED IDEOGRAPH
+0xE7B6,0x90AF, //#CJK UNIFIED IDEOGRAPH
+0xE7B7,0x90B1, //#CJK UNIFIED IDEOGRAPH
+0xE7B8,0x90B5, //#CJK UNIFIED IDEOGRAPH
+0xE7B9,0x90E2, //#CJK UNIFIED IDEOGRAPH
+0xE7BA,0x90E4, //#CJK UNIFIED IDEOGRAPH
+0xE7BB,0x6248, //#CJK UNIFIED IDEOGRAPH
+0xE7BC,0x90DB, //#CJK UNIFIED IDEOGRAPH
+0xE7BD,0x9102, //#CJK UNIFIED IDEOGRAPH
+0xE7BE,0x9112, //#CJK UNIFIED IDEOGRAPH
+0xE7BF,0x9119, //#CJK UNIFIED IDEOGRAPH
+0xE7C0,0x9132, //#CJK UNIFIED IDEOGRAPH
+0xE7C1,0x9130, //#CJK UNIFIED IDEOGRAPH
+0xE7C2,0x914A, //#CJK UNIFIED IDEOGRAPH
+0xE7C3,0x9156, //#CJK UNIFIED IDEOGRAPH
+0xE7C4,0x9158, //#CJK UNIFIED IDEOGRAPH
+0xE7C5,0x9163, //#CJK UNIFIED IDEOGRAPH
+0xE7C6,0x9165, //#CJK UNIFIED IDEOGRAPH
+0xE7C7,0x9169, //#CJK UNIFIED IDEOGRAPH
+0xE7C8,0x9173, //#CJK UNIFIED IDEOGRAPH
+0xE7C9,0x9172, //#CJK UNIFIED IDEOGRAPH
+0xE7CA,0x918B, //#CJK UNIFIED IDEOGRAPH
+0xE7CB,0x9189, //#CJK UNIFIED IDEOGRAPH
+0xE7CC,0x9182, //#CJK UNIFIED IDEOGRAPH
+0xE7CD,0x91A2, //#CJK UNIFIED IDEOGRAPH
+0xE7CE,0x91AB, //#CJK UNIFIED IDEOGRAPH
+0xE7CF,0x91AF, //#CJK UNIFIED IDEOGRAPH
+0xE7D0,0x91AA, //#CJK UNIFIED IDEOGRAPH
+0xE7D1,0x91B5, //#CJK UNIFIED IDEOGRAPH
+0xE7D2,0x91B4, //#CJK UNIFIED IDEOGRAPH
+0xE7D3,0x91BA, //#CJK UNIFIED IDEOGRAPH
+0xE7D4,0x91C0, //#CJK UNIFIED IDEOGRAPH
+0xE7D5,0x91C1, //#CJK UNIFIED IDEOGRAPH
+0xE7D6,0x91C9, //#CJK UNIFIED IDEOGRAPH
+0xE7D7,0x91CB, //#CJK UNIFIED IDEOGRAPH
+0xE7D8,0x91D0, //#CJK UNIFIED IDEOGRAPH
+0xE7D9,0x91D6, //#CJK UNIFIED IDEOGRAPH
+0xE7DA,0x91DF, //#CJK UNIFIED IDEOGRAPH
+0xE7DB,0x91E1, //#CJK UNIFIED IDEOGRAPH
+0xE7DC,0x91DB, //#CJK UNIFIED IDEOGRAPH
+0xE7DD,0x91FC, //#CJK UNIFIED IDEOGRAPH
+0xE7DE,0x91F5, //#CJK UNIFIED IDEOGRAPH
+0xE7DF,0x91F6, //#CJK UNIFIED IDEOGRAPH
+0xE7E0,0x921E, //#CJK UNIFIED IDEOGRAPH
+0xE7E1,0x91FF, //#CJK UNIFIED IDEOGRAPH
+0xE7E2,0x9214, //#CJK UNIFIED IDEOGRAPH
+0xE7E3,0x922C, //#CJK UNIFIED IDEOGRAPH
+0xE7E4,0x9215, //#CJK UNIFIED IDEOGRAPH
+0xE7E5,0x9211, //#CJK UNIFIED IDEOGRAPH
+0xE7E6,0x925E, //#CJK UNIFIED IDEOGRAPH
+0xE7E7,0x9257, //#CJK UNIFIED IDEOGRAPH
+0xE7E8,0x9245, //#CJK UNIFIED IDEOGRAPH
+0xE7E9,0x9249, //#CJK UNIFIED IDEOGRAPH
+0xE7EA,0x9264, //#CJK UNIFIED IDEOGRAPH
+0xE7EB,0x9248, //#CJK UNIFIED IDEOGRAPH
+0xE7EC,0x9295, //#CJK UNIFIED IDEOGRAPH
+0xE7ED,0x923F, //#CJK UNIFIED IDEOGRAPH
+0xE7EE,0x924B, //#CJK UNIFIED IDEOGRAPH
+0xE7EF,0x9250, //#CJK UNIFIED IDEOGRAPH
+0xE7F0,0x929C, //#CJK UNIFIED IDEOGRAPH
+0xE7F1,0x9296, //#CJK UNIFIED IDEOGRAPH
+0xE7F2,0x9293, //#CJK UNIFIED IDEOGRAPH
+0xE7F3,0x929B, //#CJK UNIFIED IDEOGRAPH
+0xE7F4,0x925A, //#CJK UNIFIED IDEOGRAPH
+0xE7F5,0x92CF, //#CJK UNIFIED IDEOGRAPH
+0xE7F6,0x92B9, //#CJK UNIFIED IDEOGRAPH
+0xE7F7,0x92B7, //#CJK UNIFIED IDEOGRAPH
+0xE7F8,0x92E9, //#CJK UNIFIED IDEOGRAPH
+0xE7F9,0x930F, //#CJK UNIFIED IDEOGRAPH
+0xE7FA,0x92FA, //#CJK UNIFIED IDEOGRAPH
+0xE7FB,0x9344, //#CJK UNIFIED IDEOGRAPH
+0xE7FC,0x932E, //#CJK UNIFIED IDEOGRAPH
+0xE840,0x9319, //#CJK UNIFIED IDEOGRAPH
+0xE841,0x9322, //#CJK UNIFIED IDEOGRAPH
+0xE842,0x931A, //#CJK UNIFIED IDEOGRAPH
+0xE843,0x9323, //#CJK UNIFIED IDEOGRAPH
+0xE844,0x933A, //#CJK UNIFIED IDEOGRAPH
+0xE845,0x9335, //#CJK UNIFIED IDEOGRAPH
+0xE846,0x933B, //#CJK UNIFIED IDEOGRAPH
+0xE847,0x935C, //#CJK UNIFIED IDEOGRAPH
+0xE848,0x9360, //#CJK UNIFIED IDEOGRAPH
+0xE849,0x937C, //#CJK UNIFIED IDEOGRAPH
+0xE84A,0x936E, //#CJK UNIFIED IDEOGRAPH
+0xE84B,0x9356, //#CJK UNIFIED IDEOGRAPH
+0xE84C,0x93B0, //#CJK UNIFIED IDEOGRAPH
+0xE84D,0x93AC, //#CJK UNIFIED IDEOGRAPH
+0xE84E,0x93AD, //#CJK UNIFIED IDEOGRAPH
+0xE84F,0x9394, //#CJK UNIFIED IDEOGRAPH
+0xE850,0x93B9, //#CJK UNIFIED IDEOGRAPH
+0xE851,0x93D6, //#CJK UNIFIED IDEOGRAPH
+0xE852,0x93D7, //#CJK UNIFIED IDEOGRAPH
+0xE853,0x93E8, //#CJK UNIFIED IDEOGRAPH
+0xE854,0x93E5, //#CJK UNIFIED IDEOGRAPH
+0xE855,0x93D8, //#CJK UNIFIED IDEOGRAPH
+0xE856,0x93C3, //#CJK UNIFIED IDEOGRAPH
+0xE857,0x93DD, //#CJK UNIFIED IDEOGRAPH
+0xE858,0x93D0, //#CJK UNIFIED IDEOGRAPH
+0xE859,0x93C8, //#CJK UNIFIED IDEOGRAPH
+0xE85A,0x93E4, //#CJK UNIFIED IDEOGRAPH
+0xE85B,0x941A, //#CJK UNIFIED IDEOGRAPH
+0xE85C,0x9414, //#CJK UNIFIED IDEOGRAPH
+0xE85D,0x9413, //#CJK UNIFIED IDEOGRAPH
+0xE85E,0x9403, //#CJK UNIFIED IDEOGRAPH
+0xE85F,0x9407, //#CJK UNIFIED IDEOGRAPH
+0xE860,0x9410, //#CJK UNIFIED IDEOGRAPH
+0xE861,0x9436, //#CJK UNIFIED IDEOGRAPH
+0xE862,0x942B, //#CJK UNIFIED IDEOGRAPH
+0xE863,0x9435, //#CJK UNIFIED IDEOGRAPH
+0xE864,0x9421, //#CJK UNIFIED IDEOGRAPH
+0xE865,0x943A, //#CJK UNIFIED IDEOGRAPH
+0xE866,0x9441, //#CJK UNIFIED IDEOGRAPH
+0xE867,0x9452, //#CJK UNIFIED IDEOGRAPH
+0xE868,0x9444, //#CJK UNIFIED IDEOGRAPH
+0xE869,0x945B, //#CJK UNIFIED IDEOGRAPH
+0xE86A,0x9460, //#CJK UNIFIED IDEOGRAPH
+0xE86B,0x9462, //#CJK UNIFIED IDEOGRAPH
+0xE86C,0x945E, //#CJK UNIFIED IDEOGRAPH
+0xE86D,0x946A, //#CJK UNIFIED IDEOGRAPH
+0xE86E,0x9229, //#CJK UNIFIED IDEOGRAPH
+0xE86F,0x9470, //#CJK UNIFIED IDEOGRAPH
+0xE870,0x9475, //#CJK UNIFIED IDEOGRAPH
+0xE871,0x9477, //#CJK UNIFIED IDEOGRAPH
+0xE872,0x947D, //#CJK UNIFIED IDEOGRAPH
+0xE873,0x945A, //#CJK UNIFIED IDEOGRAPH
+0xE874,0x947C, //#CJK UNIFIED IDEOGRAPH
+0xE875,0x947E, //#CJK UNIFIED IDEOGRAPH
+0xE876,0x9481, //#CJK UNIFIED IDEOGRAPH
+0xE877,0x947F, //#CJK UNIFIED IDEOGRAPH
+0xE878,0x9582, //#CJK UNIFIED IDEOGRAPH
+0xE879,0x9587, //#CJK UNIFIED IDEOGRAPH
+0xE87A,0x958A, //#CJK UNIFIED IDEOGRAPH
+0xE87B,0x9594, //#CJK UNIFIED IDEOGRAPH
+0xE87C,0x9596, //#CJK UNIFIED IDEOGRAPH
+0xE87D,0x9598, //#CJK UNIFIED IDEOGRAPH
+0xE87E,0x9599, //#CJK UNIFIED IDEOGRAPH
+0xE880,0x95A0, //#CJK UNIFIED IDEOGRAPH
+0xE881,0x95A8, //#CJK UNIFIED IDEOGRAPH
+0xE882,0x95A7, //#CJK UNIFIED IDEOGRAPH
+0xE883,0x95AD, //#CJK UNIFIED IDEOGRAPH
+0xE884,0x95BC, //#CJK UNIFIED IDEOGRAPH
+0xE885,0x95BB, //#CJK UNIFIED IDEOGRAPH
+0xE886,0x95B9, //#CJK UNIFIED IDEOGRAPH
+0xE887,0x95BE, //#CJK UNIFIED IDEOGRAPH
+0xE888,0x95CA, //#CJK UNIFIED IDEOGRAPH
+0xE889,0x6FF6, //#CJK UNIFIED IDEOGRAPH
+0xE88A,0x95C3, //#CJK UNIFIED IDEOGRAPH
+0xE88B,0x95CD, //#CJK UNIFIED IDEOGRAPH
+0xE88C,0x95CC, //#CJK UNIFIED IDEOGRAPH
+0xE88D,0x95D5, //#CJK UNIFIED IDEOGRAPH
+0xE88E,0x95D4, //#CJK UNIFIED IDEOGRAPH
+0xE88F,0x95D6, //#CJK UNIFIED IDEOGRAPH
+0xE890,0x95DC, //#CJK UNIFIED IDEOGRAPH
+0xE891,0x95E1, //#CJK UNIFIED IDEOGRAPH
+0xE892,0x95E5, //#CJK UNIFIED IDEOGRAPH
+0xE893,0x95E2, //#CJK UNIFIED IDEOGRAPH
+0xE894,0x9621, //#CJK UNIFIED IDEOGRAPH
+0xE895,0x9628, //#CJK UNIFIED IDEOGRAPH
+0xE896,0x962E, //#CJK UNIFIED IDEOGRAPH
+0xE897,0x962F, //#CJK UNIFIED IDEOGRAPH
+0xE898,0x9642, //#CJK UNIFIED IDEOGRAPH
+0xE899,0x964C, //#CJK UNIFIED IDEOGRAPH
+0xE89A,0x964F, //#CJK UNIFIED IDEOGRAPH
+0xE89B,0x964B, //#CJK UNIFIED IDEOGRAPH
+0xE89C,0x9677, //#CJK UNIFIED IDEOGRAPH
+0xE89D,0x965C, //#CJK UNIFIED IDEOGRAPH
+0xE89E,0x965E, //#CJK UNIFIED IDEOGRAPH
+0xE89F,0x965D, //#CJK UNIFIED IDEOGRAPH
+0xE8A0,0x965F, //#CJK UNIFIED IDEOGRAPH
+0xE8A1,0x9666, //#CJK UNIFIED IDEOGRAPH
+0xE8A2,0x9672, //#CJK UNIFIED IDEOGRAPH
+0xE8A3,0x966C, //#CJK UNIFIED IDEOGRAPH
+0xE8A4,0x968D, //#CJK UNIFIED IDEOGRAPH
+0xE8A5,0x9698, //#CJK UNIFIED IDEOGRAPH
+0xE8A6,0x9695, //#CJK UNIFIED IDEOGRAPH
+0xE8A7,0x9697, //#CJK UNIFIED IDEOGRAPH
+0xE8A8,0x96AA, //#CJK UNIFIED IDEOGRAPH
+0xE8A9,0x96A7, //#CJK UNIFIED IDEOGRAPH
+0xE8AA,0x96B1, //#CJK UNIFIED IDEOGRAPH
+0xE8AB,0x96B2, //#CJK UNIFIED IDEOGRAPH
+0xE8AC,0x96B0, //#CJK UNIFIED IDEOGRAPH
+0xE8AD,0x96B4, //#CJK UNIFIED IDEOGRAPH
+0xE8AE,0x96B6, //#CJK UNIFIED IDEOGRAPH
+0xE8AF,0x96B8, //#CJK UNIFIED IDEOGRAPH
+0xE8B0,0x96B9, //#CJK UNIFIED IDEOGRAPH
+0xE8B1,0x96CE, //#CJK UNIFIED IDEOGRAPH
+0xE8B2,0x96CB, //#CJK UNIFIED IDEOGRAPH
+0xE8B3,0x96C9, //#CJK UNIFIED IDEOGRAPH
+0xE8B4,0x96CD, //#CJK UNIFIED IDEOGRAPH
+0xE8B5,0x894D, //#CJK UNIFIED IDEOGRAPH
+0xE8B6,0x96DC, //#CJK UNIFIED IDEOGRAPH
+0xE8B7,0x970D, //#CJK UNIFIED IDEOGRAPH
+0xE8B8,0x96D5, //#CJK UNIFIED IDEOGRAPH
+0xE8B9,0x96F9, //#CJK UNIFIED IDEOGRAPH
+0xE8BA,0x9704, //#CJK UNIFIED IDEOGRAPH
+0xE8BB,0x9706, //#CJK UNIFIED IDEOGRAPH
+0xE8BC,0x9708, //#CJK UNIFIED IDEOGRAPH
+0xE8BD,0x9713, //#CJK UNIFIED IDEOGRAPH
+0xE8BE,0x970E, //#CJK UNIFIED IDEOGRAPH
+0xE8BF,0x9711, //#CJK UNIFIED IDEOGRAPH
+0xE8C0,0x970F, //#CJK UNIFIED IDEOGRAPH
+0xE8C1,0x9716, //#CJK UNIFIED IDEOGRAPH
+0xE8C2,0x9719, //#CJK UNIFIED IDEOGRAPH
+0xE8C3,0x9724, //#CJK UNIFIED IDEOGRAPH
+0xE8C4,0x972A, //#CJK UNIFIED IDEOGRAPH
+0xE8C5,0x9730, //#CJK UNIFIED IDEOGRAPH
+0xE8C6,0x9739, //#CJK UNIFIED IDEOGRAPH
+0xE8C7,0x973D, //#CJK UNIFIED IDEOGRAPH
+0xE8C8,0x973E, //#CJK UNIFIED IDEOGRAPH
+0xE8C9,0x9744, //#CJK UNIFIED IDEOGRAPH
+0xE8CA,0x9746, //#CJK UNIFIED IDEOGRAPH
+0xE8CB,0x9748, //#CJK UNIFIED IDEOGRAPH
+0xE8CC,0x9742, //#CJK UNIFIED IDEOGRAPH
+0xE8CD,0x9749, //#CJK UNIFIED IDEOGRAPH
+0xE8CE,0x975C, //#CJK UNIFIED IDEOGRAPH
+0xE8CF,0x9760, //#CJK UNIFIED IDEOGRAPH
+0xE8D0,0x9764, //#CJK UNIFIED IDEOGRAPH
+0xE8D1,0x9766, //#CJK UNIFIED IDEOGRAPH
+0xE8D2,0x9768, //#CJK UNIFIED IDEOGRAPH
+0xE8D3,0x52D2, //#CJK UNIFIED IDEOGRAPH
+0xE8D4,0x976B, //#CJK UNIFIED IDEOGRAPH
+0xE8D5,0x9771, //#CJK UNIFIED IDEOGRAPH
+0xE8D6,0x9779, //#CJK UNIFIED IDEOGRAPH
+0xE8D7,0x9785, //#CJK UNIFIED IDEOGRAPH
+0xE8D8,0x977C, //#CJK UNIFIED IDEOGRAPH
+0xE8D9,0x9781, //#CJK UNIFIED IDEOGRAPH
+0xE8DA,0x977A, //#CJK UNIFIED IDEOGRAPH
+0xE8DB,0x9786, //#CJK UNIFIED IDEOGRAPH
+0xE8DC,0x978B, //#CJK UNIFIED IDEOGRAPH
+0xE8DD,0x978F, //#CJK UNIFIED IDEOGRAPH
+0xE8DE,0x9790, //#CJK UNIFIED IDEOGRAPH
+0xE8DF,0x979C, //#CJK UNIFIED IDEOGRAPH
+0xE8E0,0x97A8, //#CJK UNIFIED IDEOGRAPH
+0xE8E1,0x97A6, //#CJK UNIFIED IDEOGRAPH
+0xE8E2,0x97A3, //#CJK UNIFIED IDEOGRAPH
+0xE8E3,0x97B3, //#CJK UNIFIED IDEOGRAPH
+0xE8E4,0x97B4, //#CJK UNIFIED IDEOGRAPH
+0xE8E5,0x97C3, //#CJK UNIFIED IDEOGRAPH
+0xE8E6,0x97C6, //#CJK UNIFIED IDEOGRAPH
+0xE8E7,0x97C8, //#CJK UNIFIED IDEOGRAPH
+0xE8E8,0x97CB, //#CJK UNIFIED IDEOGRAPH
+0xE8E9,0x97DC, //#CJK UNIFIED IDEOGRAPH
+0xE8EA,0x97ED, //#CJK UNIFIED IDEOGRAPH
+0xE8EB,0x9F4F, //#CJK UNIFIED IDEOGRAPH
+0xE8EC,0x97F2, //#CJK UNIFIED IDEOGRAPH
+0xE8ED,0x7ADF, //#CJK UNIFIED IDEOGRAPH
+0xE8EE,0x97F6, //#CJK UNIFIED IDEOGRAPH
+0xE8EF,0x97F5, //#CJK UNIFIED IDEOGRAPH
+0xE8F0,0x980F, //#CJK UNIFIED IDEOGRAPH
+0xE8F1,0x980C, //#CJK UNIFIED IDEOGRAPH
+0xE8F2,0x9838, //#CJK UNIFIED IDEOGRAPH
+0xE8F3,0x9824, //#CJK UNIFIED IDEOGRAPH
+0xE8F4,0x9821, //#CJK UNIFIED IDEOGRAPH
+0xE8F5,0x9837, //#CJK UNIFIED IDEOGRAPH
+0xE8F6,0x983D, //#CJK UNIFIED IDEOGRAPH
+0xE8F7,0x9846, //#CJK UNIFIED IDEOGRAPH
+0xE8F8,0x984F, //#CJK UNIFIED IDEOGRAPH
+0xE8F9,0x984B, //#CJK UNIFIED IDEOGRAPH
+0xE8FA,0x986B, //#CJK UNIFIED IDEOGRAPH
+0xE8FB,0x986F, //#CJK UNIFIED IDEOGRAPH
+0xE8FC,0x9870, //#CJK UNIFIED IDEOGRAPH
+0xE940,0x9871, //#CJK UNIFIED IDEOGRAPH
+0xE941,0x9874, //#CJK UNIFIED IDEOGRAPH
+0xE942,0x9873, //#CJK UNIFIED IDEOGRAPH
+0xE943,0x98AA, //#CJK UNIFIED IDEOGRAPH
+0xE944,0x98AF, //#CJK UNIFIED IDEOGRAPH
+0xE945,0x98B1, //#CJK UNIFIED IDEOGRAPH
+0xE946,0x98B6, //#CJK UNIFIED IDEOGRAPH
+0xE947,0x98C4, //#CJK UNIFIED IDEOGRAPH
+0xE948,0x98C3, //#CJK UNIFIED IDEOGRAPH
+0xE949,0x98C6, //#CJK UNIFIED IDEOGRAPH
+0xE94A,0x98E9, //#CJK UNIFIED IDEOGRAPH
+0xE94B,0x98EB, //#CJK UNIFIED IDEOGRAPH
+0xE94C,0x9903, //#CJK UNIFIED IDEOGRAPH
+0xE94D,0x9909, //#CJK UNIFIED IDEOGRAPH
+0xE94E,0x9912, //#CJK UNIFIED IDEOGRAPH
+0xE94F,0x9914, //#CJK UNIFIED IDEOGRAPH
+0xE950,0x9918, //#CJK UNIFIED IDEOGRAPH
+0xE951,0x9921, //#CJK UNIFIED IDEOGRAPH
+0xE952,0x991D, //#CJK UNIFIED IDEOGRAPH
+0xE953,0x991E, //#CJK UNIFIED IDEOGRAPH
+0xE954,0x9924, //#CJK UNIFIED IDEOGRAPH
+0xE955,0x9920, //#CJK UNIFIED IDEOGRAPH
+0xE956,0x992C, //#CJK UNIFIED IDEOGRAPH
+0xE957,0x992E, //#CJK UNIFIED IDEOGRAPH
+0xE958,0x993D, //#CJK UNIFIED IDEOGRAPH
+0xE959,0x993E, //#CJK UNIFIED IDEOGRAPH
+0xE95A,0x9942, //#CJK UNIFIED IDEOGRAPH
+0xE95B,0x9949, //#CJK UNIFIED IDEOGRAPH
+0xE95C,0x9945, //#CJK UNIFIED IDEOGRAPH
+0xE95D,0x9950, //#CJK UNIFIED IDEOGRAPH
+0xE95E,0x994B, //#CJK UNIFIED IDEOGRAPH
+0xE95F,0x9951, //#CJK UNIFIED IDEOGRAPH
+0xE960,0x9952, //#CJK UNIFIED IDEOGRAPH
+0xE961,0x994C, //#CJK UNIFIED IDEOGRAPH
+0xE962,0x9955, //#CJK UNIFIED IDEOGRAPH
+0xE963,0x9997, //#CJK UNIFIED IDEOGRAPH
+0xE964,0x9998, //#CJK UNIFIED IDEOGRAPH
+0xE965,0x99A5, //#CJK UNIFIED IDEOGRAPH
+0xE966,0x99AD, //#CJK UNIFIED IDEOGRAPH
+0xE967,0x99AE, //#CJK UNIFIED IDEOGRAPH
+0xE968,0x99BC, //#CJK UNIFIED IDEOGRAPH
+0xE969,0x99DF, //#CJK UNIFIED IDEOGRAPH
+0xE96A,0x99DB, //#CJK UNIFIED IDEOGRAPH
+0xE96B,0x99DD, //#CJK UNIFIED IDEOGRAPH
+0xE96C,0x99D8, //#CJK UNIFIED IDEOGRAPH
+0xE96D,0x99D1, //#CJK UNIFIED IDEOGRAPH
+0xE96E,0x99ED, //#CJK UNIFIED IDEOGRAPH
+0xE96F,0x99EE, //#CJK UNIFIED IDEOGRAPH
+0xE970,0x99F1, //#CJK UNIFIED IDEOGRAPH
+0xE971,0x99F2, //#CJK UNIFIED IDEOGRAPH
+0xE972,0x99FB, //#CJK UNIFIED IDEOGRAPH
+0xE973,0x99F8, //#CJK UNIFIED IDEOGRAPH
+0xE974,0x9A01, //#CJK UNIFIED IDEOGRAPH
+0xE975,0x9A0F, //#CJK UNIFIED IDEOGRAPH
+0xE976,0x9A05, //#CJK UNIFIED IDEOGRAPH
+0xE977,0x99E2, //#CJK UNIFIED IDEOGRAPH
+0xE978,0x9A19, //#CJK UNIFIED IDEOGRAPH
+0xE979,0x9A2B, //#CJK UNIFIED IDEOGRAPH
+0xE97A,0x9A37, //#CJK UNIFIED IDEOGRAPH
+0xE97B,0x9A45, //#CJK UNIFIED IDEOGRAPH
+0xE97C,0x9A42, //#CJK UNIFIED IDEOGRAPH
+0xE97D,0x9A40, //#CJK UNIFIED IDEOGRAPH
+0xE97E,0x9A43, //#CJK UNIFIED IDEOGRAPH
+0xE980,0x9A3E, //#CJK UNIFIED IDEOGRAPH
+0xE981,0x9A55, //#CJK UNIFIED IDEOGRAPH
+0xE982,0x9A4D, //#CJK UNIFIED IDEOGRAPH
+0xE983,0x9A5B, //#CJK UNIFIED IDEOGRAPH
+0xE984,0x9A57, //#CJK UNIFIED IDEOGRAPH
+0xE985,0x9A5F, //#CJK UNIFIED IDEOGRAPH
+0xE986,0x9A62, //#CJK UNIFIED IDEOGRAPH
+0xE987,0x9A65, //#CJK UNIFIED IDEOGRAPH
+0xE988,0x9A64, //#CJK UNIFIED IDEOGRAPH
+0xE989,0x9A69, //#CJK UNIFIED IDEOGRAPH
+0xE98A,0x9A6B, //#CJK UNIFIED IDEOGRAPH
+0xE98B,0x9A6A, //#CJK UNIFIED IDEOGRAPH
+0xE98C,0x9AAD, //#CJK UNIFIED IDEOGRAPH
+0xE98D,0x9AB0, //#CJK UNIFIED IDEOGRAPH
+0xE98E,0x9ABC, //#CJK UNIFIED IDEOGRAPH
+0xE98F,0x9AC0, //#CJK UNIFIED IDEOGRAPH
+0xE990,0x9ACF, //#CJK UNIFIED IDEOGRAPH
+0xE991,0x9AD1, //#CJK UNIFIED IDEOGRAPH
+0xE992,0x9AD3, //#CJK UNIFIED IDEOGRAPH
+0xE993,0x9AD4, //#CJK UNIFIED IDEOGRAPH
+0xE994,0x9ADE, //#CJK UNIFIED IDEOGRAPH
+0xE995,0x9ADF, //#CJK UNIFIED IDEOGRAPH
+0xE996,0x9AE2, //#CJK UNIFIED IDEOGRAPH
+0xE997,0x9AE3, //#CJK UNIFIED IDEOGRAPH
+0xE998,0x9AE6, //#CJK UNIFIED IDEOGRAPH
+0xE999,0x9AEF, //#CJK UNIFIED IDEOGRAPH
+0xE99A,0x9AEB, //#CJK UNIFIED IDEOGRAPH
+0xE99B,0x9AEE, //#CJK UNIFIED IDEOGRAPH
+0xE99C,0x9AF4, //#CJK UNIFIED IDEOGRAPH
+0xE99D,0x9AF1, //#CJK UNIFIED IDEOGRAPH
+0xE99E,0x9AF7, //#CJK UNIFIED IDEOGRAPH
+0xE99F,0x9AFB, //#CJK UNIFIED IDEOGRAPH
+0xE9A0,0x9B06, //#CJK UNIFIED IDEOGRAPH
+0xE9A1,0x9B18, //#CJK UNIFIED IDEOGRAPH
+0xE9A2,0x9B1A, //#CJK UNIFIED IDEOGRAPH
+0xE9A3,0x9B1F, //#CJK UNIFIED IDEOGRAPH
+0xE9A4,0x9B22, //#CJK UNIFIED IDEOGRAPH
+0xE9A5,0x9B23, //#CJK UNIFIED IDEOGRAPH
+0xE9A6,0x9B25, //#CJK UNIFIED IDEOGRAPH
+0xE9A7,0x9B27, //#CJK UNIFIED IDEOGRAPH
+0xE9A8,0x9B28, //#CJK UNIFIED IDEOGRAPH
+0xE9A9,0x9B29, //#CJK UNIFIED IDEOGRAPH
+0xE9AA,0x9B2A, //#CJK UNIFIED IDEOGRAPH
+0xE9AB,0x9B2E, //#CJK UNIFIED IDEOGRAPH
+0xE9AC,0x9B2F, //#CJK UNIFIED IDEOGRAPH
+0xE9AD,0x9B32, //#CJK UNIFIED IDEOGRAPH
+0xE9AE,0x9B44, //#CJK UNIFIED IDEOGRAPH
+0xE9AF,0x9B43, //#CJK UNIFIED IDEOGRAPH
+0xE9B0,0x9B4F, //#CJK UNIFIED IDEOGRAPH
+0xE9B1,0x9B4D, //#CJK UNIFIED IDEOGRAPH
+0xE9B2,0x9B4E, //#CJK UNIFIED IDEOGRAPH
+0xE9B3,0x9B51, //#CJK UNIFIED IDEOGRAPH
+0xE9B4,0x9B58, //#CJK UNIFIED IDEOGRAPH
+0xE9B5,0x9B74, //#CJK UNIFIED IDEOGRAPH
+0xE9B6,0x9B93, //#CJK UNIFIED IDEOGRAPH
+0xE9B7,0x9B83, //#CJK UNIFIED IDEOGRAPH
+0xE9B8,0x9B91, //#CJK UNIFIED IDEOGRAPH
+0xE9B9,0x9B96, //#CJK UNIFIED IDEOGRAPH
+0xE9BA,0x9B97, //#CJK UNIFIED IDEOGRAPH
+0xE9BB,0x9B9F, //#CJK UNIFIED IDEOGRAPH
+0xE9BC,0x9BA0, //#CJK UNIFIED IDEOGRAPH
+0xE9BD,0x9BA8, //#CJK UNIFIED IDEOGRAPH
+0xE9BE,0x9BB4, //#CJK UNIFIED IDEOGRAPH
+0xE9BF,0x9BC0, //#CJK UNIFIED IDEOGRAPH
+0xE9C0,0x9BCA, //#CJK UNIFIED IDEOGRAPH
+0xE9C1,0x9BB9, //#CJK UNIFIED IDEOGRAPH
+0xE9C2,0x9BC6, //#CJK UNIFIED IDEOGRAPH
+0xE9C3,0x9BCF, //#CJK UNIFIED IDEOGRAPH
+0xE9C4,0x9BD1, //#CJK UNIFIED IDEOGRAPH
+0xE9C5,0x9BD2, //#CJK UNIFIED IDEOGRAPH
+0xE9C6,0x9BE3, //#CJK UNIFIED IDEOGRAPH
+0xE9C7,0x9BE2, //#CJK UNIFIED IDEOGRAPH
+0xE9C8,0x9BE4, //#CJK UNIFIED IDEOGRAPH
+0xE9C9,0x9BD4, //#CJK UNIFIED IDEOGRAPH
+0xE9CA,0x9BE1, //#CJK UNIFIED IDEOGRAPH
+0xE9CB,0x9C3A, //#CJK UNIFIED IDEOGRAPH
+0xE9CC,0x9BF2, //#CJK UNIFIED IDEOGRAPH
+0xE9CD,0x9BF1, //#CJK UNIFIED IDEOGRAPH
+0xE9CE,0x9BF0, //#CJK UNIFIED IDEOGRAPH
+0xE9CF,0x9C15, //#CJK UNIFIED IDEOGRAPH
+0xE9D0,0x9C14, //#CJK UNIFIED IDEOGRAPH
+0xE9D1,0x9C09, //#CJK UNIFIED IDEOGRAPH
+0xE9D2,0x9C13, //#CJK UNIFIED IDEOGRAPH
+0xE9D3,0x9C0C, //#CJK UNIFIED IDEOGRAPH
+0xE9D4,0x9C06, //#CJK UNIFIED IDEOGRAPH
+0xE9D5,0x9C08, //#CJK UNIFIED IDEOGRAPH
+0xE9D6,0x9C12, //#CJK UNIFIED IDEOGRAPH
+0xE9D7,0x9C0A, //#CJK UNIFIED IDEOGRAPH
+0xE9D8,0x9C04, //#CJK UNIFIED IDEOGRAPH
+0xE9D9,0x9C2E, //#CJK UNIFIED IDEOGRAPH
+0xE9DA,0x9C1B, //#CJK UNIFIED IDEOGRAPH
+0xE9DB,0x9C25, //#CJK UNIFIED IDEOGRAPH
+0xE9DC,0x9C24, //#CJK UNIFIED IDEOGRAPH
+0xE9DD,0x9C21, //#CJK UNIFIED IDEOGRAPH
+0xE9DE,0x9C30, //#CJK UNIFIED IDEOGRAPH
+0xE9DF,0x9C47, //#CJK UNIFIED IDEOGRAPH
+0xE9E0,0x9C32, //#CJK UNIFIED IDEOGRAPH
+0xE9E1,0x9C46, //#CJK UNIFIED IDEOGRAPH
+0xE9E2,0x9C3E, //#CJK UNIFIED IDEOGRAPH
+0xE9E3,0x9C5A, //#CJK UNIFIED IDEOGRAPH
+0xE9E4,0x9C60, //#CJK UNIFIED IDEOGRAPH
+0xE9E5,0x9C67, //#CJK UNIFIED IDEOGRAPH
+0xE9E6,0x9C76, //#CJK UNIFIED IDEOGRAPH
+0xE9E7,0x9C78, //#CJK UNIFIED IDEOGRAPH
+0xE9E8,0x9CE7, //#CJK UNIFIED IDEOGRAPH
+0xE9E9,0x9CEC, //#CJK UNIFIED IDEOGRAPH
+0xE9EA,0x9CF0, //#CJK UNIFIED IDEOGRAPH
+0xE9EB,0x9D09, //#CJK UNIFIED IDEOGRAPH
+0xE9EC,0x9D08, //#CJK UNIFIED IDEOGRAPH
+0xE9ED,0x9CEB, //#CJK UNIFIED IDEOGRAPH
+0xE9EE,0x9D03, //#CJK UNIFIED IDEOGRAPH
+0xE9EF,0x9D06, //#CJK UNIFIED IDEOGRAPH
+0xE9F0,0x9D2A, //#CJK UNIFIED IDEOGRAPH
+0xE9F1,0x9D26, //#CJK UNIFIED IDEOGRAPH
+0xE9F2,0x9DAF, //#CJK UNIFIED IDEOGRAPH
+0xE9F3,0x9D23, //#CJK UNIFIED IDEOGRAPH
+0xE9F4,0x9D1F, //#CJK UNIFIED IDEOGRAPH
+0xE9F5,0x9D44, //#CJK UNIFIED IDEOGRAPH
+0xE9F6,0x9D15, //#CJK UNIFIED IDEOGRAPH
+0xE9F7,0x9D12, //#CJK UNIFIED IDEOGRAPH
+0xE9F8,0x9D41, //#CJK UNIFIED IDEOGRAPH
+0xE9F9,0x9D3F, //#CJK UNIFIED IDEOGRAPH
+0xE9FA,0x9D3E, //#CJK UNIFIED IDEOGRAPH
+0xE9FB,0x9D46, //#CJK UNIFIED IDEOGRAPH
+0xE9FC,0x9D48, //#CJK UNIFIED IDEOGRAPH
+0xEA40,0x9D5D, //#CJK UNIFIED IDEOGRAPH
+0xEA41,0x9D5E, //#CJK UNIFIED IDEOGRAPH
+0xEA42,0x9D64, //#CJK UNIFIED IDEOGRAPH
+0xEA43,0x9D51, //#CJK UNIFIED IDEOGRAPH
+0xEA44,0x9D50, //#CJK UNIFIED IDEOGRAPH
+0xEA45,0x9D59, //#CJK UNIFIED IDEOGRAPH
+0xEA46,0x9D72, //#CJK UNIFIED IDEOGRAPH
+0xEA47,0x9D89, //#CJK UNIFIED IDEOGRAPH
+0xEA48,0x9D87, //#CJK UNIFIED IDEOGRAPH
+0xEA49,0x9DAB, //#CJK UNIFIED IDEOGRAPH
+0xEA4A,0x9D6F, //#CJK UNIFIED IDEOGRAPH
+0xEA4B,0x9D7A, //#CJK UNIFIED IDEOGRAPH
+0xEA4C,0x9D9A, //#CJK UNIFIED IDEOGRAPH
+0xEA4D,0x9DA4, //#CJK UNIFIED IDEOGRAPH
+0xEA4E,0x9DA9, //#CJK UNIFIED IDEOGRAPH
+0xEA4F,0x9DB2, //#CJK UNIFIED IDEOGRAPH
+0xEA50,0x9DC4, //#CJK UNIFIED IDEOGRAPH
+0xEA51,0x9DC1, //#CJK UNIFIED IDEOGRAPH
+0xEA52,0x9DBB, //#CJK UNIFIED IDEOGRAPH
+0xEA53,0x9DB8, //#CJK UNIFIED IDEOGRAPH
+0xEA54,0x9DBA, //#CJK UNIFIED IDEOGRAPH
+0xEA55,0x9DC6, //#CJK UNIFIED IDEOGRAPH
+0xEA56,0x9DCF, //#CJK UNIFIED IDEOGRAPH
+0xEA57,0x9DC2, //#CJK UNIFIED IDEOGRAPH
+0xEA58,0x9DD9, //#CJK UNIFIED IDEOGRAPH
+0xEA59,0x9DD3, //#CJK UNIFIED IDEOGRAPH
+0xEA5A,0x9DF8, //#CJK UNIFIED IDEOGRAPH
+0xEA5B,0x9DE6, //#CJK UNIFIED IDEOGRAPH
+0xEA5C,0x9DED, //#CJK UNIFIED IDEOGRAPH
+0xEA5D,0x9DEF, //#CJK UNIFIED IDEOGRAPH
+0xEA5E,0x9DFD, //#CJK UNIFIED IDEOGRAPH
+0xEA5F,0x9E1A, //#CJK UNIFIED IDEOGRAPH
+0xEA60,0x9E1B, //#CJK UNIFIED IDEOGRAPH
+0xEA61,0x9E1E, //#CJK UNIFIED IDEOGRAPH
+0xEA62,0x9E75, //#CJK UNIFIED IDEOGRAPH
+0xEA63,0x9E79, //#CJK UNIFIED IDEOGRAPH
+0xEA64,0x9E7D, //#CJK UNIFIED IDEOGRAPH
+0xEA65,0x9E81, //#CJK UNIFIED IDEOGRAPH
+0xEA66,0x9E88, //#CJK UNIFIED IDEOGRAPH
+0xEA67,0x9E8B, //#CJK UNIFIED IDEOGRAPH
+0xEA68,0x9E8C, //#CJK UNIFIED IDEOGRAPH
+0xEA69,0x9E92, //#CJK UNIFIED IDEOGRAPH
+0xEA6A,0x9E95, //#CJK UNIFIED IDEOGRAPH
+0xEA6B,0x9E91, //#CJK UNIFIED IDEOGRAPH
+0xEA6C,0x9E9D, //#CJK UNIFIED IDEOGRAPH
+0xEA6D,0x9EA5, //#CJK UNIFIED IDEOGRAPH
+0xEA6E,0x9EA9, //#CJK UNIFIED IDEOGRAPH
+0xEA6F,0x9EB8, //#CJK UNIFIED IDEOGRAPH
+0xEA70,0x9EAA, //#CJK UNIFIED IDEOGRAPH
+0xEA71,0x9EAD, //#CJK UNIFIED IDEOGRAPH
+0xEA72,0x9761, //#CJK UNIFIED IDEOGRAPH
+0xEA73,0x9ECC, //#CJK UNIFIED IDEOGRAPH
+0xEA74,0x9ECE, //#CJK UNIFIED IDEOGRAPH
+0xEA75,0x9ECF, //#CJK UNIFIED IDEOGRAPH
+0xEA76,0x9ED0, //#CJK UNIFIED IDEOGRAPH
+0xEA77,0x9ED4, //#CJK UNIFIED IDEOGRAPH
+0xEA78,0x9EDC, //#CJK UNIFIED IDEOGRAPH
+0xEA79,0x9EDE, //#CJK UNIFIED IDEOGRAPH
+0xEA7A,0x9EDD, //#CJK UNIFIED IDEOGRAPH
+0xEA7B,0x9EE0, //#CJK UNIFIED IDEOGRAPH
+0xEA7C,0x9EE5, //#CJK UNIFIED IDEOGRAPH
+0xEA7D,0x9EE8, //#CJK UNIFIED IDEOGRAPH
+0xEA7E,0x9EEF, //#CJK UNIFIED IDEOGRAPH
+0xEA80,0x9EF4, //#CJK UNIFIED IDEOGRAPH
+0xEA81,0x9EF6, //#CJK UNIFIED IDEOGRAPH
+0xEA82,0x9EF7, //#CJK UNIFIED IDEOGRAPH
+0xEA83,0x9EF9, //#CJK UNIFIED IDEOGRAPH
+0xEA84,0x9EFB, //#CJK UNIFIED IDEOGRAPH
+0xEA85,0x9EFC, //#CJK UNIFIED IDEOGRAPH
+0xEA86,0x9EFD, //#CJK UNIFIED IDEOGRAPH
+0xEA87,0x9F07, //#CJK UNIFIED IDEOGRAPH
+0xEA88,0x9F08, //#CJK UNIFIED IDEOGRAPH
+0xEA89,0x76B7, //#CJK UNIFIED IDEOGRAPH
+0xEA8A,0x9F15, //#CJK UNIFIED IDEOGRAPH
+0xEA8B,0x9F21, //#CJK UNIFIED IDEOGRAPH
+0xEA8C,0x9F2C, //#CJK UNIFIED IDEOGRAPH
+0xEA8D,0x9F3E, //#CJK UNIFIED IDEOGRAPH
+0xEA8E,0x9F4A, //#CJK UNIFIED IDEOGRAPH
+0xEA8F,0x9F52, //#CJK UNIFIED IDEOGRAPH
+0xEA90,0x9F54, //#CJK UNIFIED IDEOGRAPH
+0xEA91,0x9F63, //#CJK UNIFIED IDEOGRAPH
+0xEA92,0x9F5F, //#CJK UNIFIED IDEOGRAPH
+0xEA93,0x9F60, //#CJK UNIFIED IDEOGRAPH
+0xEA94,0x9F61, //#CJK UNIFIED IDEOGRAPH
+0xEA95,0x9F66, //#CJK UNIFIED IDEOGRAPH
+0xEA96,0x9F67, //#CJK UNIFIED IDEOGRAPH
+0xEA97,0x9F6C, //#CJK UNIFIED IDEOGRAPH
+0xEA98,0x9F6A, //#CJK UNIFIED IDEOGRAPH
+0xEA99,0x9F77, //#CJK UNIFIED IDEOGRAPH
+0xEA9A,0x9F72, //#CJK UNIFIED IDEOGRAPH
+0xEA9B,0x9F76, //#CJK UNIFIED IDEOGRAPH
+0xEA9C,0x9F95, //#CJK UNIFIED IDEOGRAPH
+0xEA9D,0x9F9C, //#CJK UNIFIED IDEOGRAPH
+0xEA9E,0x9FA0, //#CJK UNIFIED IDEOGRAPH
+0xEA9F,0x582F, //#CJK UNIFIED IDEOGRAPH
+0xEAA0,0x69C7, //#CJK UNIFIED IDEOGRAPH
+0xEAA1,0x9059, //#CJK UNIFIED IDEOGRAPH
+0xEAA2,0x7464, //#CJK UNIFIED IDEOGRAPH
+0xEAA3,0x51DC, //#CJK UNIFIED IDEOGRAPH
+0xEAA4,0x7199, //#CJK UNIFIED IDEOGRAPH
+0xED40,0x7E8A, //#CJK UNIFIED IDEOGRAPH
+0xED41,0x891C, //#CJK UNIFIED IDEOGRAPH
+0xED42,0x9348, //#CJK UNIFIED IDEOGRAPH
+0xED43,0x9288, //#CJK UNIFIED IDEOGRAPH
+0xED44,0x84DC, //#CJK UNIFIED IDEOGRAPH
+0xED45,0x4FC9, //#CJK UNIFIED IDEOGRAPH
+0xED46,0x70BB, //#CJK UNIFIED IDEOGRAPH
+0xED47,0x6631, //#CJK UNIFIED IDEOGRAPH
+0xED48,0x68C8, //#CJK UNIFIED IDEOGRAPH
+0xED49,0x92F9, //#CJK UNIFIED IDEOGRAPH
+0xED4A,0x66FB, //#CJK UNIFIED IDEOGRAPH
+0xED4B,0x5F45, //#CJK UNIFIED IDEOGRAPH
+0xED4C,0x4E28, //#CJK UNIFIED IDEOGRAPH
+0xED4D,0x4EE1, //#CJK UNIFIED IDEOGRAPH
+0xED4E,0x4EFC, //#CJK UNIFIED IDEOGRAPH
+0xED4F,0x4F00, //#CJK UNIFIED IDEOGRAPH
+0xED50,0x4F03, //#CJK UNIFIED IDEOGRAPH
+0xED51,0x4F39, //#CJK UNIFIED IDEOGRAPH
+0xED52,0x4F56, //#CJK UNIFIED IDEOGRAPH
+0xED53,0x4F92, //#CJK UNIFIED IDEOGRAPH
+0xED54,0x4F8A, //#CJK UNIFIED IDEOGRAPH
+0xED55,0x4F9A, //#CJK UNIFIED IDEOGRAPH
+0xED56,0x4F94, //#CJK UNIFIED IDEOGRAPH
+0xED57,0x4FCD, //#CJK UNIFIED IDEOGRAPH
+0xED58,0x5040, //#CJK UNIFIED IDEOGRAPH
+0xED59,0x5022, //#CJK UNIFIED IDEOGRAPH
+0xED5A,0x4FFF, //#CJK UNIFIED IDEOGRAPH
+0xED5B,0x501E, //#CJK UNIFIED IDEOGRAPH
+0xED5C,0x5046, //#CJK UNIFIED IDEOGRAPH
+0xED5D,0x5070, //#CJK UNIFIED IDEOGRAPH
+0xED5E,0x5042, //#CJK UNIFIED IDEOGRAPH
+0xED5F,0x5094, //#CJK UNIFIED IDEOGRAPH
+0xED60,0x50F4, //#CJK UNIFIED IDEOGRAPH
+0xED61,0x50D8, //#CJK UNIFIED IDEOGRAPH
+0xED62,0x514A, //#CJK UNIFIED IDEOGRAPH
+0xED63,0x5164, //#CJK UNIFIED IDEOGRAPH
+0xED64,0x519D, //#CJK UNIFIED IDEOGRAPH
+0xED65,0x51BE, //#CJK UNIFIED IDEOGRAPH
+0xED66,0x51EC, //#CJK UNIFIED IDEOGRAPH
+0xED67,0x5215, //#CJK UNIFIED IDEOGRAPH
+0xED68,0x529C, //#CJK UNIFIED IDEOGRAPH
+0xED69,0x52A6, //#CJK UNIFIED IDEOGRAPH
+0xED6A,0x52C0, //#CJK UNIFIED IDEOGRAPH
+0xED6B,0x52DB, //#CJK UNIFIED IDEOGRAPH
+0xED6C,0x5300, //#CJK UNIFIED IDEOGRAPH
+0xED6D,0x5307, //#CJK UNIFIED IDEOGRAPH
+0xED6E,0x5324, //#CJK UNIFIED IDEOGRAPH
+0xED6F,0x5372, //#CJK UNIFIED IDEOGRAPH
+0xED70,0x5393, //#CJK UNIFIED IDEOGRAPH
+0xED71,0x53B2, //#CJK UNIFIED IDEOGRAPH
+0xED72,0x53DD, //#CJK UNIFIED IDEOGRAPH
+0xED73,0xFA0E, //#CJK COMPATIBILITY IDEOGRAPH
+0xED74,0x549C, //#CJK UNIFIED IDEOGRAPH
+0xED75,0x548A, //#CJK UNIFIED IDEOGRAPH
+0xED76,0x54A9, //#CJK UNIFIED IDEOGRAPH
+0xED77,0x54FF, //#CJK UNIFIED IDEOGRAPH
+0xED78,0x5586, //#CJK UNIFIED IDEOGRAPH
+0xED79,0x5759, //#CJK UNIFIED IDEOGRAPH
+0xED7A,0x5765, //#CJK UNIFIED IDEOGRAPH
+0xED7B,0x57AC, //#CJK UNIFIED IDEOGRAPH
+0xED7C,0x57C8, //#CJK UNIFIED IDEOGRAPH
+0xED7D,0x57C7, //#CJK UNIFIED IDEOGRAPH
+0xED7E,0xFA0F, //#CJK COMPATIBILITY IDEOGRAPH
+0xED80,0xFA10, //#CJK COMPATIBILITY IDEOGRAPH
+0xED81,0x589E, //#CJK UNIFIED IDEOGRAPH
+0xED82,0x58B2, //#CJK UNIFIED IDEOGRAPH
+0xED83,0x590B, //#CJK UNIFIED IDEOGRAPH
+0xED84,0x5953, //#CJK UNIFIED IDEOGRAPH
+0xED85,0x595B, //#CJK UNIFIED IDEOGRAPH
+0xED86,0x595D, //#CJK UNIFIED IDEOGRAPH
+0xED87,0x5963, //#CJK UNIFIED IDEOGRAPH
+0xED88,0x59A4, //#CJK UNIFIED IDEOGRAPH
+0xED89,0x59BA, //#CJK UNIFIED IDEOGRAPH
+0xED8A,0x5B56, //#CJK UNIFIED IDEOGRAPH
+0xED8B,0x5BC0, //#CJK UNIFIED IDEOGRAPH
+0xED8C,0x752F, //#CJK UNIFIED IDEOGRAPH
+0xED8D,0x5BD8, //#CJK UNIFIED IDEOGRAPH
+0xED8E,0x5BEC, //#CJK UNIFIED IDEOGRAPH
+0xED8F,0x5C1E, //#CJK UNIFIED IDEOGRAPH
+0xED90,0x5CA6, //#CJK UNIFIED IDEOGRAPH
+0xED91,0x5CBA, //#CJK UNIFIED IDEOGRAPH
+0xED92,0x5CF5, //#CJK UNIFIED IDEOGRAPH
+0xED93,0x5D27, //#CJK UNIFIED IDEOGRAPH
+0xED94,0x5D53, //#CJK UNIFIED IDEOGRAPH
+0xED95,0xFA11, //#CJK COMPATIBILITY IDEOGRAPH
+0xED96,0x5D42, //#CJK UNIFIED IDEOGRAPH
+0xED97,0x5D6D, //#CJK UNIFIED IDEOGRAPH
+0xED98,0x5DB8, //#CJK UNIFIED IDEOGRAPH
+0xED99,0x5DB9, //#CJK UNIFIED IDEOGRAPH
+0xED9A,0x5DD0, //#CJK UNIFIED IDEOGRAPH
+0xED9B,0x5F21, //#CJK UNIFIED IDEOGRAPH
+0xED9C,0x5F34, //#CJK UNIFIED IDEOGRAPH
+0xED9D,0x5F67, //#CJK UNIFIED IDEOGRAPH
+0xED9E,0x5FB7, //#CJK UNIFIED IDEOGRAPH
+0xED9F,0x5FDE, //#CJK UNIFIED IDEOGRAPH
+0xEDA0,0x605D, //#CJK UNIFIED IDEOGRAPH
+0xEDA1,0x6085, //#CJK UNIFIED IDEOGRAPH
+0xEDA2,0x608A, //#CJK UNIFIED IDEOGRAPH
+0xEDA3,0x60DE, //#CJK UNIFIED IDEOGRAPH
+0xEDA4,0x60D5, //#CJK UNIFIED IDEOGRAPH
+0xEDA5,0x6120, //#CJK UNIFIED IDEOGRAPH
+0xEDA6,0x60F2, //#CJK UNIFIED IDEOGRAPH
+0xEDA7,0x6111, //#CJK UNIFIED IDEOGRAPH
+0xEDA8,0x6137, //#CJK UNIFIED IDEOGRAPH
+0xEDA9,0x6130, //#CJK UNIFIED IDEOGRAPH
+0xEDAA,0x6198, //#CJK UNIFIED IDEOGRAPH
+0xEDAB,0x6213, //#CJK UNIFIED IDEOGRAPH
+0xEDAC,0x62A6, //#CJK UNIFIED IDEOGRAPH
+0xEDAD,0x63F5, //#CJK UNIFIED IDEOGRAPH
+0xEDAE,0x6460, //#CJK UNIFIED IDEOGRAPH
+0xEDAF,0x649D, //#CJK UNIFIED IDEOGRAPH
+0xEDB0,0x64CE, //#CJK UNIFIED IDEOGRAPH
+0xEDB1,0x654E, //#CJK UNIFIED IDEOGRAPH
+0xEDB2,0x6600, //#CJK UNIFIED IDEOGRAPH
+0xEDB3,0x6615, //#CJK UNIFIED IDEOGRAPH
+0xEDB4,0x663B, //#CJK UNIFIED IDEOGRAPH
+0xEDB5,0x6609, //#CJK UNIFIED IDEOGRAPH
+0xEDB6,0x662E, //#CJK UNIFIED IDEOGRAPH
+0xEDB7,0x661E, //#CJK UNIFIED IDEOGRAPH
+0xEDB8,0x6624, //#CJK UNIFIED IDEOGRAPH
+0xEDB9,0x6665, //#CJK UNIFIED IDEOGRAPH
+0xEDBA,0x6657, //#CJK UNIFIED IDEOGRAPH
+0xEDBB,0x6659, //#CJK UNIFIED IDEOGRAPH
+0xEDBC,0xFA12, //#CJK COMPATIBILITY IDEOGRAPH
+0xEDBD,0x6673, //#CJK UNIFIED IDEOGRAPH
+0xEDBE,0x6699, //#CJK UNIFIED IDEOGRAPH
+0xEDBF,0x66A0, //#CJK UNIFIED IDEOGRAPH
+0xEDC0,0x66B2, //#CJK UNIFIED IDEOGRAPH
+0xEDC1,0x66BF, //#CJK UNIFIED IDEOGRAPH
+0xEDC2,0x66FA, //#CJK UNIFIED IDEOGRAPH
+0xEDC3,0x670E, //#CJK UNIFIED IDEOGRAPH
+0xEDC4,0xF929, //#CJK COMPATIBILITY IDEOGRAPH
+0xEDC5,0x6766, //#CJK UNIFIED IDEOGRAPH
+0xEDC6,0x67BB, //#CJK UNIFIED IDEOGRAPH
+0xEDC7,0x6852, //#CJK UNIFIED IDEOGRAPH
+0xEDC8,0x67C0, //#CJK UNIFIED IDEOGRAPH
+0xEDC9,0x6801, //#CJK UNIFIED IDEOGRAPH
+0xEDCA,0x6844, //#CJK UNIFIED IDEOGRAPH
+0xEDCB,0x68CF, //#CJK UNIFIED IDEOGRAPH
+0xEDCC,0xFA13, //#CJK COMPATIBILITY IDEOGRAPH
+0xEDCD,0x6968, //#CJK UNIFIED IDEOGRAPH
+0xEDCE,0xFA14, //#CJK COMPATIBILITY IDEOGRAPH
+0xEDCF,0x6998, //#CJK UNIFIED IDEOGRAPH
+0xEDD0,0x69E2, //#CJK UNIFIED IDEOGRAPH
+0xEDD1,0x6A30, //#CJK UNIFIED IDEOGRAPH
+0xEDD2,0x6A6B, //#CJK UNIFIED IDEOGRAPH
+0xEDD3,0x6A46, //#CJK UNIFIED IDEOGRAPH
+0xEDD4,0x6A73, //#CJK UNIFIED IDEOGRAPH
+0xEDD5,0x6A7E, //#CJK UNIFIED IDEOGRAPH
+0xEDD6,0x6AE2, //#CJK UNIFIED IDEOGRAPH
+0xEDD7,0x6AE4, //#CJK UNIFIED IDEOGRAPH
+0xEDD8,0x6BD6, //#CJK UNIFIED IDEOGRAPH
+0xEDD9,0x6C3F, //#CJK UNIFIED IDEOGRAPH
+0xEDDA,0x6C5C, //#CJK UNIFIED IDEOGRAPH
+0xEDDB,0x6C86, //#CJK UNIFIED IDEOGRAPH
+0xEDDC,0x6C6F, //#CJK UNIFIED IDEOGRAPH
+0xEDDD,0x6CDA, //#CJK UNIFIED IDEOGRAPH
+0xEDDE,0x6D04, //#CJK UNIFIED IDEOGRAPH
+0xEDDF,0x6D87, //#CJK UNIFIED IDEOGRAPH
+0xEDE0,0x6D6F, //#CJK UNIFIED IDEOGRAPH
+0xEDE1,0x6D96, //#CJK UNIFIED IDEOGRAPH
+0xEDE2,0x6DAC, //#CJK UNIFIED IDEOGRAPH
+0xEDE3,0x6DCF, //#CJK UNIFIED IDEOGRAPH
+0xEDE4,0x6DF8, //#CJK UNIFIED IDEOGRAPH
+0xEDE5,0x6DF2, //#CJK UNIFIED IDEOGRAPH
+0xEDE6,0x6DFC, //#CJK UNIFIED IDEOGRAPH
+0xEDE7,0x6E39, //#CJK UNIFIED IDEOGRAPH
+0xEDE8,0x6E5C, //#CJK UNIFIED IDEOGRAPH
+0xEDE9,0x6E27, //#CJK UNIFIED IDEOGRAPH
+0xEDEA,0x6E3C, //#CJK UNIFIED IDEOGRAPH
+0xEDEB,0x6EBF, //#CJK UNIFIED IDEOGRAPH
+0xEDEC,0x6F88, //#CJK UNIFIED IDEOGRAPH
+0xEDED,0x6FB5, //#CJK UNIFIED IDEOGRAPH
+0xEDEE,0x6FF5, //#CJK UNIFIED IDEOGRAPH
+0xEDEF,0x7005, //#CJK UNIFIED IDEOGRAPH
+0xEDF0,0x7007, //#CJK UNIFIED IDEOGRAPH
+0xEDF1,0x7028, //#CJK UNIFIED IDEOGRAPH
+0xEDF2,0x7085, //#CJK UNIFIED IDEOGRAPH
+0xEDF3,0x70AB, //#CJK UNIFIED IDEOGRAPH
+0xEDF4,0x710F, //#CJK UNIFIED IDEOGRAPH
+0xEDF5,0x7104, //#CJK UNIFIED IDEOGRAPH
+0xEDF6,0x715C, //#CJK UNIFIED IDEOGRAPH
+0xEDF7,0x7146, //#CJK UNIFIED IDEOGRAPH
+0xEDF8,0x7147, //#CJK UNIFIED IDEOGRAPH
+0xEDF9,0xFA15, //#CJK COMPATIBILITY IDEOGRAPH
+0xEDFA,0x71C1, //#CJK UNIFIED IDEOGRAPH
+0xEDFB,0x71FE, //#CJK UNIFIED IDEOGRAPH
+0xEDFC,0x72B1, //#CJK UNIFIED IDEOGRAPH
+0xEE40,0x72BE, //#CJK UNIFIED IDEOGRAPH
+0xEE41,0x7324, //#CJK UNIFIED IDEOGRAPH
+0xEE42,0xFA16, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE43,0x7377, //#CJK UNIFIED IDEOGRAPH
+0xEE44,0x73BD, //#CJK UNIFIED IDEOGRAPH
+0xEE45,0x73C9, //#CJK UNIFIED IDEOGRAPH
+0xEE46,0x73D6, //#CJK UNIFIED IDEOGRAPH
+0xEE47,0x73E3, //#CJK UNIFIED IDEOGRAPH
+0xEE48,0x73D2, //#CJK UNIFIED IDEOGRAPH
+0xEE49,0x7407, //#CJK UNIFIED IDEOGRAPH
+0xEE4A,0x73F5, //#CJK UNIFIED IDEOGRAPH
+0xEE4B,0x7426, //#CJK UNIFIED IDEOGRAPH
+0xEE4C,0x742A, //#CJK UNIFIED IDEOGRAPH
+0xEE4D,0x7429, //#CJK UNIFIED IDEOGRAPH
+0xEE4E,0x742E, //#CJK UNIFIED IDEOGRAPH
+0xEE4F,0x7462, //#CJK UNIFIED IDEOGRAPH
+0xEE50,0x7489, //#CJK UNIFIED IDEOGRAPH
+0xEE51,0x749F, //#CJK UNIFIED IDEOGRAPH
+0xEE52,0x7501, //#CJK UNIFIED IDEOGRAPH
+0xEE53,0x756F, //#CJK UNIFIED IDEOGRAPH
+0xEE54,0x7682, //#CJK UNIFIED IDEOGRAPH
+0xEE55,0x769C, //#CJK UNIFIED IDEOGRAPH
+0xEE56,0x769E, //#CJK UNIFIED IDEOGRAPH
+0xEE57,0x769B, //#CJK UNIFIED IDEOGRAPH
+0xEE58,0x76A6, //#CJK UNIFIED IDEOGRAPH
+0xEE59,0xFA17, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE5A,0x7746, //#CJK UNIFIED IDEOGRAPH
+0xEE5B,0x52AF, //#CJK UNIFIED IDEOGRAPH
+0xEE5C,0x7821, //#CJK UNIFIED IDEOGRAPH
+0xEE5D,0x784E, //#CJK UNIFIED IDEOGRAPH
+0xEE5E,0x7864, //#CJK UNIFIED IDEOGRAPH
+0xEE5F,0x787A, //#CJK UNIFIED IDEOGRAPH
+0xEE60,0x7930, //#CJK UNIFIED IDEOGRAPH
+0xEE61,0xFA18, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE62,0xFA19, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE63,0xFA1A, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE64,0x7994, //#CJK UNIFIED IDEOGRAPH
+0xEE65,0xFA1B, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE66,0x799B, //#CJK UNIFIED IDEOGRAPH
+0xEE67,0x7AD1, //#CJK UNIFIED IDEOGRAPH
+0xEE68,0x7AE7, //#CJK UNIFIED IDEOGRAPH
+0xEE69,0xFA1C, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE6A,0x7AEB, //#CJK UNIFIED IDEOGRAPH
+0xEE6B,0x7B9E, //#CJK UNIFIED IDEOGRAPH
+0xEE6C,0xFA1D, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE6D,0x7D48, //#CJK UNIFIED IDEOGRAPH
+0xEE6E,0x7D5C, //#CJK UNIFIED IDEOGRAPH
+0xEE6F,0x7DB7, //#CJK UNIFIED IDEOGRAPH
+0xEE70,0x7DA0, //#CJK UNIFIED IDEOGRAPH
+0xEE71,0x7DD6, //#CJK UNIFIED IDEOGRAPH
+0xEE72,0x7E52, //#CJK UNIFIED IDEOGRAPH
+0xEE73,0x7F47, //#CJK UNIFIED IDEOGRAPH
+0xEE74,0x7FA1, //#CJK UNIFIED IDEOGRAPH
+0xEE75,0xFA1E, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE76,0x8301, //#CJK UNIFIED IDEOGRAPH
+0xEE77,0x8362, //#CJK UNIFIED IDEOGRAPH
+0xEE78,0x837F, //#CJK UNIFIED IDEOGRAPH
+0xEE79,0x83C7, //#CJK UNIFIED IDEOGRAPH
+0xEE7A,0x83F6, //#CJK UNIFIED IDEOGRAPH
+0xEE7B,0x8448, //#CJK UNIFIED IDEOGRAPH
+0xEE7C,0x84B4, //#CJK UNIFIED IDEOGRAPH
+0xEE7D,0x8553, //#CJK UNIFIED IDEOGRAPH
+0xEE7E,0x8559, //#CJK UNIFIED IDEOGRAPH
+0xEE80,0x856B, //#CJK UNIFIED IDEOGRAPH
+0xEE81,0xFA1F, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE82,0x85B0, //#CJK UNIFIED IDEOGRAPH
+0xEE83,0xFA20, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE84,0xFA21, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE85,0x8807, //#CJK UNIFIED IDEOGRAPH
+0xEE86,0x88F5, //#CJK UNIFIED IDEOGRAPH
+0xEE87,0x8A12, //#CJK UNIFIED IDEOGRAPH
+0xEE88,0x8A37, //#CJK UNIFIED IDEOGRAPH
+0xEE89,0x8A79, //#CJK UNIFIED IDEOGRAPH
+0xEE8A,0x8AA7, //#CJK UNIFIED IDEOGRAPH
+0xEE8B,0x8ABE, //#CJK UNIFIED IDEOGRAPH
+0xEE8C,0x8ADF, //#CJK UNIFIED IDEOGRAPH
+0xEE8D,0xFA22, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE8E,0x8AF6, //#CJK UNIFIED IDEOGRAPH
+0xEE8F,0x8B53, //#CJK UNIFIED IDEOGRAPH
+0xEE90,0x8B7F, //#CJK UNIFIED IDEOGRAPH
+0xEE91,0x8CF0, //#CJK UNIFIED IDEOGRAPH
+0xEE92,0x8CF4, //#CJK UNIFIED IDEOGRAPH
+0xEE93,0x8D12, //#CJK UNIFIED IDEOGRAPH
+0xEE94,0x8D76, //#CJK UNIFIED IDEOGRAPH
+0xEE95,0xFA23, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE96,0x8ECF, //#CJK UNIFIED IDEOGRAPH
+0xEE97,0xFA24, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE98,0xFA25, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE99,0x9067, //#CJK UNIFIED IDEOGRAPH
+0xEE9A,0x90DE, //#CJK UNIFIED IDEOGRAPH
+0xEE9B,0xFA26, //#CJK COMPATIBILITY IDEOGRAPH
+0xEE9C,0x9115, //#CJK UNIFIED IDEOGRAPH
+0xEE9D,0x9127, //#CJK UNIFIED IDEOGRAPH
+0xEE9E,0x91DA, //#CJK UNIFIED IDEOGRAPH
+0xEE9F,0x91D7, //#CJK UNIFIED IDEOGRAPH
+0xEEA0,0x91DE, //#CJK UNIFIED IDEOGRAPH
+0xEEA1,0x91ED, //#CJK UNIFIED IDEOGRAPH
+0xEEA2,0x91EE, //#CJK UNIFIED IDEOGRAPH
+0xEEA3,0x91E4, //#CJK UNIFIED IDEOGRAPH
+0xEEA4,0x91E5, //#CJK UNIFIED IDEOGRAPH
+0xEEA5,0x9206, //#CJK UNIFIED IDEOGRAPH
+0xEEA6,0x9210, //#CJK UNIFIED IDEOGRAPH
+0xEEA7,0x920A, //#CJK UNIFIED IDEOGRAPH
+0xEEA8,0x923A, //#CJK UNIFIED IDEOGRAPH
+0xEEA9,0x9240, //#CJK UNIFIED IDEOGRAPH
+0xEEAA,0x923C, //#CJK UNIFIED IDEOGRAPH
+0xEEAB,0x924E, //#CJK UNIFIED IDEOGRAPH
+0xEEAC,0x9259, //#CJK UNIFIED IDEOGRAPH
+0xEEAD,0x9251, //#CJK UNIFIED IDEOGRAPH
+0xEEAE,0x9239, //#CJK UNIFIED IDEOGRAPH
+0xEEAF,0x9267, //#CJK UNIFIED IDEOGRAPH
+0xEEB0,0x92A7, //#CJK UNIFIED IDEOGRAPH
+0xEEB1,0x9277, //#CJK UNIFIED IDEOGRAPH
+0xEEB2,0x9278, //#CJK UNIFIED IDEOGRAPH
+0xEEB3,0x92E7, //#CJK UNIFIED IDEOGRAPH
+0xEEB4,0x92D7, //#CJK UNIFIED IDEOGRAPH
+0xEEB5,0x92D9, //#CJK UNIFIED IDEOGRAPH
+0xEEB6,0x92D0, //#CJK UNIFIED IDEOGRAPH
+0xEEB7,0xFA27, //#CJK COMPATIBILITY IDEOGRAPH
+0xEEB8,0x92D5, //#CJK UNIFIED IDEOGRAPH
+0xEEB9,0x92E0, //#CJK UNIFIED IDEOGRAPH
+0xEEBA,0x92D3, //#CJK UNIFIED IDEOGRAPH
+0xEEBB,0x9325, //#CJK UNIFIED IDEOGRAPH
+0xEEBC,0x9321, //#CJK UNIFIED IDEOGRAPH
+0xEEBD,0x92FB, //#CJK UNIFIED IDEOGRAPH
+0xEEBE,0xFA28, //#CJK COMPATIBILITY IDEOGRAPH
+0xEEBF,0x931E, //#CJK UNIFIED IDEOGRAPH
+0xEEC0,0x92FF, //#CJK UNIFIED IDEOGRAPH
+0xEEC1,0x931D, //#CJK UNIFIED IDEOGRAPH
+0xEEC2,0x9302, //#CJK UNIFIED IDEOGRAPH
+0xEEC3,0x9370, //#CJK UNIFIED IDEOGRAPH
+0xEEC4,0x9357, //#CJK UNIFIED IDEOGRAPH
+0xEEC5,0x93A4, //#CJK UNIFIED IDEOGRAPH
+0xEEC6,0x93C6, //#CJK UNIFIED IDEOGRAPH
+0xEEC7,0x93DE, //#CJK UNIFIED IDEOGRAPH
+0xEEC8,0x93F8, //#CJK UNIFIED IDEOGRAPH
+0xEEC9,0x9431, //#CJK UNIFIED IDEOGRAPH
+0xEECA,0x9445, //#CJK UNIFIED IDEOGRAPH
+0xEECB,0x9448, //#CJK UNIFIED IDEOGRAPH
+0xEECC,0x9592, //#CJK UNIFIED IDEOGRAPH
+0xEECD,0xF9DC, //#CJK COMPATIBILITY IDEOGRAPH
+0xEECE,0xFA29, //#CJK COMPATIBILITY IDEOGRAPH
+0xEECF,0x969D, //#CJK UNIFIED IDEOGRAPH
+0xEED0,0x96AF, //#CJK UNIFIED IDEOGRAPH
+0xEED1,0x9733, //#CJK UNIFIED IDEOGRAPH
+0xEED2,0x973B, //#CJK UNIFIED IDEOGRAPH
+0xEED3,0x9743, //#CJK UNIFIED IDEOGRAPH
+0xEED4,0x974D, //#CJK UNIFIED IDEOGRAPH
+0xEED5,0x974F, //#CJK UNIFIED IDEOGRAPH
+0xEED6,0x9751, //#CJK UNIFIED IDEOGRAPH
+0xEED7,0x9755, //#CJK UNIFIED IDEOGRAPH
+0xEED8,0x9857, //#CJK UNIFIED IDEOGRAPH
+0xEED9,0x9865, //#CJK UNIFIED IDEOGRAPH
+0xEEDA,0xFA2A, //#CJK COMPATIBILITY IDEOGRAPH
+0xEEDB,0xFA2B, //#CJK COMPATIBILITY IDEOGRAPH
+0xEEDC,0x9927, //#CJK UNIFIED IDEOGRAPH
+0xEEDD,0xFA2C, //#CJK COMPATIBILITY IDEOGRAPH
+0xEEDE,0x999E, //#CJK UNIFIED IDEOGRAPH
+0xEEDF,0x9A4E, //#CJK UNIFIED IDEOGRAPH
+0xEEE0,0x9AD9, //#CJK UNIFIED IDEOGRAPH
+0xEEE1,0x9ADC, //#CJK UNIFIED IDEOGRAPH
+0xEEE2,0x9B75, //#CJK UNIFIED IDEOGRAPH
+0xEEE3,0x9B72, //#CJK UNIFIED IDEOGRAPH
+0xEEE4,0x9B8F, //#CJK UNIFIED IDEOGRAPH
+0xEEE5,0x9BB1, //#CJK UNIFIED IDEOGRAPH
+0xEEE6,0x9BBB, //#CJK UNIFIED IDEOGRAPH
+0xEEE7,0x9C00, //#CJK UNIFIED IDEOGRAPH
+0xEEE8,0x9D70, //#CJK UNIFIED IDEOGRAPH
+0xEEE9,0x9D6B, //#CJK UNIFIED IDEOGRAPH
+0xEEEA,0xFA2D, //#CJK COMPATIBILITY IDEOGRAPH
+0xEEEB,0x9E19, //#CJK UNIFIED IDEOGRAPH
+0xEEEC,0x9ED1, //#CJK UNIFIED IDEOGRAPH
+0xEEEF,0x2170, //#SMALL ROMAN NUMERAL ONE
+0xEEF0,0x2171, //#SMALL ROMAN NUMERAL TWO
+0xEEF1,0x2172, //#SMALL ROMAN NUMERAL THREE
+0xEEF2,0x2173, //#SMALL ROMAN NUMERAL FOUR
+0xEEF3,0x2174, //#SMALL ROMAN NUMERAL FIVE
+0xEEF4,0x2175, //#SMALL ROMAN NUMERAL SIX
+0xEEF5,0x2176, //#SMALL ROMAN NUMERAL SEVEN
+0xEEF6,0x2177, //#SMALL ROMAN NUMERAL EIGHT
+0xEEF7,0x2178, //#SMALL ROMAN NUMERAL NINE
+0xEEF8,0x2179, //#SMALL ROMAN NUMERAL TEN
+0xEEF9,0xFFE2, //#FULLWIDTH NOT SIGN
+0xEEFA,0xFFE4, //#FULLWIDTH BROKEN BAR
+0xEEFB,0xFF07, //#FULLWIDTH APOSTROPHE
+0xEEFC,0xFF02, //#FULLWIDTH QUOTATION MARK
+0xFA40,0x2170, //#SMALL ROMAN NUMERAL ONE
+0xFA41,0x2171, //#SMALL ROMAN NUMERAL TWO
+0xFA42,0x2172, //#SMALL ROMAN NUMERAL THREE
+0xFA43,0x2173, //#SMALL ROMAN NUMERAL FOUR
+0xFA44,0x2174, //#SMALL ROMAN NUMERAL FIVE
+0xFA45,0x2175, //#SMALL ROMAN NUMERAL SIX
+0xFA46,0x2176, //#SMALL ROMAN NUMERAL SEVEN
+0xFA47,0x2177, //#SMALL ROMAN NUMERAL EIGHT
+0xFA48,0x2178, //#SMALL ROMAN NUMERAL NINE
+0xFA49,0x2179, //#SMALL ROMAN NUMERAL TEN
+0xFA4A,0x2160, //#ROMAN NUMERAL ONE
+0xFA4B,0x2161, //#ROMAN NUMERAL TWO
+0xFA4C,0x2162, //#ROMAN NUMERAL THREE
+0xFA4D,0x2163, //#ROMAN NUMERAL FOUR
+0xFA4E,0x2164, //#ROMAN NUMERAL FIVE
+0xFA4F,0x2165, //#ROMAN NUMERAL SIX
+0xFA50,0x2166, //#ROMAN NUMERAL SEVEN
+0xFA51,0x2167, //#ROMAN NUMERAL EIGHT
+0xFA52,0x2168, //#ROMAN NUMERAL NINE
+0xFA53,0x2169, //#ROMAN NUMERAL TEN
+0xFA54,0xFFE2, //#FULLWIDTH NOT SIGN
+0xFA55,0xFFE4, //#FULLWIDTH BROKEN BAR
+0xFA56,0xFF07, //#FULLWIDTH APOSTROPHE
+0xFA57,0xFF02, //#FULLWIDTH QUOTATION MARK
+0xFA58,0x3231, //#PARENTHESIZED IDEOGRAPH STOCK
+0xFA59,0x2116, //#NUMERO SIGN
+0xFA5A,0x2121, //#TELEPHONE SIGN
+0xFA5B,0x2235, //#BECAUSE
+0xFA5C,0x7E8A, //#CJK UNIFIED IDEOGRAPH
+0xFA5D,0x891C, //#CJK UNIFIED IDEOGRAPH
+0xFA5E,0x9348, //#CJK UNIFIED IDEOGRAPH
+0xFA5F,0x9288, //#CJK UNIFIED IDEOGRAPH
+0xFA60,0x84DC, //#CJK UNIFIED IDEOGRAPH
+0xFA61,0x4FC9, //#CJK UNIFIED IDEOGRAPH
+0xFA62,0x70BB, //#CJK UNIFIED IDEOGRAPH
+0xFA63,0x6631, //#CJK UNIFIED IDEOGRAPH
+0xFA64,0x68C8, //#CJK UNIFIED IDEOGRAPH
+0xFA65,0x92F9, //#CJK UNIFIED IDEOGRAPH
+0xFA66,0x66FB, //#CJK UNIFIED IDEOGRAPH
+0xFA67,0x5F45, //#CJK UNIFIED IDEOGRAPH
+0xFA68,0x4E28, //#CJK UNIFIED IDEOGRAPH
+0xFA69,0x4EE1, //#CJK UNIFIED IDEOGRAPH
+0xFA6A,0x4EFC, //#CJK UNIFIED IDEOGRAPH
+0xFA6B,0x4F00, //#CJK UNIFIED IDEOGRAPH
+0xFA6C,0x4F03, //#CJK UNIFIED IDEOGRAPH
+0xFA6D,0x4F39, //#CJK UNIFIED IDEOGRAPH
+0xFA6E,0x4F56, //#CJK UNIFIED IDEOGRAPH
+0xFA6F,0x4F92, //#CJK UNIFIED IDEOGRAPH
+0xFA70,0x4F8A, //#CJK UNIFIED IDEOGRAPH
+0xFA71,0x4F9A, //#CJK UNIFIED IDEOGRAPH
+0xFA72,0x4F94, //#CJK UNIFIED IDEOGRAPH
+0xFA73,0x4FCD, //#CJK UNIFIED IDEOGRAPH
+0xFA74,0x5040, //#CJK UNIFIED IDEOGRAPH
+0xFA75,0x5022, //#CJK UNIFIED IDEOGRAPH
+0xFA76,0x4FFF, //#CJK UNIFIED IDEOGRAPH
+0xFA77,0x501E, //#CJK UNIFIED IDEOGRAPH
+0xFA78,0x5046, //#CJK UNIFIED IDEOGRAPH
+0xFA79,0x5070, //#CJK UNIFIED IDEOGRAPH
+0xFA7A,0x5042, //#CJK UNIFIED IDEOGRAPH
+0xFA7B,0x5094, //#CJK UNIFIED IDEOGRAPH
+0xFA7C,0x50F4, //#CJK UNIFIED IDEOGRAPH
+0xFA7D,0x50D8, //#CJK UNIFIED IDEOGRAPH
+0xFA7E,0x514A, //#CJK UNIFIED IDEOGRAPH
+0xFA80,0x5164, //#CJK UNIFIED IDEOGRAPH
+0xFA81,0x519D, //#CJK UNIFIED IDEOGRAPH
+0xFA82,0x51BE, //#CJK UNIFIED IDEOGRAPH
+0xFA83,0x51EC, //#CJK UNIFIED IDEOGRAPH
+0xFA84,0x5215, //#CJK UNIFIED IDEOGRAPH
+0xFA85,0x529C, //#CJK UNIFIED IDEOGRAPH
+0xFA86,0x52A6, //#CJK UNIFIED IDEOGRAPH
+0xFA87,0x52C0, //#CJK UNIFIED IDEOGRAPH
+0xFA88,0x52DB, //#CJK UNIFIED IDEOGRAPH
+0xFA89,0x5300, //#CJK UNIFIED IDEOGRAPH
+0xFA8A,0x5307, //#CJK UNIFIED IDEOGRAPH
+0xFA8B,0x5324, //#CJK UNIFIED IDEOGRAPH
+0xFA8C,0x5372, //#CJK UNIFIED IDEOGRAPH
+0xFA8D,0x5393, //#CJK UNIFIED IDEOGRAPH
+0xFA8E,0x53B2, //#CJK UNIFIED IDEOGRAPH
+0xFA8F,0x53DD, //#CJK UNIFIED IDEOGRAPH
+0xFA90,0xFA0E, //#CJK COMPATIBILITY IDEOGRAPH
+0xFA91,0x549C, //#CJK UNIFIED IDEOGRAPH
+0xFA92,0x548A, //#CJK UNIFIED IDEOGRAPH
+0xFA93,0x54A9, //#CJK UNIFIED IDEOGRAPH
+0xFA94,0x54FF, //#CJK UNIFIED IDEOGRAPH
+0xFA95,0x5586, //#CJK UNIFIED IDEOGRAPH
+0xFA96,0x5759, //#CJK UNIFIED IDEOGRAPH
+0xFA97,0x5765, //#CJK UNIFIED IDEOGRAPH
+0xFA98,0x57AC, //#CJK UNIFIED IDEOGRAPH
+0xFA99,0x57C8, //#CJK UNIFIED IDEOGRAPH
+0xFA9A,0x57C7, //#CJK UNIFIED IDEOGRAPH
+0xFA9B,0xFA0F, //#CJK COMPATIBILITY IDEOGRAPH
+0xFA9C,0xFA10, //#CJK COMPATIBILITY IDEOGRAPH
+0xFA9D,0x589E, //#CJK UNIFIED IDEOGRAPH
+0xFA9E,0x58B2, //#CJK UNIFIED IDEOGRAPH
+0xFA9F,0x590B, //#CJK UNIFIED IDEOGRAPH
+0xFAA0,0x5953, //#CJK UNIFIED IDEOGRAPH
+0xFAA1,0x595B, //#CJK UNIFIED IDEOGRAPH
+0xFAA2,0x595D, //#CJK UNIFIED IDEOGRAPH
+0xFAA3,0x5963, //#CJK UNIFIED IDEOGRAPH
+0xFAA4,0x59A4, //#CJK UNIFIED IDEOGRAPH
+0xFAA5,0x59BA, //#CJK UNIFIED IDEOGRAPH
+0xFAA6,0x5B56, //#CJK UNIFIED IDEOGRAPH
+0xFAA7,0x5BC0, //#CJK UNIFIED IDEOGRAPH
+0xFAA8,0x752F, //#CJK UNIFIED IDEOGRAPH
+0xFAA9,0x5BD8, //#CJK UNIFIED IDEOGRAPH
+0xFAAA,0x5BEC, //#CJK UNIFIED IDEOGRAPH
+0xFAAB,0x5C1E, //#CJK UNIFIED IDEOGRAPH
+0xFAAC,0x5CA6, //#CJK UNIFIED IDEOGRAPH
+0xFAAD,0x5CBA, //#CJK UNIFIED IDEOGRAPH
+0xFAAE,0x5CF5, //#CJK UNIFIED IDEOGRAPH
+0xFAAF,0x5D27, //#CJK UNIFIED IDEOGRAPH
+0xFAB0,0x5D53, //#CJK UNIFIED IDEOGRAPH
+0xFAB1,0xFA11, //#CJK COMPATIBILITY IDEOGRAPH
+0xFAB2,0x5D42, //#CJK UNIFIED IDEOGRAPH
+0xFAB3,0x5D6D, //#CJK UNIFIED IDEOGRAPH
+0xFAB4,0x5DB8, //#CJK UNIFIED IDEOGRAPH
+0xFAB5,0x5DB9, //#CJK UNIFIED IDEOGRAPH
+0xFAB6,0x5DD0, //#CJK UNIFIED IDEOGRAPH
+0xFAB7,0x5F21, //#CJK UNIFIED IDEOGRAPH
+0xFAB8,0x5F34, //#CJK UNIFIED IDEOGRAPH
+0xFAB9,0x5F67, //#CJK UNIFIED IDEOGRAPH
+0xFABA,0x5FB7, //#CJK UNIFIED IDEOGRAPH
+0xFABB,0x5FDE, //#CJK UNIFIED IDEOGRAPH
+0xFABC,0x605D, //#CJK UNIFIED IDEOGRAPH
+0xFABD,0x6085, //#CJK UNIFIED IDEOGRAPH
+0xFABE,0x608A, //#CJK UNIFIED IDEOGRAPH
+0xFABF,0x60DE, //#CJK UNIFIED IDEOGRAPH
+0xFAC0,0x60D5, //#CJK UNIFIED IDEOGRAPH
+0xFAC1,0x6120, //#CJK UNIFIED IDEOGRAPH
+0xFAC2,0x60F2, //#CJK UNIFIED IDEOGRAPH
+0xFAC3,0x6111, //#CJK UNIFIED IDEOGRAPH
+0xFAC4,0x6137, //#CJK UNIFIED IDEOGRAPH
+0xFAC5,0x6130, //#CJK UNIFIED IDEOGRAPH
+0xFAC6,0x6198, //#CJK UNIFIED IDEOGRAPH
+0xFAC7,0x6213, //#CJK UNIFIED IDEOGRAPH
+0xFAC8,0x62A6, //#CJK UNIFIED IDEOGRAPH
+0xFAC9,0x63F5, //#CJK UNIFIED IDEOGRAPH
+0xFACA,0x6460, //#CJK UNIFIED IDEOGRAPH
+0xFACB,0x649D, //#CJK UNIFIED IDEOGRAPH
+0xFACC,0x64CE, //#CJK UNIFIED IDEOGRAPH
+0xFACD,0x654E, //#CJK UNIFIED IDEOGRAPH
+0xFACE,0x6600, //#CJK UNIFIED IDEOGRAPH
+0xFACF,0x6615, //#CJK UNIFIED IDEOGRAPH
+0xFAD0,0x663B, //#CJK UNIFIED IDEOGRAPH
+0xFAD1,0x6609, //#CJK UNIFIED IDEOGRAPH
+0xFAD2,0x662E, //#CJK UNIFIED IDEOGRAPH
+0xFAD3,0x661E, //#CJK UNIFIED IDEOGRAPH
+0xFAD4,0x6624, //#CJK UNIFIED IDEOGRAPH
+0xFAD5,0x6665, //#CJK UNIFIED IDEOGRAPH
+0xFAD6,0x6657, //#CJK UNIFIED IDEOGRAPH
+0xFAD7,0x6659, //#CJK UNIFIED IDEOGRAPH
+0xFAD8,0xFA12, //#CJK COMPATIBILITY IDEOGRAPH
+0xFAD9,0x6673, //#CJK UNIFIED IDEOGRAPH
+0xFADA,0x6699, //#CJK UNIFIED IDEOGRAPH
+0xFADB,0x66A0, //#CJK UNIFIED IDEOGRAPH
+0xFADC,0x66B2, //#CJK UNIFIED IDEOGRAPH
+0xFADD,0x66BF, //#CJK UNIFIED IDEOGRAPH
+0xFADE,0x66FA, //#CJK UNIFIED IDEOGRAPH
+0xFADF,0x670E, //#CJK UNIFIED IDEOGRAPH
+0xFAE0,0xF929, //#CJK COMPATIBILITY IDEOGRAPH
+0xFAE1,0x6766, //#CJK UNIFIED IDEOGRAPH
+0xFAE2,0x67BB, //#CJK UNIFIED IDEOGRAPH
+0xFAE3,0x6852, //#CJK UNIFIED IDEOGRAPH
+0xFAE4,0x67C0, //#CJK UNIFIED IDEOGRAPH
+0xFAE5,0x6801, //#CJK UNIFIED IDEOGRAPH
+0xFAE6,0x6844, //#CJK UNIFIED IDEOGRAPH
+0xFAE7,0x68CF, //#CJK UNIFIED IDEOGRAPH
+0xFAE8,0xFA13, //#CJK COMPATIBILITY IDEOGRAPH
+0xFAE9,0x6968, //#CJK UNIFIED IDEOGRAPH
+0xFAEA,0xFA14, //#CJK COMPATIBILITY IDEOGRAPH
+0xFAEB,0x6998, //#CJK UNIFIED IDEOGRAPH
+0xFAEC,0x69E2, //#CJK UNIFIED IDEOGRAPH
+0xFAED,0x6A30, //#CJK UNIFIED IDEOGRAPH
+0xFAEE,0x6A6B, //#CJK UNIFIED IDEOGRAPH
+0xFAEF,0x6A46, //#CJK UNIFIED IDEOGRAPH
+0xFAF0,0x6A73, //#CJK UNIFIED IDEOGRAPH
+0xFAF1,0x6A7E, //#CJK UNIFIED IDEOGRAPH
+0xFAF2,0x6AE2, //#CJK UNIFIED IDEOGRAPH
+0xFAF3,0x6AE4, //#CJK UNIFIED IDEOGRAPH
+0xFAF4,0x6BD6, //#CJK UNIFIED IDEOGRAPH
+0xFAF5,0x6C3F, //#CJK UNIFIED IDEOGRAPH
+0xFAF6,0x6C5C, //#CJK UNIFIED IDEOGRAPH
+0xFAF7,0x6C86, //#CJK UNIFIED IDEOGRAPH
+0xFAF8,0x6C6F, //#CJK UNIFIED IDEOGRAPH
+0xFAF9,0x6CDA, //#CJK UNIFIED IDEOGRAPH
+0xFAFA,0x6D04, //#CJK UNIFIED IDEOGRAPH
+0xFAFB,0x6D87, //#CJK UNIFIED IDEOGRAPH
+0xFAFC,0x6D6F, //#CJK UNIFIED IDEOGRAPH
+0xFB40,0x6D96, //#CJK UNIFIED IDEOGRAPH
+0xFB41,0x6DAC, //#CJK UNIFIED IDEOGRAPH
+0xFB42,0x6DCF, //#CJK UNIFIED IDEOGRAPH
+0xFB43,0x6DF8, //#CJK UNIFIED IDEOGRAPH
+0xFB44,0x6DF2, //#CJK UNIFIED IDEOGRAPH
+0xFB45,0x6DFC, //#CJK UNIFIED IDEOGRAPH
+0xFB46,0x6E39, //#CJK UNIFIED IDEOGRAPH
+0xFB47,0x6E5C, //#CJK UNIFIED IDEOGRAPH
+0xFB48,0x6E27, //#CJK UNIFIED IDEOGRAPH
+0xFB49,0x6E3C, //#CJK UNIFIED IDEOGRAPH
+0xFB4A,0x6EBF, //#CJK UNIFIED IDEOGRAPH
+0xFB4B,0x6F88, //#CJK UNIFIED IDEOGRAPH
+0xFB4C,0x6FB5, //#CJK UNIFIED IDEOGRAPH
+0xFB4D,0x6FF5, //#CJK UNIFIED IDEOGRAPH
+0xFB4E,0x7005, //#CJK UNIFIED IDEOGRAPH
+0xFB4F,0x7007, //#CJK UNIFIED IDEOGRAPH
+0xFB50,0x7028, //#CJK UNIFIED IDEOGRAPH
+0xFB51,0x7085, //#CJK UNIFIED IDEOGRAPH
+0xFB52,0x70AB, //#CJK UNIFIED IDEOGRAPH
+0xFB53,0x710F, //#CJK UNIFIED IDEOGRAPH
+0xFB54,0x7104, //#CJK UNIFIED IDEOGRAPH
+0xFB55,0x715C, //#CJK UNIFIED IDEOGRAPH
+0xFB56,0x7146, //#CJK UNIFIED IDEOGRAPH
+0xFB57,0x7147, //#CJK UNIFIED IDEOGRAPH
+0xFB58,0xFA15, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB59,0x71C1, //#CJK UNIFIED IDEOGRAPH
+0xFB5A,0x71FE, //#CJK UNIFIED IDEOGRAPH
+0xFB5B,0x72B1, //#CJK UNIFIED IDEOGRAPH
+0xFB5C,0x72BE, //#CJK UNIFIED IDEOGRAPH
+0xFB5D,0x7324, //#CJK UNIFIED IDEOGRAPH
+0xFB5E,0xFA16, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB5F,0x7377, //#CJK UNIFIED IDEOGRAPH
+0xFB60,0x73BD, //#CJK UNIFIED IDEOGRAPH
+0xFB61,0x73C9, //#CJK UNIFIED IDEOGRAPH
+0xFB62,0x73D6, //#CJK UNIFIED IDEOGRAPH
+0xFB63,0x73E3, //#CJK UNIFIED IDEOGRAPH
+0xFB64,0x73D2, //#CJK UNIFIED IDEOGRAPH
+0xFB65,0x7407, //#CJK UNIFIED IDEOGRAPH
+0xFB66,0x73F5, //#CJK UNIFIED IDEOGRAPH
+0xFB67,0x7426, //#CJK UNIFIED IDEOGRAPH
+0xFB68,0x742A, //#CJK UNIFIED IDEOGRAPH
+0xFB69,0x7429, //#CJK UNIFIED IDEOGRAPH
+0xFB6A,0x742E, //#CJK UNIFIED IDEOGRAPH
+0xFB6B,0x7462, //#CJK UNIFIED IDEOGRAPH
+0xFB6C,0x7489, //#CJK UNIFIED IDEOGRAPH
+0xFB6D,0x749F, //#CJK UNIFIED IDEOGRAPH
+0xFB6E,0x7501, //#CJK UNIFIED IDEOGRAPH
+0xFB6F,0x756F, //#CJK UNIFIED IDEOGRAPH
+0xFB70,0x7682, //#CJK UNIFIED IDEOGRAPH
+0xFB71,0x769C, //#CJK UNIFIED IDEOGRAPH
+0xFB72,0x769E, //#CJK UNIFIED IDEOGRAPH
+0xFB73,0x769B, //#CJK UNIFIED IDEOGRAPH
+0xFB74,0x76A6, //#CJK UNIFIED IDEOGRAPH
+0xFB75,0xFA17, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB76,0x7746, //#CJK UNIFIED IDEOGRAPH
+0xFB77,0x52AF, //#CJK UNIFIED IDEOGRAPH
+0xFB78,0x7821, //#CJK UNIFIED IDEOGRAPH
+0xFB79,0x784E, //#CJK UNIFIED IDEOGRAPH
+0xFB7A,0x7864, //#CJK UNIFIED IDEOGRAPH
+0xFB7B,0x787A, //#CJK UNIFIED IDEOGRAPH
+0xFB7C,0x7930, //#CJK UNIFIED IDEOGRAPH
+0xFB7D,0xFA18, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB7E,0xFA19, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB80,0xFA1A, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB81,0x7994, //#CJK UNIFIED IDEOGRAPH
+0xFB82,0xFA1B, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB83,0x799B, //#CJK UNIFIED IDEOGRAPH
+0xFB84,0x7AD1, //#CJK UNIFIED IDEOGRAPH
+0xFB85,0x7AE7, //#CJK UNIFIED IDEOGRAPH
+0xFB86,0xFA1C, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB87,0x7AEB, //#CJK UNIFIED IDEOGRAPH
+0xFB88,0x7B9E, //#CJK UNIFIED IDEOGRAPH
+0xFB89,0xFA1D, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB8A,0x7D48, //#CJK UNIFIED IDEOGRAPH
+0xFB8B,0x7D5C, //#CJK UNIFIED IDEOGRAPH
+0xFB8C,0x7DB7, //#CJK UNIFIED IDEOGRAPH
+0xFB8D,0x7DA0, //#CJK UNIFIED IDEOGRAPH
+0xFB8E,0x7DD6, //#CJK UNIFIED IDEOGRAPH
+0xFB8F,0x7E52, //#CJK UNIFIED IDEOGRAPH
+0xFB90,0x7F47, //#CJK UNIFIED IDEOGRAPH
+0xFB91,0x7FA1, //#CJK UNIFIED IDEOGRAPH
+0xFB92,0xFA1E, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB93,0x8301, //#CJK UNIFIED IDEOGRAPH
+0xFB94,0x8362, //#CJK UNIFIED IDEOGRAPH
+0xFB95,0x837F, //#CJK UNIFIED IDEOGRAPH
+0xFB96,0x83C7, //#CJK UNIFIED IDEOGRAPH
+0xFB97,0x83F6, //#CJK UNIFIED IDEOGRAPH
+0xFB98,0x8448, //#CJK UNIFIED IDEOGRAPH
+0xFB99,0x84B4, //#CJK UNIFIED IDEOGRAPH
+0xFB9A,0x8553, //#CJK UNIFIED IDEOGRAPH
+0xFB9B,0x8559, //#CJK UNIFIED IDEOGRAPH
+0xFB9C,0x856B, //#CJK UNIFIED IDEOGRAPH
+0xFB9D,0xFA1F, //#CJK COMPATIBILITY IDEOGRAPH
+0xFB9E,0x85B0, //#CJK UNIFIED IDEOGRAPH
+0xFB9F,0xFA20, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBA0,0xFA21, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBA1,0x8807, //#CJK UNIFIED IDEOGRAPH
+0xFBA2,0x88F5, //#CJK UNIFIED IDEOGRAPH
+0xFBA3,0x8A12, //#CJK UNIFIED IDEOGRAPH
+0xFBA4,0x8A37, //#CJK UNIFIED IDEOGRAPH
+0xFBA5,0x8A79, //#CJK UNIFIED IDEOGRAPH
+0xFBA6,0x8AA7, //#CJK UNIFIED IDEOGRAPH
+0xFBA7,0x8ABE, //#CJK UNIFIED IDEOGRAPH
+0xFBA8,0x8ADF, //#CJK UNIFIED IDEOGRAPH
+0xFBA9,0xFA22, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBAA,0x8AF6, //#CJK UNIFIED IDEOGRAPH
+0xFBAB,0x8B53, //#CJK UNIFIED IDEOGRAPH
+0xFBAC,0x8B7F, //#CJK UNIFIED IDEOGRAPH
+0xFBAD,0x8CF0, //#CJK UNIFIED IDEOGRAPH
+0xFBAE,0x8CF4, //#CJK UNIFIED IDEOGRAPH
+0xFBAF,0x8D12, //#CJK UNIFIED IDEOGRAPH
+0xFBB0,0x8D76, //#CJK UNIFIED IDEOGRAPH
+0xFBB1,0xFA23, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBB2,0x8ECF, //#CJK UNIFIED IDEOGRAPH
+0xFBB3,0xFA24, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBB4,0xFA25, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBB5,0x9067, //#CJK UNIFIED IDEOGRAPH
+0xFBB6,0x90DE, //#CJK UNIFIED IDEOGRAPH
+0xFBB7,0xFA26, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBB8,0x9115, //#CJK UNIFIED IDEOGRAPH
+0xFBB9,0x9127, //#CJK UNIFIED IDEOGRAPH
+0xFBBA,0x91DA, //#CJK UNIFIED IDEOGRAPH
+0xFBBB,0x91D7, //#CJK UNIFIED IDEOGRAPH
+0xFBBC,0x91DE, //#CJK UNIFIED IDEOGRAPH
+0xFBBD,0x91ED, //#CJK UNIFIED IDEOGRAPH
+0xFBBE,0x91EE, //#CJK UNIFIED IDEOGRAPH
+0xFBBF,0x91E4, //#CJK UNIFIED IDEOGRAPH
+0xFBC0,0x91E5, //#CJK UNIFIED IDEOGRAPH
+0xFBC1,0x9206, //#CJK UNIFIED IDEOGRAPH
+0xFBC2,0x9210, //#CJK UNIFIED IDEOGRAPH
+0xFBC3,0x920A, //#CJK UNIFIED IDEOGRAPH
+0xFBC4,0x923A, //#CJK UNIFIED IDEOGRAPH
+0xFBC5,0x9240, //#CJK UNIFIED IDEOGRAPH
+0xFBC6,0x923C, //#CJK UNIFIED IDEOGRAPH
+0xFBC7,0x924E, //#CJK UNIFIED IDEOGRAPH
+0xFBC8,0x9259, //#CJK UNIFIED IDEOGRAPH
+0xFBC9,0x9251, //#CJK UNIFIED IDEOGRAPH
+0xFBCA,0x9239, //#CJK UNIFIED IDEOGRAPH
+0xFBCB,0x9267, //#CJK UNIFIED IDEOGRAPH
+0xFBCC,0x92A7, //#CJK UNIFIED IDEOGRAPH
+0xFBCD,0x9277, //#CJK UNIFIED IDEOGRAPH
+0xFBCE,0x9278, //#CJK UNIFIED IDEOGRAPH
+0xFBCF,0x92E7, //#CJK UNIFIED IDEOGRAPH
+0xFBD0,0x92D7, //#CJK UNIFIED IDEOGRAPH
+0xFBD1,0x92D9, //#CJK UNIFIED IDEOGRAPH
+0xFBD2,0x92D0, //#CJK UNIFIED IDEOGRAPH
+0xFBD3,0xFA27, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBD4,0x92D5, //#CJK UNIFIED IDEOGRAPH
+0xFBD5,0x92E0, //#CJK UNIFIED IDEOGRAPH
+0xFBD6,0x92D3, //#CJK UNIFIED IDEOGRAPH
+0xFBD7,0x9325, //#CJK UNIFIED IDEOGRAPH
+0xFBD8,0x9321, //#CJK UNIFIED IDEOGRAPH
+0xFBD9,0x92FB, //#CJK UNIFIED IDEOGRAPH
+0xFBDA,0xFA28, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBDB,0x931E, //#CJK UNIFIED IDEOGRAPH
+0xFBDC,0x92FF, //#CJK UNIFIED IDEOGRAPH
+0xFBDD,0x931D, //#CJK UNIFIED IDEOGRAPH
+0xFBDE,0x9302, //#CJK UNIFIED IDEOGRAPH
+0xFBDF,0x9370, //#CJK UNIFIED IDEOGRAPH
+0xFBE0,0x9357, //#CJK UNIFIED IDEOGRAPH
+0xFBE1,0x93A4, //#CJK UNIFIED IDEOGRAPH
+0xFBE2,0x93C6, //#CJK UNIFIED IDEOGRAPH
+0xFBE3,0x93DE, //#CJK UNIFIED IDEOGRAPH
+0xFBE4,0x93F8, //#CJK UNIFIED IDEOGRAPH
+0xFBE5,0x9431, //#CJK UNIFIED IDEOGRAPH
+0xFBE6,0x9445, //#CJK UNIFIED IDEOGRAPH
+0xFBE7,0x9448, //#CJK UNIFIED IDEOGRAPH
+0xFBE8,0x9592, //#CJK UNIFIED IDEOGRAPH
+0xFBE9,0xF9DC, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBEA,0xFA29, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBEB,0x969D, //#CJK UNIFIED IDEOGRAPH
+0xFBEC,0x96AF, //#CJK UNIFIED IDEOGRAPH
+0xFBED,0x9733, //#CJK UNIFIED IDEOGRAPH
+0xFBEE,0x973B, //#CJK UNIFIED IDEOGRAPH
+0xFBEF,0x9743, //#CJK UNIFIED IDEOGRAPH
+0xFBF0,0x974D, //#CJK UNIFIED IDEOGRAPH
+0xFBF1,0x974F, //#CJK UNIFIED IDEOGRAPH
+0xFBF2,0x9751, //#CJK UNIFIED IDEOGRAPH
+0xFBF3,0x9755, //#CJK UNIFIED IDEOGRAPH
+0xFBF4,0x9857, //#CJK UNIFIED IDEOGRAPH
+0xFBF5,0x9865, //#CJK UNIFIED IDEOGRAPH
+0xFBF6,0xFA2A, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBF7,0xFA2B, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBF8,0x9927, //#CJK UNIFIED IDEOGRAPH
+0xFBF9,0xFA2C, //#CJK COMPATIBILITY IDEOGRAPH
+0xFBFA,0x999E, //#CJK UNIFIED IDEOGRAPH
+0xFBFB,0x9A4E, //#CJK UNIFIED IDEOGRAPH
+0xFBFC,0x9AD9, //#CJK UNIFIED IDEOGRAPH
+0xFC40,0x9ADC, //#CJK UNIFIED IDEOGRAPH
+0xFC41,0x9B75, //#CJK UNIFIED IDEOGRAPH
+0xFC42,0x9B72, //#CJK UNIFIED IDEOGRAPH
+0xFC43,0x9B8F, //#CJK UNIFIED IDEOGRAPH
+0xFC44,0x9BB1, //#CJK UNIFIED IDEOGRAPH
+0xFC45,0x9BBB, //#CJK UNIFIED IDEOGRAPH
+0xFC46,0x9C00, //#CJK UNIFIED IDEOGRAPH
+0xFC47,0x9D70, //#CJK UNIFIED IDEOGRAPH
+0xFC48,0x9D6B, //#CJK UNIFIED IDEOGRAPH
+0xFC49,0xFA2D, //#CJK COMPATIBILITY IDEOGRAPH
+0xFC4A,0x9E19, //#CJK UNIFIED IDEOGRAPH
+0xFC4B,0x9ED1  //#CJK UNIFIED IDEOGRAPH
+};
diff --git a/include/_mingw.h b/include/_mingw.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/algorithm b/include/algorithm
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/assert.h b/include/assert.h
new file mode 100644 (file)
index 0000000..c81c0f7
--- /dev/null
@@ -0,0 +1,2 @@
+#pragma once
+#define assert(a)
diff --git a/include/cctype b/include/cctype
new file mode 100644 (file)
index 0000000..09cd549
--- /dev/null
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <ctype.h>
+
+namespace std{
+       typedef ::size_t size_t;
+       typedef ::ptrdiff_t ptrdiff_t;
+
+}
\ No newline at end of file
diff --git a/include/cstddef b/include/cstddef
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/ctype.h b/include/ctype.h
new file mode 100644 (file)
index 0000000..997f556
--- /dev/null
@@ -0,0 +1,64 @@
+#pragma once
+
+typedef unsigned int size_t;
+typedef unsigned int ptrdiff_t;
+//ascii
+inline int isdigit(int c){
+       return '0' <= c && c <= '9';
+}
+
+inline int isupper(int c){
+       return ('A' <= c && c <= 'Z');
+}
+
+inline int islower(int c){
+       return ('a' <= c && c <= 'z');
+}
+
+inline int isalpha(int c){
+       return isupper(c) || islower(c);
+}
+
+
+inline int isalnum(int c){
+       return isalpha(c) || isdigit(c);
+}
+
+inline int toupper(int c){
+       return islower(c) ? c - 0x20 : c;
+}
+
+inline int tolower(int c){
+       return isupper(c) ? c + 0x20 : c;
+}
+
+//unicode
+inline int iswdigit(wchar_t c){
+       return L'0' <= c && c <= L'9';
+}
+
+inline int iswupper(wchar_t c){
+       return L'A' <= c && c <= L'Z';
+}
+
+inline int iswlower(wchar_t c){
+       return L'a' <= c && c <= L'z';
+}
+
+inline int iswalpha(wchar_t c){
+       return iswupper(c) || iswlower(c);
+}
+
+inline int iswalnum(wchar_t c){
+       return iswalpha(c) || iswdigit(c);
+}
+
+
+
+inline wchar_t towupper(wchar_t c){
+       return iswlower(c) ? c - 0x20 : c;
+}
+
+inline wchar_t towlower(wchar_t c){
+       return iswupper(c) ? c + 0x20 : c;
+}
diff --git a/include/errno.h b/include/errno.h
new file mode 100644 (file)
index 0000000..3b2b64e
--- /dev/null
@@ -0,0 +1,20 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(ERRNO_H))
+
+#define ERRNO_H        1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+extern int errno;
+
+#define        ENOENT          2       /* No such file or directory */
+#define        ERANGE          34      /* Result too large (or too small) */
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/include/exception b/include/exception
new file mode 100644 (file)
index 0000000..e5be75d
--- /dev/null
@@ -0,0 +1,16 @@
+#pragma once
+
+namespace std{
+
+       class exception{
+       public:
+               exception(){}
+               virtual ~exception(){}
+       };
+       class bad_cast: public exception{
+       public:
+               virtual ~bad_cast(){}
+       };
+
+       struct nothrow_t{};
+}
\ No newline at end of file
diff --git a/include/float.h b/include/float.h
new file mode 100644 (file)
index 0000000..f541ac1
--- /dev/null
@@ -0,0 +1,26 @@
+/* copyright(C) 2002 H.Kawai (under KL-01). */
+
+#if (!defined(FLOAT_H))
+
+#define FLOAT_H                        1
+
+#define FLT_RADIX              2
+#define FLT_ROUNDS             1 /* nearest */
+#define FLT_DIG                        6
+#define FLT_EPSILON            1.19209290e-07F
+#define FLT_MANT_DIG   24
+#define FLT_MAX                        3.40282347e+38F
+#define FLT_MAX_EXP            (+128)
+#define FLT_MIN                        1.17549435e-38F
+#define FLT_MIN_EXP            (-125)
+
+#define DBL_DIG                        15
+#define DBL_EPSILON            2.2204460492503131e-16
+#define DBL_MANT_DIG   53
+#define DBL_MAX                        1.7976931348623157e+308
+#define DBL_MAX_EXP            1024
+#define DBL_MIN                        2.2250738585072014e-308
+#define DBL_MIN_EXP            (-1021)
+
+#endif
+
diff --git a/include/functional b/include/functional
new file mode 100644 (file)
index 0000000..efa55a5
--- /dev/null
@@ -0,0 +1,13 @@
+#pragma once
+
+namespace std{
+       template <class T>
+       class less{
+         public:
+               less(){
+               }
+               bool operator()(const T &a, const T &b)const{
+                       return a < b;
+               }
+       };
+}
\ No newline at end of file
diff --git a/include/haribote.rul b/include/haribote.rul
new file mode 100644 (file)
index 0000000..c0a8e92
--- /dev/null
@@ -0,0 +1,19 @@
+format:
+       /* \82±\82Ì\83Z\83N\83V\83\87\83\93\82Å\83\8a\83\93\83N\82Ì\95û\90j\82ð\8bL\8fq */
+       code(align:1, logic:0x24,      file:0x24);
+       data(align:4, logic:stack_end, file:code_end);
+
+file:
+       /* \82±\82Ì\83Z\83N\83V\83\87\83\93\82Å\83R\83}\83\93\83h\83\89\83C\83\93\82É\8f\91\82«\82«\82ê\82È\82©\82Á\82½
+               .obj\83t\83@\83C\83\8b\81A.lib\83t\83@\83C\83\8b\82ð\8bL\8dÚ */
+       /* \82È\82¨\81A\82±\82Ì\83Z\83N\83V\83\87\83\93\82Í\83t\83\8b\83p\83X\82Å\8f\91\82¢\82Ä\82à\82æ\82¢\81B */
+       /* \97á\81F  c:/osask/gg00libc.lib;  */
+       ../z_tools/haribote/harilibc.lib;
+       ../z_tools/haribote/golibc.lib;
+
+label:
+       /* \95K\82¸\83\8a\83\93\83N\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\83\89\83x\83\8b\82ð\8ew\92è */
+       /* \83G\83\93\83g\83\8a\83|\83C\83\93\83g\82ð\8ew\92è\82·\82ê\82Î\82¢\82¢\82Æ\8ev\82Á\82Ä\82­\82¾\82³\82¢ */
+       _HariStartup;
+
+       /* \8fã\8bL3\83Z\83N\83V\83\87\83\93\82Ì\8f\87\8f\98\82Í\93ü\82ê\91Ö\82¦\82Ä\82Í\82¢\82¯\82Ü\82¹\82ñ! */
diff --git a/include/harilibc.lib b/include/harilibc.lib
new file mode 100644 (file)
index 0000000..545fd31
Binary files /dev/null and b/include/harilibc.lib differ
diff --git a/include/iosfwd b/include/iosfwd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/limits.h b/include/limits.h
new file mode 100644 (file)
index 0000000..9eb6c47
--- /dev/null
@@ -0,0 +1,23 @@
+/* copyright(C) 2002 H.Kawai (under KL-01). */
+
+#if (!defined(LIMITS_H))
+
+#define LIMITS_H       1
+
+#define CHAR_BIT       8
+#define        CHAR_MAX        (+127)
+#define CHAR_MIN       0
+#define INT_MAX                (+0x7fffffff)
+#define INT_MIN                (-0x7fffffff)
+#define LONG_MAX    INT_MAX
+#define        LONG_MIN        INT_MIN
+#define SCHAR_MAX      (+127)
+#define        SCHAR_MIN       (-127)
+#define        SHRT_MAX        (+0x7fff)
+#define SHRT_MIN       (-0x7fff)
+#define UCHAR_MAX      (+0xff)
+#define UINT_MAX       (+0xffffffff)
+#define ULONG_MAX      UINT_MAX
+#define USHRT_MAX      (+0xffff)
+
+#endif
diff --git a/include/math.h b/include/math.h
new file mode 100644 (file)
index 0000000..da7ac84
--- /dev/null
@@ -0,0 +1,42 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(MATH_H))
+
+#define MATH_H 1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+double sin(double);
+double cos(double);
+double sqrt(double);
+double ldexp(double x, int n);
+double frexp(double x, int *exp);
+
+extern __inline__ double sin(double x)
+{
+       double res;
+       __asm__ ("fsin" : "=t" (res) : "0" (x));
+       return res;
+}
+
+extern __inline__ double cos(double x)
+{
+       double res;
+       __asm__ ("fcos" : "=t" (res) : "0" (x));
+       return res;
+}
+
+extern __inline__ double sqrt(double x)
+{
+       double res;
+       __asm__ ("fsqrt" : "=t" (res) : "0" (x));
+       return res;
+}
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/include/memory b/include/memory
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/new b/include/new
new file mode 100644 (file)
index 0000000..3d098c4
--- /dev/null
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <cctype>
+#include <exception>
+
+
+namespace std{
+       class bad_alloc: public exception{
+       public:
+               virtual ~bad_alloc(){}
+       };
+};
+
+
+
+void* operator new(std::size_t) ;
+void* operator new[](std::size_t) ;
+void operator delete(void*) throw();
+void operator delete[](void*) throw();
+void* operator new(std::size_t, const std::nothrow_t&) throw();
+void* operator new[](std::size_t, const std::nothrow_t&) throw();
+void operator delete(void*, const std::nothrow_t&) throw();
+void operator delete[](void*, const std::nothrow_t&) throw();
+
+// Default placement versions of operator new.
+inline void* operator new(std::size_t, void* __p) throw() { return __p; }
+inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
+
+// Default placement versions of operator delete.
+inline void  operator delete  (void*, void*) throw() { }
+inline void  operator delete[](void*, void*) throw() { }
+
diff --git a/include/random b/include/random
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/random.h b/include/random.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/setjmp.h b/include/setjmp.h
new file mode 100644 (file)
index 0000000..3aa5996
--- /dev/null
@@ -0,0 +1,20 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(SETJMP_H))
+
+#define SETJMP_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+typedef int jmp_buf[3]; /* EBP, EIP, ESP */
+
+#define setjmp(env)                    __builtin_setjmp(env)
+#define longjmp(env, val)      __builtin_longjmp(env, val)
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/include/stdarg.h b/include/stdarg.h
new file mode 100644 (file)
index 0000000..01b5365
--- /dev/null
@@ -0,0 +1,21 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDARG_H))
+
+#define STDARG_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+#define va_start(v,l)  __builtin_va_start((v),l)
+#define va_end                 __builtin_va_end
+#define va_arg                 __builtin_va_arg
+#define va_copy(d,s)   __builtin_va_copy((d),(s))
+#define        va_list                 __builtin_va_list
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/include/stddef.h b/include/stddef.h
new file mode 100644 (file)
index 0000000..cdc2895
--- /dev/null
@@ -0,0 +1,17 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDDEF_H))
+
+#define STDDEF_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+typedef unsigned int size_t;
+typedef unsigned int ptrdiff_t;
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/include/stdio.h b/include/stdio.h
new file mode 100644 (file)
index 0000000..0fe67a5
--- /dev/null
@@ -0,0 +1,28 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDIO_H))
+
+#define STDIO_H        1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+#if (defined(__cplusplus))
+       #define NULL    0
+#else
+#if (!defined(NULL))
+       #define NULL    ((void *) 0)
+#endif
+#endif
+
+#include <stdarg.h>
+
+int sprintf(char *s, const char *format, ...);
+int vsprintf(char *s, const char *format, va_list arg);
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/include/stdlib.h b/include/stdlib.h
new file mode 100644 (file)
index 0000000..31859f1
--- /dev/null
@@ -0,0 +1,42 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STDLIB_H))
+
+#define STDLIB_H       1
+
+#if (defined(__cplusplus))
+extern "C" {
+#endif
+
+#include <stddef.h>            /* size_t */
+#include <stdio.h>             /* NULL */
+
+#define        RAND_MAX        0x7fff
+#define srand(seed)                    (void) (rand_seed = (seed))
+
+#define EXIT_SUCCESS           0
+#define EXIT_FAILURE           1
+
+int abs(int n);
+double atof(const char *s);
+int atoi(const char *s);
+void qsort(void *base, size_t n, size_t size,
+                  int (*cmp)(const void *, const void *));
+int rand(void);
+extern unsigned int rand_seed;
+double strtod(const char *s, const char **endp);
+long strtol(const char *s, const char **endp, int base);
+unsigned long strtoul(const char *s, const char **endp, int base);
+
+/* for strdup() */
+void *malloc(unsigned int nbytes);
+void free(void *ap);
+
+int cp932towcs(const char *p1, int n, wchar_t *unicode);
+size_t mbstowcs(wchar_t *dest, const char *src, size_t n);
+
+#if (defined(__cplusplus))
+}
+#endif
+
+#endif
diff --git a/include/stl_algo.h b/include/stl_algo.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/string.h b/include/string.h
new file mode 100644 (file)
index 0000000..0a8aaa1
--- /dev/null
@@ -0,0 +1,45 @@
+/* copyright(C) 2003 H.Kawai (under KL-01). */
+
+#if (!defined(STRING_H))
+
+#define STRING_H       1
+
+#if (defined(__cplusplus))
+       extern "C" {
+#endif
+
+#include <stddef.h>            /* size_t */
+
+char *strcpy(char *s, const char *ct);
+char *strncpy(char *s, const char *ct, size_t n);
+char *strcat(char *s, const char *ct);
+char *strncat(char *s, const char *ct, size_t n);
+int strcmp(const char *cs, const char *ct);
+int strncmp(const char *cs, const char *ct, size_t n);
+char *strchr(const char *cs, int c);
+char *strrchr(const char *cs, int c);
+size_t strspn(const char *s, const char *accept);
+size_t strcspn(const char *s, const char *reject);
+char *strpbrk(const char *s, const char *accept);
+char *strstr(const char *cs, const char *ct);
+size_t strlen(const char *cs);
+
+void *memcpy(void *s, const void *ct, size_t n);
+void *memmove(void *s, const void *ct, size_t n);
+int memcmp(const void *cs, const void *ct, size_t n);
+void *memchr(const void *cs, int c, size_t n);
+void *memset(void *s, int c, size_t n);
+char *strdup(const char *s);
+
+
+int wcslen(const wchar_t *p);
+
+wchar_t *wcsncpy(wchar_t *dest, const wchar_t *src, int n);
+
+int wcsicmp(const wchar_t *s1, const wchar_t *s2);
+
+#if (defined(__cplusplus))
+       }
+#endif
+
+#endif
diff --git a/include/typeid b/include/typeid
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/typeinfo b/include/typeinfo
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/utility b/include/utility
new file mode 100644 (file)
index 0000000..f2da839
--- /dev/null
@@ -0,0 +1,10 @@
+#pragma once
+
+namespace std{
+       template <class T>
+       inline void swap(T &a, T& b){
+               T tmp = b;
+               b = a;
+               a = tmp;
+       }
+}
diff --git a/intmemo b/intmemo
new file mode 100644 (file)
index 0000000..2eed452
--- /dev/null
+++ b/intmemo
@@ -0,0 +1,4 @@
+\8a\84\8d\9e\90Ý\92è\83\81\83\82
+
+\83^\83C\83}\81[\8a\84\82è\8d\9e\82Ý int0x20 timer.cpp
+
diff --git a/makefat.pl b/makefat.pl
new file mode 100644 (file)
index 0000000..887eea6
--- /dev/null
@@ -0,0 +1,10 @@
+use strict;
+use warnings;
+
+print "BOOTMGR    ";
+print "\x20"; #flag
+print "\x00\x50\x69\x98\x16\x3d\x16\x3d";
+print "\x00\x00"; # cluster hi
+print "\xe0\x94\xed\x3a";
+print "\x03\x00"; # cluster lo
+print pack("L", -s "haribote/haribote.sys");
diff --git a/new2.txt b/new2.txt
new file mode 100644 (file)
index 0000000..a694da1
--- /dev/null
+++ b/new2.txt
@@ -0,0 +1,34 @@
+fat size : 3c8
+rsvd sec cnt : 0x1870
+tot : 0x3e780
+FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
+FirstDataSector = 0x1870 + 2 * 0x3c8 + 0x80 == 0x2080
+
+FirstSectorofCluster = ((N – 2) * BPB_SecPerClus) + FirstDataSector;
+(0x17a-2)*2 + 0x2080 = 0x2370
+
+DataSec = TotSec - (BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors);
+datasec = 0x3e780 - (0x1870 + 2 * 0x3c8 + 0) = 0x3c780
+3c780
+CountofClusters = DataSec / BPB_SecPerClus = 0x3c780 / 2
+
+0x0000017a
+0x017a3d16
+(0x017a-2)*2 + 0x2080 = 0x2370
+
+first fat?: 0x1870 + 0x80 = 0x18f0 = 6384
+31E000
+
+totsec32:0x3e780
+
+(0xf9e - 2)*2 + 0x2080 = 003FB8 = 0016312
+
+0x00- : mbr
+0x3f - ??: pat0 fat32
+0x3f : boot sect
+  0x00 - 0x3f : reserved sect
+  0x40 - 0x13f : fat 1
+  0x140 - 0x23f : fat 2
+  0x240 - : root dir (clus 2-2 (1クラスタのみ使用))
+       0x242: bootmgr(clus3- 断片化しないように入れておく)
+  
\ No newline at end of file
diff --git a/ntdll.dll b/ntdll.dll
new file mode 100644 (file)
index 0000000..757140e
Binary files /dev/null and b/ntdll.dll differ
diff --git a/ntdll/Debug/.gitignore b/ntdll/Debug/.gitignore
new file mode 100644 (file)
index 0000000..d20496a
--- /dev/null
@@ -0,0 +1,5 @@
+
+*.tlog
+*.obj
+*.pdb
+*.idb
\ No newline at end of file
diff --git a/ntdll/Debug/ntdll.dll.embed.manifest b/ntdll/Debug/ntdll.dll.embed.manifest
new file mode 100644 (file)
index 0000000..11bb704
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+</assembly>
\ No newline at end of file
diff --git a/ntdll/Debug/ntdll.dll.embed.manifest.res b/ntdll/Debug/ntdll.dll.embed.manifest.res
new file mode 100644 (file)
index 0000000..c933726
Binary files /dev/null and b/ntdll/Debug/ntdll.dll.embed.manifest.res differ
diff --git a/ntdll/Debug/ntdll.dll.intermediate.manifest b/ntdll/Debug/ntdll.dll.intermediate.manifest
new file mode 100644 (file)
index 0000000..ecea6f7
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
+<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+</assembly>
diff --git a/ntdll/Debug/ntdll.lastbuildstate b/ntdll/Debug/ntdll.lastbuildstate
new file mode 100644 (file)
index 0000000..34d8ccb
--- /dev/null
@@ -0,0 +1,2 @@
+#v4.0:v100
+Debug|Win32|G:\c\os\winexe-harib\haribote\|
diff --git a/ntdll/Debug/ntdll_manifest.rc b/ntdll/Debug/ntdll_manifest.rc
new file mode 100644 (file)
index 0000000..3db9014
Binary files /dev/null and b/ntdll/Debug/ntdll_manifest.rc differ
diff --git a/ntdll/ReadMe.txt b/ntdll/ReadMe.txt
new file mode 100644 (file)
index 0000000..c69f161
--- /dev/null
@@ -0,0 +1,53 @@
+========================================================================
+ ダイナミック リンク ライブラリ: ntdll プロジェクトの概要
+========================================================================
+
+この ntdll DLL は、AppWizard により作成されました。
+
+このファイルには、ntdll 
+アプリケーションを構成する各ファイルの内容の概要が含まれています。
+
+
+ntdll.vcxproj
+    これは、アプリケーション ウィザードを使用して生成された VC++ 
+    プロジェクトのメイン プロジェクト ファイルです。
+    ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション 
+    ウィザードで選択されたプラットフォーム、
+    構成、およびプロジェクト機能に関する情報が含まれています。
+
+ntdll.vcxproj.filters
+    これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター 
+    ファイルです。 
+    このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する
+    情報が含まれています。 この関連付けは、特定のノー
+    ドで同様の拡張子を持つファイルのグループ化を
+    示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" 
+    フィルターに関連付けられています)。
+
+ntdll.cpp
+    これは、メインの DLL ソース ファイルです。
+
+    この DLL の作成時には、シンボルがエクスポートされません。 このため、ビルド時に 
+    .lib ファイルが生成されません。
+    このプロジェクトを他のプロジェクトの依存関係に追加する場合は、
+    コードを追加して DLL からシンボルをエクスポートし、エクスポート 
+    ライブラリが生成されるようにするか、またはプロジェクトの [プロパティ ページ] 
+    ダイアログ ボックスにある [リンカー] フォルダーの[全般] プロパティ 
+    ページで、"インポート ライブラリの無視" プロパティを[はい] に設定します。
+
+/////////////////////////////////////////////////////////////////////////////
+その他の標準ファイル :
+
+StdAfx.h、StdAfx.cpp
+    これらのファイルは、ntdll.pch 
+    という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj 
+    という名前のプリコンパイル済みの型ファイルを構築するために使用されます。
+
+/////////////////////////////////////////////////////////////////////////////
+その他のメモ :
+
+AppWizard では "TODO:" 
+コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース 
+コードを示します。
+
+/////////////////////////////////////////////////////////////////////////////
diff --git a/ntdll/dllmain.cpp b/ntdll/dllmain.cpp
new file mode 100644 (file)
index 0000000..1ec707c
--- /dev/null
@@ -0,0 +1,19 @@
+// dllmain.cpp : DLL \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\83G\83\93\83g\83\8a \83|\83C\83\93\83g\82ð\92è\8b`\82µ\82Ü\82·\81B
+#include "stdafx.h"
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+                                        )
+{
+       switch (ul_reason_for_call)
+       {
+       case DLL_PROCESS_ATTACH:
+       case DLL_THREAD_ATTACH:
+       case DLL_THREAD_DETACH:
+       case DLL_PROCESS_DETACH:
+               break;
+       }
+       return TRUE;
+}
+
diff --git a/ntdll/ntdll.cpp b/ntdll/ntdll.cpp
new file mode 100644 (file)
index 0000000..7bfab27
--- /dev/null
@@ -0,0 +1,11 @@
+// ntdll.cpp : DLL \83A\83v\83\8a\83P\81[\83V\83\87\83\93\97p\82É\83G\83N\83X\83|\81[\83g\82³\82ê\82é\8aÖ\90\94\82ð\92è\8b`\82µ\82Ü\82·\81B
+//
+
+#include "stdafx.h"
+
+static void __stdcall entry(DWORD eip, DWORD cr3, DWORD dt){
+       __asm{
+
+
+       }
+}
\ No newline at end of file
diff --git a/ntdll/ntdll.def b/ntdll/ntdll.def
new file mode 100644 (file)
index 0000000..186874c
--- /dev/null
@@ -0,0 +1,3 @@
+LIBRARY ntdll
+EXPORTS
+       entry @1
diff --git a/ntdll/ntdll.vcxproj b/ntdll/ntdll.vcxproj
new file mode 100644 (file)
index 0000000..412c519
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{5C782ED0-884E-41DC-8E9D-BD3E13972D38}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>ntdll</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;NTDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ModuleDefinitionFile>ntdll.def</ModuleDefinitionFile>
+      <BaseAddress>0x7e000000</BaseAddress>
+    </Link>
+    <PostBuildEvent>
+      <Command>copy "$(TargetPath)" "G:\c\os\harib27f"</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;NTDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>ntdll.def</ModuleDefinitionFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <None Include="ntdll.def" />
+    <None Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="dllmain.cpp">
+      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+      </PrecompiledHeader>
+      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+      </PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="ntdll.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/ntdll/stdafx.cpp b/ntdll/stdafx.cpp
new file mode 100644 (file)
index 0000000..566abdf
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h ntdll.pch \82Ì\82Ý\82ð
+// \8aÜ\82Þ\83\\81[\83\83t\83@\83C\83\8b\82Í\81A\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\83w\83b\83_\81[\82É\82È\82è\82Ü\82·\81B
+// stdafx.obj \82É\82Í\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\8c^\8fî\95ñ\82ª\8aÜ\82Ü\82ê\82Ü\82·\81B
+
+#include "stdafx.h"
+
+// TODO: \82±\82Ì\83t\83@\83C\83\8b\82Å\82Í\82È\82­\81ASTDAFX.H \82Å\95K\97v\82È
+// \92Ç\89Á\83w\83b\83_\81[\82ð\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/ntdll/stdafx.h b/ntdll/stdafx.h
new file mode 100644 (file)
index 0000000..c54fbd9
--- /dev/null
@@ -0,0 +1,16 @@
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\81A\82Ü\82½\82Í
+// \8eQ\8fÆ\89ñ\90\94\82ª\91½\82­\81A\82©\82Â\82 \82Ü\82è\95Ï\8dX\82³\82ê\82È\82¢\81A\83v\83\8d\83W\83F\83N\83g\90ê\97p\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b
+// \82ð\8bL\8fq\82µ\82Ü\82·\81B
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#define WIN32_LEAN_AND_MEAN             // Windows \83w\83b\83_\81[\82©\82ç\8eg\97p\82³\82ê\82Ä\82¢\82È\82¢\95\94\95ª\82ð\8f\9c\8aO\82µ\82Ü\82·\81B
+// Windows \83w\83b\83_\81\83t\83@\83C\83\8b:
+#include <windows.h>
+
+
+
+// TODO: \83v\83\8d\83O\83\89\83\80\82É\95K\97v\82È\92Ç\89Á\83w\83b\83_\81[\82ð\82±\82±\82Å\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/ntdll/targetver.h b/ntdll/targetver.h
new file mode 100644 (file)
index 0000000..10b7ccd
--- /dev/null
@@ -0,0 +1,8 @@
+#pragma once
+
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\82Æ\81A\97\98\97p\82Å\82«\82é\8dÅ\82à\8fã\88Ê\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\82ª\92è\8b`\82³\82ê\82Ü\82·\81B
+
+// \88È\91O\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\97p\82É\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\83r\83\8b\83h\82·\82é\8fê\8d\87\82Í\81AWinSDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82µ\81A
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\91O\82É\81A\83T\83|\81[\83g\91Î\8fÛ\82Æ\82·\82é\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\8e¦\82·\82æ\82¤\82É _WIN32_WINNT \83}\83N\83\8d\82ð\90Ý\92è\82µ\82Ü\82·\81B
+
+#include <SDKDDKVer.h>
diff --git a/ostestapp.cpp b/ostestapp.cpp
new file mode 100644 (file)
index 0000000..70cce7c
--- /dev/null
@@ -0,0 +1,8 @@
+#include <windows.h>
+#pragma comment(linker,"/subsystem:windows")
+#pragma comment(linker,"/NODEFAULTLIB")
+
+void WinMainCRTStartup()
+{
+       MessageBox(NULL,"MINIEXE!","mini",MB_OK);
+}
diff --git a/ostestapp.exe b/ostestapp.exe
new file mode 100644 (file)
index 0000000..4015f76
Binary files /dev/null and b/ostestapp.exe differ
diff --git a/partback.cpp b/partback.cpp
new file mode 100644 (file)
index 0000000..329b528
--- /dev/null
@@ -0,0 +1,98 @@
+#include <windows.h>
+#ifdef MSC_VER
+#include <afxdb.h>
+#include <atlstr.h>
+#include <commctrl.h>
+#endif
+#include <stdio.h>
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <map>
+#include <assert.h>
+#include <time.h>
+#include <iostream>
+
+#pragma comment(lib, "ws2_32.lib")
+#pragma comment(lib, "user32.lib")
+#pragma comment(lib, "strmiids.lib")
+#pragma comment(lib, "Ole32.lib")
+#pragma comment(lib, "gdi32.lib")
+#pragma comment(lib, "ddraw.lib")
+#pragma comment(lib, "dxguid.lib")
+#pragma comment(lib, "shell32.lib")
+using namespace std;
+
+
+#include <stdio.h>
+
+
+#include <windows.h>
+
+struct PAT_TABLE{
+       BYTE flag;
+       BYTE begin_chs[3];
+       BYTE type;
+       BYTE end_chs[3];
+       DWORD begin_lba;
+       DWORD size_lba;
+};
+
+int main(void)
+{
+       HANDLE hDrive;
+       char drivename[30];
+       unsigned char buf[512];
+       unsigned long readsize;
+       PAT_TABLE *pt;
+
+
+       sprintf(drivename, "\\\\.\\physicaldrive0");
+       hDrive= CreateFile(drivename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+
+
+       // \94F\8e¯\82Å\82«\82é\83h\83\89\83C\83u\82ª\82È\82¯\82ê\82Î\8fI\97¹
+       if (hDrive == INVALID_HANDLE_VALUE){
+               printf("cant open");
+               return 0;
+       }
+
+
+       // buf\82É\93Ç\82Ý\8d\9e\82Þ
+       ReadFile(hDrive, buf, sizeof(buf), &readsize, NULL);
+       //buf[readsize]= '\0';
+
+       pt = (PAT_TABLE *)(buf + 0x200 - 2 - sizeof(PAT_TABLE) * 4);
+       for(int i = 0; i < 4; i++){
+               printf("%d:%p-%p\n", i, pt[i].begin_lba, pt[i].size_lba);
+       }
+       memset(&pt[1], 0, sizeof(PAT_TABLE));
+
+       //SetFilePointer(hDrive, s, 0, 0);
+
+       HANDLE hf = CreateFile("g:\\win7_32bit_back.img", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
+       if(hf == (HANDLE)0xffffffff){
+               printf("create file error %d", GetLastError());
+               return 0;
+       }
+       WriteFile(hf, buf, sizeof(buf), &readsize, NULL);
+
+       //3BF F04C \83Z\83N\83^\93Ç\82Þ
+       DWORD bufsize = 0x10000000;
+       BYTE *tmp = new BYTE [bufsize];//0x80000\83Z\83N\83^
+       for(int i = 0; i < 0x78; i++){
+               ReadFile(hDrive, tmp, bufsize, &readsize, NULL);
+               WriteFile(hf, tmp, bufsize, &readsize, NULL);
+               printf("%d/0x78\n", i);
+       }
+
+       CloseHandle(hf);
+
+       // \83h\83\89\83C\83u\93Ç\82Ý\8eæ\82è\83n\83\93\83h\83\8b\82ð\95Â\82\82é
+       CloseHandle(hDrive);
+
+
+
+
+       return 0;
+}
\ No newline at end of file
diff --git a/partback.exe b/partback.exe
new file mode 100644 (file)
index 0000000..04cb0ba
Binary files /dev/null and b/partback.exe differ
diff --git a/qlaunch.cpp b/qlaunch.cpp
new file mode 100644 (file)
index 0000000..385896c
--- /dev/null
@@ -0,0 +1,38 @@
+#include <windows.h>
+#ifdef MSC_VER
+#include <afxdb.h>
+#include <atlstr.h>
+#include <commctrl.h>
+#endif
+#include <stdio.h>
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <map>
+#include <assert.h>
+#include <time.h>
+#include <iostream>
+#include <stdlib.h>
+#pragma comment(lib, "ws2_32.lib")
+#pragma comment(lib, "user32.lib")
+#pragma comment(lib, "strmiids.lib")
+#pragma comment(lib, "Ole32.lib")
+#pragma comment(lib, "gdi32.lib")
+#pragma comment(lib, "ddraw.lib")
+#pragma comment(lib, "dxguid.lib")
+#pragma comment(lib, "shell32.lib")
+using namespace std;
+
+
+#include <stdio.h>
+
+int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR lpCmdLine, int){
+       HWND hWnd = FindWindow("SDL_app", "QEMU [Stopped]");
+       if(hWnd == NULL){
+               hWnd = FindWindow("SDL_app", "QEMU");
+       }
+       SendMessage(hWnd, WM_CLOSE, 0, 0);
+       
+       SetCurrentDirectory("G:\\c\\os\\z_tools\\qemu\\");
+       system("G:\\c\\os\\z_tools\\qemu\\qemu-aa.bat");
+}
diff --git a/qlaunch.exe b/qlaunch.exe
new file mode 100644 (file)
index 0000000..fde640e
Binary files /dev/null and b/qlaunch.exe differ
diff --git a/readmbr.cpp b/readmbr.cpp
new file mode 100644 (file)
index 0000000..134238e
--- /dev/null
@@ -0,0 +1,70 @@
+#include <stdio.h>
+#include <windows.h>
+#define MAX_DRIVE 10
+
+
+
+int main(void)
+{
+    HANDLE hDrive;
+    int i,j;
+    char drivename[30];
+    unsigned char buf[512*20];
+    unsigned char buf2[512*20];
+    unsigned long readsize;
+
+
+
+    // \95¨\97\9d\83h\83\89\83C\83u\\.\physicaldrive0\82©\82ç\8f\87\82É\93Ç\82Ý\8eæ\82é
+    for (i=0; i<=MAX_DRIVE; i++){
+
+
+        sprintf(drivename, "\\\\.\\physicaldrive%d", i);
+        hDrive= CreateFile(drivename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+
+
+        // \94F\8e¯\82Å\82«\82é\83h\83\89\83C\83u\82ª\82È\82¯\82ê\82Î\8fI\97¹
+        if (hDrive == INVALID_HANDLE_VALUE) break;
+
+
+        printf("Drive%d reading...\n", i);
+
+
+        // buf\82É\93Ç\82Ý\8d\9e\82Þ
+        ReadFile(hDrive, buf, sizeof(buf), &readsize, NULL);
+        //buf[readsize]= '\0';
+               
+               int s = *(int *)(buf + 0x1c6);
+               
+               SetFilePointer(hDrive, s, 0, 0);
+               
+               ReadFile(hDrive, buf2, sizeof(buf2), &readsize, NULL);
+
+        // \83h\83\89\83C\83u\93Ç\82Ý\8eæ\82è\83n\83\93\83h\83\8b\82ð\95Â\82\82é
+        CloseHandle(hDrive);
+               
+       
+               
+               char fname[200];
+               sprintf(fname, "mbr%d", i);
+               FILE *fp = fopen(fname, "wb");
+               fwrite(buf, sizeof(buf), 1, fp);
+               fclose(fp);
+
+               sprintf(fname, "mbr%d_1", i);
+               fp = fopen(fname, "wb");
+               fwrite(buf2, sizeof(buf2), 1, fp);
+               fclose(fp);
+               
+        // \82P\82U\90i\83_\83\93\83v\95û\8e®\82Å\95\\8e¦
+        for (j=0; j<readsize; j++){
+            if (j % 16 == 0) printf("%04X", j);
+            printf(" %02X", buf[j]);
+            if (j % 16 == 15) putchar('\n');
+        }
+        putchar('\n');
+    }
+
+
+    return 0; 
+}
\ No newline at end of file
diff --git a/readmbr.exe b/readmbr.exe
new file mode 100644 (file)
index 0000000..5a1ba92
Binary files /dev/null and b/readmbr.exe differ