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