--- uae/src/filesys.c 2018/04/24 17:16:47 1.1.1.21 +++ uae/src/filesys.c 2018/04/24 17:18:36 1.1.1.22 @@ -35,12 +35,18 @@ #include "events.h" #include "newcpu.h" #include "filesys.h" +#include "traps.h" #include "autoconf.h" #include "fsusage.h" #include "native2amiga.h" #include "scsidev.h" #include "fsdb.h" +/* Count the number of FS packets waiting to be serviced, for the benefit + * of the idle on STOP code. */ +int active_fs_packets; +uae_sem_t packet_counter_sem; + #define TRACING_ENABLED 0 #if TRACING_ENABLED #define TRACE(x) do { write_log x; } while(0) @@ -117,6 +123,7 @@ typedef struct { char *volname; /* volume name, e.g. CDROM, WORK, etc. */ char *rootdir; /* root unix directory */ int readonly; /* disallow write access? */ + int bootpri; int devno; struct hardfiledata hf; @@ -174,9 +181,9 @@ static void close_filesys_unit (UnitInfo } char *get_filesys_unit (struct uaedev_mount_info *mountinfo, int nr, - char **volname, char **rootdir, int *readonly, - int *secspertrack, int *surfaces, int *reserved, - int *cylinders, int *size, int *blocksize) + char **devname, char **volname, char **rootdir, + int *readonly, int *secspertrack, int *surfaces, int *reserved, + int *cylinders, int *size, int *blocksize, int *bootpri) { UnitInfo *uip = mountinfo->ui + nr; @@ -184,6 +191,7 @@ char *get_filesys_unit (struct uaedev_mo return "No slot allocated for this unit"; *volname = uip->volname ? my_strdup (uip->volname) : 0; + *devname = uip->devname ? my_strdup (uip->devname) : 0; *rootdir = uip->rootdir ? my_strdup (uip->rootdir) : 0; *readonly = uip->readonly; *secspertrack = uip->hf.secspertrack; @@ -192,13 +200,14 @@ char *get_filesys_unit (struct uaedev_mo *size = uip->hf.size; *cylinders = uip->hf.nrcyls; *blocksize = uip->hf.blocksize; + *bootpri = uip->bootpri; return 0; } static char *set_filesys_unit_1 (struct uaedev_mount_info *mountinfo, int nr, - char *volname, char *rootdir, int readonly, - int secspertrack, int surfaces, int reserved, - int blocksize) + const char *devname, const char *volname, const char *rootdir, + int readonly, int secspertrack, int surfaces, int reserved, + int blocksize, int bootpri) { UnitInfo *ui = mountinfo->ui + nr; @@ -243,19 +252,27 @@ static char *set_filesys_unit_1 (struct ui->self = 0; ui->reset_state = FS_STARTUP; ui->rootdir = my_strdup (rootdir); + if (devname != 0 && strlen (devname) != 0) + ui->devname = my_strdup (devname); ui->readonly = readonly; + if (bootpri < -128) + bootpri = -128; + if (bootpri > 127) + bootpri = 127; + ui->bootpri = bootpri; return 0; } char *set_filesys_unit (struct uaedev_mount_info *mountinfo, int nr, - char *volname, char *rootdir, int readonly, - int secspertrack, int surfaces, int reserved, - int blocksize) + const char *devname, const char *volname, const char *rootdir, + int readonly, int secspertrack, int surfaces, int reserved, + int blocksize, int bootpri) { UnitInfo ui = mountinfo->ui[nr]; - char *result = set_filesys_unit_1 (mountinfo, nr, volname, rootdir, readonly, - secspertrack, surfaces, reserved, blocksize); + char *result = set_filesys_unit_1 (mountinfo, nr, devname, volname, rootdir, + readonly, secspertrack, surfaces, reserved, + blocksize, bootpri); if (result) mountinfo->ui[nr] = ui; else @@ -265,9 +282,9 @@ char *set_filesys_unit (struct uaedev_mo } char *add_filesys_unit (struct uaedev_mount_info *mountinfo, - char *volname, char *rootdir, int readonly, - int secspertrack, int surfaces, int reserved, - int blocksize) + const char *devname, const char *volname, const char *rootdir, + int readonly, int secspertrack, int surfaces, int reserved, + int blocksize, int bootpri) { char *retval; int nr = mountinfo->num_units; @@ -277,8 +294,9 @@ char *add_filesys_unit (struct uaedev_mo return "Maximum number of file systems mounted"; mountinfo->num_units++; - retval = set_filesys_unit_1 (mountinfo, nr, volname, rootdir, readonly, - secspertrack, surfaces, reserved, blocksize); + retval = set_filesys_unit_1 (mountinfo, nr, devname, volname, rootdir, readonly, + secspertrack, surfaces, reserved, blocksize, + bootpri); if (retval) mountinfo->num_units--; return retval; @@ -549,11 +567,11 @@ static char *bstr1 (uaecptr addr) { static char buf[256]; int i; - int n = get_byte(addr); + int n = get_byte (addr); addr++; for (i = 0; i < n; i++, addr++) - buf[i] = get_byte(addr); + buf[i] = get_byte (addr); buf[i] = 0; return buf; } @@ -561,11 +579,11 @@ static char *bstr1 (uaecptr addr) static char *bstr (Unit *unit, uaecptr addr) { int i; - int n = get_byte(addr); + int n = get_byte (addr); addr++; for (i = 0; i < n; i++, addr++) - unit->tmpbuf3[i] = get_byte(addr); + unit->tmpbuf3[i] = get_byte (addr); unit->tmpbuf3[i] = 0; return unit->tmpbuf3; } @@ -578,7 +596,7 @@ static char *bstr_cut (Unit *unit, uaecp addr++; for (i = 0; i < n; i++, addr++) { - uae_u8 c = get_byte(addr); + uae_u8 c = get_byte (addr); unit->tmpbuf3[i] = c; if (c == '/' || (c == ':' && colon_seen++ == 0)) p = unit->tmpbuf3 + i + 1; @@ -659,7 +677,7 @@ static void recycle_aino (Unit *unit, a_ int i = 0; while (i < 50) { a_inode *parent = unit->rootnode.prev->parent; - a_inode **aip; + a_inode **aip, *old_prev; aip = &parent->child; if (! parent->locked_children) { @@ -686,13 +704,15 @@ static void recycle_aino (Unit *unit, a_ /* In the previous loop, we went through all children of one parent. Re-arrange the recycled list so that we'll find a different parent the next time around. */ + old_prev = unit->rootnode.prev; do { unit->rootnode.next->prev = unit->rootnode.prev; unit->rootnode.prev->next = unit->rootnode.next; unit->rootnode.next = unit->rootnode.prev; unit->rootnode.prev = unit->rootnode.prev->prev; unit->rootnode.prev->next = unit->rootnode.next->prev = &unit->rootnode; - } while (unit->rootnode.prev->parent == parent); + } while (unit->rootnode.prev != old_prev + && unit->rootnode.prev->parent == parent); } #if 0 { @@ -1133,7 +1153,7 @@ static a_inode *get_aino (Unit *unit, a_ return curr; } -static uae_u32 startup_handler (void) +static uae_u32 startup_handler (TrapContext *dummy) { /* Just got the startup packet. It's in A4. DosBase is in A2, * our allocated volume structure is in D6, A5 is a pointer to @@ -1185,6 +1205,7 @@ static uae_u32 startup_handler (void) unit->ui.volname = my_strdup (uinfo->volname); /* might free later for rename */ unit->ui.rootdir = uinfo->rootdir; unit->ui.readonly = uinfo->readonly; + unit->ui.bootpri = uinfo->bootpri; unit->ui.unit_pipe = uinfo->unit_pipe; unit->ui.back_pipe = uinfo->back_pipe; unit->cmds_complete = 0; @@ -2117,7 +2138,7 @@ action_read (Unit *unit, dpacket packet) int i; PUT_PCK_RES1 (packet, actual); for (i = 0; i < actual; i++) - put_byte(addr + i, buf[i]); + put_byte (addr + i, buf[i]); k->file_pos += actual; } free (buf); @@ -2156,7 +2177,7 @@ action_write (Unit *unit, dpacket packet } for (i = 0; i < size; i++) - buf[i] = get_byte(addr + i); + buf[i] = get_byte (addr + i); PUT_PCK_RES1 (packet, write(k->fd, buf, size)); if (GET_PCK_RES1 (packet) != size) @@ -2753,7 +2774,7 @@ action_flush (Unit *unit, dpacket packet * know whether AmigaOS takes care of that, but this does. */ static uae_sem_t singlethread_int_sem; -static uae_u32 exter_int_helper (void) +static uae_u32 exter_int_helper (TrapContext *dummy) { UnitInfo *uip = current_mountinfo->ui; uaecptr port; @@ -2960,6 +2981,11 @@ static void *filesys_thread (void *unit_ /* The message is sent by our interrupt handler, so make sure an interrupt * happens. */ uae_int_requested = 1; + + uae_sem_wait (&packet_counter_sem); + active_fs_packets--; + uae_sem_post (&packet_counter_sem); + /* Send back the locks. */ if (get_long (ui->self->locklist) != 0) write_comm_pipe_int (ui->back_pipe, (int)(get_long (ui->self->locklist)), 0); @@ -2970,7 +2996,7 @@ static void *filesys_thread (void *unit_ #endif /* Talk about spaghetti code... */ -static uae_u32 filesys_handler (void) +static uae_u32 filesys_handler (TrapContext *dummy) { Unit *unit = find_unit (m68k_areg (regs, 5)); uaecptr packet_addr = m68k_dreg (regs, 3); @@ -3003,6 +3029,10 @@ static uae_u32 filesys_handler (void) put_long (m68k_areg (regs, 3), get_long (get_long (morelocks))); put_long (get_long (morelocks), 0); + uae_sem_wait (&packet_counter_sem); + active_fs_packets++; + uae_sem_post (&packet_counter_sem); + /* The packet wasn't processed yet. */ do_put_mem_long ((uae_u32 *)(msg + 4), 0); write_comm_pipe_pvoid (unit->ui.unit_pipe, (void *)pck, 0); @@ -3047,7 +3077,9 @@ static int get_new_device (char **devnam result = current_deviceno++; } - *devname_amiga = ds (*devname = my_strdup (buffer)); + if (*devname == NULL) + *devname = my_strdup (buffer); + *devname_amiga = ds (*devname); return result; } @@ -3143,7 +3175,7 @@ void filesys_prepare_reset (void) } } -static uae_u32 filesys_diagentry (void) +static uae_u32 filesys_diagentry (TrapContext *dummy) { uaecptr resaddr = m68k_areg (regs, 2) + 0x10; uaecptr start = resaddr; @@ -3152,7 +3184,6 @@ static uae_u32 filesys_diagentry (void) TRACE (("filesystem: diagentry called\n")); filesys_configdev = m68k_areg (regs, 3); - init_filesys_diagentry (); uae_sem_init (&singlethread_int_sem, 0, 1); @@ -3203,7 +3234,6 @@ static uae_u32 filesys_diagentry (void) put_word (resaddr + 6, 0xd1fc); put_long (resaddr + 8, RTAREA_BASE + 8 + 4); /* add.l #RTAREA_BASE+12,a0 */ put_word (resaddr + 12, 0x4e90); /* jsr (a0) */ - put_word (resaddr + 14, 0x7001); /* moveq.l #1,d0 */ put_word (resaddr + 16, RTS); @@ -3213,23 +3243,24 @@ static uae_u32 filesys_diagentry (void) /* Remember a pointer AmigaOS gave us so we can later use it to identify * which unit a given startup message belongs to. */ -static uae_u32 filesys_dev_remember (void) +static uae_u32 filesys_dev_remember (TrapContext *dummy) { int unit_no = m68k_dreg (regs, 6); + UnitInfo *uip = ¤t_mountinfo->ui[unit_no]; uaecptr devicenode = m68k_areg (regs, 3); - current_mountinfo->ui[unit_no].startup = get_long (devicenode + 28); + uip->startup = get_long (devicenode + 28); return devicenode; } /* Fill in per-unit fields of a parampacket */ -static uae_u32 filesys_dev_storeinfo (void) +static uae_u32 filesys_dev_storeinfo (TrapContext *dummy) { UnitInfo *uip = current_mountinfo->ui; int unit_no = m68k_dreg (regs, 6); uaecptr parmpacket = m68k_areg (regs, 0); - put_long (parmpacket, current_mountinfo->ui[unit_no].devname_amiga); + put_long (parmpacket, uip[unit_no].devname_amiga); put_long (parmpacket + 4, is_hardfile (current_mountinfo, unit_no) ? ROM_hardfile_resname : fsdevname); put_long (parmpacket + 8, uip[unit_no].devno); put_long (parmpacket + 12, 0); /* Device flags */ @@ -3237,7 +3268,7 @@ static uae_u32 filesys_dev_storeinfo (vo put_long (parmpacket + 20, uip[unit_no].hf.blocksize >> 2); /* longwords per block */ put_long (parmpacket + 24, 0); /* unused */ put_long (parmpacket + 28, uip[unit_no].hf.surfaces); /* heads */ - put_long (parmpacket + 32, 0); /* unused */ + put_long (parmpacket + 32, 1); /* sectors per block */ put_long (parmpacket + 36, uip[unit_no].hf.secspertrack); /* sectors per track */ put_long (parmpacket + 40, uip[unit_no].hf.reservedblocks); /* reserved blocks */ put_long (parmpacket + 44, 0); /* unused */ @@ -3248,7 +3279,7 @@ static uae_u32 filesys_dev_storeinfo (vo 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, (uae_u32)-1); /* bootPri */ + put_long (parmpacket + 76, uip[unit_no].bootpri); /* bootPri */ put_long (parmpacket + 80, 0x444f5300); /* DOS\0 */ put_long (parmpacket + 84, 0); /* pad */ @@ -3262,14 +3293,14 @@ void filesys_install (void) TRACE (("Installing filesystem\n")); - ROM_filesys_resname = ds("UAEunixfs.resource"); - ROM_filesys_resid = ds("UAE unixfs 0.4"); + ROM_filesys_resname = ds ("UAEunixfs.resource"); + ROM_filesys_resid = ds ("UAE unixfs 0.4"); fsdevname = ds ("uae.device"); /* does not really exist */ ROM_filesys_diagentry = here(); calltrap (deftrap(filesys_diagentry)); - dw(0x4ED0); /* JMP (a0) - jump to code that inits Residents */ + dw (0x4ED0); /* JMP (a0) - jump to code that inits Residents */ loop = here (); /* Special trap for the assembly make_dev routine */ @@ -3294,6 +3325,8 @@ void filesys_install (void) dw (RTS); org (loop); + + uae_sem_init (&packet_counter_sem, 0, 0); } void filesys_install_code (void) @@ -3301,131 +3334,9 @@ void filesys_install_code (void) align(4); /* The last offset comes from the code itself, look for it near the top. */ - EXPANSION_bootcode = here () + 8 + 0x14 + 4; + EXPANSION_bootcode = here () + 8 + 0x1c + 4; /* Ouch. Make sure this is _always_ a multiple of two bytes. */ - filesys_initcode = here() + 8 + 0x28 + 4; - - db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); - db(0x60); db(0x00); db(0x02); db(0x34); db(0x00); db(0x00); db(0x01); db(0x8c); - db(0x00); db(0x00); db(0x00); db(0x2c); db(0x00); db(0x00); db(0x00); db(0xc4); - db(0x00); db(0x00); db(0x00); db(0x18); db(0x00); db(0x00); db(0x01); db(0x54); - db(0x43); db(0xfa); db(0x03); db(0x89); 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(0xff); db(0xfe); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x30); db(0x3c); db(0xff); db(0xfc); - db(0x61); db(0x00); db(0x03); db(0x4c); db(0x2a); db(0x50); db(0x43); db(0xfa); - db(0x03); db(0x6f); db(0x70); db(0x24); db(0x7a); db(0x00); db(0x4e); db(0xae); - db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x66); db(0x0c); db(0x43); db(0xfa); - db(0x03); db(0x5f); db(0x70); db(0x00); db(0x7a); db(0x01); db(0x4e); db(0xae); - db(0xfd); db(0xd8); db(0x28); db(0x40); db(0x70); db(0x58); db(0x72); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40); db(0x7e); db(0x54); - db(0x27); db(0xb5); db(0x78); db(0x00); db(0x78); db(0x00); db(0x59); db(0x87); - db(0x64); db(0xf6); db(0x7c); db(0x00); db(0xbc); db(0xad); db(0x01); db(0x0c); - db(0x64); db(0x18); db(0x20); db(0x4b); db(0x48); db(0xe7); db(0x02); db(0x10); - db(0x2e); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x01); db(0x61); db(0x00); - db(0x01); db(0x04); db(0x4c); db(0xdf); db(0x08); db(0x40); db(0x52); db(0x86); - db(0x60); db(0xe2); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x22); db(0x4c); - db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x30); db(0x3c); db(0xff); db(0x80); - db(0x61); db(0x00); db(0x02); db(0xe4); db(0x4e); db(0x90); db(0x72); db(0x03); - db(0x74); db(0xf6); db(0x20); db(0x7c); db(0x00); db(0x20); db(0x00); db(0x00); - db(0x90); db(0x88); db(0x65); db(0x0a); db(0x67); db(0x08); db(0x78); db(0x00); - db(0x22); db(0x44); db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x4c); db(0xdf); - db(0x7f); db(0xff); 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(0x02); db(0xb8); - db(0x70); db(0x00); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x76); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x30); db(0x3c); db(0xff); db(0x50); - db(0x61); db(0x00); db(0x02); db(0xa4); db(0x70); db(0x02); db(0x4e); db(0x90); - db(0x0c); db(0x80); db(0x00); db(0x00); db(0x00); db(0x01); db(0x6d); db(0x50); - db(0x6e); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x60); db(0xe4); - db(0x0c); db(0x80); db(0x00); db(0x00); db(0x00); db(0x02); db(0x6e); db(0x08); - db(0x20); db(0x01); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x60); db(0xd4); - db(0x0c); db(0x80); db(0x00); db(0x00); db(0x00); db(0x03); db(0x6e); db(0x06); - db(0x4e); db(0xae); db(0xfe); db(0x86); db(0x60); db(0xc6); db(0x0c); db(0x80); - db(0x00); db(0x00); db(0x00); db(0x04); db(0x6e); db(0x06); db(0x4e); db(0xae); - db(0xff); db(0x4c); db(0x60); db(0xb8); db(0x48); db(0xe7); db(0x00); db(0x24); - db(0x24); db(0x49); db(0x22); db(0x6a); db(0x00); db(0x14); db(0x2a); db(0x6a); - db(0x00); db(0x18); db(0x2f); db(0x0a); db(0x4e); db(0x95); db(0x24); db(0x1f); - db(0x42); db(0xaa); db(0x00); db(0x18); db(0x4c); db(0xdf); db(0x24); db(0x00); - db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); db(0x02); db(0x40); - 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(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(0x02); db(0x30); db(0x23); db(0x48); - db(0x00); db(0x0a); db(0x41); db(0xfa); db(0xff); db(0x58); db(0x23); db(0x48); - db(0x00); db(0x0e); db(0x41); db(0xfa); db(0xff); db(0x50); db(0x23); db(0x48); - db(0x00); db(0x12); db(0x13); db(0x7c); db(0x00); db(0xc8); db(0x00); db(0x09); - db(0x13); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x08); db(0x70); db(0x0d); - db(0x4e); db(0xee); db(0xff); db(0x58); db(0x2f); db(0x08); db(0x30); db(0x3c); - db(0xff); db(0xfc); db(0x61); db(0x00); db(0x01); db(0xf2); db(0x2a); db(0x50); - db(0x30); db(0x3c); db(0xff); db(0x28); db(0x61); db(0x00); db(0x01); db(0xe8); - db(0x22); db(0x48); db(0x20); db(0x5f); db(0x4e); db(0x91); db(0x26); db(0x00); - db(0xc0); db(0x85); db(0x66); db(0x00); db(0xff); db(0x16); db(0x2c); db(0x4c); - db(0x4e); db(0xae); db(0xff); db(0x70); db(0x26); db(0x40); db(0x30); db(0x3c); - db(0xff); db(0x20); db(0x61); db(0x00); db(0x01); db(0xca); 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(0x83); - db(0x66); db(0x1c); db(0x27); db(0x7c); db(0x00); db(0x00); db(0x0f); db(0xa0); - db(0x00); db(0x14); db(0x43); db(0xfa); db(0xfe); db(0x20); db(0x20); db(0x09); - db(0xe4); db(0x88); db(0x27); db(0x40); db(0x00); db(0x20); db(0x27); db(0x7c); - db(0xff); db(0xff); db(0xff); db(0xff); db(0x00); db(0x24); db(0x4a); db(0x87); - db(0x67); db(0x36); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0x14); - db(0x72); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x22); db(0x40); - db(0x70); db(0x00); db(0x22); db(0x80); db(0x23); db(0x40); db(0x00); db(0x04); - db(0x33); db(0x40); db(0x00); db(0x0e); db(0x30); db(0x3c); db(0x10); db(0xff); - db(0x90); db(0x06); db(0x33); db(0x40); db(0x00); db(0x08); db(0x23); db(0x6d); - db(0x01); db(0x04); db(0x00); db(0x0a); db(0x23); db(0x4b); db(0x00); db(0x10); - db(0x41); db(0xec); db(0x00); db(0x4a); db(0x4e); db(0xee); db(0xfe); db(0xf2); - db(0x20); db(0x4b); db(0x72); db(0x00); db(0x22); db(0x41); db(0x70); db(0xff); - db(0x2c); db(0x4c); db(0x4e); db(0xee); db(0xff); db(0x6a); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x70); db(0x00); db(0x22); db(0x40); 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(0x01); db(0x59); 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(0x9d); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40); db(0x7c); db(0x00); - db(0x26); db(0x86); db(0x27); db(0x46); db(0x00); db(0x04); db(0x27); db(0x46); - db(0x00); db(0x08); 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(0x00); db(0xfa); db(0x70); db(0x00); - db(0x4e); db(0x90); db(0x60); db(0x7e); 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(0x66); db(0x3c); - db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); db(0x00); db(0xd8); - 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(0xd6); db(0x22); db(0x50); - db(0x20); db(0x40); db(0x20); db(0x28); db(0x00); db(0x04); db(0x6a); db(0x16); - db(0x48); db(0xe7); db(0x00); db(0xc0); db(0x28); db(0x68); db(0x00); db(0x0a); - db(0x61); db(0x48); db(0x53); db(0x85); db(0x4c); db(0xdf); db(0x03); db(0x00); - db(0x24); db(0x89); db(0x20); db(0x49); db(0x60); db(0xdc); db(0x24); db(0x48); - db(0x20); db(0x49); db(0x60); db(0xd6); 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(0x30); - db(0x30); db(0x3c); db(0xff); db(0x30); db(0x61); db(0x00); db(0x00); db(0x88); - db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x0c); db(0x52); db(0x85); - db(0x28); db(0xab); db(0x00); db(0x04); db(0x27); db(0x4c); db(0x00); db(0x04); - db(0x60); db(0x82); db(0x28); db(0x43); db(0x61); db(0x04); db(0x60); db(0x00); - db(0xff); db(0x7c); 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(0xfc); db(0x6c); db(0x02); db(0x80); db(0x00); db(0x00); db(0xff); db(0xff); - db(0xd1); db(0xc0); db(0x4e); db(0x75); db(0x55); db(0x41); db(0x45); db(0x20); - db(0x66); db(0x69); db(0x6c); db(0x65); db(0x73); db(0x79); db(0x73); db(0x74); - db(0x65); db(0x6d); db(0x00); db(0x64); db(0x6f); db(0x73); db(0x2e); db(0x6c); - db(0x69); db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); db(0x65); - db(0x78); db(0x70); db(0x61); db(0x6e); db(0x73); db(0x69); db(0x6f); db(0x6e); - db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x03); db(0xf2); + filesys_initcode = here() + 8 + 0x30 + 4; + #include "filesys_bootrom.c" }