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)
void sys_command_close (int unitnum)
{
+ if (openlist[unitnum] > 1) {
+ openlist[unitnum]--;
+ return;
+ }
#ifdef RETROPLATFORM
rp_cd_device_enable (unitnum, false);
#endif
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);
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);
*
* Infix->RPN conversion and calculation
*
-* Copyright 1995-2002 Bernd Schmidt
-* Copyright 1995 Alessandro Bissacco
-* Copyright 2000-2010 Toni Wilen
*/
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;
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+
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;
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;
render_screen ();
show_screen ();
frame_shown = true;
+ return;
} else if (vs < 0) {
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;
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;
#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)
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;
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;
int rdb_filesyssize;
TCHAR *filesysdir;
+ /* CDFS */
+ bool cd_open;
+ int cddevno;
+ void *cdfs_superblock;
+
} UnitInfo;
struct uaedev_mount_info {
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;
uip->devname = 0;
uip->rootdir = 0;
uip->open = 0;
+ uip->cd_open = 0;
}
static UnitInfo *getuip (struct uae_prefs *p, int index)
UnitInfo *ui;
int i;
bool emptydrive = false;
+ bool iscd;
if (hdc)
return -1;
}
}
+ 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);
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) {
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;
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) {
}
}
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
}
#define ACTION_READ_LINK 1024
#define DISK_TYPE 0x444f5301 /* DOS\1 */
+#define CDFS_DOSTYPE (USE_CDFS == 2 ? 0x43444653 : 0x43445644)
typedef struct {
uae_u32 uniq;
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;
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;
}
{
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;
}
}
+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;
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)
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)
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;
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;
/* 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;
*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);
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);
}
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;
xfree (aino);
return 0;
}
- if (aino->dir)
+ if (aino->dir && !isvirtual)
fsdb_clean_dir (aino);
}
init_child_aino (unit, base, aino);
}
/* 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);
}
if (c != 0)
return c;
- if (!isarch)
+ if (!isvirtual)
c = fsdb_lookup_aino_nname (base, rel);
if (c == 0) {
c = xcalloc (a_inode, 1);
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);
{
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)
UnitInfo *uinfo;
int late = 0;
int ed, ef;
+ uae_u64 uniq = 0;
/* find UnitInfo with correct device name */
s = _tcschr (devname, ':');
}
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) {
}
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);*/
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 */
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);
}
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);
}
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)
}
if (k->fd != NULL)
- fs_close (k->fd);
+ fs_closefile (k->fd);
xfree(k);
}
/* 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);
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);
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 {
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++;
#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;
return 1;
}
-static uae_u32 REGPARAM2 exall_helper (TrapContext *context)
+static uae_u32 exall_helpder(TrapContext *context)
{
int i;
Unit *u;
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;
{
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) {
/* 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);
}
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;
}
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));
| (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;
}
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);
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);
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);
}
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);
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));
}
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) {
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)
}
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;
}
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)
}
/* 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 ());
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);
}
}
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");
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);
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)
} else {
PUT_PCK64_RES1 (packet, TRUE);
PUT_PCK64_RES2 (packet, 0);
- k->file_pos = res;
+ k->file_pos = cur;
}
}
}
/* 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)
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);
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);
{
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
}
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;
}
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 ();
}
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;
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);
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);
}
-#define CDFS_DOSTYPE 0x43445644
static uae_u8 *cdfs_handler;
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;
}
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;
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;
}
{
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 */
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) {
put_long (parmpacket + PP_FSSIZE, cdfs_handler_len);
addfakefilesys (parmpacket, CDFS_DOSTYPE);
}
-
+#endif
return type;
} else {
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 */
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);
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"
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;
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) {
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);
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);
TCHAR *n;
FILE *f;
+ if (!dir->nname)
+ return NULL;
n = build_nname (dir->nname, FSDB_FILE);
f = _tfopen (n, mode);
xfree (n);
static void kill_fsdb (a_inode *dir)
{
+ if (!dir->nname)
+ return;
TCHAR *n = build_nname (dir->nname, FSDB_FILE);
_wunlink (n);
xfree (n);
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) {
extern void blkdev_entergui (void);
extern void blkdev_exitgui (void);
+bool filesys_do_disk_change (int, bool);
#define MAX_FILESYSTEM_UNITS 30
+#define USE_CDFS 2
+
struct uaedev_mount_info;
extern struct uaedev_mount_info options_mountinfo;
/* 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;
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
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);
#define MYVOLUMEINFO_STREAMS 2
#define MYVOLUMEINFO_ARCHIVE 4
#define MYVOLUMEINFO_REUSABLE 8
+#define MYVOLUMEINFO_CDFS 16
extern int my_getvolumeinfo (const TCHAR *root);
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;
};
};
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);
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];
} 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
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);
+ }
}
}
}
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;
}
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;
}
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;
}
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;
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:
{ 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 },
}
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")) {
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
BEGIN\r
END\r
\r
+ IDD_FILESYS, DIALOG\r
+ BEGIN\r
+ END\r
+\r
IDD_CHIPSET, DIALOG\r
BEGIN\r
BOTTOMMARGIN, 165\r
{
if (p->win32_automount_cddrives && !p->scsi)
p->scsi = 1;
-
bool paused = false;
bool nosound = false;
if (!paused) {
#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""
}
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;
<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" />
<ClCompile Include="..\..\calc.cpp">
<Filter>common</Filter>
</ClCompile>
+ <ClCompile Include="..\..\isofs.cpp">
+ <Filter>common</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="..\resources\35floppy.ico">
+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.
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)