]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2400b23
authorToni Wilen <twilen@winuae.net>
Wed, 21 Mar 2012 15:48:42 +0000 (17:48 +0200)
committerToni Wilen <twilen@winuae.net>
Wed, 21 Mar 2012 15:48:42 +0000 (17:48 +0200)
27 files changed:
blkdev.cpp
calc.cpp
cfgfile.cpp
custom.cpp
debug.cpp
filesys.cpp
filesys_bootrom.cpp
fsdb.cpp
include/blkdev.h
include/filesys.h
include/fsdb.h
include/zfile.h
main.cpp
newcpu.cpp
od-win32/blkdev_win32_ioctl.cpp
od-win32/blkdev_win32_spti.cpp
od-win32/fsdb_mywin32.cpp
od-win32/keyboard_win32.cpp
od-win32/mman.cpp
od-win32/resources/winuae.rc
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32_filesys.cpp
od-win32/winuae_msvc10/winuae_msvc.vcxproj
od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters
od-win32/winuaechangelog.txt
zfile.cpp

index 8d335b218f514e21bf14fa748d2f67b5a44645df..d89e3755787eeeb25e03e3b96f18deb48f43fd56 100644 (file)
@@ -411,6 +411,10 @@ int sys_command_isopen (int unitnum)
 
 int sys_command_open (int unitnum)
 {
+       if (openlist[unitnum]) {
+               openlist[unitnum]++;
+               return -1;
+       }
        waspaused[unitnum] = 0;
        int v = sys_command_open_internal (unitnum, currprefs.cdslots[unitnum].name[0] ? currprefs.cdslots[unitnum].name : NULL, CD_STANDARD_UNIT_DEFAULT);
        if (!v)
@@ -423,6 +427,10 @@ int sys_command_open (int unitnum)
 
 void sys_command_close (int unitnum)
 {
+       if (openlist[unitnum] > 1) {
+               openlist[unitnum]--;
+               return;
+       }
 #ifdef RETROPLATFORM
        rp_cd_device_enable (unitnum, false);
 #endif
@@ -518,6 +526,7 @@ static void check_changes (int unitnum)
                                scsi_do_disk_change (unitnum, 0, &pollmode);
                                if (pollmode)
                                        imagechangetime[unitnum] = 8 * 50;
+                               filesys_do_disk_change (unitnum, 0);
                        }
                }
                write_log (L"CD: eject (%s) open=%d\n", pollmode ? L"slow" : L"fast", wasopen[unitnum] ? 1 : 0);
@@ -559,6 +568,7 @@ static void check_changes (int unitnum)
                        gotsem = false;
                }
                scsi_do_disk_change (unitnum, 1, &pollmode);
+               filesys_do_disk_change (unitnum, 1);
        }
 #ifdef RETROPLATFORM
        rp_cd_image_change (unitnum, currprefs.cdslots[unitnum].name);
index 4d7e62dbd247432e33f24a532c637b75b7b970c4..f921ad5bd7fd2e9f00c76c6c4dd63a9a93e47ce0 100644 (file)
--- a/calc.cpp
+++ b/calc.cpp
@@ -3,9 +3,6 @@
 *
 * Infix->RPN conversion and calculation
 *
-* Copyright 1995-2002 Bernd Schmidt
-* Copyright 1995 Alessandro Bissacco
-* Copyright 2000-2010 Toni Wilen
 */
 
 
index 58216ad24e2746799ed4195e0e225bfea84c71c7..dccadbd7ef5eba2465dc0cd01ed224101b2f6d84 100644 (file)
@@ -4849,7 +4849,7 @@ int built_in_chipset_prefs (struct uae_prefs *p)
        p->cs_ksmirror_a8 = 0;
        p->cs_ciaoverlay = 1;
        p->cs_ciaatod = 0;
-       p->cs_rtc = 1;
+       p->cs_rtc = 0;
        p->cs_rtc_adjust_mode = p->cs_rtc_adjust = 0;
        p->cs_df0idhw = 1;
        p->cs_resetwarning = 1;
@@ -4880,7 +4880,7 @@ int built_in_chipset_prefs (struct uae_prefs *p)
        case CP_A500: // A500
                p->cs_df0idhw = 0;
                p->cs_resetwarning = 0;
-               if (p->bogomem_size || p->chipmem_size > 1 || p->fastmem_size)
+               if (p->bogomem_size || p->chipmem_size > 0x80000 || p->fastmem_size)
                        p->cs_rtc = 1;
                break;
        case CP_A500P: // A500+
@@ -4899,7 +4899,6 @@ int built_in_chipset_prefs (struct uae_prefs *p)
                p->cs_a1000ram = 1;
                p->cs_ciaatod = p->ntscmode ? 2 : 1;
                p->cs_ksmirror_e0 = 0;
-               p->cs_rtc = 0;
                p->cs_agnusbltbusybug = 1;
                p->cs_dipagnus = 1;
                break;
@@ -4908,6 +4907,8 @@ int built_in_chipset_prefs (struct uae_prefs *p)
                p->cs_pcmcia = 1;
                p->cs_ksmirror_a8 = 1;
                p->cs_ciaoverlay = 0;
+               if (p->fastmem_size || p->z3fastmem_size)
+                       p->cs_rtc = 1;
                break;
        case CP_A2000: // A2000
                p->cs_rtc = 1;
index 8b18e11618a3ae701e913c3f0834bfa1816296c9..886f4c834aaaecff09685e01c0e94402250c519d 100644 (file)
@@ -5150,6 +5150,7 @@ static void framewait (void)
                render_screen ();
                show_screen ();
                frame_shown = true;
+               return;
 
        } else if (vs < 0) {
 
index a55fdb7bdef14a327fbb337df71556fc92405bb4..32b83de1959054a6c476295d94f105abf2df6748 100644 (file)
--- a/debug.cpp
+++ b/debug.cpp
@@ -3052,35 +3052,39 @@ static void debug_sprite (TCHAR **inptr)
                                        ww2 = get_long (addr2 + 4);
                                }
                        } else if (size == 4) {
-                               w1 = get_long (addr) << 16;
-                               w2 = get_long (addr + 4) << 16;
-                               w1 <<= 16;
-                               w2 <<= 16;
-                               w1 |= get_long (addr);
-                               w2 |= get_long (addr2 + 4);
+                               w1 = get_long (addr + 0);
+                               w2 = get_long (addr + 8);
+                               w1 <<= 32;
+                               w2 <<= 32;
+                               w1 |= get_long (addr + 4);
+                               w2 |= get_long (addr + 12);
                                if (addr2) {
-                                       ww1 = get_long (addr2) << 16;
-                                       ww2 = get_long (addr2 + 4) << 16;
-                                       ww1 <<= 16;
-                                       ww2 <<= 16;
-                                       ww1 |= get_long (addr2);
-                                       ww2 |= get_long (addr2 + 4);
+                                       ww1 = get_long (addr2 + 0);
+                                       ww2 = get_long (addr2 + 8);
+                                       ww1 <<= 32;
+                                       ww2 <<= 32;
+                                       ww1 |= get_long (addr2 + 4);
+                                       ww2 |= get_long (addr2 + 12);
                                }
                        }
                        width = size * 16;
                        for (x = 0; x < width; x++) {
-                               int v1 = (w1 >> (width - x)) & 1;
-                               int v2 = (w2 >> (width - x)) & 1;
+                               int v1 = w1 & 1;
+                               int v2 = w2 & 1;
                                int v = v1 * 2 + v2;
+                               w1 >>= 1;
+                               w2 >>= 1;
                                if (addr2) {
-                                       int vv1 = (ww1 >> (width - x)) & 1;
-                                       int vv2 = (ww2 >> (width - x)) & 1;
+                                       int vv1 = ww1 & 1;
+                                       int vv2 = ww2 & 1;
                                        int vv = vv1 * 2 + vv2;
+                                       vv1 >>= 1;
+                                       vv2 >>= 1;
                                        v *= 4;
                                        v += vv;
-                                       tmp[x] = v >= 10 ? 'A' + v - 10 : v + '0';
+                                       tmp[width - (x + 1)] = v >= 10 ? 'A' + v - 10 : v + '0';
                                } else {
-                                       tmp[x] = v + '0';
+                                       tmp[width - (x + 1)] = v + '0';
                                }
                        }
                        tmp[width] = 0;
@@ -3089,7 +3093,7 @@ static void debug_sprite (TCHAR **inptr)
 
                console_out_f (L"Sprite address %08X, width = %d\n", saddr, size * 16);
                console_out_f (L"OCS: StartX=%d StartY=%d EndY=%d\n", xpos, ypos, ypose);
-               console_out_f (L"ECS: StartX=%d (%d.%d) StartY=%d EndY=%d%s\n", xpos_ecs, xpos_ecs / 4, xpos_ecs & 3, ypos_ecs, ypose_ecs, ecs ? " (*)" : "");
+               console_out_f (L"ECS: StartX=%d (%d.%d) StartY=%d EndY=%d%s\n", xpos_ecs, xpos_ecs / 4, xpos_ecs & 3, ypos_ecs, ypose_ecs, ecs ? L" (*)" : L"");
                console_out_f (L"Attach: %d. AGA SSCAN/SH10 bit: %d\n", attach, sh10);
 
                addr += size * 4;
index cb16ee8bcdb73278661a37682b43e02c7f6847e4..1988697e6121e7321575ca1e66bd3119bf6720ee 100644 (file)
@@ -52,6 +52,8 @@
 #include "inputdevice.h"
 #include "clipboard.h"
 #include "consolehook.h"
+#include "blkdev.h"
+#include "isofs_api.h"
 
 #define TRACING_ENABLED 0
 #define TRACE2(x) do { write_log x; } while(0)
@@ -107,13 +109,18 @@ static uae_u32 cdfs_devname, cdfs_control;
 static int filesys_in_interrupt;
 static uae_u32 mountertask;
 static int automountunit = -1;
+static int cd_unit_offset, cd_unit_number;
 
 #define FS_STARTUP 0
 #define FS_GO_DOWN 1
 
 #define DEVNAMES_PER_HDF 32
 
+#define UNIT_FILESYSTEM 0
+#define UNIT_CDFS 1
+
 typedef struct {
+       int unit_type;
        bool open;
        TCHAR *devname; /* device name, e.g. UAE0: */
        uaecptr devname_amiga;
@@ -125,6 +132,7 @@ typedef struct {
        TCHAR *rootdirdiff; /* "diff" file/directory */
        bool readonly; /* disallow write access? */
        bool locked; /* action write protect */
+       bool unknown_media; /* ID_UNREADABLE_DISK */
        int bootpri; /* boot priority. -128 = no autoboot, -129 = no mount */
        int devno;
        int controller;
@@ -151,6 +159,11 @@ typedef struct {
        int rdb_filesyssize;
        TCHAR *filesysdir;
 
+       /* CDFS */
+       bool cd_open;
+       int cddevno;
+       void *cdfs_superblock;
+
 } UnitInfo;
 
 struct uaedev_mount_info {
@@ -214,6 +227,10 @@ static void close_filesys_unit (UnitInfo *uip)
                xfree (uip->unit_pipe);
        if (uip->back_pipe)
                xfree (uip->back_pipe);
+       if (uip->cd_open) {
+               sys_command_close (uip->cddevno);
+               isofs_unmount (uip->cdfs_superblock);
+               }
 
        uip->unit_pipe = 0;
        uip->back_pipe = 0;
@@ -223,6 +240,7 @@ static void close_filesys_unit (UnitInfo *uip)
        uip->devname = 0;
        uip->rootdir = 0;
        uip->open = 0;
+       uip->cd_open = 0;
 }
 
 static UnitInfo *getuip (struct uae_prefs *p, int index)
@@ -435,6 +453,7 @@ static int set_filesys_unit_1 (int nr,
        UnitInfo *ui;
        int i;
        bool emptydrive = false;
+       bool iscd;
 
        if (hdc)
                return -1;
@@ -449,8 +468,10 @@ static int set_filesys_unit_1 (int nr,
                }
        }
 
+       iscd = USE_CDFS == 2 && nr >= cd_unit_offset && nr < cd_unit_offset + cd_unit_number;
+
        for (i = 0; i < MAX_FILESYSTEM_UNITS; i++) {
-               if (nr == i || !mountinfo.ui[i].open)
+               if (nr == i || !mountinfo.ui[i].open || mountinfo.ui[i].rootdir == NULL || iscd)
                        continue;
                if (rootdir && _tcslen (rootdir) > 0 && !_tcsicmp (mountinfo.ui[i].rootdir, rootdir)) {
                        write_log (L"directory/hardfile '%s' already added\n", rootdir);
@@ -461,7 +482,12 @@ static int set_filesys_unit_1 (int nr,
        ui = &mountinfo.ui[nr];
        memset (ui, 0, sizeof (UnitInfo));
 
-       if (volname != NULL) {
+       if (iscd) {
+               ui->unit_type = UNIT_CDFS;
+               emptydrive = 1;
+               ui->volflags = MYVOLUMEINFO_CDFS | MYVOLUMEINFO_READONLY;
+               readonly = true;
+       } else if (volname != NULL) {
                int flags = 0;
                emptydrive = 1;
                if (rootdir) {
@@ -471,6 +497,7 @@ static int set_filesys_unit_1 (int nr,
                ui->volname = filesys_createvolname (volname, rootdir, L"harddrive");
                ui->volflags = flags;
        } else {
+               ui->unit_type = UNIT_FILESYSTEM;
                ui->hf.secspertrack = secspertrack;
                ui->hf.surfaces = surfaces;
                ui->hf.reservedblocks = reserved;
@@ -606,11 +633,11 @@ static void initialize_mountinfo (void)
        struct uaedev_config_info *uci;
        UnitInfo *uip = &mountinfo.ui[0];
 
+       cd_unit_offset = MAX_FILESYSTEM_UNITS;
        for (i = 0; i < currprefs.mountitems; i++) {
-               int idx;
                uci = &currprefs.mountconfig[i];
                if (uci->controller == HD_CONTROLLER_UAE) {
-                       idx = set_filesys_unit_1 (-1, uci->devname, uci->ishdf ? NULL : uci->volname, uci->rootdir,
+                       int idx = set_filesys_unit_1 (-1, uci->devname, uci->ishdf ? NULL : uci->volname, uci->rootdir,
                                uci->readonly, uci->sectors, uci->surfaces, uci->reserved,
                                uci->blocksize, uci->bootpri, uci->donotmount, uci->autoboot, uci->filesys, 0, MYVOLUMEINFO_REUSABLE);
                        if (idx >= 0) {
@@ -644,6 +671,28 @@ static void initialize_mountinfo (void)
                }
        }
        filesys_addexternals ();
+       cd_unit_offset = nr_units ();
+       cd_unit_number = 0;
+       
+#if USE_CDFS == 2
+       if (currprefs.scsi && currprefs.win32_automount_cddrives && USE_CDFS) {
+               uae_u32 mask = scsi_get_cd_drive_mask ();
+               for (int i = 0; i < 32; i++) {
+                       if (mask & (1 << i)) {
+                               TCHAR cdname[30];
+                               _stprintf (cdname, L"CD%d", i);
+                               cd_unit_number++;
+                               int idx = set_filesys_unit_1 (i + cd_unit_offset, cdname, NULL, L"/", true, 1, 1, 0, 2048, 0, false, false, NULL, 0, 0);
+                               if (idx >= 0) {
+                                       UnitInfo *ui;
+                                       uci->configoffset = idx;
+                                       ui = &mountinfo.ui[idx];
+                                       ui->configureddrive = 1;
+                               }
+                       }
+               }
+       }
+#endif
 }
 
 
@@ -770,6 +819,7 @@ struct hardfiledata *get_hardfile_data (int nr)
 #define ACTION_READ_LINK               1024
 
 #define DISK_TYPE 0x444f5301 /* DOS\1 */
+#define CDFS_DOSTYPE (USE_CDFS == 2 ? 0x43444653 : 0x43445644)
 
 typedef struct {
        uae_u32 uniq;
@@ -873,8 +923,18 @@ typedef struct _unit {
        uae_u32 lockkey;
        bool inhibited;
        bool canremovable;
+       /* increase when media is changed.
+        * used to detect if cached aino is valid
+        */
        int mountcount;
+       int mount_changed;
        struct zvolume *zarchive;
+       void *cdfs_superblock;
+
+       TCHAR *mount_volume;
+       TCHAR *mount_rootdir;
+       bool mount_readonly;
+       int mount_flags;
 
        int reinsertdelay;
        TCHAR *newvolume;
@@ -986,21 +1046,19 @@ static Unit*
        return u;
 }
 
-static struct fs_dirhandle *fs_opendir (Unit *u, const TCHAR *nname)
+static struct fs_dirhandle *fs_opendir (Unit *u, a_inode *aino)
 {
        struct fs_dirhandle *fsd = xmalloc (struct fs_dirhandle, 1);
-       fsd->isarch = !!(u->volflags & MYVOLUMEINFO_ARCHIVE);
-       if (fsd->isarch) {
-               fsd->zd = zfile_opendir_archive (nname);
-               if (!fsd->zd)
-                       goto end;
-       } else {
-               fsd->od = my_opendir (nname);
-               if (!fsd->od)
-                       goto end;
-       }
-       return fsd;
-end:
+       fsd->fstype = (u->volflags & MYVOLUMEINFO_ARCHIVE) ? FS_ARCHIVE : ((u->volflags & MYVOLUMEINFO_CDFS) ? FS_CDFS : FS_DIRECTORY);
+       if (fsd->fstype == FS_ARCHIVE) {
+               fsd->zd = zfile_opendir_archive (aino->nname);
+       } else if (fsd->fstype == FS_DIRECTORY) {
+               fsd->od = my_opendir (aino->nname);
+       } else if (fsd->fstype == FS_CDFS) {
+               fsd->isod = isofs_opendir (u->ui.cdfs_superblock, aino->uniq_external);
+       }
+       if (fsd)
+               return fsd;
        xfree (fsd);
        return NULL;
 }
@@ -1008,67 +1066,90 @@ static void fs_closedir (struct fs_dirhandle *fsd)
 {
        if (!fsd)
                return;
-       if (fsd->isarch)
+       if (fsd->fstype  == FS_ARCHIVE)
                zfile_closedir_archive (fsd->zd);
-       else
+       else if (fsd->fstype == FS_DIRECTORY)
                my_closedir (fsd->od);
+       else if (fsd->fstype == FS_CDFS)
+               isofs_closedir (fsd->isod);
        xfree (fsd);
 }
-static struct fs_filehandle *fs_open (Unit *unit, const TCHAR *name, int flags)
+static struct fs_filehandle *fs_openfile (Unit *u, a_inode *aino, int flags)
 {
        struct fs_filehandle *fsf = xmalloc (struct fs_filehandle, 1);
-       fsf->isarch = !!(unit->volflags & MYVOLUMEINFO_ARCHIVE);
-       if (fsf->isarch) {
-               fsf->zf = zfile_open_archive (name, flags);
-               if (!fsf->zf)
-                       goto end;
+       fsf->fstype = (u->volflags & MYVOLUMEINFO_ARCHIVE) ? FS_ARCHIVE : ((u->volflags & MYVOLUMEINFO_CDFS) ? FS_CDFS : FS_DIRECTORY);
+       if (fsf->fstype == FS_ARCHIVE) {
+               fsf->zf = zfile_open_archive (aino->nname, flags);
+       } else if (fsf->fstype == FS_DIRECTORY) {
+               fsf->of = my_open (aino->nname, flags);
        } else {
-               fsf->of = my_open (name, flags);
-               if (!fsf->of)
-                       goto end;
+               fsf->isof = isofs_openfile (u->ui.cdfs_superblock, aino->uniq_external, flags);
        }
-       return fsf;
-end:
+       if (fsf)
+               return fsf;
        xfree (fsf);
        return NULL;
 }
-static void fs_close (struct fs_filehandle *fd)
+static void fs_closefile (struct fs_filehandle *fd)
 {
        if (!fd)
                return;
-       if (fd->isarch)
+       if (fd->fstype == FS_ARCHIVE)
                zfile_close_archive (fd->zf);
-       else
+       else if (fd->fstype == FS_DIRECTORY)
                my_close (fd->of);
+       else if (fd->fstype == FS_CDFS)
+               isofs_closefile (fd->isof);
 }
 static unsigned int fs_read (struct fs_filehandle *fsf, void *b, unsigned int size)
 {
-       if (fsf->isarch)
+       if (fsf->fstype == FS_ARCHIVE)
                return zfile_read_archive (fsf->zf, b, size);
-       else
+       else if (fsf->fstype == FS_DIRECTORY)
                return my_read (fsf->of, b, size);
+       else if (fsf->fstype == FS_CDFS)
+               return isofs_read (fsf->isof, b, size);
+       return 0;
 }
 static unsigned int fs_write (struct fs_filehandle *fsf, void *b, unsigned int size)
 {
-       if (fsf->isarch)
+       if (fsf->fstype == FS_ARCHIVE)
                return 0;
-       return my_write (fsf->of, b, size);
+       else if (fsf->fstype == FS_DIRECTORY)
+               return my_write (fsf->of, b, size);
+       return 0;
 }
 
+/* return value = old position. -1 = error. */
 static uae_u64 fs_lseek64 (struct fs_filehandle *fsf, uae_s64 offset, int whence)
 {
-       if (fsf->isarch)
+       if (fsf->fstype == FS_ARCHIVE)
                return zfile_lseek_archive (fsf->zf, offset, whence);
-       else
+       else if (fsf->fstype == FS_DIRECTORY)
                return my_lseek (fsf->of, offset, whence);
+       else if (fsf->fstype == FS_CDFS)
+               return isofs_lseek (fsf->isof, offset, whence);
+       return -1;
 }
 static uae_u32 fs_lseek (struct fs_filehandle *fsf, uae_s32 offset, int whence)
 {
-       if (fsf->isarch)
-               return (uae_u32)zfile_lseek_archive (fsf->zf, (uae_s32)offset, whence);
-       else
-               return (uae_u32)my_lseek (fsf->of, (uae_s32)offset, whence);
+       return (uae_u32)fs_lseek64 (fsf, offset, whence);
 }
+static uae_u64 fs_fsize64 (struct fs_filehandle *fsf)
+{
+       if (fsf->fstype == FS_ARCHIVE)
+               return zfile_fsize_archive (fsf->zf);
+       else if (fsf->fstype == FS_DIRECTORY)
+               return my_fsize (fsf->of);
+       else if (fsf->fstype == FS_CDFS)
+               return isofs_fsize (fsf->isof);
+       return -1;
+}
+static uae_u32 fs_fsize (struct fs_filehandle *fsf)
+{
+       return (uae_u32)fs_fsize64 (fsf);
+}
+
 static void set_volume_name (Unit *unit)
 {
        int namelen;
@@ -1123,12 +1204,27 @@ static void clear_exkeys (Unit *unit)
        }
 }
 
+static void filesys_delayed_change (Unit *u, int frames, const TCHAR *rootdir, const TCHAR *volume, bool readonly, int flags)
+{
+       u->reinsertdelay = 50;
+       u->newflags = flags;
+       u->newreadonly = readonly;
+       u->newrootdir = my_strdup (rootdir);
+       if (volume)
+               u->newvolume = my_strdup (volume);
+       filesys_eject(u->unit);
+       if (!rootdir || _tcslen (rootdir) == 0)
+               u->reinsertdelay = 0;
+       if (u->reinsertdelay > 0)
+               write_log (L"FILESYS: delayed insert %d: '%s' ('%s')\n", u->unit, volume ? volume : L"<none>", rootdir);
+}
+
 int filesys_eject (int nr)
 {
        UnitInfo *ui = &mountinfo.ui[nr];
        Unit *u = ui->self;
 
-       if (!mountertask)
+       if (!mountertask || u->mount_changed)
                return 0;
        if (!ui->open || u == NULL)
                return 0;
@@ -1136,29 +1232,154 @@ int filesys_eject (int nr)
                return 0;
        if (!filesys_isvolume (u))
                return 0;
-       zfile_fclose_archive (u->zarchive);
-       u->zarchive = NULL;
+       u->mount_changed = -1;
        u->mountcount++;
-       write_log (L"FILESYS: removed volume '%s'\n", u->ui.volname);
-       flush_cache (u, -1);
-       put_byte (u->volume + 172 - 32, -2);
+       write_log (L"FILESYS: volume '%s' removal request\n", u->ui.volname);
+       // -1 = remove, -2 = remove + remove device node
+       put_byte (u->volume + 172 - 32, ui->unit_type == UNIT_CDFS ? -1 : -2);
        uae_Signal (get_long (u->volume + 176 - 32), 1 << 13);
        return 1;
 }
 
-static void filesys_delayed_change (Unit *u, int frames, const TCHAR *rootdir, const TCHAR *volume, bool readonly, int flags)
+
+int filesys_insert (int nr, TCHAR *volume, const TCHAR *rootdir, bool readonly, int flags)
 {
-       u->reinsertdelay = 50;
-       u->newflags = flags;
-       u->newreadonly = readonly;
-       u->newrootdir = my_strdup (rootdir);
-       if (volume)
-               u->newvolume = my_strdup (volume);
-       filesys_eject(u->unit);
-       if (!rootdir || _tcslen (rootdir) == 0)
-               u->reinsertdelay = 0;
-       if (u->reinsertdelay > 0)
-               write_log (L"FILESYS: delayed insert %d: '%s' ('%s')\n", u->unit, volume ? volume : L"<none>", rootdir);
+       UnitInfo *ui;
+       Unit *u;
+
+       if (!mountertask)
+               return 0;
+       if (nr < 0) {
+               for (u = units; u; u = u->next) {
+                       if (is_hardfile (u->unit) == FILESYS_VIRTUAL) {
+                               if (!filesys_isvolume (u) && mountinfo.ui[u->unit].canremove)
+                                       break;
+                       }
+               }
+               if (!u) {
+                       for (u = units; u; u = u->next) {
+                               if (is_hardfile (u->unit) == FILESYS_VIRTUAL) {
+                                       if (mountinfo.ui[u->unit].canremove)
+                                               break;
+                               }
+                       }
+               }
+               if (!u)
+                       return 0;
+               nr = u->unit;
+               ui = &mountinfo.ui[nr];
+       } else {
+               ui = &mountinfo.ui[nr];
+               u = ui->self;
+       }
+
+       if (!ui->open || u == NULL)
+               return 0;
+       if (u->reinsertdelay)
+               return -1;
+       if (is_hardfile (nr) != FILESYS_VIRTUAL)
+               return 0;
+       if (filesys_isvolume (u)) {
+               filesys_delayed_change (u, 50, rootdir, volume, readonly, flags);
+               return -1;
+       }
+       u->mountcount++;
+       u->mount_changed = 1;
+       u->mount_volume = volume ? my_strdup (volume) : NULL;
+       u->mount_rootdir = my_strdup (rootdir);
+       u->mount_readonly = readonly;
+       u->mount_flags = flags;
+
+       put_byte (u->volume + 172 - 32, -3); // wait for insert
+       uae_Signal (get_long (u->volume + 176 - 32), 1 << 13);
+
+       return 100 + nr;
+}
+
+static uae_u32 filesys_media_change_reply (TrapContext *ctx, int mode)
+{
+       int nr;
+       UnitInfo *ui = NULL;
+       Unit *u;
+
+       for (nr = 0; nr < MAX_FILESYSTEM_UNITS; nr++) {
+               ui = &mountinfo.ui[nr];
+               u = ui->self;
+               if (u && u->mount_changed)
+                       break;
+       }
+       if (nr >= MAX_FILESYSTEM_UNITS) {
+               write_log (L"FILESYS: filesys_media_change_reply without mount_changed flag!?\n");
+               return 0;
+       }
+
+       if (u->mount_changed < 0) {
+               // eject
+               if (mode == 0) {
+                       write_log (L"FILESYS: got media change reply, '%s' removal finished\n", u->ui.volname);
+                       flush_cache (u, -1);
+                       isofs_unmount (u->ui.cdfs_superblock);
+                       ui->cdfs_superblock = u->ui.cdfs_superblock = NULL;
+                       zfile_fclose_archive (u->zarchive);
+                       u->zarchive = NULL;
+               } else {
+                       u->mount_changed = 0;
+               }
+               return 1;
+       } else if (u->mount_changed > 0) {
+               if (mode == 0) {
+                       // insert
+                       bool emptydrive = false;
+                       struct uaedev_config_info *uci;
+
+                       clear_exkeys (u);
+                       uci = &currprefs.mountconfig[nr];
+                       xfree (u->ui.rootdir);
+                       ui->rootdir = u->ui.rootdir = my_strdup (u->mount_rootdir);
+                       flush_cache (u, -1);
+                       if (ui->unit_type == UNIT_CDFS) {
+                               uae_u64 uniq;
+                               ui->cdfs_superblock = u->ui.cdfs_superblock = isofs_mount (ui->cddevno, &uniq);
+                               u->rootnode.uniq_external = uniq;
+                               if (!u->ui.cdfs_superblock)
+                                       return 0;
+                               struct isofs_info ii;
+                               if (isofs_mediainfo (ui->cdfs_superblock, &ii) && ii.media) {
+                                       u->ui.unknown_media = ii.unknown_media;
+                                       if (!ii.unknown_media)
+                                               u->ui.volname = ui->volname = my_strdup (ii.volumename);
+                               }
+                       } else {
+                               if (set_filesys_volume (u->mount_rootdir, &u->mount_flags, &u->mount_readonly, &emptydrive, &u->zarchive) < 0)
+                                       return 0;
+                               if (emptydrive)
+                                       return 0;
+                               xfree (u->ui.volname);
+                               ui->volname = u->ui.volname = filesys_createvolname (u->mount_volume, u->mount_rootdir, L"removable");
+                       }
+                       set_volume_name (u);
+                       write_log (L"FILESYS: inserted volume NR=%d RO=%d '%s' ('%s')\n", nr, u->mount_readonly, ui->volname, u->mount_rootdir);
+                       if (u->mount_flags >= 0)
+                               ui->volflags = u->volflags = u->ui.volflags = u->mount_flags;
+                       _tcscpy (uci->volname, ui->volname);
+                       _tcscpy (uci->rootdir, u->mount_rootdir);
+                       if (u->mount_flags >= 0)
+                               uci->readonly = ui->readonly = u->ui.readonly = u->mount_readonly;
+                       put_byte (u->volume + 44, 0);
+                       put_byte (u->volume + 172 - 32, 1);
+               
+                       xfree (u->mount_volume);
+                       xfree (u->mount_rootdir);
+                       u->mount_rootdir = NULL;
+                       u->mount_volume = NULL;
+               } else {
+                       u->mount_changed = 0;
+               }
+               
+               return 1;
+
+       }
+       return 0;
 }
 
 int filesys_media_change (const TCHAR *rootdir, int inserted, struct uaedev_config_info *uci)
@@ -1229,7 +1450,7 @@ int filesys_media_change (const TCHAR *rootdir, int inserted, struct uaedev_conf
                if (inserted < 0) /* -1 = only mount if already exists */
                        return 0;
                /* new volume inserted and it was not previously mounted? 
-               * perhaps we have some empty device slots? */
+                * perhaps we have some empty device slots? */
                nr = filesys_insert (-1, volptr, rootdir, 0, 0);
                if (nr >= 100) {
                        if (uci)
@@ -1240,7 +1461,7 @@ int filesys_media_change (const TCHAR *rootdir, int inserted, struct uaedev_conf
                if (uci)
                        _tcscpy (devname, uci->devname);
                else
-                       _stprintf (devname, L"RDH%d", nr_units());
+                       _stprintf (devname, L"RDH%d", nr_units ());
                nr = add_filesys_unit (devname, volptr, rootdir, 0, 0, 0, 0, 0, 0, 0, 1, NULL, 0, MYVOLUMEINFO_REUSABLE);
                if (nr < 0)
                        return 0;
@@ -1268,79 +1489,25 @@ int hardfile_remount (int nr)
        return 1;
 }
 
-int filesys_insert (int nr, TCHAR *volume, const TCHAR *rootdir, bool readonly, int flags)
-{
-       struct uaedev_config_info *uci;
-       bool emptydrive = false;
-       UnitInfo *ui;
-       Unit *u;
 
-       if (!mountertask)
-               return 0;
-       if (nr < 0) {
-               for (u = units; u; u = u->next) {
-                       if (is_hardfile (u->unit) == FILESYS_VIRTUAL) {
-                               if (!filesys_isvolume (u) && mountinfo.ui[u->unit].canremove)
-                                       break;
-                       }
-               }
-               if (!u) {
-                       for (u = units; u; u = u->next) {
-                               if (is_hardfile (u->unit) == FILESYS_VIRTUAL) {
-                                       if (mountinfo.ui[u->unit].canremove)
-                                               break;
-                               }
-                       }
-               }
-               if (!u)
-                       return 0;
-               nr = u->unit;
-               ui = &mountinfo.ui[nr];
+bool filesys_do_disk_change (int cdunitnum, bool insert)
+{
+       int nr = cdunitnum + cd_unit_offset;
+       if (!mountinfo.ui[nr].cd_open)
+               return false;
+       if (insert) {
+               filesys_insert (nr, NULL, L"/", true, MYVOLUMEINFO_CDFS | MYVOLUMEINFO_READONLY);
+               return true;
        } else {
-               ui = &mountinfo.ui[nr];
-               u = ui->self;
+               filesys_eject (nr);
+               return true;
        }
-       uci = &currprefs.mountconfig[nr];
-
-       if (!ui->open || u == NULL)
-               return 0;
-       if (u->reinsertdelay)
-               return -1;
-       if (is_hardfile (nr) != FILESYS_VIRTUAL)
-               return 0;
-       if (filesys_isvolume (u)) {
-               filesys_delayed_change (u, 50, rootdir, volume, readonly, flags);
-               return -1;
-       }
-       u->mountcount++;
-       clear_exkeys (u);
-       xfree (u->ui.rootdir);
-       ui->rootdir = u->ui.rootdir = my_strdup (rootdir);
-       flush_cache (u, -1);
-       if (set_filesys_volume (rootdir, &flags, &readonly, &emptydrive, &u->zarchive) < 0)
-               return 0;
-       if (emptydrive)
-               return 0;
-       xfree (u->ui.volname);
-       ui->volname = u->ui.volname = filesys_createvolname (volume, rootdir, L"removable");
-       set_volume_name (u);
-       write_log (L"FILESYS: inserted volume NR=%d RO=%d '%s' ('%s')\n", nr, readonly, ui->volname, rootdir);
-       if (flags >= 0)
-               ui->volflags = u->volflags = u->ui.volflags = flags;
-       _tcscpy (uci->volname, ui->volname);
-       _tcscpy (uci->rootdir, rootdir);
-       if (flags >= 0)
-               uci->readonly = ui->readonly = u->ui.readonly = readonly;
-       put_byte (u->volume + 44, 0);
-       put_byte (u->volume + 172 - 32, 1);
-       uae_Signal (get_long (u->volume + 176 - 32), 1 << 13);
-       return 100 + nr;
 }
 
 /* flags and comments supported? */
 static int fsdb_cando (Unit *unit)
 {
-       if (unit->volflags & MYVOLUMEINFO_ARCHIVE)
+       if (unit->volflags & (MYVOLUMEINFO_ARCHIVE | MYVOLUMEINFO_CDFS))
                return 1;
        if (currprefs.filesys_custom_uaefsdb  && (unit->volflags & MYVOLUMEINFO_STREAMS))
                return 1;
@@ -1646,8 +1813,7 @@ TCHAR *build_aname (const TCHAR *d, const TCHAR *n)
 
 /* This gets called to translate an Amiga name that some program used to
 * a name that we can use on the native filesystem.  */
-static TCHAR *get_nname (Unit *unit, a_inode *base, TCHAR *rel,
-       TCHAR **modified_rel)
+static TCHAR *get_nname (Unit *unit, a_inode *base, TCHAR *rel, TCHAR **modified_rel, uae_u64 *uniq_ext)
 {
        TCHAR *found;
        TCHAR *p = 0;
@@ -1655,9 +1821,13 @@ static TCHAR *get_nname (Unit *unit, a_inode *base, TCHAR *rel,
        *modified_rel = 0;
 
        if (unit->volflags & MYVOLUMEINFO_ARCHIVE) {
-               if (zfile_exists_archive(base->nname, rel))
-                       return build_nname(base->nname, rel);
-               return 0;
+               if (zfile_exists_archive (base->nname, rel))
+                       return build_nname (base->nname, rel);
+               return NULL;
+       } else if (unit->volflags & MYVOLUMEINFO_CDFS) {
+               if (isofs_exists (unit->ui.cdfs_superblock, base->uniq_external, rel, uniq_ext))
+                       return build_nname (base->nname, rel);
+               return NULL;
        }
 
        aino_test (base);
@@ -1733,6 +1903,14 @@ static int fill_file_attrs (Unit *u, a_inode *base, a_inode *c)
                        c->amigaos_mode = flags;
                c->comment = comment;
                return 1;
+       } else if (u->volflags & MYVOLUMEINFO_CDFS) {
+               int isdir, flags;
+               isofss_fill_file_attrs (u->ui.cdfs_superblock, base->uniq_external, &isdir, &flags, c->uniq_external);
+               c->dir = isdir;
+               c->amigaos_mode = 0;
+               if (flags >= 0)
+                       c->amigaos_mode = flags;
+               return 1;
        } else {
                return fsdb_fill_file_attrs (base, c);
        }
@@ -1798,20 +1976,22 @@ static a_inode *new_child_aino (Unit *unit, a_inode *base, TCHAR *rel)
        TCHAR *modified_rel;
        TCHAR *nn;
        a_inode *aino = NULL;
-       int isarch = unit->volflags & MYVOLUMEINFO_ARCHIVE;
+       int isvirtual = unit->volflags & (MYVOLUMEINFO_ARCHIVE | MYVOLUMEINFO_CDFS);
 
        TRACE((L"new_child_aino %s, %s\n", base->aname, rel));
 
-       if (!isarch)
+       if (!isvirtual)
                aino = fsdb_lookup_aino_aname (base, rel);
        if (aino == 0) {
-               nn = get_nname (unit, base, rel, &modified_rel);
+               uae_u64 uniq_ext = 0;
+               nn = get_nname (unit, base, rel, &modified_rel, &uniq_ext);
                if (nn == 0)
                        return 0;
 
                aino = xcalloc (a_inode, 1);
                if (aino == 0)
                        return 0;
+               aino->uniq_external = uniq_ext;
                aino->aname = modified_rel ? modified_rel : my_strdup (rel);
                aino->nname = nn;
 
@@ -1822,7 +2002,7 @@ static a_inode *new_child_aino (Unit *unit, a_inode *base, TCHAR *rel)
                        xfree (aino);
                        return 0;
                }
-               if (aino->dir)
+               if (aino->dir && !isvirtual)
                        fsdb_clean_dir (aino);
        }
        init_child_aino (unit, base, aino);
@@ -1887,11 +2067,11 @@ static a_inode *lookup_child_aino (Unit *unit, a_inode *base, TCHAR *rel, int *e
 }
 
 /* Different version because for this one, REL is an nname.  */
-static a_inode *lookup_child_aino_for_exnext (Unit *unit, a_inode *base, TCHAR *rel, uae_u32 *err)
+static a_inode *lookup_child_aino_for_exnext (Unit *unit, a_inode *base, TCHAR *rel, uae_u32 *err, uae_u64 uniq_external)
 {
        a_inode *c = base->child;
        int l0 = _tcslen (rel);
-       int isarch = unit->volflags & MYVOLUMEINFO_ARCHIVE;
+       int isvirtual = unit->volflags & (MYVOLUMEINFO_ARCHIVE | MYVOLUMEINFO_CDFS);
 
        aino_test (base);
        aino_test (c);
@@ -1907,7 +2087,7 @@ static a_inode *lookup_child_aino_for_exnext (Unit *unit, a_inode *base, TCHAR *
        }
        if (c != 0)
                return c;
-       if (!isarch)
+       if (!isvirtual)
                c = fsdb_lookup_aino_nname (base, rel);
        if (c == 0) {
                c = xcalloc (a_inode, 1);
@@ -1919,13 +2099,14 @@ static a_inode *lookup_child_aino_for_exnext (Unit *unit, a_inode *base, TCHAR *
                c->nname = build_nname (base->nname, rel);
                c->aname = get_aname (unit, base, rel);
                c->comment = 0;
+               c->uniq_external = uniq_external;
                c->has_dbentry = 0;
                if (!fill_file_attrs (unit, base, c)) {
                        xfree (c);
                        *err = ERROR_NO_FREE_STORE;
                        return 0;
                }
-               if (c->dir && !isarch)
+               if (c->dir && !isvirtual)
                        fsdb_clean_dir (c);
        }
        init_child_aino (unit, base, c);
@@ -2036,15 +2217,10 @@ static void startup_update_unit (Unit *unit, UnitInfo *uinfo)
 {
        if (!unit)
                return;
-       unit->ui.devname = uinfo->devname;
        xfree (unit->ui.volname);
+       memcpy (&unit->ui, uinfo, sizeof UnitInfo);
+       unit->ui.devname = uinfo->devname;
        unit->ui.volname = my_strdup (uinfo->volname); /* might free later for rename */
-       unit->ui.rootdir = uinfo->rootdir;
-       unit->ui.readonly = uinfo->readonly;
-       unit->ui.unit_pipe = uinfo->unit_pipe;
-       unit->ui.back_pipe = uinfo->back_pipe;
-       unit->ui.wasisempty = uinfo->wasisempty;
-       unit->ui.canremove = uinfo->canremove;
 }
 
 static Unit *startup_create_unit (UnitInfo *uinfo, int num)
@@ -2151,6 +2327,7 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context)
        UnitInfo *uinfo;
        int late = 0;
        int ed, ef;
+       uae_u64 uniq = 0;
 
        /* find UnitInfo with correct device name */
        s = _tcschr (devname, ':');
@@ -2175,14 +2352,38 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context)
        }
        uinfo = mountinfo.ui + i;
 
-       ed = my_existsdir (uinfo->rootdir);
-       ef = my_existsfile (uinfo->rootdir);
-       if (!uinfo->wasisempty && !ef && !ed)
-       {
-               write_log (L"Failed attempt to mount device '%s'\n", devname);
-               put_long (pkt + dp_Res1, DOS_FALSE);
-               put_long (pkt + dp_Res2, ERROR_DEVICE_NOT_MOUNTED);
-               return 0;
+       if (uinfo->unit_type == UNIT_CDFS) {
+               ed = ef = 0;
+               uinfo->cddevno = i - cd_unit_offset;
+               if (!sys_command_open (uinfo->cddevno)) {
+                       write_log (L"Failed attempt to open CD unit %d\n", uinfo->cddevno);
+                       put_long (pkt + dp_Res1, DOS_FALSE);
+                       put_long (pkt + dp_Res2, ERROR_DEVICE_NOT_MOUNTED);
+                       return 0;
+               }
+               uinfo->cdfs_superblock = isofs_mount(uinfo->cddevno, &uniq);
+               uinfo->wasisempty = true;
+               struct isofs_info ii;
+               if (isofs_mediainfo (uinfo->cdfs_superblock, &ii)) {
+                       xfree (uinfo->volname);
+                       if (ii.media) {
+                               uinfo->wasisempty = false;
+                               if (!ii.unknown_media) {
+                                       uinfo->volname = my_strdup (ii.volumename);
+                               }
+                       }
+                       uinfo->unknown_media = ii.unknown_media;
+               }
+               uinfo->cd_open = true;
+       } else {
+               ed = my_existsdir (uinfo->rootdir);
+               ef = my_existsfile (uinfo->rootdir);
+               if (!uinfo->wasisempty && !ef && !ed) {
+                       write_log (L"Failed attempt to mount device '%s'\n", devname);
+                       put_long (pkt + dp_Res1, DOS_FALSE);
+                       put_long (pkt + dp_Res2, ERROR_DEVICE_NOT_MOUNTED);
+                       return 0;
+               }
        }
 
        if (!uinfo->unit_pipe) {
@@ -2191,6 +2392,7 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context)
        }
        unit = startup_create_unit (uinfo, i);
        unit->volflags = uinfo->volflags;
+       unit->rootnode.uniq_external = uniq;
 
        /*    write_comm_pipe_int (unit->ui.unit_pipe, -1, 1);*/
 
@@ -2214,6 +2416,7 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context)
 
        put_long (unit->dummy_message + 10, 0);
 
+       /* Prepare volume information */
        put_long (unit->volume + 4, 2); /* Type = dt_volume */
        put_long (unit->volume + 12, 0); /* Lock */
        put_long (unit->volume + 16, 3800 + i); /* Creation Date */
@@ -2223,13 +2426,14 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context)
        put_long (unit->volume + 40, (unit->volume + 44) >> 2); /* Name */
 
        put_byte (unit->volume + 44, 0);
-       if (!uinfo->wasisempty) {
+       if (!uinfo->wasisempty && !uinfo->unknown_media) {
+               /* Set volume if non-empty */
                set_volume_name (unit);
                fsdb_clean_dir (&unit->rootnode);
        }
 
        put_long (unit->volume + 8, unit->port);
-       put_long (unit->volume + 32, DISK_TYPE);
+       put_long (unit->volume + 32, uinfo->unit_type == UNIT_CDFS ? CDFS_DOSTYPE : DISK_TYPE);
 
        put_long (pkt + dp_Res1, DOS_TRUE);
 
@@ -2237,28 +2441,48 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context)
 }
 
 static void
-       do_info (Unit *unit, dpacket packet, uaecptr info)
+       do_info (Unit *unit, dpacket packet, uaecptr info, bool disk_info)
 {
        struct fs_usage fsu;
-       int ret;
+       int ret, err = ERROR_NO_FREE_STORE;
 
-       if (unit->volflags & MYVOLUMEINFO_ARCHIVE)
+       if (unit->volflags & MYVOLUMEINFO_ARCHIVE) {
                ret = zfile_fs_usage_archive (unit->ui.rootdir, 0, &fsu);
-       else
+       } else if (unit->volflags & MYVOLUMEINFO_CDFS) {
+               struct isofs_info ii;
+               ret = isofs_mediainfo (unit->ui.cdfs_superblock, &ii) ? 0 : 1;
+               fsu.fsu_blocks = ii.blocks;
+               fsu.fsu_bavail = 0;
+       } else {
                ret = get_fs_usage (unit->ui.rootdir, 0, &fsu);
+               if (ret)
+                       err = dos_errno ();
+       }
        if (ret != 0) {
                PUT_PCK_RES1 (packet, DOS_FALSE);
-               PUT_PCK_RES2 (packet, dos_errno ());
+               PUT_PCK_RES2 (packet, err);
                return;
        }
        put_long (info, 0); /* errors */
-       put_long (info + 4, unit->unit); /* unit number */
+       put_long (info + 4, (unit->volflags & MYVOLUMEINFO_CDFS) ? unit->unit - cd_unit_offset : unit->unit); /* unit number */
        put_long (info + 8, unit->ui.readonly || unit->ui.locked ? 80 : 82); /* state  */
-       put_long (info + 12, fsu.fsu_blocks ); /* numblocks */
-       put_long (info + 16, fsu.fsu_blocks - fsu.fsu_bavail); /* inuse */
-       put_long (info + 20, 1024); /* bytesperblock */
-       put_long (info + 24, DISK_TYPE); /* disk type */
-       put_long (info + 28, unit->volume >> 2); /* volume node */
+       put_long (info + 20, (unit->volflags & MYVOLUMEINFO_CDFS) ? 2048 : 1024); /* bytesperblock */
+       if (disk_info && unit->ui.unknown_media) {
+               put_long (info + 12, 0);
+               put_long (info + 16, 0);
+               put_long (info + 24, ('B' << 24) | ('A' << 16) | ('D' << 8) | 0); /* ID_UNREADABLE_DISK */
+               put_long (info + 28, 0);
+       } else if (disk_info && !filesys_isvolume (unit)) {
+               put_long (info + 12, 0);
+               put_long (info + 16, 0);
+               put_long (info + 24, -1); /* ID_NO_DISK_PRESENT */
+               put_long (info + 28, 0);
+       } else {
+               put_long (info + 12, fsu.fsu_blocks ); /* numblocks */
+               put_long (info + 16, fsu.fsu_blocks - fsu.fsu_bavail); /* inuse */
+               put_long (info + 24, DISK_TYPE); /* disk type */
+               put_long (info + 28, unit->volume >> 2); /* volume node */
+       }
        put_long (info + 32, 0); /* inuse */
        PUT_PCK_RES1 (packet, DOS_TRUE);
 }
@@ -2267,14 +2491,14 @@ static void
        action_disk_info (Unit *unit, dpacket packet)
 {
        TRACE((L"ACTION_DISK_INFO\n"));
-       do_info (unit, packet, GET_PCK_ARG1 (packet) << 2);
+       do_info (unit, packet, GET_PCK_ARG1 (packet) << 2, true);
 }
 
 static void
        action_info (Unit *unit, dpacket packet)
 {
        TRACE((L"ACTION_INFO\n"));
-       do_info (unit, packet, GET_PCK_ARG2 (packet) << 2);
+       do_info (unit, packet, GET_PCK_ARG2 (packet) << 2, false);
 }
 
 static void free_key (Unit *unit, Key *k)
@@ -2299,7 +2523,7 @@ static void free_key (Unit *unit, Key *k)
        }
 
        if (k->fd != NULL)
-               fs_close (k->fd);
+               fs_closefile (k->fd);
 
        xfree(k);
 }
@@ -2812,6 +3036,8 @@ static void
        /* No error checks - this had better work. */
        if (unit->volflags & MYVOLUMEINFO_ARCHIVE)
                zfile_stat_archive (aino->nname, &statbuf);
+       else if (unit->volflags & MYVOLUMEINFO_CDFS)
+               isofs_stat (unit->ui.cdfs_superblock, aino->uniq_external, &statbuf);
        else
                stat (aino->nname, &statbuf);
 
@@ -3117,6 +3343,8 @@ static int exalldo (uaecptr exalldata, uae_u32 exalldatasize, uae_u32 type, uaec
        memset (&statbuf, 0, sizeof statbuf);
        if (unit->volflags & MYVOLUMEINFO_ARCHIVE)
                zfile_stat_archive (aino->nname, &statbuf);
+       else if (unit->volflags & MYVOLUMEINFO_CDFS)
+               ;
        else
                stat (aino->nname, &statbuf);
 
@@ -3233,11 +3461,13 @@ static int action_examine_all_do (Unit *unit, uaecptr lock, ExAllKey *eak, uaecp
                d = eak->dirhandle;
                if (!eak->fn) {
                        do {
-                               if (d->isarch)
+                               if (d->fstype == FS_ARCHIVE)
                                        ok = zfile_readdir_archive (d->zd, fn);
-                               else
+                               else if (d->fstype == FS_DIRECTORY)
                                        ok = my_readdir (d->od, fn);
-                       } while (ok && !d->isarch && fsdb_name_invalid (fn));
+                               else
+                                       ok = 0;
+                       } while (ok && d->fstype == FS_DIRECTORY && fsdb_name_invalid (fn));
                        if (!ok)
                                return 0;
                } else {
@@ -3245,7 +3475,7 @@ static int action_examine_all_do (Unit *unit, uaecptr lock, ExAllKey *eak, uaecp
                        xfree (eak->fn);
                        eak->fn = NULL;
                }
-               aino = lookup_child_aino_for_exnext (unit, base, fn, &err);
+               aino = lookup_child_aino_for_exnext (unit, base, fn, &err, 0);
                if (!aino)
                        return 0;
                eak->id = unit->exallid++;
@@ -3359,7 +3589,7 @@ static int action_examine_all (Unit *unit, dpacket packet)
 #if EXALL_DEBUG > 0
                write_log("exall: ID=%d '%s'\n", eak->id, base->nname);
 #endif
-               d = fs_opendir (unit, base->nname);
+               d = fs_opendir (unit, base);
                if (!d)
                        goto fail;
                eak->dirhandle = d;
@@ -3408,7 +3638,7 @@ fail:
        return 1;
 }
 
-static uae_u32 REGPARAM2 exall_helper (TrapContext *context)
+static uae_u32 exall_helpder(TrapContext *context)
 {
        int i;
        Unit *u;
@@ -3431,6 +3661,23 @@ static uae_u32 REGPARAM2 exall_helper (TrapContext *context)
        return 1;
 }
 
+static uae_u32 REGPARAM2 fsmisc_helper (TrapContext *context)
+{
+       int mode = m68k_dreg (regs, 0);
+
+       switch (mode)
+       {
+       case 0:
+       return exall_helpder (context);
+       case 1:
+       return filesys_media_change_reply (context, 0);
+       case 2:
+       return filesys_media_change_reply (context, 1);
+       }
+       return 0;
+}
+
+
 static void action_examine_object (Unit *unit, dpacket packet)
 {
        uaecptr lock = GET_PCK_ARG1 (packet) << 2;
@@ -3463,8 +3710,9 @@ static void populate_directory (Unit *unit, a_inode *base)
 {
        struct fs_dirhandle *d;
        a_inode *aino;
+       uae_u64 uniq = 0;
 
-       d = fs_opendir (unit, base->nname);
+       d = fs_opendir (unit, base);
        if (!d)
                return;
        for (aino = base->child; aino; aino = aino->sibling) {
@@ -3481,16 +3729,20 @@ static void populate_directory (Unit *unit, a_inode *base)
                /* Find next file that belongs to the Amiga fs (skipping things
                like "..", "." etc.  */
                do {
-                       if (d->isarch)
-                               ok = zfile_readdir_archive(d->zd, fn);
-                       else
+                       if (d->fstype == FS_ARCHIVE)
+                               ok = zfile_readdir_archive (d->zd, fn);
+                       else if (d->fstype == FS_DIRECTORY)
                                ok = my_readdir (d->od, fn);
-               } while (ok && !d->isarch && fsdb_name_invalid (fn));
+                       else if (d->fstype == FS_CDFS)
+                               ok = isofs_readdir (d->isod, fn, &uniq);
+                       else
+                               ok = 0;
+               } while (ok && d->fstype == FS_DIRECTORY && fsdb_name_invalid (fn));
                if (!ok)
                        break;
                /* This calls init_child_aino, which will notice that the parent is
                being ExNext()ed, and it will increment the locked counts.  */
-               aino = lookup_child_aino_for_exnext (unit, base, fn, &err);
+               aino = lookup_child_aino_for_exnext (unit, base, fn, &err, uniq);
        }
        fs_closedir (d);
 }
@@ -3504,7 +3756,7 @@ static void do_examine (Unit *unit, dpacket packet, ExamineKey *ek, uaecptr info
                name = ek->curr_file->nname;
                get_fileinfo (unit, packet, info, ek->curr_file);
                ek->curr_file = ek->curr_file->sibling;
-               if (!(unit->volflags & MYVOLUMEINFO_ARCHIVE) && !fsdb_exists(name)) {
+               if (!(unit->volflags & (MYVOLUMEINFO_ARCHIVE | MYVOLUMEINFO_CDFS)) && !fsdb_exists(name)) {
                        TRACE ((L"%s orphaned", name));
                        continue;
                }
@@ -3585,7 +3837,7 @@ static void do_find (Unit *unit, dpacket packet, int mode, int create, int fallb
        int err;
        mode_t openmode;
        int aino_created = 0;
-       int isarch = unit->volflags & MYVOLUMEINFO_ARCHIVE;
+       int isvirtual = unit->volflags & (MYVOLUMEINFO_ARCHIVE | MYVOLUMEINFO_CDFS);
 
        TRACE((L"ACTION_FIND_*(0x%lx,0x%lx,\"%s\",%d,%d)\n", fh, lock, bstr (unit, name), mode, create));
        TRACE((L"fh=%x lock=%x name=%x\n", fh, lock, name));
@@ -3665,13 +3917,13 @@ static void do_find (Unit *unit, dpacket packet, int mode, int create, int fallb
                | (create ? O_CREAT : 0)
                | (create == 2 ? O_TRUNC : 0));
 
-       fd = fs_open (unit, aino->nname, openmode | O_BINARY);
+       fd = fs_openfile (unit, aino, openmode | O_BINARY);
        if (fd == NULL) {
                if (aino_created)
                        delete_aino (unit, aino);
                PUT_PCK_RES1 (packet, DOS_FALSE);
                /* archive and fd == NULL = corrupt archive or out of memory */
-               PUT_PCK_RES2 (packet, isarch ? ERROR_OBJECT_NOT_AROUND : dos_errno ());
+               PUT_PCK_RES2 (packet, isvirtual ? ERROR_OBJECT_NOT_AROUND : dos_errno ());
                return;
        }
 
@@ -3682,7 +3934,7 @@ static void do_find (Unit *unit, dpacket packet, int mode, int create, int fallb
        k->createmode = create;
        k->notifyactive = create ? 1 : 0;
 
-       if (create && isarch)
+       if (create && isvirtual)
                fsdb_set_file_attrs (aino);
 
        put_long (fh + 36, k->uniq);
@@ -3711,7 +3963,6 @@ static void
        struct fs_filehandle *fd;
        mode_t openmode;
        int mode;
-       int isarch = unit->volflags & MYVOLUMEINFO_ARCHIVE;
 
        TRACE((L"ACTION_FH_FROM_LOCK(0x%lx,0x%lx)\n", fh, lock));
        DUMPLOCK(unit,lock);
@@ -3738,7 +3989,7 @@ static void
        if (unit->ui.readonly || unit->ui.locked)
                openmode = O_RDONLY;
 
-       fd = fs_open (unit, aino->nname, openmode | O_BINARY);
+       fd = fs_openfile (unit, aino, openmode | O_BINARY);
 
        if (fd == NULL) {
                PUT_PCK_RES1 (packet, DOS_FALSE);
@@ -3845,23 +4096,52 @@ static void
        }
        TRACE((L"ACTION_READ(%s,0x%lx,%ld)\n", k->aino->nname, addr, size));
        gui_flicker_led (LED_HD, unit->unit, 1);
-#ifdef RELY_ON_LOADSEG_DETECTION
-       /* HACK HACK HACK HACK
-       * Try to detect a LoadSeg() */
-       if (k->file_pos == 0 && size >= 4) {
-               unsigned TCHAR buf[4];
-               off_t currpos = fs_lseek (unit, k->fd, 0, SEEK_CUR);
-               my_read (k->fd, buf, 4);
-               fs_lseek (unit, k->fd, currpos, SEEK_SET);
-               if (buf[0] == 0 && buf[1] == 0 && buf[2] == 3 && buf[3] == 0xF3)
-                       possible_loadseg();
-       }
-#endif
+
        if (size == 0) {
                actual = 0;
                PUT_PCK_RES1 (packet, 0);
                PUT_PCK_RES2 (packet, 0);
-       } else if (valid_address (addr, size)) {
+       } else if (!valid_address (addr, size)) {
+               /* check if filesize < size */
+               uae_s64 cur, filesize;
+
+               cur = fs_lseek64 (k->fd, 0, SEEK_CUR);
+               filesize = fs_fsize64 (k->fd);
+               if (size > filesize - cur)
+                       size = filesize - cur;
+
+               if (!valid_address (addr, size)) {
+                       /* it really crosses memory boundary */
+                       uae_u8 *buf;
+                       
+                       write_log (L"unixfs warning: Bad pointer passed for read: %08x, size %d\n", addr, size);
+                       /* ugh this is inefficient but easy */
+
+                       buf = xmalloc (uae_u8, size);
+                       if (!buf) {
+                               PUT_PCK_RES1 (packet, -1);
+                               PUT_PCK_RES2 (packet, ERROR_NO_FREE_STORE);
+                               return;
+                       }
+                       actual = fs_read (k->fd, buf, size);
+
+                       if (actual < 0) {
+                               PUT_PCK_RES1 (packet, 0);
+                               PUT_PCK_RES2 (packet, dos_errno ());
+                       } else {
+                               int i;
+                               PUT_PCK_RES1 (packet, actual);
+                               for (i = 0; i < actual; i++)
+                                       put_byte (addr + i, buf[i]);
+                               k->file_pos += actual;
+                       }
+                       xfree (buf);
+                       flush_dcache (addr, size);
+                       size = 0;
+               }
+       }
+       if (size) {
+               /* normal fast read */
                uae_u8 *realpt = get_real_address (addr);
                actual = fs_read (k->fd, realpt, size);
 
@@ -3876,39 +4156,8 @@ static void
                        k->file_pos += actual;
                }
                flush_dcache (addr, size);
-       } else {
-               uae_u8 *buf;
-               off_t old, filesize;
-
-               write_log (L"unixfs warning: Bad pointer passed for read: %08x, size %d\n", addr, size);
-               /* ugh this is inefficient but easy */
-
-               old = fs_lseek (k->fd, 0, SEEK_CUR);
-               filesize = fs_lseek (k->fd, 0, SEEK_END);
-               fs_lseek (k->fd, old, SEEK_SET);
-               if (size > filesize)
-                       size = filesize;
-
-               buf = xmalloc (uae_u8, size);
-               if (!buf) {
-                       PUT_PCK_RES1 (packet, -1);
-                       PUT_PCK_RES2 (packet, ERROR_NO_FREE_STORE);
-                       return;
-               }
-               actual = fs_read (k->fd, buf, size);
-
-               if (actual < 0) {
-                       PUT_PCK_RES1 (packet, 0);
-                       PUT_PCK_RES2 (packet, dos_errno ());
-               } else {
-                       int i;
-                       PUT_PCK_RES1 (packet, actual);
-                       for (i = 0; i < actual; i++)
-                               put_byte (addr + i, buf[i]);
-                       k->file_pos += actual;
-               }
-               xfree (buf);
        }
+
        TRACE((L"=%d\n", actual));
 }
 
@@ -3978,7 +4227,7 @@ static void
        long pos = (uae_s32)GET_PCK_ARG2 (packet);
        long mode = (uae_s32)GET_PCK_ARG3 (packet);
        uae_s64 res;
-       uae_s64 old;
+       uae_s64 cur;
        int whence = SEEK_CUR;
 
        if (k == 0) {
@@ -3992,17 +4241,16 @@ static void
        if (mode < 0)
                whence = SEEK_SET;
 
-       old = fs_lseek (k->fd, 0, SEEK_CUR);
+       cur = fs_lseek (k->fd, 0, SEEK_CUR);
        TRACE((L"ACTION_SEEK(%s,%d,%d)=%d\n", k->aino->nname, pos, mode, old));
        gui_flicker_led (LED_HD, unit->unit, 1);
 
        {
                uae_s64 temppos;
-               uae_s64 filesize = fs_lseek64 (k->fd, 0, SEEK_END);
-               fs_lseek (k->fd, old, SEEK_SET);
+               uae_s64 filesize = fs_fsize64 (k->fd);
 
                if (whence == SEEK_CUR)
-                       temppos = old + pos;
+                       temppos = cur + pos;
                if (whence == SEEK_SET)
                        temppos = pos;
                if (whence == SEEK_END)
@@ -4016,13 +4264,13 @@ static void
        }
        res = fs_lseek64 (k->fd, pos, whence);
 
-       if (-1 == res || old > MAXFILESIZE32) {
+       if (-1 == res || cur > MAXFILESIZE32) {
                PUT_PCK_RES1 (packet, -1);
                PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR);
-               fs_lseek64 (k->fd, old, SEEK_SET);
-               res = old;
+               fs_lseek64 (k->fd, cur, SEEK_SET);
+               res = cur;
        } else {
-               PUT_PCK_RES1 (packet, old);
+               PUT_PCK_RES1 (packet, cur);
        }
        k->file_pos = res;
 }
@@ -4356,7 +4604,7 @@ static void
        gui_flicker_led (LED_HD, unit->unit, 1);
        k->notifyactive = 1;
        /* If any open files have file pointers beyond this size, truncate only
-       * so far that these pointers do not become invalid.  */
+        * so far that these pointers do not become invalid.  */
        for (k1 = unit->keys; k1; k1 = k1->next) {
                if (k != k1 && k->aino == k1->aino) {
                        if (k1->file_pos > offset)
@@ -4365,16 +4613,17 @@ static void
        }
 
        /* Write one then truncate: that should give the right size in all cases.  */
-       offset = fs_lseek (k->fd, offset, whence);
+       fs_lseek (k->fd, offset, whence);
+       offset = fs_lseek (k->fd, 0, SEEK_CUR);
        fs_write (k->fd, /* whatever */(uae_u8*)&k1, 1);
        if (k->file_pos > offset)
                k->file_pos = offset;
        fs_lseek (k->fd, (off_t)k->file_pos, SEEK_SET);
 
        /* Brian: no bug here; the file _must_ be one byte too large after writing
-       The write is supposed to guarantee that the file can't be smaller than
-       the requested size, the truncate guarantees that it can't be larger.
-       If we were to write one byte earlier we'd clobber file data.  */
+        * The write is supposed to guarantee that the file can't be smaller than
+        * the requested size, the truncate guarantees that it can't be larger.
+        * If we were to write one byte earlier we'd clobber file data.  */
        if (my_truncate (k->aino->nname, offset) == -1) {
                PUT_PCK_RES1 (packet, DOS_FALSE);
                PUT_PCK_RES2 (packet, dos_errno ());
@@ -4394,7 +4643,7 @@ static int relock_do(Unit *unit, a_inode *a1)
                knext = k1->next;
                if (k1->aino == a1 && k1->fd) {
                        wehavekeys++;
-                       fs_close (k1->fd);
+                       fs_closefile (k1->fd);
                        write_log (L"handle %p freed\n", k1->fd);
                }
        }
@@ -4412,13 +4661,13 @@ static void relock_re (Unit *unit, a_inode *a1, a_inode *a2, int failed)
                        mode |= O_BINARY;
                        if (failed) {
                                /* rename still failed, restore fd */
-                               k1->fd = fs_open (unit, a1->nname, mode);
+                               k1->fd = fs_openfile (unit, a1, mode);
                                write_log (L"restoring old handle '%s' %d\n", a1->nname, k1->dosmode);
                        } else {
                                /* transfer fd to new name */
                                if (a2) {
                                        k1->aino = a2;
-                                       k1->fd = fs_open (unit, a2->nname, mode);
+                                       k1->fd = fs_openfile (unit, a2, mode);
                                        write_log (L"restoring new handle '%s' %d\n", a2->nname, k1->dosmode);
                                } else {
                                        write_log (L"no new handle, deleting old lock(s).\n");
@@ -4724,7 +4973,7 @@ static void action_change_file_position64 (Unit *unit, dpacket packet)
        uae_s64 pos = GET_PCK64_ARG2 (packet);
        long mode = GET_PCK64_ARG3 (packet);
        long whence = SEEK_CUR;
-       uae_s64 res, old;
+       uae_s64 res, cur;
 
        PUT_PCK64_RES0 (packet, DP64_INIT);
 
@@ -4742,14 +4991,13 @@ static void action_change_file_position64 (Unit *unit, dpacket packet)
        TRACE((L"ACTION_CHANGE_FILE_POSITION64(%s,%I64d,%d)\n", k->aino->nname, pos, mode));
        gui_flicker_led (LED_HD, unit->unit, 1);
 
-       old = fs_lseek64 (k->fd, 0, SEEK_CUR);
+       cur = fs_lseek64 (k->fd, 0, SEEK_CUR);
        {
                uae_s64 temppos;
-               uae_s64 filesize = fs_lseek64 (k->fd, 0, SEEK_END);
-               fs_lseek64 (k->fd, old, SEEK_SET);
+               uae_s64 filesize = fs_fsize64 (k->fd);
 
                if (whence == SEEK_CUR)
-                       temppos = old + pos;
+                       temppos = cur + pos;
                if (whence == SEEK_SET)
                        temppos = pos;
                if (whence == SEEK_END)
@@ -4769,7 +5017,7 @@ static void action_change_file_position64 (Unit *unit, dpacket packet)
        } else {
                PUT_PCK64_RES1 (packet, TRUE);
                PUT_PCK64_RES2 (packet, 0);
-               k->file_pos = res;
+               k->file_pos = cur;
        }
 
 }
@@ -4825,6 +5073,7 @@ static void action_change_file_size64 (Unit *unit, dpacket packet)
        }
 
        /* Write one then truncate: that should give the right size in all cases.  */
+       fs_lseek (k->fd, offset, whence);
        offset = fs_lseek (k->fd, offset, whence);
        fs_write (k->fd, /* whatever */(uae_u8*)&k1, 1);
        if (k->file_pos > offset)
@@ -4845,7 +5094,7 @@ static void action_change_file_size64 (Unit *unit, dpacket packet)
 static void action_get_file_size64 (Unit *unit, dpacket packet)
 {
        Key *k = lookup_key (unit, GET_PCK64_ARG1 (packet));
-       uae_s64 old, filesize;
+       uae_s64 filesize;
 
        PUT_PCK64_RES0 (packet, DP64_INIT);
 
@@ -4855,15 +5104,11 @@ static void action_get_file_size64 (Unit *unit, dpacket packet)
                return;
        }
        TRACE((L"ACTION_GET_FILE_SIZE64(%s)\n", k->aino->nname));
-       old = fs_lseek64 (k->fd, 0, SEEK_CUR);
-       if (old >= 0) {
-               filesize = fs_lseek64 (k->fd, 0, SEEK_END);
-               if (filesize >= 0) {
-                       fs_lseek64 (k->fd, old, SEEK_SET);
-                       PUT_PCK64_RES1 (packet, filesize);
-                       PUT_PCK64_RES2 (packet, 0);
-                       return;
-               }
+       filesize = fs_fsize64 (k->fd);
+       if (filesize >= 0) {
+               PUT_PCK64_RES1 (packet, filesize);
+               PUT_PCK64_RES2 (packet, 0);
+               return;
        }
        PUT_PCK64_RES1 (packet, DOS_FALSE);
        PUT_PCK64_RES2 (packet, ERROR_SEEK_ERROR);
@@ -5019,8 +5264,13 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg)
 {
        uae_s32 type = GET_PCK_TYPE (pck);
        PUT_PCK_RES2 (pck, 0);
+
+#if 0
+       if (unit->cdfs_superblock)
+               write_log(L"unit=%x packet=%d\n", unit, type);
+#endif
 #if TRACING_ENABLED > 0
-       write_log(L"packet=%d\n", type);
+       write_log(L"unit=%x packet=%d\n", unit, type);
 #endif
        if (unit->inhibited && filesys_isvolume (unit)
                && type != ACTION_INHIBIT && type != ACTION_MORE_CACHE
@@ -5031,10 +5281,10 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg)
        }
        if (type != ACTION_INHIBIT && type != ACTION_CURRENT_VOLUME
                && type != ACTION_IS_FILESYSTEM && type != ACTION_MORE_CACHE
-               && type != ACTION_WRITE_PROTECT
+               && type != ACTION_WRITE_PROTECT && type != ACTION_DISK_INFO
                && !filesys_isvolume (unit)) {
                        PUT_PCK_RES1 (pck, DOS_FALSE);
-                       PUT_PCK_RES2 (pck, ERROR_NO_DISK);
+                       PUT_PCK_RES2 (pck, unit->ui.unknown_media ? ERROR_NOT_A_DOS_DISK : ERROR_NO_DISK);
                        return 1;
        }
 
@@ -5204,10 +5454,12 @@ static void init_filesys_diagentry (void)
        do_put_mem_long ((uae_u32 *)(filesysory + 0x2104), filesys_configdev);
        do_put_mem_long ((uae_u32 *)(filesysory + 0x2108), EXPANSION_doslibname);
        do_put_mem_word ((uae_u16 *)(filesysory + 0x210e), nr_units ());
-       if (currprefs.scsi && currprefs.win32_automount_cddrives)
+       if (currprefs.scsi && currprefs.win32_automount_cddrives && USE_CDFS == 1)
                do_put_mem_word ((uae_u16 *)(filesysory + 0x210c),  scsi_get_cd_drive_mask ());
        else
                do_put_mem_word ((uae_u16 *)(filesysory + 0x210c), 0);
+       if (USE_CDFS != 2)
+               cd_unit_offset = MAX_FILESYSTEM_UNITS;
        native2amiga_startup ();
 }
 
@@ -5239,7 +5491,7 @@ void filesys_free_handles (void)
                for (k1 = u->keys; k1; k1 = knext) {
                        knext = k1->next;
                        if (k1->fd)
-                               fs_close (k1->fd);
+                               fs_closefile (k1->fd);
                        xfree (k1);
                }
                u->keys = NULL;
@@ -5407,7 +5659,6 @@ static uae_u32 REGPARAM2 filesys_diagentry (TrapContext *context)
 
 static uae_u32 REGPARAM2 filesys_dev_bootfilesys (TrapContext *context)
 {
-       int iscd = (m68k_dreg (regs, 6) & 0x80000000) != 0;
        uaecptr devicenode = m68k_areg (regs, 3);
        uaecptr parmpacket = m68k_areg (regs, 1);
        uaecptr fsres = get_long (parmpacket + PP_FSRES);
@@ -5416,9 +5667,13 @@ static uae_u32 REGPARAM2 filesys_dev_bootfilesys (TrapContext *context)
        UnitInfo *uip = mountinfo.ui;
        int no = m68k_dreg (regs, 6) & 0x7fffffff;
        int unit_no = no & 65535;
+       int iscd = (m68k_dreg (regs, 6) & 0x80000000) != 0 || uip->unit_type == UNIT_CDFS;
        int type;
        
        if (iscd) {
+#if USE_CDFS == 2
+               return 0;
+#endif
                type = FILESYS_CD;
        } else {
                type = is_hardfile (unit_no);
@@ -5465,7 +5720,6 @@ static uae_u32 REGPARAM2 filesys_init_storeinfo (TrapContext *context)
 }
 
 
-#define CDFS_DOSTYPE 0x43445644
 static uae_u8 *cdfs_handler;
 static int cdfs_handler_len;
 
@@ -5473,24 +5727,23 @@ static int cdfs_handler_len;
 * which unit a given startup message belongs to.  */
 static uae_u32 REGPARAM2 filesys_dev_remember (TrapContext *context)
 {
-       int iscd = (m68k_dreg (regs, 6) & 0x80000000) != 0;
        int no = m68k_dreg (regs, 6) & 0x7fffffff;
        int unit_no = no & 65535;
        int sub_no = no >> 16;
-       UnitInfo *uip = NULL;
+       UnitInfo *uip = &mountinfo.ui[unit_no];
+       int iscd = (m68k_dreg (regs, 6) & 0x80000000) != 0 || uip->unit_type == UNIT_CDFS;
        int i;
        uaecptr devicenode = m68k_areg (regs, 3);
        uaecptr parmpacket = m68k_areg (regs, 1);
        int fssize;
        uae_u8 *fs;
 
-       if (iscd) {
+       if (iscd && USE_CDFS == 1) {
                fssize = cdfs_handler_len;
                fs = cdfs_handler;
                if (get_long (devicenode + 5 * 4) < 10000)  // stack
                        put_long (devicenode + 5 * 4, 10000);
        } else {
-               uip = &mountinfo.ui[unit_no];
                fssize = uip->rdb_filesyssize;
                fs = uip->rdb_filesysstore;
        }
@@ -5501,7 +5754,7 @@ static uae_u32 REGPARAM2 filesys_dev_remember (TrapContext *context)
                        put_byte (get_long (parmpacket + PP_FSPTR) + i, fs[i]);
        }
 
-       if (!iscd) {
+       if (!iscd || USE_CDFS == 2) {
                xfree (fs);
                uip->rdb_filesysstore = 0;
                uip->rdb_filesyssize = 0;
@@ -6002,6 +6255,8 @@ static void get_new_device (int type, uaecptr parmpacket, TCHAR **devname, uaecp
                int un = unit_no;
                for (;;) {
                        _stprintf (buffer, type == FILESYS_CD ? L"CD%d" : L"DH%d", un++);
+                       if (type == FILESYS_CD && USE_CDFS == 2)
+                               *devname = my_strdup (buffer);
                        if (!device_isdup (expbase, buffer))
                                break;
                }
@@ -6025,22 +6280,34 @@ static uae_u32 REGPARAM2 filesys_dev_storeinfo (TrapContext *context)
 {
        UnitInfo *uip = mountinfo.ui;
        int no = m68k_dreg (regs, 6) & 0x7fffffff;
-       int iscd = (m68k_dreg (regs, 6) & 0x80000000) != 0;
        int unit_no = no & 65535;
        int sub_no = no >> 16;
+       int iscd = (m68k_dreg (regs, 6) & 0x80000000) != 0 || uip[unit_no].unit_type == UNIT_CDFS;
        int type;
        uaecptr parmpacket = m68k_areg (regs, 0);
 
        if (iscd) {
-
                TCHAR *cdname = NULL;
                uaecptr cdname_amiga;
+               int cd_unit_no = unit_no - cd_unit_offset;
+
+               if (sub_no)
+                       return -2;
+
                type = FILESYS_CD;
-               write_log (L"Mounting uaescsi.device %d:\n", unit_no);
-               get_new_device (type, parmpacket, &cdname, &cdname_amiga, unit_no);
+               if (USE_CDFS == 2) {
+                       get_new_device (type, parmpacket, &uip[unit_no].devname, &uip[unit_no].devname_amiga, cd_unit_no);
+                       cdname_amiga = uip[unit_no].devname_amiga;
+                       uip[unit_no].devno = unit_no;
+                       type = FILESYS_VIRTUAL;
+               } else {
+                       get_new_device (type, parmpacket, &cdname, &cdname_amiga, cd_unit_no);
+               }
+
+               write_log (L"Mounting uaescsi.device %d: (%d)\n", cd_unit_no, unit_no);
                put_long (parmpacket, cdname_amiga);
                put_long (parmpacket + 4, cdfs_devname);
-               put_long (parmpacket + 8, unit_no);
+               put_long (parmpacket + 8, cd_unit_no);
                put_long (parmpacket + 12, 0); /* Device flags */
                put_long (parmpacket + 16, 19); /* Env. size */
                put_long (parmpacket + 20, 2048 >> 2); /* longwords per block */
@@ -6057,12 +6324,12 @@ static uae_u32 REGPARAM2 filesys_dev_storeinfo (TrapContext *context)
                put_long (parmpacket + 64, 0); /* Buffer mem type */
                put_long (parmpacket + 68, 0x7FFFFFFF); /* largest transfer */
                put_long (parmpacket + 72, ~1); /* addMask (?) */
-               put_long (parmpacket + 76, scsi_get_cd_drive_media_mask () & (1 << unit_no) ? -80 : -128); /* bootPri */
+               put_long (parmpacket + 76, scsi_get_cd_drive_media_mask () & (1 << cd_unit_no) ? -80 : -128); /* bootPri */
                put_long (parmpacket + 80, CDFS_DOSTYPE);
                put_long (parmpacket + 84, 0); /* baud */
                put_long (parmpacket + 88, cdfs_control >> 2); /* Control. BSTR! */
                put_long (parmpacket + 92, 0); /* bootblocks */
-
+#if USE_CDFS == 1
                uaecptr fsres = get_long (parmpacket + PP_FSRES);
                bool cdfs = false;
                if (fsres) {
@@ -6083,7 +6350,7 @@ static uae_u32 REGPARAM2 filesys_dev_storeinfo (TrapContext *context)
                        put_long (parmpacket + PP_FSSIZE, cdfs_handler_len);
                        addfakefilesys (parmpacket, CDFS_DOSTYPE);
                }
-
+#endif
                return type;
 
        } else {
@@ -6214,9 +6481,12 @@ void filesys_install (void)
        ROM_filesys_resid = ds_ansi ("UAE unixfs 0.4");
 
        fsdevname = ds_ansi ("uae.device"); /* does not really exist */
+#if USE_CDFS
        cdfs_devname = ds_ansi ("uaescsi.device");
+#if USE_CDFS == 1
        cdfs_control = ds_bstr_ansi ("ROCKRIDGE JOLIET MAYBELOWERCASE SCANINTERVAL=-1 DE=.1 RE=.2");
-
+#endif
+#endif
        ROM_filesys_diagentry = here ();
        calltrap (deftrap2 (filesys_diagentry, 0, L"filesys_diagentry"));
        dw(0x4ED0); /* JMP (a0) - jump to code that inits Residents */
@@ -6257,7 +6527,7 @@ void filesys_install (void)
        dw (RTS);
 
        org (rtarea_base + 0xFF58);
-       calltrap (deftrap2 (exall_helper, 0, L"exall_helper"));
+       calltrap (deftrap2 (fsmisc_helper, 0, L"fsmisc_helper"));
        dw (RTS);
 
        org (loop);
@@ -6281,11 +6551,14 @@ void filesys_install_code (void)
        b = a + bootrom_header + 3 * 4 - 4;
        filesys_initcode = a + dlg (b) + bootrom_header - 4;
 
+#if USE_CDFS == 1
        cdfs_handler = zfile_load_data (L"cdfs.gz", cdfs_rom, cdfs_rom_len, &cdfs_handler_len);
-
+#endif
 }
 
+#if USE_CDFS
 #include "cdrom-handler.cpp"
+#endif
 
 #include "od-win32/win32_filesys.cpp"
 
@@ -6544,9 +6817,9 @@ static uae_u8 *restore_key (UnitInfo *ui, Unit *u, uae_u8 *src)
                k->aino = a;
                if (a->uniq != uniq)
                        write_log (L"*** FS: Open file '%s' aino id %d != %d\n", p, uniq, a->uniq);
-               if (!my_existsfile(pn)) {
+               if (!my_existsfile (pn)) {
                        write_log (L"*** FS: Open file '%s' is missing, creating dummy file!\n", p);
-                       k->fd = fs_open (u, pn, openmode | O_CREAT |O_BINARY);
+                       k->fd = fs_openfile (u, a, openmode | O_CREAT |O_BINARY);
                        if (k->fd) {
                                uae_u8 *buf = xcalloc (uae_u8, 10000);
                                int sp = savedsize;
@@ -6561,14 +6834,14 @@ static uae_u8 *restore_key (UnitInfo *ui, Unit *u, uae_u8 *src)
                                write_log (L"*** FS: Open file '%s', couldn't create dummy file!\n", p);
                        }
                } else {
-                       k->fd = fs_open (u, pn, openmode | O_BINARY);
+                       k->fd = fs_openfile (u, a, openmode | O_BINARY);
                }
                if (!k->fd) {
                        write_log (L"*** FS: Open file '%s' failed to open!\n", p);
                        missing = 1;
                } else {
                        uae_s64 s;
-                       s = fs_lseek64 (k->fd, 0, SEEK_END);
+                       s = fs_fsize64 (k->fd);
                        if (s != savedsize)
                                write_log (L"FS: restored file '%s' size changed! orig=%d, now=%d!!\n", p, savedsize, s);
                        if (k->file_pos > s) {
@@ -6728,7 +7001,7 @@ static uae_u8 *save_key (uae_u8 *dst, Key *k)
        save_u32 ((uae_u32)k->file_pos);
        save_u32 (k->createmode);
        save_u32 (k->dosmode);
-       size = fs_lseek (k->fd, 0, SEEK_END);
+       size = fs_fsize (k->fd);
        save_u32 ((uae_u32)size);
        save_u64 (k->aino->uniq);
        fs_lseek (k->fd, k->file_pos, SEEK_SET);
index 42d8a472f51d9beb93407e6b10004239707bfbe4..1e3ac75d723cd16e85ab1beecd1731882bff7e54 100644 (file)
@@ -2,12 +2,12 @@
  db(0x00); db(0x00); db(0x00); db(0x09); db(0x60); db(0x00); db(0x0b); db(0x94);
  db(0x00); db(0x00); db(0x09); db(0x70); db(0x00); db(0x00); db(0x00); db(0xe0);
  db(0x00); db(0x00); db(0x02); db(0x9c); db(0x00); db(0x00); db(0x00); db(0x24);
- db(0x00); db(0x00); db(0x03); db(0x58); db(0x00); db(0x00); db(0x0f); db(0x70);
- db(0x00); db(0x00); db(0x14); db(0x00); db(0x43); db(0xfa); db(0x18); db(0xec);
+ db(0x00); db(0x00); db(0x03); db(0x58); db(0x00); db(0x00); db(0x0f); db(0x96);
+ db(0x00); db(0x00); db(0x14); db(0x26); db(0x43); db(0xfa); db(0x19); db(0x14);
  db(0x4e); db(0xae); db(0xff); db(0xa0); db(0x20); db(0x40); db(0x20); db(0x28);
  db(0x00); db(0x16); db(0x20); db(0x40); db(0x4e); db(0x90); db(0x4e); db(0x75);
  db(0x48); db(0xe7); db(0xe0); db(0xe2); db(0x30); db(0x3c); db(0xff); db(0x38);
- db(0x72); db(0x11); db(0x61); db(0x00); db(0x0d); db(0x98); db(0x4e); db(0x90);
+ db(0x72); db(0x11); db(0x61); db(0x00); db(0x0d); db(0xbe); db(0x4e); db(0x90);
  db(0x4a); db(0x80); db(0x67); db(0x4c); db(0x2c); db(0x78); db(0x00); db(0x04);
  db(0x0c); db(0x6e); db(0x00); db(0x25); db(0x00); db(0x14); db(0x65); db(0x40);
  db(0x70); db(0x14); db(0x24); db(0x00); db(0x72); db(0x01); db(0x4e); db(0xae);
  db(0x20); db(0x68); db(0x00); db(0x02); db(0x2f); db(0x08); db(0x4e); db(0x90);
  db(0x20); db(0x5f); db(0x58); db(0x8f); db(0x48); db(0xe7); db(0xff); db(0x7e);
  db(0x22); db(0x4e); db(0x20); db(0x08); db(0x30); db(0x7c); db(0xff); db(0xb8);
- db(0x4e); db(0xae); db(0xfe); db(0x5c); db(0x61); db(0x00); db(0x13); db(0x42);
- db(0x61); db(0x00); db(0x17); db(0x08); db(0x4c); db(0xdf); db(0x7e); db(0xff);
+ db(0x4e); db(0xae); db(0xfe); db(0x5c); db(0x61); db(0x00); db(0x13); db(0x68);
+ db(0x61); db(0x00); db(0x17); db(0x30); db(0x4c); db(0xdf); db(0x7e); db(0xff);
  db(0x4e); db(0x75); db(0x00); db(0x00); db(0x08); db(0x00); db(0x00); db(0x02);
  db(0x67); db(0x06); db(0x4e); db(0xb9); db(0x00); db(0xf0); db(0x00); db(0x00);
  db(0x4e); db(0xf9); db(0x00); db(0xf0); db(0x00); db(0x00); db(0x00); db(0x00);
  db(0x48); db(0xe7); db(0xff); db(0xfe); db(0x2c); db(0x78); db(0x00); db(0x04);
- db(0x30); db(0x3c); db(0xff); db(0xfc); db(0x61); db(0x00); db(0x0c); db(0xee);
- db(0x2a); db(0x50); db(0x43); db(0xfa); db(0x18); db(0x4d); db(0x70); db(0x24);
+ db(0x30); db(0x3c); db(0xff); db(0xfc); db(0x61); db(0x00); db(0x0d); db(0x14);
+ db(0x2a); db(0x50); db(0x43); db(0xfa); db(0x18); db(0x75); db(0x70); db(0x24);
  db(0x7a); db(0x01); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80);
- db(0x66); db(0x0c); db(0x43); db(0xfa); db(0x18); db(0x3d); db(0x70); db(0x00);
+ db(0x66); db(0x0c); db(0x43); db(0xfa); db(0x18); db(0x65); db(0x70); db(0x00);
  db(0x7a); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x28); db(0x40);
  db(0x4a); db(0xad); db(0x01); db(0x0c); db(0x67); db(0x00); db(0x00); db(0x84);
  db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x2c); db(0x22); db(0x3c);
  db(0x00); db(0x24); db(0x00); db(0x14); db(0x65); db(0x04); db(0x00); db(0x44);
  db(0x01); db(0x00); db(0x43); db(0xf9); db(0x00); db(0x21); db(0x00); db(0x00);
  db(0x4e); db(0xae); db(0xfd); db(0xea); db(0x4a); db(0x80); db(0x66); db(0x20);
- db(0x30); db(0x3c); db(0xff); db(0x80); db(0x61); db(0x00); db(0x0c); db(0x16);
+ db(0x30); db(0x3c); db(0xff); db(0x80); db(0x61); db(0x00); db(0x0c); db(0x3c);
  db(0x4e); db(0x90); db(0x22); db(0x04); db(0x74); db(0xf6); db(0x20); db(0x7c);
  db(0x00); db(0x20); db(0x00); db(0x00); db(0x90); db(0x88); db(0x65); db(0x08);
  db(0x67); db(0x06); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfd); db(0x96);
- db(0x30); db(0x3c); db(0xff); db(0x80); db(0x61); db(0x00); db(0x0b); db(0xf6);
+ db(0x30); db(0x3c); db(0xff); db(0x80); db(0x61); db(0x00); db(0x0c); db(0x1c);
  db(0x4e); db(0x90); db(0x20); db(0x49); db(0x20); db(0x01); db(0x67); db(0x0c);
- db(0x22); db(0x04); db(0x74); db(0xfb); db(0x43); db(0xfa); db(0x17); db(0x71);
- db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x41); db(0xfa); db(0x16); db(0xe8);
+ db(0x22); db(0x04); db(0x74); db(0xfb); db(0x43); db(0xfa); db(0x17); db(0x99);
+ db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x41); db(0xfa); db(0x17); db(0x10);
  db(0x43); db(0xfa); db(0x00); db(0x54); db(0x70); db(0x0a); db(0x61); db(0x00);
- db(0x0c); db(0xb0); db(0x22); db(0x40); db(0x72); db(0x01); db(0x30); db(0x3c);
- db(0xff); db(0x48); db(0x61); db(0x00); db(0x0b); db(0xc8); db(0x4e); db(0x90);
+ db(0x0c); db(0xd6); db(0x22); db(0x40); db(0x72); db(0x01); db(0x30); db(0x3c);
+ db(0xff); db(0x48); db(0x61); db(0x00); db(0x0b); db(0xee); db(0x4e); db(0x90);
  db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x48); db(0xe7);
  db(0x38); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x24); db(0x00);
  db(0x28); db(0x01); db(0x26); db(0x09); db(0x24); db(0x48); db(0x43); db(0xfa);
- db(0x16); db(0xe2); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
+ db(0x17); db(0x0a); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
  db(0x4a); db(0x80); db(0x67); db(0x14); db(0x2c); db(0x40); db(0x22); db(0x0a);
  db(0xe4); db(0x8b); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x22); db(0x4e);
  db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xfe); db(0x62);
  db(0x4c); db(0xdf); db(0x44); db(0x1c); db(0x4e); db(0x75); db(0x2c); db(0x78);
  db(0x00); db(0x04); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d);
- db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x41); db(0xfa); db(0x16); db(0x93);
+ db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x41); db(0xfa); db(0x16); db(0xbb);
  db(0x43); db(0xfa); db(0x00); db(0x16); db(0x70); db(0x0f); db(0x22); db(0x3c);
  db(0x00); db(0x00); db(0x1f); db(0x40); db(0x61); db(0x00); db(0xff); db(0xa8);
  db(0x60); db(0xdc); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x10);
  db(0x00); db(0x00); db(0x00); db(0x00); db(0x72); db(0x02); db(0x30); db(0x3c);
- db(0xff); db(0x48); db(0x61); db(0x00); db(0x0b); db(0x50); db(0x4e); db(0x90);
+ db(0xff); db(0x48); db(0x61); db(0x00); db(0x0b); db(0x76); db(0x4e); db(0x90);
  db(0x22); db(0x00); db(0x6b); db(0x04); db(0x61); db(0x00); db(0x08); db(0x8c);
  db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x00); db(0x20);
- db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); db(0x0b); db(0x36);
+ db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); db(0x0b); db(0x5c);
  db(0x70); db(0x00); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x00);
  db(0x00); db(0xa2); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x30); db(0x3c);
- db(0xff); db(0x50); db(0x61); db(0x00); db(0x0b); db(0x20); db(0x70); db(0x02);
+ db(0xff); db(0x50); db(0x61); db(0x00); db(0x0b); db(0x46); db(0x70); db(0x02);
  db(0x4e); db(0x90); db(0x0c); db(0x40); db(0x00); db(0x01); db(0x6d); db(0x00);
  db(0x00); db(0x7c); db(0x6e); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0x92);
  db(0x60); db(0xe4); db(0x0c); db(0x40); db(0x00); db(0x02); db(0x6e); db(0x08);
  db(0x00); db(0x18); db(0x25); db(0x49); db(0x00); db(0x1a); db(0x20); db(0x69);
  db(0x00); db(0x10); db(0x22); db(0x4a); db(0x4e); db(0xae); db(0xfe); db(0x92);
  db(0x60); db(0x00); db(0xff); db(0x74); db(0x30); db(0x3c); db(0xff); db(0x50);
- db(0x61); db(0x00); db(0x0a); db(0x92); db(0x70); db(0x04); db(0x4e); db(0x90);
+ db(0x61); db(0x00); db(0x0a); db(0xb8); db(0x70); db(0x04); db(0x4e); db(0x90);
  db(0x70); db(0x01); db(0x4c); db(0xdf); db(0x04); db(0x00); db(0x4e); db(0x75);
  db(0x48); db(0xe7); db(0xc0); db(0xc0); db(0x61); db(0x00); db(0xfc); db(0xda);
  db(0x70); db(0x1a); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01);
  db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x22); db(0x40); db(0x41); db(0xfa);
- db(0x15); db(0x67); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa);
+ db(0x15); db(0x8f); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa);
  db(0xff); db(0x24); db(0x23); db(0x48); db(0x00); db(0x0e); db(0x41); db(0xfa);
  db(0xff); db(0x1c); db(0x23); db(0x48); db(0x00); db(0x12); db(0x33); db(0x7c);
  db(0x02); db(0x14); db(0x00); db(0x08); db(0x70); db(0x03); db(0x4e); db(0xae);
- db(0xff); db(0x58); db(0x30); db(0x3a); db(0x0b); db(0xdc); db(0x67); db(0x04);
- db(0x61); db(0x00); db(0x0b); db(0x7a); db(0x4c); db(0xdf); db(0x03); db(0x03);
+ db(0xff); db(0x58); db(0x30); db(0x3a); db(0x0c); db(0x02); db(0x67); db(0x04);
+ db(0x61); db(0x00); db(0x0b); db(0xa0); db(0x4c); db(0xdf); db(0x03); db(0x03);
  db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xc0); db(0xf2); db(0x2c); db(0x78);
  db(0x00); db(0x04); db(0x24); db(0x48); db(0x26); db(0x49); db(0x20); db(0x3c);
  db(0x00); db(0x00); db(0x00); db(0xbe); db(0x22); db(0x3c); db(0x00); db(0x01);
  db(0x00); db(0x00); db(0x00); db(0x0e); db(0x52); db(0x40); db(0x0c); db(0x40);
  db(0x00); db(0x8c); db(0x66); db(0xf2); db(0x20); db(0x0a); db(0xe4); db(0x88);
  db(0x21); db(0x40); db(0x00); db(0x36); db(0x22); db(0x48); db(0x41); db(0xfa);
- db(0x14); db(0xf7); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x20); db(0x6b);
+ db(0x15); db(0x1f); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x20); db(0x6b);
  db(0x01); db(0x98); db(0x41); db(0xe8); db(0x00); db(0x12); db(0x4e); db(0xae);
  db(0xff); db(0x10); db(0x4c); db(0xdf); db(0x4f); db(0x03); db(0x4e); db(0x75);
  db(0x48); db(0xe7); db(0x7f); db(0x7e); db(0x2c); db(0x78); db(0x00); db(0x04);
  db(0x60); db(0xf4); db(0x48); db(0xe7); db(0x40); db(0xe2); db(0x2c); db(0x78);
  db(0x00); db(0x04); db(0x41); db(0xee); db(0x01); db(0x50); db(0x20); db(0x50);
  db(0x4a); db(0x90); db(0x67); db(0x1a); db(0x22); db(0x68); db(0x00); db(0x0a);
- db(0x45); db(0xfa); db(0x14); db(0x49); db(0x10); db(0x19); db(0x12); db(0x1a);
+ db(0x45); db(0xfa); db(0x14); db(0x71); db(0x10); db(0x19); db(0x12); db(0x1a);
  db(0xb0); db(0x01); db(0x66); db(0x06); db(0x4a); db(0x00); db(0x67); db(0x42);
  db(0x60); db(0xf2); db(0x20); db(0x50); db(0x60); db(0xe2); db(0x70); db(0x20);
  db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae);
  db(0xff); db(0x3a); db(0x24); db(0x40); db(0x15); db(0x7c); db(0x00); db(0x08);
- db(0x00); db(0x08); db(0x41); db(0xfa); db(0x14); db(0x1f); db(0x25); db(0x48);
- db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x13); db(0x9b); db(0x25); db(0x48);
+ db(0x00); db(0x08); db(0x41); db(0xfa); db(0x14); db(0x47); db(0x25); db(0x48);
+ db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x13); db(0xc3); db(0x25); db(0x48);
  db(0x00); db(0x0e); db(0x41); db(0xea); db(0x00); db(0x12); db(0x20); db(0x88);
  db(0x58); db(0x90); db(0x21); db(0x48); db(0x00); db(0x08); db(0x41); db(0xee);
  db(0x01); db(0x50); db(0x22); db(0x4a); db(0x4e); db(0xae); db(0xff); db(0x0a);
  db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x20); db(0x6c); db(0x00); db(0x24);
  db(0x4a); db(0x90); db(0x4e); db(0x75); db(0x61); db(0x00); db(0xfc); db(0x7c);
  db(0x21); db(0x40); db(0x01); db(0x98); db(0x2f); db(0x08); db(0x30); db(0x3c);
- db(0xff); db(0xfc); db(0x61); db(0x00); db(0x05); db(0x58); db(0x2a); db(0x50);
- db(0x30); db(0x3c); db(0xff); db(0x28); db(0x61); db(0x00); db(0x05); db(0x4e);
+ db(0xff); db(0xfc); db(0x61); db(0x00); db(0x05); db(0x7e); db(0x2a); db(0x50);
+ db(0x30); db(0x3c); db(0xff); db(0x28); db(0x61); db(0x00); db(0x05); db(0x74);
  db(0x22); db(0x48); db(0x20); db(0x5f); db(0x42); db(0xa8); db(0x01); db(0x90);
  db(0x42); db(0xa8); db(0x01); db(0x94); db(0x4e); db(0x91); db(0x4a); db(0x80);
  db(0x67); db(0x00); db(0x00); db(0xcc); db(0x20); db(0x28); db(0x01); db(0x90);
  db(0x20); db(0x5f); db(0x21); db(0x40); db(0x01); db(0x94); db(0x67); db(0x00);
  db(0x00); db(0xae); db(0x2c); db(0x4c); db(0x2f); db(0x08); db(0x4e); db(0xae);
  db(0xff); db(0x70); db(0x20); db(0x5f); db(0x22); db(0x48); db(0x26); db(0x40);
- db(0x30); db(0x3c); db(0xff); db(0x20); db(0x61); db(0x00); db(0x05); db(0x06);
+ db(0x30); db(0x3c); db(0xff); db(0x20); db(0x61); db(0x00); db(0x05); db(0x2c);
  db(0x4e); db(0x90); db(0x70); db(0x00); db(0x27); db(0x40); db(0x00); db(0x08);
  db(0x27); db(0x40); db(0x00); db(0x10); db(0x27); db(0x40); db(0x00); db(0x20);
  db(0x20); db(0x29); db(0x01); db(0x94); db(0x67); db(0x22); db(0x20); db(0x40);
  db(0x20); db(0x29); db(0x01); db(0x90); db(0x22); db(0x69); db(0x01); db(0x94);
  db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x2e);
  db(0x4c); db(0xdf); db(0x03); db(0x01); db(0x61); db(0x00); db(0xfa); db(0x94);
- db(0x30); db(0x3c); db(0xff); db(0x18); db(0x61); db(0x00); db(0x04); db(0xc6);
+ db(0x30); db(0x3c); db(0xff); db(0x18); db(0x61); db(0x00); db(0x04); db(0xec);
  db(0x4e); db(0x90); db(0x16); db(0x29); db(0x00); db(0x4f); db(0x0c); db(0x03);
  db(0x00); db(0x80); db(0x67); db(0x38); db(0x2c); db(0x78); db(0x00); db(0x04);
  db(0x70); db(0x14); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01);
  db(0x2c); db(0x4c); db(0x4e); db(0xae); db(0xff); db(0x6a); db(0x4e); db(0x75);
  db(0x61); db(0x00); db(0xfb); db(0x80); db(0x21); db(0x40); db(0x01); db(0x98);
  db(0x2f); db(0x08); db(0x30); db(0x3c); db(0xff); db(0xfc); db(0x61); db(0x00);
- db(0x04); db(0x5c); db(0x2a); db(0x50); db(0x30); db(0x3c); db(0xff); db(0x28);
- db(0x61); db(0x00); db(0x04); db(0x52); db(0x22); db(0x48); db(0x20); db(0x5f);
+ db(0x04); db(0x82); db(0x2a); db(0x50); db(0x30); db(0x3c); db(0xff); db(0x28);
+ db(0x61); db(0x00); db(0x04); db(0x78); db(0x22); db(0x48); db(0x20); db(0x5f);
  db(0x42); db(0xa8); db(0x01); db(0x90); db(0x42); db(0xa8); db(0x01); db(0x94);
  db(0x4e); db(0x91); db(0x26); db(0x00); db(0x0c); db(0x43); db(0xff); db(0xfe);
  db(0x67); db(0x00); db(0xf8); db(0x7a); db(0x20); db(0x28); db(0x01); db(0x90);
  db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x3a);
  db(0x20); db(0x5f); db(0x21); db(0x40); db(0x01); db(0x94); db(0x4a); db(0x83);
  db(0x6a); db(0x0e); db(0x22); db(0x48); db(0x30); db(0x3c); db(0xff); db(0x20);
- db(0x61); db(0x00); db(0x04); db(0x12); db(0x4e); db(0x90); db(0x60); db(0x26);
+ db(0x61); db(0x00); db(0x04); db(0x38); db(0x4e); db(0x90); db(0x60); db(0x26);
  db(0x2c); db(0x4c); db(0x2f); db(0x08); db(0x4e); db(0xae); db(0xff); db(0x70);
  db(0x20); db(0x5f); db(0x22); db(0x48); db(0x26); db(0x40); db(0x30); db(0x3c);
- db(0xff); db(0x20); db(0x61); db(0x00); db(0x03); db(0xf8); db(0x4e); db(0x90);
+ db(0xff); db(0x20); db(0x61); db(0x00); db(0x04); db(0x1e); db(0x4e); db(0x90);
  db(0x70); db(0x00); db(0x27); db(0x40); db(0x00); db(0x08); db(0x27); db(0x40);
  db(0x00); db(0x10); db(0x27); db(0x40); db(0x00); db(0x20); db(0x4a); db(0xa9);
  db(0x01); db(0x94); db(0x67); db(0x28); db(0x20); db(0x69); db(0x01); db(0x94);
  db(0x4c); db(0xdf); db(0x03); db(0x01); db(0x4a); db(0x80); db(0x67); db(0x04);
  db(0x61); db(0x00); db(0xf9); db(0x80); db(0x4a); db(0x83); db(0x6b); db(0x00);
  db(0xf7); db(0xf4); db(0x30); db(0x3c); db(0xff); db(0x18); db(0x61); db(0x00);
- db(0x03); db(0xac); db(0x4e); db(0x90); db(0x20); db(0x03); db(0x16); db(0x29);
+ db(0x03); db(0xd2); db(0x4e); db(0x90); db(0x20); db(0x03); db(0x16); db(0x29);
  db(0x00); db(0x4f); db(0x4a); db(0x80); db(0x66); db(0x1a); db(0x27); db(0x7c);
  db(0x00); db(0x00); db(0x17); db(0x70); db(0x00); db(0x14); db(0x41); db(0xfa);
  db(0xf5); db(0xb4); db(0x20); db(0x08); db(0xe4); db(0x88); db(0x27); db(0x40);
  db(0x4a); db(0x80); db(0x67); db(0x3a); db(0x20); db(0x52); db(0x24); db(0x40);
  db(0x22); db(0x4a); db(0x12); db(0xd8); db(0x66); db(0xfc); db(0x13); db(0x7c);
  db(0x00); db(0x3a); db(0xff); db(0xff); db(0x42); db(0x11); db(0x2c); db(0x78);
- db(0x00); db(0x04); db(0x43); db(0xfa); db(0x0e); db(0x16); db(0x70); db(0x00);
+ db(0x00); db(0x04); db(0x43); db(0xfa); db(0x0e); db(0x3e); db(0x70); db(0x00);
  db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x2c); db(0x40); db(0x22); db(0x0a);
  db(0x4e); db(0xae); db(0xff); db(0x52); db(0x22); db(0x4e); db(0x2c); db(0x78);
  db(0x00); db(0x04); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x22); db(0x4a);
  db(0x20); db(0x02); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x70); db(0x00);
  db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x2c); db(0x01);
  db(0x7e); db(0x06); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa);
- db(0x0e); db(0x11); db(0x70); db(0x24); db(0x4e); db(0xae); db(0xfd); db(0xd8);
+ db(0x0e); db(0x39); db(0x70); db(0x24); db(0x4e); db(0xae); db(0xfd); db(0xd8);
  db(0x4a); db(0x80); db(0x66); db(0x0e); db(0x08); db(0x87); db(0x00); db(0x02);
- db(0x43); db(0xfa); db(0x0d); db(0xff); db(0x70); db(0x00); db(0x4e); db(0xae);
+ db(0x43); db(0xfa); db(0x0e); db(0x27); db(0x70); db(0x00); db(0x4e); db(0xae);
  db(0xfd); db(0xd8); db(0x28); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00);
  db(0x02); db(0x2c); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01);
  db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x40); db(0x4a); db(0x80);
  db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x4c); db(0xdf); db(0x7c); db(0xfc);
  db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x93); db(0xc9);
  db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x20); db(0x40); db(0x4b); db(0xe8);
- db(0x00); db(0x5c); db(0x43); db(0xfa); db(0x0d); db(0x66); db(0x70); db(0x00);
+ db(0x00); db(0x5c); db(0x43); db(0xfa); db(0x0d); db(0x8e); db(0x70); db(0x00);
  db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x24); db(0x40); db(0x20); db(0x3c);
  db(0x00); db(0x00); db(0x00); db(0xb9); db(0x22); db(0x3c); db(0x00); db(0x01);
  db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40);
  db(0x27); db(0x46); db(0x00); db(0x08); db(0x27); db(0x4a); db(0x00); db(0xa0);
  db(0x50); db(0xeb); db(0x00); db(0x9e); db(0x93); db(0xc9); db(0x4e); db(0xae);
  db(0xfe); db(0xda); db(0x27); db(0x40); db(0x00); db(0xb0); db(0x41); db(0xfa);
- db(0x0c); db(0x4e); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00);
- db(0x02); db(0x8e); db(0x27); db(0x40); db(0x00); db(0xa4); db(0x41); db(0xfa);
- db(0x0c); db(0x4b); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00);
- db(0x02); db(0x7e); db(0x27); db(0x40); db(0x00); db(0xa8); db(0x7a); db(0x00);
+ db(0x0c); db(0x76); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00);
+ db(0x02); db(0xb4); db(0x27); db(0x40); db(0x00); db(0xa4); db(0x41); db(0xfa);
+ db(0x0c); db(0x73); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00);
+ db(0x02); db(0xa4); db(0x27); db(0x40); db(0x00); db(0xa8); db(0x7a); db(0x00);
  db(0x20); db(0x4d); db(0x4e); db(0xae); db(0xfe); db(0x80); db(0x20); db(0x4d);
  db(0x4e); db(0xae); db(0xfe); db(0x8c); db(0x28); db(0x40); db(0x26); db(0x2c);
  db(0x00); db(0x0a); db(0x30); db(0x3c); db(0xff); db(0x40); db(0x61); db(0x00);
- db(0x01); db(0xbc); db(0x70); db(0x00); db(0x4e); db(0x90); db(0x24); db(0x00);
+ db(0x01); db(0xe2); db(0x70); db(0x00); db(0x4e); db(0x90); db(0x24); db(0x00);
  db(0x70); db(0x01); db(0x61); db(0x00); db(0xf9); db(0x36); db(0x08); db(0x02);
  db(0x00); db(0x01); db(0x67); db(0x06); db(0x70); db(0x01); db(0x61); db(0x00);
- db(0xfa); db(0x9e); db(0x60); db(0x00); db(0x01); db(0x02); db(0x20); db(0x4d);
+ db(0xfa); db(0x9e); db(0x60); db(0x00); db(0x01); db(0x26); db(0x20); db(0x4d);
  db(0x4e); db(0xae); db(0xfe); db(0x8c); db(0x28); db(0x40); db(0x4a); db(0x80);
  db(0x66); db(0x10); db(0x70); db(0x00); db(0x12); db(0x2d); db(0x00); db(0x0f);
  db(0x03); db(0xc0); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae);
- db(0xfe); db(0xc2); db(0x4a); db(0x2b); db(0x00); db(0xac); db(0x67); db(0x08);
- db(0x61); db(0x00); db(0xfb); db(0x4a); db(0x42); db(0x2b); db(0x00); db(0xac);
- db(0x20); db(0x0c); db(0x67); db(0x54); db(0x0c); db(0x6c); db(0x00); db(0x26);
- db(0x00); db(0x12); db(0x66); db(0x4c); db(0x0c); db(0xac); db(0x40); db(0x00);
- db(0x00); db(0x00); db(0x00); db(0x14); db(0x66); db(0x42); db(0x0c); db(0x6c);
- db(0x12); db(0x34); db(0x00); db(0x18); db(0x66); db(0x3a); db(0x20); db(0x6c);
- db(0x00); db(0x1a); db(0x20); db(0x28); db(0x00); db(0x0c); db(0x02); db(0x80);
- db(0x80); db(0x00); db(0x00); db(0x08); db(0x0c); db(0x80); db(0x80); db(0x00);
- db(0x00); db(0x08); db(0x66); db(0x18); db(0x02); db(0xa8); db(0x7f); db(0xff);
- db(0xff); db(0xff); db(0x00); db(0x0c); db(0x20); db(0x68); db(0x00); db(0x10);
- db(0x22); db(0x4c); db(0x12); db(0xbc); db(0x00); db(0x08); db(0x4e); db(0xae);
- db(0xfe); db(0x92); db(0x60); db(0x8a); db(0x22); db(0x4c); db(0x70); db(0x26);
- db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x60); db(0x00); db(0xff); db(0x80);
- db(0x74); db(0xfe); db(0x20); db(0x0c); db(0x67); db(0x14); db(0x26); db(0x2c);
- db(0x00); db(0x0a); db(0x66); db(0x42); db(0x74); db(0xff); db(0x30); db(0x3c);
- db(0xff); db(0x50); db(0x61); db(0x00); db(0x01); db(0x08); db(0x70); db(0x01);
- db(0x4e); db(0x90); db(0x45); db(0xeb); db(0x00); db(0x04); db(0x20); db(0x52);
- db(0x20); db(0x08); db(0x67); db(0x00); db(0xff); db(0x5a); db(0x22); db(0x50);
- db(0x20); db(0x40); db(0x20); db(0x28); db(0x00); db(0x04); db(0xb4); db(0x80);
- db(0x66); db(0x16); db(0x48); db(0xe7); db(0x00); db(0xc0); db(0x28); db(0x68);
- db(0x00); db(0x0a); db(0x61); db(0x4a); db(0x53); db(0x85); db(0x4c); db(0xdf);
- db(0x03); db(0x00); db(0x24); db(0x89); db(0x20); db(0x49); db(0x60); db(0xd8);
- db(0x24); db(0x48); db(0x20); db(0x49); db(0x60); db(0xd2); db(0x0c); db(0x85);
- db(0x00); db(0x00); db(0x00); db(0x14); db(0x65); db(0x00); db(0x00); db(0x0a);
- db(0x70); db(0x01); db(0x29); db(0x40); db(0x00); db(0x04); db(0x60); db(0x12);
- db(0x61); db(0x5c); db(0x30); db(0x3c); db(0xff); db(0x30); db(0x61); db(0x00);
- db(0x00); db(0xb4); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x0e);
- db(0x52); db(0x85); db(0x28); db(0xab); db(0x00); db(0x04); db(0x27); db(0x4c);
- db(0x00); db(0x04); db(0x60); db(0x00); db(0xff); db(0x02); db(0x28); db(0x43);
- db(0x61); db(0x04); db(0x60); db(0x00); db(0xfe); db(0xfa); db(0x0c); db(0xac);
- db(0x00); db(0x00); db(0x00); db(0x1f); db(0x00); db(0x08); db(0x66); db(0x04);
- db(0x61); db(0x00); db(0xfa); db(0x40); db(0x0c); db(0xac); db(0x00); db(0x00);
- db(0x04); db(0x09); db(0x00); db(0x08); db(0x66); db(0x12); db(0x61); db(0x00);
- db(0xfa); db(0x6e); db(0x66); db(0x0c); db(0x30); db(0x3c); db(0xff); db(0x58);
- db(0x61); db(0x00); db(0x00); db(0x72); db(0x4e); db(0x90); db(0x60); db(0xee);
- db(0x22); db(0x54); db(0x20); db(0x6c); db(0x00); db(0x04); db(0x29); db(0x4d);
- db(0x00); db(0x04); db(0x4e); db(0xee); db(0xfe); db(0x92); db(0x2f); db(0x05);
- db(0x7a); db(0xfc); db(0x24); db(0x53); db(0x2e); db(0x0a); db(0x22); db(0x0a);
- db(0x67); db(0x00); db(0x00); db(0x0c); db(0x52); db(0x85); db(0x67); db(0x1e);
- db(0x22); db(0x4a); db(0x24); db(0x52); db(0x60); db(0xf0); db(0x52); db(0x85);
- db(0x67); db(0x3c); db(0x24); db(0x47); db(0x70); db(0x18); db(0x72); db(0x01);
- db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x52); db(0x46); db(0x24); db(0x40);
- db(0x24); db(0x87); db(0x2e); db(0x0a); db(0x60); db(0xe8); db(0x20); db(0x12);
- db(0x67); db(0x24); db(0x20); db(0x40); db(0x20); db(0x10); db(0x67); db(0x1e);
- db(0x20); db(0x40); db(0x20); db(0x10); db(0x67); db(0x18); db(0x70); db(0x00);
- db(0x22); db(0x80); db(0x22); db(0x4a); db(0x24); db(0x51); db(0x70); db(0x18);
- db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x06); db(0x86); db(0x00); db(0x01);
- db(0x00); db(0x00); db(0x20); db(0x0a); db(0x66); db(0xec); db(0x26); db(0x87);
- db(0x2a); db(0x1f); db(0x4e); db(0x75); db(0x41); db(0xfa); db(0xf2); db(0x16);
- db(0x02); db(0x80); db(0x00); db(0x00); db(0xff); db(0xff); db(0xd1); db(0xc0);
- db(0x4e); db(0x75); db(0x20); db(0x88); db(0x58); db(0x90); db(0x42); db(0xa8);
- db(0x00); db(0x04); db(0x21); db(0x48); db(0x00); db(0x08); db(0x4e); db(0x75);
- db(0x48); db(0xe7); db(0x20); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04);
- db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x91); db(0xc8);
- db(0x24); db(0x00); db(0x6b); db(0x32); db(0x70); db(0x22); db(0x22); db(0x3c);
- db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a);
- db(0x91); db(0xc8); db(0x24); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x1e);
- db(0x15); db(0x7c); db(0x00); db(0x04); db(0x00); db(0x08); db(0x15); db(0x42);
- db(0x00); db(0x0f); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda);
- db(0x25); db(0x40); db(0x00); db(0x10); db(0x41); db(0xea); db(0x00); db(0x14);
- db(0x61); db(0x00); db(0xff); db(0xb0); db(0x20); db(0x4a); db(0x20); db(0x08);
- db(0x4c); db(0xdf); db(0x44); db(0x04); db(0x4e); db(0x75); db(0x48); db(0xe7);
- db(0x20); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4a); db(0x80);
- db(0x67); db(0x24); db(0x24); db(0x40); db(0x24); db(0x01); db(0x66); db(0x02);
- db(0x74); db(0x30); db(0x20); db(0x02); db(0x22); db(0x3c); db(0x00); db(0x01);
- db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x40);
- db(0x11); db(0x7c); db(0x00); db(0x0a); db(0x00); db(0x08); db(0x31); db(0x42);
- db(0x00); db(0x12); db(0x21); db(0x4a); db(0x00); db(0x0e); db(0x4a); db(0x80);
- db(0x4c); db(0xdf); db(0x44); db(0x04); db(0x4e); db(0x75); db(0x48); db(0xe7);
- db(0x30); db(0x22); db(0x24); db(0x48); db(0x24); db(0x00); db(0x26); db(0x01);
- db(0x2c); db(0x78); db(0x00); db(0x04); db(0x61); db(0x00); db(0xff); db(0x6a);
- db(0x22); db(0x03); db(0x61); db(0x00); db(0xff); db(0xb2); db(0x67); db(0x18);
- db(0x20); db(0x4a); db(0x22); db(0x40); db(0x24); db(0x40); db(0x20); db(0x02);
- db(0x72); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0x44); db(0x22); db(0x00);
- db(0x70); db(0x00); db(0x4a); db(0x81); db(0x66); db(0x02); db(0x20); db(0x0a);
- db(0x4a); db(0x80); db(0x4c); db(0xdf); db(0x44); db(0x0c); db(0x4e); db(0x75);
- db(0x48); db(0xe7); db(0x38); db(0x32); db(0x2c); db(0x78); db(0x00); db(0x04);
- db(0x28); db(0x00); db(0x24); db(0x08); db(0x26); db(0x09); db(0x20); db(0x3c);
- db(0x00); db(0x00); db(0x08); db(0x5c); db(0x22); db(0x3c); db(0x00); db(0x01);
- db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80);
- db(0x67); db(0x00); db(0x00); db(0x34); db(0x24); db(0x40); db(0x15); db(0x7c);
- db(0x00); db(0x01); db(0x00); db(0x08); db(0x15); db(0x44); db(0x00); db(0x09);
- db(0x25); db(0x42); db(0x00); db(0x0a); db(0x47); db(0xea); db(0x00); db(0x5c);
- db(0x25); db(0x4b); db(0x00); db(0x3a); db(0x47); db(0xeb); db(0x08); db(0x00);
- db(0x25); db(0x4b); db(0x00); db(0x3e); db(0x25); db(0x4b); db(0x00); db(0x36);
- db(0x22); db(0x4a); db(0x24); db(0x43); db(0x97); db(0xcb); db(0x24); db(0x09);
- db(0x4e); db(0xae); db(0xfe); db(0xe6); db(0x20); db(0x02); db(0x4c); db(0xdf);
- db(0x4c); db(0x1c); db(0x4e); db(0x75); db(0x41); db(0xfa); db(0x09); db(0xb0);
- db(0x43); db(0xfa); db(0x01); db(0x5c); db(0x70); db(0x13); db(0x61); db(0x00);
- db(0xff); db(0x98); db(0x4e); db(0x75); db(0x22); db(0x6d); db(0x02); db(0x0c);
- db(0x33); db(0x7c); db(0x00); db(0x0a); db(0x00); db(0x1c); db(0x13); db(0x7c);
- db(0x00); db(0x01); db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0x38);
- db(0x22); db(0x6d); db(0x02); db(0x0c); db(0x25); db(0x69); db(0x00); db(0x20);
- db(0x00); db(0x0e); db(0x25); db(0x69); db(0x00); db(0x24); db(0x00); db(0x12);
- db(0x22); db(0x6d); db(0x02); db(0x08); db(0x13); db(0x7c); db(0x00); db(0x01);
- db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x4e); db(0x75);
- db(0x42); db(0xaa); db(0x00); db(0x0e); db(0x42); db(0xaa); db(0x00); db(0x12);
- db(0x22); db(0x6d); db(0x02); db(0x08); db(0x13); db(0x7c); db(0x00); db(0x01);
- db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x4e); db(0x75);
- db(0x00); db(0x00); db(0xff); db(0xff); db(0x00); db(0x00); db(0x00); db(0x00);
+ db(0xfe); db(0xc2); db(0x4a); db(0x2b); db(0x00); db(0xac); db(0x67); db(0x2a);
+ db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); db(0x01); db(0x9c);
+ db(0x70); db(0x01); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x66); db(0x06);
+ db(0x42); db(0x2b); db(0x00); db(0xac); db(0x60); db(0x14); db(0x61); db(0x00);
+ db(0xfb); db(0x34); db(0x42); db(0x2b); db(0x00); db(0xac); db(0x30); db(0x3c);
+ db(0xff); db(0x58); db(0x61); db(0x00); db(0x01); db(0x7e); db(0x70); db(0x02);
+ db(0x4e); db(0x90); db(0x20); db(0x0c); db(0x67); db(0x56); db(0x0c); db(0x6c);
+ db(0x00); db(0x26); db(0x00); db(0x12); db(0x66); db(0x4e); db(0x0c); db(0xac);
+ db(0x40); db(0x00); db(0x00); db(0x00); db(0x00); db(0x14); db(0x66); db(0x44);
+ db(0x0c); db(0x6c); db(0x12); db(0x34); db(0x00); db(0x18); db(0x66); db(0x3c);
+ db(0x20); db(0x6c); db(0x00); db(0x1a); db(0x20); db(0x28); db(0x00); db(0x0c);
+ db(0x02); db(0x80); db(0x80); db(0x00); db(0x00); db(0x08); db(0x0c); db(0x80);
+ db(0x80); db(0x00); db(0x00); db(0x08); db(0x66); db(0x1a); db(0x02); db(0xa8);
+ db(0x7f); db(0xff); db(0xff); db(0xff); db(0x00); db(0x0c); db(0x20); db(0x68);
+ db(0x00); db(0x10); db(0x22); db(0x4c); db(0x12); db(0xbc); db(0x00); db(0x08);
+ db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x60); db(0x00); db(0xff); db(0x68);
+ db(0x22); db(0x4c); db(0x70); db(0x26); db(0x4e); db(0xae); db(0xff); db(0x2e);
+ db(0x60); db(0x00); db(0xff); db(0x5c); db(0x74); db(0xfe); db(0x20); db(0x0c);
+ db(0x67); db(0x14); db(0x26); db(0x2c); db(0x00); db(0x0a); db(0x66); db(0x42);
+ db(0x74); db(0xff); db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00);
+ db(0x01); db(0x0a); db(0x70); db(0x01); db(0x4e); db(0x90); db(0x45); db(0xeb);
+ db(0x00); db(0x04); db(0x20); db(0x52); db(0x20); db(0x08); db(0x67); db(0x00);
+ db(0xff); db(0x36); db(0x22); db(0x50); db(0x20); db(0x40); db(0x20); db(0x28);
+ db(0x00); db(0x04); db(0xb4); db(0x80); db(0x66); db(0x16); db(0x48); db(0xe7);
+ db(0x00); db(0xc0); db(0x28); db(0x68); db(0x00); db(0x0a); db(0x61); db(0x4a);
+ db(0x53); db(0x85); db(0x4c); db(0xdf); db(0x03); db(0x00); db(0x24); db(0x89);
+ db(0x20); db(0x49); db(0x60); db(0xd8); db(0x24); db(0x48); db(0x20); db(0x49);
+ db(0x60); db(0xd2); db(0x0c); db(0x85); db(0x00); db(0x00); db(0x00); db(0x14);
+ db(0x65); db(0x00); db(0x00); db(0x0a); db(0x70); db(0x01); db(0x29); db(0x40);
+ db(0x00); db(0x04); db(0x60); db(0x12); db(0x61); db(0x5e); db(0x30); db(0x3c);
+ db(0xff); db(0x30); db(0x61); db(0x00); db(0x00); db(0xb6); db(0x4e); db(0x90);
+ db(0x4a); db(0x80); db(0x67); db(0x0e); db(0x52); db(0x85); db(0x28); db(0xab);
+ db(0x00); db(0x04); db(0x27); db(0x4c); db(0x00); db(0x04); db(0x60); db(0x00);
+ db(0xfe); db(0xde); db(0x28); db(0x43); db(0x61); db(0x04); db(0x60); db(0x00);
+ db(0xfe); db(0xd6); db(0x0c); db(0xac); db(0x00); db(0x00); db(0x00); db(0x1f);
+ db(0x00); db(0x08); db(0x66); db(0x04); db(0x61); db(0x00); db(0xfa); db(0x1c);
+ db(0x0c); db(0xac); db(0x00); db(0x00); db(0x04); db(0x09); db(0x00); db(0x08);
+ db(0x66); db(0x14); db(0x61); db(0x00); db(0xfa); db(0x4a); db(0x66); db(0x0e);
+ db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); db(0x00); db(0x74);
+ db(0x70); db(0x00); db(0x4e); db(0x90); db(0x60); db(0xec); db(0x22); db(0x54);
+ db(0x20); db(0x6c); db(0x00); db(0x04); db(0x29); db(0x4d); db(0x00); db(0x04);
+ db(0x4e); db(0xee); db(0xfe); db(0x92); db(0x2f); db(0x05); db(0x7a); db(0xfc);
+ db(0x24); db(0x53); db(0x2e); db(0x0a); db(0x22); db(0x0a); db(0x67); db(0x00);
+ db(0x00); db(0x0c); db(0x52); db(0x85); db(0x67); db(0x1e); db(0x22); db(0x4a);
+ db(0x24); db(0x52); db(0x60); db(0xf0); db(0x52); db(0x85); db(0x67); db(0x3c);
+ db(0x24); db(0x47); db(0x70); db(0x18); db(0x72); db(0x01); db(0x4e); db(0xae);
+ db(0xff); db(0x3a); db(0x52); db(0x46); db(0x24); db(0x40); db(0x24); db(0x87);
+ db(0x2e); db(0x0a); db(0x60); db(0xe8); db(0x20); db(0x12); db(0x67); db(0x24);
+ db(0x20); db(0x40); db(0x20); db(0x10); db(0x67); db(0x1e); db(0x20); db(0x40);
+ db(0x20); db(0x10); db(0x67); db(0x18); db(0x70); db(0x00); db(0x22); db(0x80);
+ db(0x22); db(0x4a); db(0x24); db(0x51); db(0x70); db(0x18); db(0x4e); db(0xae);
+ db(0xff); db(0x2e); db(0x06); db(0x86); db(0x00); db(0x01); db(0x00); db(0x00);
+ db(0x20); db(0x0a); db(0x66); db(0xec); db(0x26); db(0x87); db(0x2a); db(0x1f);
+ db(0x4e); db(0x75); db(0x41); db(0xfa); db(0xf1); db(0xf0); db(0x02); db(0x80);
+ db(0x00); db(0x00); db(0xff); db(0xff); db(0xd1); db(0xc0); db(0x4e); db(0x75);
+ db(0x20); db(0x88); db(0x58); db(0x90); db(0x42); db(0xa8); db(0x00); db(0x04);
+ db(0x21); db(0x48); db(0x00); db(0x08); db(0x4e); db(0x75); db(0x48); db(0xe7);
+ db(0x20); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0xff);
+ db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x91); db(0xc8); db(0x24); db(0x00);
+ db(0x6b); db(0x32); db(0x70); db(0x22); db(0x22); db(0x3c); db(0x00); db(0x01);
+ db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x91); db(0xc8);
+ db(0x24); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x1e); db(0x15); db(0x7c);
+ db(0x00); db(0x04); db(0x00); db(0x08); db(0x15); db(0x42); db(0x00); db(0x0f);
+ db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x25); db(0x40);
+ db(0x00); db(0x10); db(0x41); db(0xea); db(0x00); db(0x14); db(0x61); db(0x00);
+ db(0xff); db(0xb0); db(0x20); db(0x4a); db(0x20); db(0x08); db(0x4c); db(0xdf);
+ db(0x44); db(0x04); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x20); db(0x22);
+ db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4a); db(0x80); db(0x67); db(0x24);
+ db(0x24); db(0x40); db(0x24); db(0x01); db(0x66); db(0x02); db(0x74); db(0x30);
+ db(0x20); db(0x02); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01);
+ db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x40); db(0x11); db(0x7c);
+ db(0x00); db(0x0a); db(0x00); db(0x08); db(0x31); db(0x42); db(0x00); db(0x12);
+ db(0x21); db(0x4a); db(0x00); db(0x0e); db(0x4a); db(0x80); db(0x4c); db(0xdf);
+ db(0x44); db(0x04); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x30); db(0x22);
+ db(0x24); db(0x48); db(0x24); db(0x00); db(0x26); db(0x01); db(0x2c); db(0x78);
+ db(0x00); db(0x04); db(0x61); db(0x00); db(0xff); db(0x6a); db(0x22); db(0x03);
+ db(0x61); db(0x00); db(0xff); db(0xb2); db(0x67); db(0x18); db(0x20); db(0x4a);
+ db(0x22); db(0x40); db(0x24); db(0x40); db(0x20); db(0x02); db(0x72); db(0x00);
+ db(0x4e); db(0xae); db(0xfe); db(0x44); db(0x22); db(0x00); db(0x70); db(0x00);
+ db(0x4a); db(0x81); db(0x66); db(0x02); db(0x20); db(0x0a); db(0x4a); db(0x80);
+ db(0x4c); db(0xdf); db(0x44); db(0x0c); db(0x4e); db(0x75); db(0x48); db(0xe7);
+ db(0x38); db(0x32); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x28); db(0x00);
+ db(0x24); db(0x08); db(0x26); db(0x09); db(0x20); db(0x3c); db(0x00); db(0x00);
+ db(0x08); db(0x5c); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01);
+ db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x00);
+ db(0x00); db(0x34); db(0x24); db(0x40); db(0x15); db(0x7c); db(0x00); db(0x01);
+ db(0x00); db(0x08); db(0x15); db(0x44); db(0x00); db(0x09); db(0x25); db(0x42);
+ db(0x00); db(0x0a); db(0x47); db(0xea); db(0x00); db(0x5c); db(0x25); db(0x4b);
+ db(0x00); db(0x3a); db(0x47); db(0xeb); db(0x08); db(0x00); db(0x25); db(0x4b);
+ db(0x00); db(0x3e); db(0x25); db(0x4b); db(0x00); db(0x36); db(0x22); db(0x4a);
+ db(0x24); db(0x43); db(0x97); db(0xcb); db(0x24); db(0x09); db(0x4e); db(0xae);
+ db(0xfe); db(0xe6); db(0x20); db(0x02); db(0x4c); db(0xdf); db(0x4c); db(0x1c);
+ db(0x4e); db(0x75); db(0x41); db(0xfa); db(0x09); db(0xb2); db(0x43); db(0xfa);
+ db(0x01); db(0x5c); db(0x70); db(0x13); db(0x61); db(0x00); db(0xff); db(0x98);
+ db(0x4e); db(0x75); db(0x22); db(0x6d); db(0x02); db(0x0c); db(0x33); db(0x7c);
+ db(0x00); db(0x0a); db(0x00); db(0x1c); db(0x13); db(0x7c); db(0x00); db(0x01);
+ db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x22); db(0x6d);
+ db(0x02); db(0x0c); db(0x25); db(0x69); db(0x00); db(0x20); db(0x00); db(0x0e);
+ db(0x25); db(0x69); db(0x00); db(0x24); db(0x00); db(0x12); db(0x22); db(0x6d);
+ db(0x02); db(0x08); db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x1e);
+ db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x4e); db(0x75); db(0x42); db(0xaa);
+ db(0x00); db(0x0e); db(0x42); db(0xaa); db(0x00); db(0x12); db(0x22); db(0x6d);
+ db(0x02); db(0x08); db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x1e);
+ db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x4e); db(0x75); db(0x00); db(0x00);
+ db(0xff); db(0xff); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00);
  db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00);
  db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00);
  db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00);
  db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00);
- db(0x00); db(0x00); db(0x00); db(0x00); db(0x48); db(0xe7); db(0xf8); db(0xfe);
- db(0x2a); db(0x48); db(0x95); db(0xca); db(0x97); db(0xcb); db(0x99); db(0xcc);
- db(0x78); db(0x00); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x20); db(0x6d);
- db(0x00); db(0x14); db(0x20); db(0x28); db(0x00); db(0x3c); db(0x67); db(0x5c);
- db(0x20); db(0x40); db(0x41); db(0xe8); db(0x00); db(0x2c); db(0x28); db(0x48);
- db(0x4e); db(0xae); db(0xfc); db(0xe8); db(0x72); db(0xff); db(0x74); db(0xff);
- db(0xb2); db(0x80); db(0x67); db(0x48); db(0x26); db(0x00); db(0x2c); db(0x6d);
- db(0x00); db(0x14); db(0x41); db(0xed); db(0x00); db(0xc0); db(0x70); db(0x66);
- db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xed); db(0x00); db(0xc0);
- db(0x38); db(0x28); db(0x00); db(0x64); db(0x2c); db(0x6d); db(0x00); db(0x18);
- db(0x91); db(0xc8); db(0x43); db(0xed); db(0x00); db(0x38); db(0x70); db(0x00);
- db(0x30); db(0x3c); db(0x00); db(0x58); db(0x22); db(0x3c); db(0x80); db(0x00);
- db(0x10); db(0x00); db(0x24); db(0x03); db(0x4e); db(0xae); db(0xfd); db(0x0c);
- db(0x72); db(0xff); db(0x74); db(0xff); db(0x4a); db(0x80); db(0x6b); db(0x0c);
- db(0x45); db(0xed); db(0x00); db(0x38); db(0x22); db(0x2a); db(0x00); db(0x32);
- db(0x24); db(0x2a); db(0x00); db(0x36); db(0x20); db(0x2c); db(0x00); db(0x1c);
- db(0xb8); db(0x6d); db(0x00); db(0x2c); db(0x66); db(0x12); db(0xb0); db(0xad);
- db(0x00); db(0x28); db(0x66); db(0x0c); db(0xb2); db(0xad); db(0x00); db(0x20);
- db(0x66); db(0x06); db(0xb4); db(0xad); db(0x00); db(0x24); db(0x67); db(0x40);
- db(0x2b); db(0x40); db(0x00); db(0x28); db(0x2b); db(0x41); db(0x00); db(0x20);
- db(0x2b); db(0x42); db(0x00); db(0x24); db(0x3b); db(0x44); db(0x00); db(0x2c);
- db(0x91); db(0xc8); db(0x43); db(0xed); db(0x00); db(0x90); db(0x70); db(0x00);
- db(0x30); db(0x3c); db(0x00); db(0x58); db(0x22); db(0x3c); db(0x80); db(0x00);
- db(0x00); db(0x00); db(0x24); db(0x03); db(0x4e); db(0xae); db(0xfd); db(0x0c);
- db(0x4a); db(0x80); db(0x6b); db(0x04); db(0x47); db(0xed); db(0x00); db(0x90);
- db(0x34); db(0x2d); db(0x00); db(0x2c); db(0x30); db(0x3c); db(0xff); db(0x38);
- db(0x72); db(0x01); db(0x61); db(0x00); db(0xfd); db(0x70); db(0x4e); db(0x90);
- db(0x4c); db(0xdf); db(0x7f); db(0x1f); db(0x4e); db(0x75); db(0x2c); db(0x78);
- db(0x00); db(0x04); db(0x3e); db(0x2e); db(0x00); db(0x14); db(0x70); db(0xff);
- db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x7c); db(0x00); db(0x01); db(0xc6);
- db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x28); db(0x40);
- db(0x70); db(0x14); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0xd4);
- db(0x70); db(0x00); db(0x30); db(0x3c); db(0x02); db(0x10); db(0x22); db(0x3c);
- db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a);
- db(0x2a); db(0x40); db(0x47); db(0xed); db(0x00); db(0x16); db(0x27); db(0x4e);
- db(0x00); db(0x10); db(0x27); db(0x4c); db(0x00); db(0x08); db(0x27); db(0x46);
- db(0x00); db(0x0c); db(0x70); db(0xff); db(0x37); db(0x40); db(0x00); db(0x00);
- db(0x43); db(0xed); db(0x00); db(0x00); db(0x13); db(0x7c); db(0x00); db(0x02);
- db(0x00); db(0x08); db(0x13); db(0x7c); db(0x00); db(0x05); db(0x00); db(0x09);
- db(0x41); db(0xfa); db(0x07); db(0xf4); db(0x23); db(0x48); db(0x00); db(0x0a);
- db(0x41); db(0xfa); db(0x02); db(0xda); db(0x23); db(0x48); db(0x00); db(0x12);
- db(0x23); db(0x4d); db(0x00); db(0x0e); db(0x70); db(0x05); db(0x4e); db(0xae);
- db(0xff); db(0x58); db(0x20); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0xc2);
- db(0x70); db(0x00); db(0x53); db(0xab); db(0x00); db(0x1c); db(0x6a); db(0x06);
- db(0x70); db(0x0a); db(0x27); db(0x40); db(0x00); db(0x1c); db(0x4a); db(0xab);
- db(0x00); db(0x14); db(0x66); db(0x16); db(0x4a); db(0xab); db(0x00); db(0x1c);
- db(0x66); db(0xe0); db(0x43); db(0xfa); db(0x08); db(0x12); db(0x70); db(0x00);
- db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x27); db(0x40); db(0x00); db(0x14);
- db(0x67); db(0xd0); db(0x4a); db(0xab); db(0x00); db(0x18); db(0x66); db(0x18);
- db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0xc4); db(0x43); db(0xfa);
- db(0x08); db(0x08); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
- db(0x27); db(0x40); db(0x00); db(0x18); db(0x67); db(0x00); db(0xff); db(0xb4);
- db(0x4a); db(0xad); db(0x02); db(0x08); db(0x66); db(0x38); db(0x4a); db(0xab);
- db(0x00); db(0x1c); db(0x66); db(0xa6); db(0x4e); db(0xae); db(0xff); db(0x7c);
- db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x06); db(0xe8);
- db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae);
- db(0xff); db(0x76); db(0x4a); db(0x82); db(0x67); db(0x8c); db(0x41); db(0xfa);
- db(0x06); db(0xd6); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00);
- db(0xfd); db(0x16); db(0x2b); db(0x40); db(0x02); db(0x08); db(0x67); db(0x00);
- db(0x02); db(0x42); db(0x60); db(0x00); db(0xff); db(0x76); db(0x4a); db(0xad);
- db(0x02); db(0x0c); db(0x66); db(0x48); db(0x4a); db(0xab); db(0x00); db(0x1c);
- db(0x66); db(0x00); db(0xff); db(0x68); db(0x4e); db(0xae); db(0xff); db(0x7c);
- db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x06); db(0xb5);
- db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae);
- db(0xff); db(0x76); db(0x4a); db(0x82); db(0x67); db(0x00); db(0xff); db(0x4c);
- db(0x41); db(0xfa); db(0x06); db(0xa1); db(0x70); db(0x00); db(0x72); db(0x00);
- db(0x61); db(0x00); db(0xfc); db(0xd4); db(0x2b); db(0x40); db(0x02); db(0x0c);
- db(0x67); db(0x00); db(0x02); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x38);
- db(0x72); db(0x00); db(0x61); db(0x00); db(0xfc); db(0x20); db(0x4e); db(0x90);
- db(0x60); db(0x00); db(0xff); db(0x28); db(0x0c); db(0x47); db(0x00); db(0x24);
- db(0x65); db(0x12); db(0x53); db(0xab); db(0x00); db(0x34); db(0x6a); db(0x0c);
- db(0x20); db(0x4b); db(0x61); db(0x00); db(0xfd); db(0xc8); db(0x70); db(0x32);
- db(0x27); db(0x40); db(0x00); db(0x34); db(0x22); db(0x6d); db(0x02); db(0x08);
- db(0x45); db(0xed); db(0x01); db(0x3c); db(0x33); db(0x7c); db(0x00); db(0x0b);
- db(0x00); db(0x1c); db(0x23); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x16);
- db(0x00); db(0x24); db(0x23); db(0x4a); db(0x00); db(0x28); db(0x10); db(0x3a);
- db(0xfd); db(0x78); db(0x0c); db(0x47); db(0x00); db(0x27); db(0x65); db(0x00);
- db(0x01); db(0x62); db(0x08); db(0x00); db(0x00); db(0x01); db(0x67); db(0x00);
- db(0x01); db(0x5a); db(0x41); db(0xed); db(0x01); db(0x68); db(0x25); db(0x48);
- db(0x00); db(0x0a); db(0x15); db(0x7c); db(0x00); db(0x13); db(0x00); db(0x04);
- db(0x15); db(0x7c); db(0x00); db(0x03); db(0x00); db(0x05); db(0x42); db(0x90);
- db(0x42); db(0xa8); db(0x00); db(0x04); db(0x42); db(0x6a); db(0x00); db(0x06);
- db(0x42); db(0xa8); db(0x00); db(0x08); db(0x42); db(0x68); db(0x00); db(0x0c);
- db(0x22); db(0x3a); db(0xfd); db(0x60); db(0x02); db(0x41); db(0x00); db(0x07);
- db(0x70); db(0x07); db(0x90); db(0x41); db(0xe1); db(0x48); db(0xe9); db(0x48);
- db(0x35); db(0x40); db(0x00); db(0x08); db(0x31); db(0x7a); db(0xfd); db(0x34);
- db(0x00); db(0x0e); db(0x42); db(0x68); db(0x00); db(0x10); db(0x31); db(0x7a);
- db(0xfd); db(0x2c); db(0x00); db(0x12); db(0x42); db(0x68); db(0x00); db(0x14);
- db(0x31); db(0x7a); db(0xfd); db(0x1a); db(0x00); db(0x16); db(0x42); db(0x68);
- db(0x00); db(0x18); db(0x31); db(0x7a); db(0xfd); db(0x12); db(0x00); db(0x1a);
- db(0x43); db(0xed); db(0x01); db(0x88); db(0x21); db(0x49); db(0x00); db(0x1c);
- db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x06); db(0x30); db(0x3a);
- db(0xfd); db(0x18); db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0);
- db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x07); db(0x22); db(0xfa);
- db(0xfd); db(0x0a); db(0x70); db(0x00); db(0x30); db(0x3a); db(0xfc); db(0xf2);
- db(0x6b); db(0x08); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x09);
- db(0x22); db(0xc0); db(0x30); db(0x3a); db(0xfc); db(0xe6); db(0x6b); db(0x08);
- db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x0a); db(0x22); db(0xc0);
- db(0x30); db(0x3a); db(0xfc); db(0xce); db(0x6b); db(0x14); db(0x22); db(0xfc);
- db(0x80); db(0x03); db(0xa0); db(0x02); db(0x22); db(0xc0); db(0x30); db(0x3a);
- db(0xfc); db(0xc6); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x01);
- db(0x22); db(0xc0); db(0x30); db(0x3a); db(0xfc); db(0xc0); db(0x6b); db(0x10);
- db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x03); db(0x30); db(0x3a);
- db(0xfc); db(0xba); db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0);
- db(0x30); db(0x3a); db(0xfc); db(0xac); db(0x6b); db(0x10); db(0x22); db(0xfc);
- db(0x80); db(0x03); db(0xa0); db(0x04); db(0x30); db(0x3a); db(0xfc); db(0xa6);
+ db(0x00); db(0x00); db(0x48); db(0xe7); db(0xf8); db(0xfe); db(0x2a); db(0x48);
+ db(0x95); db(0xca); db(0x97); db(0xcb); db(0x99); db(0xcc); db(0x78); db(0x00);
+ db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x20); db(0x6d); db(0x00); db(0x14);
+ db(0x20); db(0x28); db(0x00); db(0x3c); db(0x67); db(0x5c); db(0x20); db(0x40);
+ db(0x41); db(0xe8); db(0x00); db(0x2c); db(0x28); db(0x48); db(0x4e); db(0xae);
+ db(0xfc); db(0xe8); db(0x72); db(0xff); db(0x74); db(0xff); db(0xb2); db(0x80);
+ db(0x67); db(0x48); db(0x26); db(0x00); db(0x2c); db(0x6d); db(0x00); db(0x14);
+ db(0x41); db(0xed); db(0x00); db(0xc0); db(0x70); db(0x66); db(0x4e); db(0xae);
+ db(0xff); db(0x7c); db(0x41); db(0xed); db(0x00); db(0xc0); db(0x38); db(0x28);
+ db(0x00); db(0x64); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x91); db(0xc8);
+ db(0x43); db(0xed); db(0x00); db(0x38); db(0x70); db(0x00); db(0x30); db(0x3c);
+ db(0x00); db(0x58); db(0x22); db(0x3c); db(0x80); db(0x00); db(0x10); db(0x00);
+ db(0x24); db(0x03); db(0x4e); db(0xae); db(0xfd); db(0x0c); db(0x72); db(0xff);
+ db(0x74); db(0xff); db(0x4a); db(0x80); db(0x6b); db(0x0c); db(0x45); db(0xed);
+ db(0x00); db(0x38); db(0x22); db(0x2a); db(0x00); db(0x32); db(0x24); db(0x2a);
+ db(0x00); db(0x36); db(0x20); db(0x2c); db(0x00); db(0x1c); db(0xb8); db(0x6d);
+ db(0x00); db(0x2c); db(0x66); db(0x12); db(0xb0); db(0xad); db(0x00); db(0x28);
+ db(0x66); db(0x0c); db(0xb2); db(0xad); db(0x00); db(0x20); db(0x66); db(0x06);
+ db(0xb4); db(0xad); db(0x00); db(0x24); db(0x67); db(0x40); db(0x2b); db(0x40);
+ db(0x00); db(0x28); db(0x2b); db(0x41); db(0x00); db(0x20); db(0x2b); db(0x42);
+ db(0x00); db(0x24); db(0x3b); db(0x44); db(0x00); db(0x2c); db(0x91); db(0xc8);
+ db(0x43); db(0xed); db(0x00); db(0x90); db(0x70); db(0x00); db(0x30); db(0x3c);
+ db(0x00); db(0x58); db(0x22); db(0x3c); db(0x80); db(0x00); db(0x00); db(0x00);
+ db(0x24); db(0x03); db(0x4e); db(0xae); db(0xfd); db(0x0c); db(0x4a); db(0x80);
+ db(0x6b); db(0x04); db(0x47); db(0xed); db(0x00); db(0x90); db(0x34); db(0x2d);
+ db(0x00); db(0x2c); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x01);
+ db(0x61); db(0x00); db(0xfd); db(0x70); db(0x4e); db(0x90); db(0x4c); db(0xdf);
+ db(0x7f); db(0x1f); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04);
+ db(0x3e); db(0x2e); db(0x00); db(0x14); db(0x70); db(0xff); db(0x4e); db(0xae);
+ db(0xfe); db(0xb6); db(0x7c); db(0x00); db(0x01); db(0xc6); db(0x93); db(0xc9);
+ db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x28); db(0x40); db(0x70); db(0x14);
+ db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0xd4); db(0x70); db(0x00);
+ db(0x30); db(0x3c); db(0x02); db(0x10); db(0x22); db(0x3c); db(0x00); db(0x01);
+ db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x2a); db(0x40);
+ db(0x47); db(0xed); db(0x00); db(0x16); db(0x27); db(0x4e); db(0x00); db(0x10);
+ db(0x27); db(0x4c); db(0x00); db(0x08); db(0x27); db(0x46); db(0x00); db(0x0c);
+ db(0x70); db(0xff); db(0x37); db(0x40); db(0x00); db(0x00); db(0x43); db(0xed);
+ db(0x00); db(0x00); db(0x13); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x08);
+ db(0x13); db(0x7c); db(0x00); db(0x05); db(0x00); db(0x09); db(0x41); db(0xfa);
+ db(0x07); db(0xf6); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa);
+ db(0x02); db(0xda); db(0x23); db(0x48); db(0x00); db(0x12); db(0x23); db(0x4d);
+ db(0x00); db(0x0e); db(0x70); db(0x05); db(0x4e); db(0xae); db(0xff); db(0x58);
+ db(0x20); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x70); db(0x00);
+ db(0x53); db(0xab); db(0x00); db(0x1c); db(0x6a); db(0x06); db(0x70); db(0x0a);
+ db(0x27); db(0x40); db(0x00); db(0x1c); db(0x4a); db(0xab); db(0x00); db(0x14);
+ db(0x66); db(0x16); db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0xe0);
+ db(0x43); db(0xfa); db(0x08); db(0x14); db(0x70); db(0x00); db(0x4e); db(0xae);
+ db(0xfd); db(0xd8); db(0x27); db(0x40); db(0x00); db(0x14); db(0x67); db(0xd0);
+ db(0x4a); db(0xab); db(0x00); db(0x18); db(0x66); db(0x18); db(0x4a); db(0xab);
+ db(0x00); db(0x1c); db(0x66); db(0xc4); db(0x43); db(0xfa); db(0x08); db(0x0a);
+ db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x27); db(0x40);
+ db(0x00); db(0x18); db(0x67); db(0x00); db(0xff); db(0xb4); db(0x4a); db(0xad);
+ db(0x02); db(0x08); db(0x66); db(0x38); db(0x4a); db(0xab); db(0x00); db(0x1c);
+ db(0x66); db(0xa6); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee);
+ db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x06); db(0xea); db(0x4e); db(0xae);
+ db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76);
+ db(0x4a); db(0x82); db(0x67); db(0x8c); db(0x41); db(0xfa); db(0x06); db(0xd8);
+ db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0xfd); db(0x16);
+ db(0x2b); db(0x40); db(0x02); db(0x08); db(0x67); db(0x00); db(0x02); db(0x42);
+ db(0x60); db(0x00); db(0xff); db(0x76); db(0x4a); db(0xad); db(0x02); db(0x0c);
+ db(0x66); db(0x48); db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0x00);
+ db(0xff); db(0x68); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee);
+ db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x06); db(0xb7); db(0x4e); db(0xae);
+ db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76);
+ db(0x4a); db(0x82); db(0x67); db(0x00); db(0xff); db(0x4c); db(0x41); db(0xfa);
+ db(0x06); db(0xa3); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00);
+ db(0xfc); db(0xd4); db(0x2b); db(0x40); db(0x02); db(0x0c); db(0x67); db(0x00);
+ db(0x02); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x00);
+ db(0x61); db(0x00); db(0xfc); db(0x20); db(0x4e); db(0x90); db(0x60); db(0x00);
+ db(0xff); db(0x28); db(0x0c); db(0x47); db(0x00); db(0x24); db(0x65); db(0x12);
+ db(0x53); db(0xab); db(0x00); db(0x34); db(0x6a); db(0x0c); db(0x20); db(0x4b);
+ db(0x61); db(0x00); db(0xfd); db(0xc8); db(0x70); db(0x32); db(0x27); db(0x40);
+ db(0x00); db(0x34); db(0x22); db(0x6d); db(0x02); db(0x08); db(0x45); db(0xed);
+ db(0x01); db(0x3c); db(0x33); db(0x7c); db(0x00); db(0x0b); db(0x00); db(0x1c);
+ db(0x23); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x16); db(0x00); db(0x24);
+ db(0x23); db(0x4a); db(0x00); db(0x28); db(0x10); db(0x3a); db(0xfd); db(0x78);
+ db(0x0c); db(0x47); db(0x00); db(0x27); db(0x65); db(0x00); db(0x01); db(0x62);
+ db(0x08); db(0x00); db(0x00); db(0x01); db(0x67); db(0x00); db(0x01); db(0x5a);
+ db(0x41); db(0xed); db(0x01); db(0x68); db(0x25); db(0x48); db(0x00); db(0x0a);
+ db(0x15); db(0x7c); db(0x00); db(0x13); db(0x00); db(0x04); db(0x15); db(0x7c);
+ db(0x00); db(0x03); db(0x00); db(0x05); db(0x42); db(0x90); db(0x42); db(0xa8);
+ db(0x00); db(0x04); db(0x42); db(0x6a); db(0x00); db(0x06); db(0x42); db(0xa8);
+ db(0x00); db(0x08); db(0x42); db(0x68); db(0x00); db(0x0c); db(0x22); db(0x3a);
+ db(0xfd); db(0x60); db(0x02); db(0x41); db(0x00); db(0x07); db(0x70); db(0x07);
+ db(0x90); db(0x41); db(0xe1); db(0x48); db(0xe9); db(0x48); db(0x35); db(0x40);
+ db(0x00); db(0x08); db(0x31); db(0x7a); db(0xfd); db(0x34); db(0x00); db(0x0e);
+ db(0x42); db(0x68); db(0x00); db(0x10); db(0x31); db(0x7a); db(0xfd); db(0x2c);
+ db(0x00); db(0x12); db(0x42); db(0x68); db(0x00); db(0x14); db(0x31); db(0x7a);
+ db(0xfd); db(0x1a); db(0x00); db(0x16); db(0x42); db(0x68); db(0x00); db(0x18);
+ db(0x31); db(0x7a); db(0xfd); db(0x12); db(0x00); db(0x1a); db(0x43); db(0xed);
+ db(0x01); db(0x88); db(0x21); db(0x49); db(0x00); db(0x1c); db(0x22); db(0xfc);
+ db(0x80); db(0x03); db(0xa0); db(0x06); db(0x30); db(0x3a); db(0xfd); db(0x18);
+ db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x22); db(0xfc);
+ db(0x80); db(0x03); db(0xa0); db(0x07); db(0x22); db(0xfa); db(0xfd); db(0x0a);
+ db(0x70); db(0x00); db(0x30); db(0x3a); db(0xfc); db(0xf2); db(0x6b); db(0x08);
+ db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x09); db(0x22); db(0xc0);
+ db(0x30); db(0x3a); db(0xfc); db(0xe6); db(0x6b); db(0x08); db(0x22); db(0xfc);
+ db(0x80); db(0x03); db(0xa0); db(0x0a); db(0x22); db(0xc0); db(0x30); db(0x3a);
+ db(0xfc); db(0xce); db(0x6b); db(0x14); db(0x22); db(0xfc); db(0x80); db(0x03);
+ db(0xa0); db(0x02); db(0x22); db(0xc0); db(0x30); db(0x3a); db(0xfc); db(0xc6);
+ db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x01); db(0x22); db(0xc0);
+ db(0x30); db(0x3a); db(0xfc); db(0xc0); db(0x6b); db(0x10); db(0x22); db(0xfc);
+ db(0x80); db(0x03); db(0xa0); db(0x03); db(0x30); db(0x3a); db(0xfc); db(0xba);
  db(0x48); db(0xc0); db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x30); db(0x3a);
- db(0xfc); db(0x98); db(0x6b); db(0x10); db(0x22); db(0xfc); db(0x80); db(0x03);
- db(0xa0); db(0x05); db(0x30); db(0x3a); db(0xfc); db(0x92); db(0x48); db(0xc0);
- db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x70); db(0x00); db(0x30); db(0x3a);
- db(0xfc); db(0x8e); db(0x6b); db(0x08); db(0x22); db(0xfc); db(0x80); db(0x03);
- db(0xa0); db(0x08); db(0x22); db(0xc0); db(0x42); db(0x91); db(0x61); db(0x00);
- db(0xfc); db(0x40); db(0x36); db(0x3c); db(0x00); db(0x68); db(0x74); db(0x01);
- db(0x28); db(0x3a); db(0xfc); db(0x70); db(0x20); db(0x04); db(0xc0); db(0x82);
- db(0x22); db(0x2b); db(0x00); db(0x04); db(0xc2); db(0x82); db(0xb2); db(0x80);
- db(0x67); db(0x22); db(0x42); db(0x92); db(0x35); db(0x7c); db(0x02); db(0x00);
- db(0x00); db(0x04); db(0x42); db(0xaa); db(0x00); db(0x0a); db(0x32); db(0x03);
- db(0x4a); db(0x00); db(0x66); db(0x04); db(0x08); db(0xc1); db(0x00); db(0x07);
- db(0x35); db(0x41); db(0x00); db(0x06); db(0x42); db(0x6a); db(0x00); db(0x08);
- db(0x61); db(0x00); db(0xfc); db(0x06); db(0x52); db(0x43); db(0xd4); db(0x42);
- db(0x0c); db(0x42); db(0x00); db(0x08); db(0x66); db(0xc6); db(0x27); db(0x44);
- db(0x00); db(0x04); db(0x10); db(0x3a); db(0xfc); db(0x0c); db(0x08); db(0x00);
- db(0x00); db(0x00); db(0x67); db(0x00); db(0xfd); db(0x7e); db(0x42); db(0x92);
- db(0x35); db(0x7c); db(0x04); db(0x00); db(0x00); db(0x04); db(0x42); db(0x6a);
- db(0x00); db(0x06); db(0x42); db(0x6a); db(0x00); db(0x08); db(0x20); db(0x6b);
- db(0x00); db(0x14); db(0x30); db(0x3a); db(0xfc); db(0x14); db(0x32); db(0x28);
- db(0x00); db(0x30); db(0xd2); db(0x41); db(0x90); db(0x41); db(0x6a); db(0x02);
- db(0x70); db(0x00); db(0x35); db(0x40); db(0x00); db(0x0a); db(0x30); db(0x3a);
- db(0xfc); db(0x02); db(0x32); db(0x28); db(0x00); db(0x2e); db(0xd2); db(0x41);
- db(0x90); db(0x41); db(0x6a); db(0x02); db(0x70); db(0x00); db(0x35); db(0x40);
- db(0x00); db(0x0c); db(0x61); db(0x00); db(0xfb); db(0x78); db(0x60); db(0x00);
- db(0xfd); db(0x3a); db(0x4e); db(0x75); db(0x4a); db(0xa9); db(0x02); db(0x08);
- db(0x67); db(0x14); db(0x4a); db(0xa9); db(0x02); db(0x0c); db(0x67); db(0x0e);
- db(0x30); db(0x3a); db(0xfb); db(0xb0); db(0xb0); db(0x69); db(0x00); db(0x16);
- db(0x67); db(0x14); db(0x33); db(0x40); db(0x00); db(0x16); db(0x2c); db(0x69);
- db(0x00); db(0x26); db(0x20); db(0x29); db(0x00); db(0x22); db(0x22); db(0x69);
- db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x53); db(0x69);
- db(0x00); db(0x46); db(0x6a); db(0x12); db(0x33); db(0x7c); db(0x00); db(0x32);
- db(0x00); db(0x46); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x02);
- db(0x61); db(0x00); db(0xf9); db(0xea); db(0x4e); db(0x90); db(0x41); db(0xf9);
- db(0x00); db(0xdf); db(0xf0); db(0x00); db(0x70); db(0x00); db(0x4e); db(0x75);
- db(0x48); db(0xe7); db(0x00); db(0x06); db(0x30); db(0x3c); db(0xff); db(0x38);
- db(0x72); db(0x11); db(0x61); db(0x00); db(0xf9); db(0xd0); db(0x4e); db(0x90);
- db(0x08); db(0x00); db(0x00); db(0x00); db(0x67); db(0x42); db(0x2c); db(0x78);
- db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x88);
- db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae);
- db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0x40);
- db(0x2a); db(0x40); db(0x2b); db(0x4e); db(0x00); db(0x14); db(0x30); db(0x3c);
- db(0xff); db(0x38); db(0x72); db(0x0e); db(0x61); db(0x00); db(0xf9); db(0x9e);
- db(0x20); db(0x0d); db(0x4e); db(0x90); db(0x41); db(0xfa); db(0x04); db(0x6a);
- db(0x43); db(0xfa); db(0x01); db(0x12); db(0x70); db(0xf6); db(0x22); db(0x3c);
- db(0x00); db(0x00); db(0x27); db(0x10); db(0x61); db(0x00); db(0xed); db(0xc8);
- db(0x70); db(0x00); db(0x4c); db(0xdf); db(0x60); db(0x00); db(0x4e); db(0x75);
- db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0a); db(0x61); db(0x00);
- db(0xf9); db(0x74); db(0x4e); db(0x90); db(0x4e); db(0x75); db(0x61); db(0xf0);
- db(0x20); db(0x0d); db(0x67); db(0x1c); db(0x2c); db(0x6d); db(0x00); db(0x14);
- db(0x20); db(0x2d); db(0x00); db(0x18); db(0x67); db(0x06); db(0x22); db(0x40);
- db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x22); db(0x4d); db(0x20); db(0x3c);
- db(0x00); db(0x00); db(0x00); db(0x88); db(0x4e); db(0xae); db(0xff); db(0x2e);
- db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x38); db(0x3e);
- db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x41); db(0xfa); db(0x03); db(0xf8);
- db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00); db(0x03); db(0xed);
- db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x28); db(0x00); db(0x67); db(0x4c);
- db(0x45); db(0xed); db(0x00); db(0x68); db(0x42); db(0x92); db(0x34); db(0xaa);
- db(0x00); db(0x02); db(0x24); db(0x0a); db(0x54); db(0x82); db(0x76); db(0x02);
- db(0x22); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xd6); db(0xb6); db(0x80);
- db(0x66); db(0x32); db(0x0c); db(0x92); db(0x50); db(0x4e); db(0x54); db(0x52);
- db(0x66); db(0xe4); db(0x24); db(0x0a); db(0x76); db(0x04); db(0x22); db(0x04);
- db(0x4e); db(0xae); db(0xff); db(0xd6); db(0x24); db(0x0a); db(0x76); db(0x20);
- db(0x22); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xd6); db(0xb6); db(0x80);
- db(0x66); db(0x12); db(0x4a); db(0x6a); db(0x00); db(0x10); db(0x66); db(0xc4);
- db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x10); db(0x61); db(0x00);
- db(0xf8); db(0xe4); db(0x4e); db(0x90); db(0x22); db(0x04); db(0x67); db(0x04);
- db(0x4e); db(0xae); db(0xff); db(0xdc); db(0x4c); db(0xdf); db(0x7c); db(0x1c);
- db(0x4e); db(0x75); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x41); db(0xfa);
- db(0x03); db(0x70); db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae);
- db(0xff); db(0xac); db(0x22); db(0x00); db(0x67); db(0x34); db(0x4e); db(0xae);
- db(0xff); db(0xa6); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x45); db(0xed);
- db(0x00); db(0x38); db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6);
- db(0x15); db(0x40); db(0x00); db(0x14); db(0x41); db(0xfa); db(0x03); db(0x60);
- db(0x24); db(0x88); db(0x25); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x12);
- db(0x00); db(0x0c); db(0x25); db(0x6d); db(0x00); db(0x08); db(0x00); db(0x10);
- db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x22); db(0x0a); db(0x4e); db(0xae);
- db(0xfc); db(0x88); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x4e); db(0x75);
+ db(0xfc); db(0xac); db(0x6b); db(0x10); db(0x22); db(0xfc); db(0x80); db(0x03);
+ db(0xa0); db(0x04); db(0x30); db(0x3a); db(0xfc); db(0xa6); db(0x48); db(0xc0);
+ db(0xe1); db(0x80); db(0x22); db(0xc0); db(0x30); db(0x3a); db(0xfc); db(0x98);
+ db(0x6b); db(0x10); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x05);
+ db(0x30); db(0x3a); db(0xfc); db(0x92); db(0x48); db(0xc0); db(0xe1); db(0x80);
+ db(0x22); db(0xc0); db(0x70); db(0x00); db(0x30); db(0x3a); db(0xfc); db(0x8e);
+ db(0x6b); db(0x08); db(0x22); db(0xfc); db(0x80); db(0x03); db(0xa0); db(0x08);
+ db(0x22); db(0xc0); db(0x42); db(0x91); db(0x61); db(0x00); db(0xfc); db(0x40);
+ db(0x36); db(0x3c); db(0x00); db(0x68); db(0x74); db(0x01); db(0x28); db(0x3a);
+ db(0xfc); db(0x70); db(0x20); db(0x04); db(0xc0); db(0x82); db(0x22); db(0x2b);
+ db(0x00); db(0x04); db(0xc2); db(0x82); db(0xb2); db(0x80); db(0x67); db(0x22);
+ db(0x42); db(0x92); db(0x35); db(0x7c); db(0x02); db(0x00); db(0x00); db(0x04);
+ db(0x42); db(0xaa); db(0x00); db(0x0a); db(0x32); db(0x03); db(0x4a); db(0x00);
+ db(0x66); db(0x04); db(0x08); db(0xc1); db(0x00); db(0x07); db(0x35); db(0x41);
+ db(0x00); db(0x06); db(0x42); db(0x6a); db(0x00); db(0x08); db(0x61); db(0x00);
+ db(0xfc); db(0x06); db(0x52); db(0x43); db(0xd4); db(0x42); db(0x0c); db(0x42);
+ db(0x00); db(0x08); db(0x66); db(0xc6); db(0x27); db(0x44); db(0x00); db(0x04);
+ db(0x10); db(0x3a); db(0xfc); db(0x0c); db(0x08); db(0x00); db(0x00); db(0x00);
+ db(0x67); db(0x00); db(0xfd); db(0x7e); db(0x42); db(0x92); db(0x35); db(0x7c);
+ db(0x04); db(0x00); db(0x00); db(0x04); db(0x42); db(0x6a); db(0x00); db(0x06);
+ db(0x42); db(0x6a); db(0x00); db(0x08); db(0x20); db(0x6b); db(0x00); db(0x14);
+ db(0x30); db(0x3a); db(0xfc); db(0x14); db(0x32); db(0x28); db(0x00); db(0x30);
+ db(0xd2); db(0x41); db(0x90); db(0x41); db(0x6a); db(0x02); db(0x70); db(0x00);
+ db(0x35); db(0x40); db(0x00); db(0x0a); db(0x30); db(0x3a); db(0xfc); db(0x02);
+ db(0x32); db(0x28); db(0x00); db(0x2e); db(0xd2); db(0x41); db(0x90); db(0x41);
+ db(0x6a); db(0x02); db(0x70); db(0x00); db(0x35); db(0x40); db(0x00); db(0x0c);
+ db(0x61); db(0x00); db(0xfb); db(0x78); db(0x60); db(0x00); db(0xfd); db(0x3a);
+ db(0x4e); db(0x75); db(0x4a); db(0xa9); db(0x02); db(0x08); db(0x67); db(0x14);
+ db(0x4a); db(0xa9); db(0x02); db(0x0c); db(0x67); db(0x0e); db(0x30); db(0x3a);
+ db(0xfb); db(0xb0); db(0xb0); db(0x69); db(0x00); db(0x16); db(0x67); db(0x14);
+ db(0x33); db(0x40); db(0x00); db(0x16); db(0x2c); db(0x69); db(0x00); db(0x26);
+ db(0x20); db(0x29); db(0x00); db(0x22); db(0x22); db(0x69); db(0x00); db(0x1e);
+ db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x53); db(0x69); db(0x00); db(0x46);
+ db(0x6a); db(0x12); db(0x33); db(0x7c); db(0x00); db(0x32); db(0x00); db(0x46);
+ db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x02); db(0x61); db(0x00);
+ db(0xf9); db(0xea); db(0x4e); db(0x90); db(0x41); db(0xf9); db(0x00); db(0xdf);
+ db(0xf0); db(0x00); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7);
+ db(0x00); db(0x06); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x11);
+ db(0x61); db(0x00); db(0xf9); db(0xd0); db(0x4e); db(0x90); db(0x08); db(0x00);
+ db(0x00); db(0x00); db(0x67); db(0x42); db(0x2c); db(0x78); db(0x00); db(0x04);
+ db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x88); db(0x22); db(0x3c);
+ db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a);
+ db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0x40); db(0x2a); db(0x40);
+ db(0x2b); db(0x4e); db(0x00); db(0x14); db(0x30); db(0x3c); db(0xff); db(0x38);
+ db(0x72); db(0x0e); db(0x61); db(0x00); db(0xf9); db(0x9e); db(0x20); db(0x0d);
+ db(0x4e); db(0x90); db(0x41); db(0xfa); db(0x04); db(0x6c); db(0x43); db(0xfa);
+ db(0x01); db(0x14); db(0x70); db(0xf6); db(0x22); db(0x3c); db(0x00); db(0x00);
+ db(0x27); db(0x10); db(0x61); db(0x00); db(0xed); db(0xa2); db(0x70); db(0x00);
+ db(0x4c); db(0xdf); db(0x60); db(0x00); db(0x4e); db(0x75); db(0x30); db(0x3c);
+ db(0xff); db(0x38); db(0x72); db(0x0a); db(0x61); db(0x00); db(0xf9); db(0x74);
+ db(0x4e); db(0x90); db(0x4e); db(0x75); db(0x61); db(0xf0); db(0x20); db(0x0d);
+ db(0x67); db(0x1c); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x20); db(0x2d);
+ db(0x00); db(0x18); db(0x67); db(0x06); db(0x22); db(0x40); db(0x4e); db(0xae);
+ db(0xfe); db(0x62); db(0x22); db(0x4d); db(0x20); db(0x3c); db(0x00); db(0x00);
+ db(0x00); db(0x88); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x70); db(0x00);
+ db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x38); db(0x3e); db(0x2c); db(0x6d);
+ db(0x00); db(0x18); db(0x41); db(0xfa); db(0x03); db(0xfa); db(0x22); db(0x08);
+ db(0x24); db(0x3c); db(0x00); db(0x00); db(0x03); db(0xed); db(0x4e); db(0xae);
+ db(0xff); db(0xe2); db(0x28); db(0x00); db(0x67); db(0x4c); db(0x45); db(0xed);
+ db(0x00); db(0x68); db(0x42); db(0x92); db(0x34); db(0xaa); db(0x00); db(0x02);
+ db(0x24); db(0x0a); db(0x54); db(0x82); db(0x76); db(0x02); db(0x22); db(0x04);
+ db(0x4e); db(0xae); db(0xff); db(0xd6); db(0xb6); db(0x80); db(0x66); db(0x32);
+ db(0x0c); db(0x92); db(0x50); db(0x4e); db(0x54); db(0x52); db(0x66); db(0xe4);
+ db(0x24); db(0x0a); db(0x76); db(0x04); db(0x22); db(0x04); db(0x4e); db(0xae);
+ db(0xff); db(0xd6); db(0x24); db(0x0a); db(0x76); db(0x20); db(0x22); db(0x04);
+ db(0x4e); db(0xae); db(0xff); db(0xd6); db(0xb6); db(0x80); db(0x66); db(0x12);
+ db(0x4a); db(0x6a); db(0x00); db(0x10); db(0x66); db(0xc4); db(0x30); db(0x3c);
+ db(0xff); db(0x38); db(0x72); db(0x10); db(0x61); db(0x00); db(0xf8); db(0xe4);
+ db(0x4e); db(0x90); db(0x22); db(0x04); db(0x67); db(0x04); db(0x4e); db(0xae);
+ db(0xff); db(0xdc); db(0x4c); db(0xdf); db(0x7c); db(0x1c); db(0x4e); db(0x75);
+ db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x41); db(0xfa); db(0x03); db(0x72);
+ db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac);
+ db(0x22); db(0x00); db(0x67); db(0x34); db(0x4e); db(0xae); db(0xff); db(0xa6);
+ db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x45); db(0xed); db(0x00); db(0x38);
+ db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x15); db(0x40);
+ db(0x00); db(0x14); db(0x41); db(0xfa); db(0x03); db(0x62); db(0x24); db(0x88);
+ db(0x25); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x12); db(0x00); db(0x0c);
+ db(0x25); db(0x6d); db(0x00); db(0x08); db(0x00); db(0x10); db(0x2c); db(0x6d);
+ db(0x00); db(0x18); db(0x22); db(0x0a); db(0x4e); db(0xae); db(0xfc); db(0x88);
+ db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x4e); db(0x75); db(0x00); db(0x00);
  db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00);
  db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0d); db(0x61); db(0x00);
- db(0xf8); db(0x74); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x00);
- db(0xfe); db(0xfe); db(0x2a); db(0x40); db(0x2c); db(0x6d); db(0x00); db(0x14);
+ db(0xf8); db(0x72); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x00);
+ db(0xfe); db(0xfc); db(0x2a); db(0x40); db(0x2c); db(0x6d); db(0x00); db(0x14);
  db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x2b); db(0x40);
  db(0x00); db(0x08); db(0x43); db(0xfa); db(0x03); db(0x8e); db(0x70); db(0x00);
  db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x2b); db(0x40); db(0x00); db(0x18);
- db(0x67); db(0x00); db(0xfe); db(0xdc); db(0x2c); db(0x40); db(0x72); db(0x32);
+ db(0x67); db(0x00); db(0xfe); db(0xda); db(0x2c); db(0x40); db(0x72); db(0x32);
  db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x41); db(0xfa); db(0x02); db(0xc6);
  db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac);
  db(0x4a); db(0x80); db(0x67); db(0xea); db(0x22); db(0x00); db(0x4e); db(0xae);
  db(0xff); db(0xa6); db(0x72); db(0x32); db(0x4e); db(0xae); db(0xff); db(0x3a);
  db(0x41); db(0xfa); db(0x02); db(0xb0); db(0x22); db(0x08); db(0x74); db(0xfe);
  db(0x4e); db(0xae); db(0xff); db(0xac); db(0x4a); db(0x80); db(0x67); db(0x00);
- db(0xfe); db(0xa6); db(0x22); db(0x00); db(0x4e); db(0xae); db(0xff); db(0xa6);
- db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x61); db(0x00); db(0xf8); db(0x22);
+ db(0xfe); db(0xa4); db(0x22); db(0x00); db(0x4e); db(0xae); db(0xff); db(0xa6);
+ db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x61); db(0x00); db(0xf8); db(0x20);
  db(0x72); db(0x00); db(0x32); db(0x3c); db(0x00); db(0x34); db(0x61); db(0x00);
- db(0xf8); db(0x66); db(0x28); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x00);
- db(0xfe); db(0x86); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d);
+ db(0xf8); db(0x64); db(0x28); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x00);
+ db(0xfe); db(0x84); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d);
  db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x72); db(0x00); db(0x20); db(0x2d);
  db(0x00); db(0x0c); db(0x41); db(0xfa); db(0x02); db(0x89); db(0x22); db(0x4c);
  db(0x4e); db(0xae); db(0xfe); db(0x44); db(0x4a); db(0x80); db(0x66); db(0xe2);
  db(0x20); db(0x6c); db(0x00); db(0x14); db(0x0c); db(0x68); db(0x00); db(0x25);
- db(0x00); db(0x14); db(0x64); db(0x0c); db(0x61); db(0x00); db(0xfe); db(0x4a);
+ db(0x00); db(0x14); db(0x64); db(0x0c); db(0x61); db(0x00); db(0xfe); db(0x48);
  db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x60); db(0xf8);
- db(0x61); db(0x00); db(0xfe); db(0xe8); db(0x41); db(0xed); db(0x00); db(0x1c);
+ db(0x61); db(0x00); db(0xfe); db(0xe6); db(0x41); db(0xed); db(0x00); db(0x1c);
  db(0x29); db(0x48); db(0x00); db(0x28); db(0x70); db(0x01); db(0x29); db(0x40);
  db(0x00); db(0x24); db(0x39); db(0x7c); db(0x00); db(0x0c); db(0x00); db(0x1c);
  db(0x2b); db(0x4d); db(0x00); db(0x2c); db(0x41); db(0xfa); db(0x01); db(0x60);
  db(0x2b); db(0x48); db(0x00); db(0x24); db(0x22); db(0x4c); db(0x4e); db(0xae);
  db(0xfe); db(0x38); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0f);
- db(0x61); db(0x00); db(0xf7); db(0x8a); db(0x4e); db(0x90); db(0x4a); db(0xad);
+ db(0x61); db(0x00); db(0xf7); db(0x88); db(0x4e); db(0x90); db(0x4a); db(0xad);
  db(0x00); db(0x00); db(0x66); db(0x1c); db(0x70); db(0x00); db(0x74); db(0x00);
  db(0x14); db(0x2d); db(0x00); db(0x4c); db(0x05); db(0xc0); db(0x08); db(0xc0);
  db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x05); db(0x00);
- db(0x67); db(0x06); db(0x61); db(0x00); db(0xfe); db(0x20); db(0x60); db(0xe4);
+ db(0x67); db(0x06); db(0x61); db(0x00); db(0xfe); db(0x1e); db(0x60); db(0xe4);
  db(0x20); db(0x2d); db(0x00); db(0x00); db(0x67); db(0x00); db(0x00); db(0x76);
  db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x2b); db(0x40);
  db(0x00); db(0x04); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0c);
- db(0x61); db(0x00); db(0xf7); db(0x4a); db(0x4e); db(0x90); db(0x4a); db(0x80);
+ db(0x61); db(0x00); db(0xf7); db(0x48); db(0x4e); db(0x90); db(0x4a); db(0x80);
  db(0x67); db(0x40); db(0x4a); db(0xad); db(0x00); db(0x04); db(0x67); db(0x3a);
  db(0x39); db(0x7c); db(0x00); db(0x03); db(0x00); db(0x1c); db(0x42); db(0x2c);
  db(0x00); db(0x1f); db(0x42); db(0xac); db(0x00); db(0x20); db(0x29); db(0x6d);
  db(0x00); db(0x34); db(0x29); db(0x48); db(0x00); db(0x28); db(0x20); db(0x02);
  db(0x51); db(0x80); db(0x29); db(0x40); db(0x00); db(0x24); db(0x22); db(0x4c);
  db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x30); db(0x3c); db(0xff); db(0x38);
- db(0x72); db(0x0b); db(0x61); db(0x00); db(0xf6); db(0x70); db(0x20); db(0x2c);
+ db(0x72); db(0x0b); db(0x61); db(0x00); db(0xf6); db(0x6e); db(0x20); db(0x2c);
  db(0x00); db(0x20); db(0x4e); db(0x90); db(0x22); db(0x4a); db(0x20); db(0x02);
  db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x4a); db(0xac); db(0x00); db(0x20);
  db(0x67); db(0x00); db(0xfe); db(0xda); db(0x41); db(0xed); db(0x00); db(0x30);
  db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x2c); db(0x5f); db(0x70); db(0x00);
  db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x74); db(0xff);
  db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x11); db(0x61); db(0x00);
- db(0xf6); db(0x04); db(0x4e); db(0x90); db(0x08); db(0x00); db(0x00); db(0x01);
+ db(0xf6); db(0x02); db(0x4e); db(0x90); db(0x08); db(0x00); db(0x00); db(0x01);
  db(0x67); db(0x38); db(0x74); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x7c);
  db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x00); db(0x62);
  db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x4a); db(0x80); db(0x67); db(0x1e);
  db(0x20); db(0x40); db(0x43); db(0xfa); db(0x00); db(0x22); db(0x24); db(0x68);
  db(0xff); db(0xe4); db(0x21); db(0x49); db(0xff); db(0xe4); db(0x22); db(0x48);
  db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x65); db(0x61); db(0x00);
- db(0xf5); db(0xcc); db(0x4e); db(0x90); db(0x74); db(0x01); db(0x4e); db(0xae);
+ db(0xf5); db(0xca); db(0x4e); db(0x90); db(0x74); db(0x01); db(0x4e); db(0xae);
  db(0xff); db(0x76); db(0x20); db(0x02); db(0x4e); db(0x75); db(0x59); db(0x8f);
  db(0x48); db(0xe7); db(0xc0); db(0x80); db(0x30); db(0x3c); db(0xff); db(0x38);
- db(0x72); db(0x66); db(0x61); db(0x00); db(0xf5); db(0xb0); db(0x4e); db(0x90);
+ db(0x72); db(0x66); db(0x61); db(0x00); db(0xf5); db(0xae); db(0x4e); db(0x90);
  db(0x4c); db(0xdf); db(0x01); db(0x03); db(0x4e); db(0x75); db(0x69); db(0x6e);
  db(0x70); db(0x75); db(0x74); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69);
  db(0x63); db(0x65); db(0x00); db(0x74); db(0x69); db(0x6d); db(0x65); db(0x72);
index c24b993915f2884748fdbdd87ea783de272e7dbe..d09f6807e7c61c5e4639eb70a558172a116147ad 100644 (file)
--- a/fsdb.cpp
+++ b/fsdb.cpp
@@ -78,6 +78,8 @@ static FILE *get_fsdb (a_inode *dir, const TCHAR *mode)
        TCHAR *n;
        FILE *f;
 
+       if (!dir->nname)
+               return NULL;
        n = build_nname (dir->nname, FSDB_FILE);
        f = _tfopen (n, mode);
        xfree (n);
@@ -86,6 +88,8 @@ static FILE *get_fsdb (a_inode *dir, const TCHAR *mode)
 
 static void kill_fsdb (a_inode *dir)
 {
+       if (!dir->nname)
+               return;
        TCHAR *n = build_nname (dir->nname, FSDB_FILE);
        _wunlink (n);
        xfree (n);
@@ -118,6 +122,8 @@ void fsdb_clean_dir (a_inode *dir)
        FILE *f;
        off_t pos1 = 0, pos2;
 
+       if (!dir->nname)
+               return;
        n = build_nname (dir->nname, FSDB_FILE);
        f = _tfopen (n, L"r+b");
        if (f == 0) {
index b267a2334ca268c2d58dca723907b174f561bc45..7d9fabc8a6d4e652fc574b79c0c062a21ae4e314 100644 (file)
@@ -205,3 +205,4 @@ extern void blkdev_cd_change (int unitnum, const TCHAR *name);
 extern void blkdev_entergui (void);
 extern void blkdev_exitgui (void);
 
+bool filesys_do_disk_change (int, bool);
index dbed529ced0ce5d81b016c9bc5e443c00af9d354..7d5e447a8ef34902802e19fd1f18ea41f04ba17c 100644 (file)
@@ -92,6 +92,8 @@ struct hd_hardfiledata {
 
 #define MAX_FILESYSTEM_UNITS 30
 
+#define USE_CDFS 2
+
 struct uaedev_mount_info;
 extern struct uaedev_mount_info options_mountinfo;
 
index 67bb857f853e4a70346370e7888d325b30bf55e0..33204489895fdfcedcd049424fc6d588862aca55 100644 (file)
@@ -71,7 +71,7 @@ typedef struct a_inode_struct {
     /* AmigaOS protection bits.  */
     int amigaos_mode;
     /* Unique number for identification.  */
-    uae_u32 uniq;
+    uae_u64 uniq;
     /* For a directory that is being ExNext()ed, the number of child ainos
        which must be kept locked in core.  */
     unsigned long locked_children;
@@ -95,6 +95,7 @@ typedef struct a_inode_struct {
     unsigned int volflags;
     /* not equaling unit.mountcount -> not in this volume */
     unsigned int mountcount;
+       uae_u64 uniq_external;
 #ifdef AINO_DEBUG
     uae_u32 checksum2;
 #endif
@@ -142,6 +143,7 @@ void my_setfilehidden (const TCHAR *path, bool hidden);
 extern struct my_openfile_s *my_open (const TCHAR*, int);
 extern void my_close (struct my_openfile_s*);
 extern uae_s64 my_lseek (struct my_openfile_s*, uae_s64, int);
+extern uae_s64 my_fsize (struct my_openfile_s*);
 extern unsigned int my_read (struct my_openfile_s*, void*, unsigned int);
 extern unsigned int my_write (struct my_openfile_s*, void*, unsigned int);
 extern int my_truncate (const TCHAR *name, uae_u64 len);
@@ -159,5 +161,6 @@ extern int custom_fsdb_used_as_nname (a_inode *base, const TCHAR *nname);
 #define MYVOLUMEINFO_STREAMS 2
 #define MYVOLUMEINFO_ARCHIVE 4
 #define MYVOLUMEINFO_REUSABLE 8
+#define MYVOLUMEINFO_CDFS 16
 
 extern int my_getvolumeinfo (const TCHAR *root);
index bba717a8cb810bbefeedae2e00d13dd187a3d6b5..5d10a7b0ddfa6819cd5a5909f3e27212321bebb9 100644 (file)
@@ -10,20 +10,26 @@ struct zfile;
 struct zvolume;
 struct zdirectory;
 
+#define FS_DIRECTORY 0
+#define FS_ARCHIVE 1
+#define FS_CDFS 2
+
 struct fs_dirhandle
 {
-       int isarch;
+       int fstype;
        union {
                struct zdirectory *zd;
                struct my_opendir_s *od;
+               struct cd_opendir_s *isod;
        };
 };
 struct fs_filehandle
 {
-       int isarch;
+       int fstype;
        union {
                struct zfile *zf;
                struct my_openfile_s *of;
+               struct cd_openfile_s *isof;
        };
 };
 
@@ -118,6 +124,7 @@ extern int zfile_readdir_archive (struct zdirectory *, TCHAR*, bool fullpath);
 extern void zfile_resetdir_archive (struct zdirectory *);
 extern int zfile_fill_file_attrs_archive (const TCHAR *path, int *isdir, int *flags, TCHAR **comment);
 extern uae_s64 zfile_lseek_archive (struct zfile *d, uae_s64 offset, int whence);
+extern uae_s64 zfile_fsize_archive (struct zfile *d);
 extern unsigned int zfile_read_archive (struct zfile *d, void *b, unsigned int size);
 extern void zfile_close_archive (struct zfile *d);
 extern struct zfile *zfile_open_archive (const TCHAR *path, int flags);
index f8774c094645cb19bf74b0aa43dbd1e9848e72f5..7f8298b6414a86ec974f8329274d92e982955864 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -133,8 +133,6 @@ void fixup_prefs_dimensions (struct uae_prefs *prefs)
        fixup_prefs_dim2 (&prefs->gfx_size_win);
        if (prefs->gfx_apmode[1].gfx_vsync)
                prefs->gfx_apmode[1].gfx_vsyncmode = 1;
-       if (prefs->gfx_apmode[0].gfx_vsync && !prefs->gfx_apmode[0].gfx_vsyncmode && prefs->gfx_apmode[0].gfx_backbuffers < 1)
-               prefs->gfx_apmode[0].gfx_backbuffers = 1;
 
        for (int i = 0; i < 2; i++) {
                struct apmode *ap = &prefs->gfx_apmode[i];
@@ -149,6 +147,8 @@ void fixup_prefs_dimensions (struct uae_prefs *prefs)
                        } else {
                                // legacy vsync: always wait for flip
                                ap->gfx_vflip = -1;
+                               if (ap->gfx_backbuffers < 1)
+                                       ap->gfx_backbuffers = 1;
                        }
                } else {
                        // no vsync: wait if triple bufferirng
index 3fa7b501c96d75737a169614f0a4b30d529d00d2..905964ad564656e71ce1e955e70fdbbcde09dcdd 100644 (file)
@@ -3383,25 +3383,27 @@ STATIC_INLINE int do_specialties (int cycles)
                        return 1;
                }
 
-               if (!uae_int_requested && currprefs.cpu_idle && currprefs.m68k_speed != 0 && ((regs.spcflags & SPCFLAG_STOP)) == SPCFLAG_STOP) {
+               if (!uae_int_requested && currprefs.cpu_idle && currprefs.m68k_speed != 0 && (regs.spcflags & SPCFLAG_STOP)) {
                        /* sleep 1ms if STOP-instruction is executed
                         * but only if we have free frametime left to prevent slowdown
                         */
-                       frame_time_t rpt = read_processor_time ();
-                       if ((int)rpt - (int)vsyncmaxtime < 0) {
+                       {
                                static int sleepcnt, lvpos, zerocnt;
                                if (vpos != lvpos) {
-                                       sleepcnt--;
-#ifdef JIT
-                                       if (pissoff == 0 && currprefs.cachesize && --zerocnt < 0) {
-                                               sleepcnt = -1;
-                                               zerocnt = IDLETIME / 4;
-                                       }
-#endif
                                        lvpos = vpos;
-                                       if (sleepcnt < 0) {
-                                               sleepcnt = IDLETIME / 2;
-                                               sleep_millis_main (1);
+                                       frame_time_t rpt = read_processor_time ();
+                                       if ((int)rpt - (int)vsyncmaxtime < 0) {
+                                               sleepcnt--;
+#if 0
+                                               if (pissoff == 0 && currprefs.cachesize && --zerocnt < 0) {
+                                                       sleepcnt = -1;
+                                                       zerocnt = IDLETIME / 4;
+                                               }
+#endif
+                                               if (sleepcnt < 0) {
+                                                       sleepcnt = IDLETIME / 2;
+                                                       sleep_millis_main (1);
+                                               }
                                        }
                                }
                        }
index d97daff4ebf74940645c33d865eb0387438017e6..80616b73efdc893bddfda4b5d8aa5e71e930a970 100644 (file)
@@ -143,7 +143,7 @@ static int win32_error (struct dev_info_ioctl *ciw, int unitnum, const TCHAR *fo
        if (err == ERROR_WRONG_DISK) {
                write_log (L"IOCTL: media change, re-opening device\n");
                sys_cddev_close (ciw, unitnum);
-               if (!sys_cddev_open (ciw, unitnum))
+               if (sys_cddev_open (ciw, unitnum))
                        write_log (L"IOCTL: re-opening failed!\n");
                return -1;
        }
@@ -1409,6 +1409,7 @@ bool win32_ioctl_media_change (TCHAR driveletter, int insert)
                        if (unitnum >= 0) {
                                update_device_info (unitnum);
                                scsi_do_disk_change (unitnum, insert, NULL);
+                               filesys_do_disk_change (unitnum, insert != 0);
                                blkdev_cd_change (unitnum, ciw->drvlettername);
                                return true;
                        }
index 30314e36253862218ba116d0ec4f2ef73e4f9106..b7d9346b77b71ca3a0dd653d2456c3081a34ac12 100644 (file)
@@ -663,6 +663,7 @@ bool win32_spti_media_change (TCHAR driveletter, int insert)
                        if (unitnum >= 0) {
                                update_device_info (unitnum);
                                scsi_do_disk_change (unitnum, insert, NULL);
+                               filesys_do_disk_change (unitnum, insert != 0);
                                blkdev_cd_change (unitnum, di->drvletter ? di->drvlettername : di->name);
                                return true;
                        }
index 46a87e23a5d1b4a9710900e3ef5ea1b5b524c5b9..756b14198fe454f9e50e061187e81786cc46fa95 100644 (file)
@@ -183,16 +183,28 @@ void my_close (struct my_openfile_s *mos)
 
 uae_s64 int my_lseek (struct my_openfile_s *mos, uae_s64 int offset, int whence)
 {
-       LARGE_INTEGER li;
+       LARGE_INTEGER li, old;
 
+       old.QuadPart = 0;
+       old.LowPart = SetFilePointer (mos->h, 0, &old.HighPart, FILE_CURRENT);
+       if (old.LowPart == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR)
+               return -1;
        li.QuadPart = offset;
        li.LowPart = SetFilePointer (mos->h, li.LowPart, &li.HighPart,
                whence == SEEK_SET ? FILE_BEGIN : (whence == SEEK_END ? FILE_END : FILE_CURRENT));
        if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR)
-               li.QuadPart = -1;
+               return -1;
+       return old.QuadPart;
+}
+uae_s64 int my_fsize (struct my_openfile_s *mos)
+{
+       LARGE_INTEGER li;
+       if (!GetFileSizeEx (mos->h, &li))
+               return -1;
        return li.QuadPart;
 }
 
+
 unsigned int my_read (struct my_openfile_s *mos, void *b, unsigned int size)
 {
        DWORD read = 0;
@@ -339,6 +351,8 @@ int dos_errno (void)
        case ERROR_BAD_UNIT:
        case ERROR_REQUEST_ABORTED:
        case ERROR_INVALID_HANDLE:
+       case ERROR_BAD_NETPATH:
+       case ERROR_DEV_NOT_EXIST:
                return ERROR_OBJECT_NOT_AROUND;
 
        case ERROR_HANDLE_DISK_FULL:
index 7a906e3abfe06910b6d1773f2898d9fb11749a4c..d7f55f552e348ce1aa2b7a80aad68971c5c41663 100644 (file)
@@ -155,7 +155,7 @@ static struct uae_input_device_kbr_default keytrans_amiga[] = {
        { DIK_PERIOD, INPUTEVENT_KEY_PERIOD },
        { DIK_SLASH, INPUTEVENT_KEY_DIV },
        { DIK_OEM_102, INPUTEVENT_KEY_30 },
-       { DIK_SYSRQ, INPUTEVENT_SPC_SCREENSHOT_CLIPBOARD, 0, INPUTEVENT_SPC_SCREENSHOT_CLIPBOARD, ID_FLAG_QUALIFIER_SPECIAL },
+       { DIK_SYSRQ, INPUTEVENT_SPC_SCREENSHOT_CLIPBOARD, 0, INPUTEVENT_SPC_SCREENSHOT, ID_FLAG_QUALIFIER_SPECIAL },
 
        { DIK_END, INPUTEVENT_SPC_QUALIFIER_SPECIAL },
        { DIK_PAUSE, INPUTEVENT_SPC_PAUSE, 0, INPUTEVENT_SPC_WARP, ID_FLAG_QUALIFIER_SPECIAL, INPUTEVENT_SPC_IRQ7, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT },
index 002114b06a3745e15899ecbcb386cbbdb0c7584e..846d9cd63bd82f3ba26d093aa527335a326e5886 100644 (file)
@@ -466,13 +466,10 @@ void *shmat (int shmid, void *shmaddr, int shmflg)
                }
                if(!_tcscmp (shmids[shmid].name, L"ramsey_low")) {
                        shmaddr=natmem_offset + a3000lmem_start;
-                       if (!currprefs.mbresmem_high_size)
-                               size += BARRIER;
                        got = TRUE;
                }
                if(!_tcscmp (shmids[shmid].name, L"ramsey_high")) {
                        shmaddr=natmem_offset + a3000hmem_start;
-                       size += BARRIER;
                        got = TRUE;
                }
                if(!_tcscmp (shmids[shmid].name, L"z3")) {
index 235aa4e5bd54288f331bd4e14160b1ac2e42257c..b4b9706b36533d2ab9edec4e86c9b3a1457e69ca 100644 (file)
@@ -303,12 +303,12 @@ BEGIN
     PUSHBUTTON      "&Properties",IDC_EDIT,235,172,60,15\r
     CONTROL         "Add PC drives at startup",IDC_MAPDRIVES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,154,100,10\r
     CONTROL         "Disable UAEFSDB-support",IDC_NOUAEFSDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,154,119,10\r
-    CONTROL         "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,165,121,10\r
-    CONTROL         "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,177,101,10\r
-    CONTROL         "CDFS automount CD/DVD drives.",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,189,201,10\r
-    CONTROL         "Automount removable drives",IDC_MAPDRIVES_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,177,115,10\r
+    CONTROL         "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,166,121,10\r
+    CONTROL         "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,178,101,10\r
+    CONTROL         "CDFS automount CD/DVD drives.",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,190,160,10\r
+    CONTROL         "Automount removable drives",IDC_MAPDRIVES_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,178,115,10\r
     CONTROL         "Include removable drives..",IDC_MAPDRIVES_REMOVABLE,\r
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,165,100,10\r
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,166,100,10\r
     COMBOBOX        IDC_CD_TEXT,5,224,289,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
     PUSHBUTTON      "Eject",IDC_CD_EJECT,265,204,30,15\r
     PUSHBUTTON      "Select image file",IDC_CD_SELECT,90,204,98,15\r
@@ -1268,6 +1268,10 @@ BEGIN
     BEGIN\r
     END\r
 \r
+    IDD_FILESYS, DIALOG\r
+    BEGIN\r
+    END\r
+\r
     IDD_CHIPSET, DIALOG\r
     BEGIN\r
         BOTTOMMARGIN, 165\r
index d5949b7f7e1364eb973e8fbdb34e6a74bafaf9de..a91f0c396041bffd1dae567f5d2cd480289552c5 100644 (file)
@@ -2795,7 +2795,6 @@ void target_fixup_options (struct uae_prefs *p)
 {
        if (p->win32_automount_cddrives && !p->scsi)
                p->scsi = 1;
-
        bool paused = false;
        bool nosound = false;
        if (!paused) {
index cf827f9ab071d70e8576976f723da7b93c23cfd2..400bb3a88b8e6192cb9b67d7f30d14fbb8311311 100644 (file)
@@ -19,8 +19,8 @@
 #define LANG_DLL 1
 
 //#define WINUAEBETA L""
-#define WINUAEBETA L"Beta 22"
-#define WINUAEDATE MAKEBD(2012, 3, 12)
+#define WINUAEBETA L"Beta 23"
+#define WINUAEDATE MAKEBD(2012, 3, 21)
 #define WINUAEEXTRA L"RC1"
 //#define WINUAEEXTRA L"AmiKit Preview"
 #define WINUAEREV L""
index d7ca08813130856a705bee0b9d388fcee3e4be1f..7413e39a407272609ce09becb38e6c380e9951a1 100644 (file)
@@ -164,8 +164,8 @@ static void filesys_addexternals (void)
                        }
                        devname[0] = 0;
                        for (;;) {
-#if 0
-                               if (drivetype == DRIVE_CDROM && currprefs.win32_automount_cddrives && !currprefs.scsi) {
+#if USE_CDFS == 0
+                               if (drivetype == DRIVE_CDROM && currprefs.win32_automount_cddrives) {
                                        _stprintf (devname, L"WinCD_%c", drive);
                                        rw = 0;
                                        break;
index 07dd59718a51703c658cf5a9add8bf1c1033bd9b..02d99b94877d6663b77bc0c86331c369aec9f21f 100644 (file)
     <ClCompile Include="..\..\events.cpp" />
     <ClCompile Include="..\..\hrtmon.rom.cpp" />
     <ClCompile Include="..\..\inputrecord.cpp" />
+    <ClCompile Include="..\..\isofs.cpp" />
     <ClCompile Include="..\..\specialmonitors.cpp" />
     <ClCompile Include="..\..\statusline.cpp" />
     <ClCompile Include="..\ahidsound_dsonly.cpp" />
index 7e0539467ee3a8685db6a61d9b17f9fba6ba494f..0f75a87b0c66b127f0f9e6d68c7ddc032c093f7c 100644 (file)
     <ClCompile Include="..\..\calc.cpp">
       <Filter>common</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\isofs.cpp">
+      <Filter>common</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\resources\35floppy.ico">
index 4d6516cbd4b2ee17f76e64fe87f3ae3ad9d47db3..291332b327cd9f240f6b518f9e02f793a88c58fb 100644 (file)
@@ -1,4 +1,35 @@
 
+Beta 23:
+
+- CPU Idle change improved, b22 caused major slowdowns on some systems.
+- MB RAM option + JIT enabled detected wrong amount of RAM. (Can't have extra memory barrier there)
+- Directory filesystem ACTION_DISK_INFO and seek updates (ACTION SEEK had some problems in archive mode)
+- Sprite debugger showed 64-bit AGA sprite shape totally wrong.
+- END + PrinScreen (Screenshot to file) used incorrectly screenshot to clipoard input event.
+- Legacy vsync was horribly slow (b22)
+- optimized normal safe "unixfs warning: Bad pointer passed for read" directory filesystem situation.
+- added win32 ERROR_BAD_NETPATH = AOS ERROR_OBJECT_NOT_AROUND mapping directory filesystem error handler.
+- improved filesystem volume insert/removal stability.
+- config file/uae-configuration/custom input math formula (+-*/ and parenthesis) support.
+  For example it is now possible to increase or decrease any numeric configuration entry,
+  very simple example: "gfx_filter_horiz_offset=[gfx_filter_horiz_offset+1]". Multiple variables and
+  complex formulas fully supported. This was already in previous beta because it was too experimental,
+  but I guess it can be considered "official" now because of CDFS delay..
+- A500 advanced chipset extra option always enabled RTC (real time clock), should have been enabled only
+  when more than 0.5M RAM configured.
+- built-in AOS CDFS removed, unfortunately it is not license compatible (non-commercial usage only).
+  I was too blind to not notice it months ago.
+- CDFS replaced with host native Linux isofs/directory filesystem wrapper which works quite differently
+  but should have exactly same behavior from Amiga program point of view. Uses filesystem emulation but
+  accesses CD data using Linux isofs filesystem code that directly reads CD sectors via IOCTL native API
+  or UAE built-in CD image support.
+  Amiga specific rock ridge 'AS' extension (protection flags and file comment) is not supported yet.
+  Does anyone know any example CDs or images?
+- AROS ROM updated.
+
+New isofs/directory filesystem CDFS hybrid needs testing! 2.4.0 final waits until CDFS is guaranteed working.
+
+
 Beta 22: (RC1)
 
 - CPU Idle limit added, do not sleep if there are no frame time left, no more slowdowns if CPU Idle is set too high.
index fb0985862a91597ecad9f68d3c7ce3d5cb54627c..5d72178bcdf2496c57447101b202b3522081f114 100644 (file)
--- a/zfile.cpp
+++ b/zfile.cpp
@@ -3282,9 +3282,14 @@ int zfile_stat_archive (const TCHAR *path, struct _stat64 *s)
 
 uae_s64 zfile_lseek_archive (struct zfile *d, uae_s64 offset, int whence)
 {
-       if (zfile_fseek (d, offset, whence))
+       uae_s64 old = zfile_ftell (d);
+       if (old < 0 || zfile_fseek (d, offset, whence))
                return -1;
-       return zfile_ftell (d);
+       return old;
+}
+uae_s64 zfile_fsize_archive (struct zfile *d)
+{
+       return zfile_size (d);
 }
 
 unsigned int zfile_read_archive (struct zfile *d, void *b, unsigned int size)