Previous 199869 Revisions Next

r17927 Sunday 16th September, 2012 at 12:50:13 UTC by smf
(MESS) builds after normalization (nw)
[src/mess/tools/imgtool/modules]ti99.c

trunk/src/mess/tools/imgtool/modules/ti99.c
r17926r17927
15051505   L2I_DSK,
15061506   L2I_WIN
15071507};
1508struct u
1508
1509struct ti99_lvl2_imgref
15091510{
15101511   ti99_lvl1_imgref l1_img;/* image format, imgtool image handle, image geometry */
15111512   ti99_AUformat AUformat;   /* AU format */
r17926r17927
15361537      ti99_lvl2_imgref_dsk dsk;
15371538      ti99_lvl2_imgref_win win;
15381539   };               /* structure-specific info */
1539} ti99_lvl2_imgref;
1540};
15401541
15411542/*
15421543    file flags found in fdr (and tifiles)
r17926r17927
17041705*/
17051706struct ti99_lvl2_fileref_dsk
17061707{
1707   ti99_lvl2_imgref *l2_img;
1708   struct ti99_lvl2_imgref *l2_img;
17081709   int fdr_aphysrec;
17091710   dsk_fdr fdr;
17101711};
17111712
17121713struct ti99_lvl2_fileref_win
17131714{
1714   ti99_lvl2_imgref *l2_img;
1715   struct ti99_lvl2_imgref *l2_img;
17151716   unsigned fphysrecs;            /* copy of field in the eldest FDR */
17161717   unsigned eldestfdr_aphysrec;   /* aphysrec address of the eldest FDR */
17171718   unsigned curfdr_aphysrec;      /* aphysrec address of the currently open sibling FDR */
r17926r17927
17301731   L2F_WIN,
17311732   L2F_TIFILES
17321733};
1733struct u
1734
1735struct ti99_lvl2_fileref
17341736{
17351737   l2f_type_t type;
17361738   union
r17926r17927
17391741      ti99_lvl2_fileref_win win;
17401742      ti99_lvl2_fileref_tifiles tifiles;
17411743   };
1742} ti99_lvl2_fileref;
1744};
17431745
1744
1745
17461746/*
17471747    Compare two (possibly empty) catalog entry for qsort
17481748*/
r17926r17927
17851785
17861786    Return an error code if there was an error, 0 otherwise.
17871787*/
1788static int dsk_read_catalog(ti99_lvl2_imgref *l2_img, int aphysrec, ti99_catalog *dest)
1788static int dsk_read_catalog(struct ti99_lvl2_imgref *l2_img, int aphysrec, ti99_catalog *dest)
17891789{
1790   int totphysrecs = l2_img->u.dsk.totphysrecs;
1790   int totphysrecs = l2_img->dsk.totphysrecs;
17911791   UINT16BE fdir_buf[128];
17921792   dsk_fdr fdr;
17931793   int i;
r17926r17927
18561856
18571857    Return an error code if there was an error, 0 otherwise.
18581858*/
1859static int win_read_catalog(ti99_lvl2_imgref *l2_img, int DDR_AU, ti99_catalog *dest)
1859static int win_read_catalog(struct ti99_lvl2_imgref *l2_img, int DDR_AU, ti99_catalog *dest)
18601860{
18611861   win_vib_ddr ddr_buf;
18621862   UINT16BE fdir_buf[128];
r17926r17927
19791979    out_is_dir: TRUE if element is a directory
19801980    catalog_index: on output, index of file catalog entry (may be NULL)
19811981*/
1982static int dsk_find_catalog_entry(ti99_lvl2_imgref *l2_img, const char *fpath, int *parent_ref_valid, int *parent_ref, int *out_is_dir, int *catalog_index)
1982static int dsk_find_catalog_entry(struct ti99_lvl2_imgref *l2_img, const char *fpath, int *parent_ref_valid, int *parent_ref, int *out_is_dir, int *catalog_index)
19831983{
19841984   int i;
19851985   const ti99_catalog *cur_catalog;
r17926r17927
19891989   int is_dir = FALSE;
19901990
19911991
1992   cur_catalog = & l2_img->u.dsk.catalogs[0];
1992   cur_catalog = & l2_img->dsk.catalogs[0];
19931993   if (parent_ref_valid)
19941994      (* parent_ref_valid) = FALSE;
19951995   if (parent_ref)
r17926r17927
20492049            return IMGTOOLERR_BADFILENAME;
20502050
20512051         /* initialize cur_catalog */
2052         cur_catalog = & l2_img->u.dsk.catalogs[i+1];
2052         cur_catalog = & l2_img->dsk.catalogs[i+1];
20532053         if (parent_ref)
20542054            *parent_ref = i+1;
20552055      }
r17926r17927
20792079    out_is_dir: TRUE if element is a directory
20802080    catalog_index: on output, index of file catalog entry (may be NULL)
20812081*/
2082static int win_find_catalog_entry(ti99_lvl2_imgref *l2_img, const char *fpath,
2082static int win_find_catalog_entry(struct ti99_lvl2_imgref *l2_img, const char *fpath,
20832083                           int *parent_ref_valid, int *parent_ddr_AU, ti99_catalog *parent_catalog,
20842084                           int *out_is_dir, int *catalog_index)
20852085{
r17926r17927
21792179    l2_img: image reference
21802180    fdr_AU: on output, address of allocated AU
21812181*/
2182static int alloc_fdr_AU(ti99_lvl2_imgref *l2_img, unsigned *fdr_AU)
2182static int alloc_fdr_AU(struct ti99_lvl2_imgref *l2_img, unsigned *fdr_AU)
21832183{
21842184   int totAUs = l2_img->AUformat.totAUs;
21852185   int i;
r17926r17927
21982198   return IMGTOOLERR_NOSPACE;
21992199}
22002200
2201INLINE int get_dsk_fdr_cluster_baseAU(ti99_lvl2_imgref *l2_img, dsk_fdr *fdr, int cluster_index)
2201INLINE int get_dsk_fdr_cluster_baseAU(struct ti99_lvl2_imgref *l2_img, dsk_fdr *fdr, int cluster_index)
22022202{
22032203   int reply;
22042204
r17926r17927
22112211   return reply;
22122212}
22132213
2214INLINE int get_dsk_fdr_cluster_baseaphysrec(ti99_lvl2_imgref *l2_img, dsk_fdr *fdr, int cluster_index)
2214INLINE int get_dsk_fdr_cluster_baseaphysrec(struct ti99_lvl2_imgref *l2_img, dsk_fdr *fdr, int cluster_index)
22152215{
22162216   int reply;
22172217
r17926r17927
22352235   fdr->clusters[cluster_index][2] = data >> 4;
22362236}
22372237
2238INLINE void set_dsk_fdr_cluster(ti99_lvl2_imgref *l2_img, dsk_fdr *fdr, int cluster_index, int baseAU, int lastfphysrec)
2238INLINE void set_dsk_fdr_cluster(struct ti99_lvl2_imgref *l2_img, dsk_fdr *fdr, int cluster_index, int baseAU, int lastfphysrec)
22392239{
22402240   /* convert AU address to FDR value */
22412241   if (l2_img->AUformat.physrecsperAU <= 2)
r17926r17927
22692269   set_UINT16LE(&fdr->fixrecs_LSW, data & 0xffff);
22702270}
22712271
2272INLINE unsigned get_win_fdr_prevsibFDR_aphysrec(ti99_lvl2_imgref *l2_img, win_fdr *fdr)
2272INLINE unsigned get_win_fdr_prevsibFDR_aphysrec(struct ti99_lvl2_imgref *l2_img, win_fdr *fdr)
22732273{
22742274   unsigned prevsibFDR_AU = get_UINT16BE(fdr->prevsibFDR_AU);
22752275
r17926r17927
22782278         : 0;
22792279}
22802280
2281INLINE unsigned get_win_fdr_nextsibFDR_aphysrec(ti99_lvl2_imgref *l2_img, win_fdr *fdr)
2281INLINE unsigned get_win_fdr_nextsibFDR_aphysrec(struct ti99_lvl2_imgref *l2_img, win_fdr *fdr)
22822282{
22832283   unsigned nextsibFDR_AU = get_UINT16BE(fdr->nextsibFDR_AU);
22842284
r17926r17927
27952795/*
27962796    Allocate a new (empty) file
27972797*/
2798static int new_file_lvl2_dsk(ti99_lvl2_imgref *l2_img, int parent_ref, char filename[10], ti99_lvl2_fileref *l2_file)
2798static int new_file_lvl2_dsk(struct ti99_lvl2_imgref *l2_img, int parent_ref, char filename[10], struct ti99_lvl2_fileref *l2_file)
27992799{
2800   ti99_catalog *catalog = &l2_img->u.dsk.catalogs[parent_ref];
2800   ti99_catalog *catalog = &l2_img->dsk.catalogs[parent_ref];
28012801   unsigned fdr_AU, fdr_aphysrec;
28022802   int catalog_index, i;
28032803   int reply = 0;
r17926r17927
28422842
28432843   /* set up file handle */
28442844   l2_file->type = L2F_DSK;
2845   l2_file->u.dsk.l2_img = l2_img;
2846   l2_file->u.dsk.fdr_aphysrec = fdr_aphysrec;
2847   memset(&l2_file->u.dsk.fdr, 0, sizeof(l2_file->u.dsk.fdr));
2848   memcpy(l2_file->u.dsk.fdr.name, filename, 10);
2845   l2_file->dsk.l2_img = l2_img;
2846   l2_file->dsk.fdr_aphysrec = fdr_aphysrec;
2847   memset(&l2_file->dsk.fdr, 0, sizeof(l2_file->dsk.fdr));
2848   memcpy(l2_file->dsk.fdr.name, filename, 10);
28492849
28502850   return 0;
28512851}
r17926r17927
28532853/*
28542854    Allocate a new (empty) file
28552855*/
2856static int new_file_lvl2_win(ti99_lvl2_imgref *l2_img, ti99_catalog *parent_catalog, char filename[10], ti99_lvl2_fileref *l2_file)
2856static int new_file_lvl2_win(struct ti99_lvl2_imgref *l2_img, ti99_catalog *parent_catalog, char filename[10], struct ti99_lvl2_fileref *l2_file)
28572857{
28582858   unsigned fdr_AU;
28592859   int catalog_index, i;
r17926r17927
28942894
28952895   /* set up file handle */
28962896   l2_file->type = L2F_WIN;
2897   l2_file->u.win.l2_img = l2_img;
2898   l2_file->u.win.fphysrecs = 0;
2899   l2_file->u.win.eldestfdr_aphysrec = fdr_AU * l2_img->AUformat.physrecsperAU;
2900   l2_file->u.win.curfdr_aphysrec = l2_file->u.win.eldestfdr_aphysrec;
2901   memset(&l2_file->u.win.curfdr, 0, sizeof(l2_file->u.win.curfdr));
2902   memcpy(l2_file->u.win.curfdr.name, filename, 10);
2897   l2_file->win.l2_img = l2_img;
2898   l2_file->win.fphysrecs = 0;
2899   l2_file->win.eldestfdr_aphysrec = fdr_AU * l2_img->AUformat.physrecsperAU;
2900   l2_file->win.curfdr_aphysrec = l2_file->win.eldestfdr_aphysrec;
2901   memset(&l2_file->win.curfdr, 0, sizeof(l2_file->win.curfdr));
2902   memcpy(l2_file->win.curfdr.name, filename, 10);
29032903
29042904   return 0;
29052905}
r17926r17927
29072907/*
29082908    Allocate a new (empty) file
29092909*/
2910static int new_file_lvl2_tifiles(imgtool_stream *file_handle, ti99_lvl2_fileref *l2_file)
2910static int new_file_lvl2_tifiles(imgtool_stream *file_handle, struct ti99_lvl2_fileref *l2_file)
29112911{
29122912   /* set up file handle */
29132913   l2_file->type = L2F_TIFILES;
2914   l2_file->u.tifiles.file_handle = file_handle;
2915   memset(&l2_file->u.tifiles.hdr, 0, sizeof(l2_file->u.tifiles.hdr));
2916   l2_file->u.tifiles.hdr.tifiles[0] = '\7';
2917   l2_file->u.tifiles.hdr.tifiles[1] = 'T';
2918   l2_file->u.tifiles.hdr.tifiles[2] = 'I';
2919   l2_file->u.tifiles.hdr.tifiles[3] = 'F';
2920   l2_file->u.tifiles.hdr.tifiles[4] = 'I';
2921   l2_file->u.tifiles.hdr.tifiles[5] = 'L';
2922   l2_file->u.tifiles.hdr.tifiles[6] = 'E';
2923   l2_file->u.tifiles.hdr.tifiles[7] = 'S';
2914   l2_file->tifiles.file_handle = file_handle;
2915   memset(&l2_file->tifiles.hdr, 0, sizeof(l2_file->tifiles.hdr));
2916   l2_file->tifiles.hdr.tifiles[0] = '\7';
2917   l2_file->tifiles.hdr.tifiles[1] = 'T';
2918   l2_file->tifiles.hdr.tifiles[2] = 'I';
2919   l2_file->tifiles.hdr.tifiles[3] = 'F';
2920   l2_file->tifiles.hdr.tifiles[4] = 'I';
2921   l2_file->tifiles.hdr.tifiles[5] = 'L';
2922   l2_file->tifiles.hdr.tifiles[6] = 'E';
2923   l2_file->tifiles.hdr.tifiles[7] = 'S';
29242924
29252925   return 0;
29262926}
r17926r17927
29322932    fpath: access path to the file
29332933    file: set up if open is successful
29342934*/
2935static int open_file_lvl2_dsk(ti99_lvl2_imgref *l2_img, const char *fpath, ti99_lvl2_fileref *l2_file)
2935static int open_file_lvl2_dsk(struct ti99_lvl2_imgref *l2_img, const char *fpath, struct ti99_lvl2_fileref *l2_file)
29362936{
29372937   int parent_ref, is_dir, catalog_index;
29382938   int reply;
r17926r17927
29472947      return IMGTOOLERR_BADFILENAME;
29482948
29492949   l2_file->type = L2F_DSK;
2950   l2_file->u.dsk.l2_img = l2_img;
2951   l2_file->u.dsk.fdr_aphysrec = l2_img->u.dsk.catalogs[parent_ref].files[catalog_index].fdr_ptr;
2952   if (read_absolute_physrec(& l2_img->l1_img, l2_file->u.dsk.fdr_aphysrec, &l2_file->u.dsk.fdr))
2950   l2_file->dsk.l2_img = l2_img;
2951   l2_file->dsk.fdr_aphysrec = l2_img->dsk.catalogs[parent_ref].files[catalog_index].fdr_ptr;
2952   if (read_absolute_physrec(& l2_img->l1_img, l2_file->dsk.fdr_aphysrec, &l2_file->dsk.fdr))
29532953      return IMGTOOLERR_READERROR;
29542954
29552955   return 0;
r17926r17927
29622962    fpath: access path to the file
29632963    file: set up if open is successful
29642964*/
2965static int open_file_lvl2_win(ti99_lvl2_imgref *l2_img, const char *fpath, ti99_lvl2_fileref *l2_file)
2965static int open_file_lvl2_win(struct ti99_lvl2_imgref *l2_img, const char *fpath, struct ti99_lvl2_fileref *l2_file)
29662966{
29672967   int parent_ref, is_dir, catalog_index;
29682968   ti99_catalog catalog;
r17926r17927
29772977      return IMGTOOLERR_BADFILENAME;
29782978
29792979   l2_file->type = L2F_WIN;
2980   l2_file->u.win.l2_img = l2_img;
2981   l2_file->u.win.eldestfdr_aphysrec = catalog.files[catalog_index].fdr_ptr * l2_img->AUformat.physrecsperAU;
2982   l2_file->u.win.curfdr_aphysrec = l2_file->u.win.eldestfdr_aphysrec;
2983   if (read_absolute_physrec(& l2_img->l1_img, l2_file->u.win.curfdr_aphysrec, &l2_file->u.win.curfdr))
2980   l2_file->win.l2_img = l2_img;
2981   l2_file->win.eldestfdr_aphysrec = catalog.files[catalog_index].fdr_ptr * l2_img->AUformat.physrecsperAU;
2982   l2_file->win.curfdr_aphysrec = l2_file->win.eldestfdr_aphysrec;
2983   if (read_absolute_physrec(& l2_img->l1_img, l2_file->win.curfdr_aphysrec, &l2_file->win.curfdr))
29842984      return IMGTOOLERR_READERROR;
2985   l2_file->u.win.fphysrecs = get_win_fdr_fphysrecs(&l2_file->u.win.curfdr);
2985   l2_file->win.fphysrecs = get_win_fdr_fphysrecs(&l2_file->win.curfdr);
29862986
29872987   /* check integrity of FDR sibling chain */
29882988   /* note that as we check that the back chain is consistent with the forward
29892989    chain, we will also detect any cycle in the sibling chain, so we do not
29902990    need to check against them explicitely */
2991   if (get_UINT16BE(l2_file->u.win.curfdr.prevsibFDR_AU) != 0)
2991   if (get_UINT16BE(l2_file->win.curfdr.prevsibFDR_AU) != 0)
29922992      return IMGTOOLERR_CORRUPTIMAGE;
29932993
29942994   {
r17926r17927
29992999
30003000      cur_fphysrec = 0;
30013001      pastendoflist_flag = 0;
3002      cur_fdr = &l2_file->u.win.curfdr;
3003      curfdr_aphysrec = l2_file->u.win.eldestfdr_aphysrec;
3002      cur_fdr = &l2_file->win.curfdr;
3003      curfdr_aphysrec = l2_file->win.eldestfdr_aphysrec;
30043004
30053005      while (1)
30063006      {
r17926r17927
30373037            return IMGTOOLERR_CORRUPTIMAGE;
30383038
30393039         /* update current file physrec position to point to end of sibling FDR */
3040         cur_fphysrec += sibFDR_AUlen * l2_file->u.win.l2_img->AUformat.physrecsperAU;
3040         cur_fphysrec += sibFDR_AUlen * l2_file->win.l2_img->AUformat.physrecsperAU;
30413041
30423042         /* exit loop if end of sibling chain */
30433043         if (! get_UINT16BE(cur_fdr->nextsibFDR_AU))
30443044            break;
30453045
30463046         /* otherwise read next FDR */
3047         if (get_UINT16BE(cur_fdr->nextsibFDR_AU) >= l2_file->u.win.l2_img->AUformat.totAUs)
3047         if (get_UINT16BE(cur_fdr->nextsibFDR_AU) >= l2_file->win.l2_img->AUformat.totAUs)
30483048            return IMGTOOLERR_CORRUPTIMAGE;
30493049
30503050         prevfdr_aphysrec = curfdr_aphysrec;
3051         curfdr_aphysrec = get_win_fdr_nextsibFDR_aphysrec(l2_file->u.win.l2_img, cur_fdr);
3052         if (read_absolute_physrec(& l2_file->u.win.l2_img->l1_img, curfdr_aphysrec, &fdr_buf))
3051         curfdr_aphysrec = get_win_fdr_nextsibFDR_aphysrec(l2_file->win.l2_img, cur_fdr);
3052         if (read_absolute_physrec(& l2_file->win.l2_img->l1_img, curfdr_aphysrec, &fdr_buf))
30533053            return IMGTOOLERR_READERROR;
30543054         cur_fdr = &fdr_buf;
30553055
30563056         /* check that back chaining is consistent with forward chaining */
3057         if (get_win_fdr_prevsibFDR_aphysrec(l2_file->u.win.l2_img, &fdr_buf) != prevfdr_aphysrec)
3057         if (get_win_fdr_prevsibFDR_aphysrec(l2_file->win.l2_img, &fdr_buf) != prevfdr_aphysrec)
30583058            return IMGTOOLERR_CORRUPTIMAGE;
30593059         /*  check fphysrecs field */
30603060         if (get_win_fdr_fphysrecs(&fdr_buf) != cur_fphysrec)
30613061            return IMGTOOLERR_CORRUPTIMAGE;
30623062
30633063         /* check consistency of informative fields (name, record format, flags, etc) */
3064         if (memcmp(fdr_buf.name, l2_file->u.win.curfdr.name, 10)
3065               || (get_UINT16BE(fdr_buf.xreclen) != get_UINT16BE(l2_file->u.win.curfdr.xreclen))
3066               || (fdr_buf.flags != l2_file->u.win.curfdr.flags)
3067               || (fdr_buf.recsperphysrec != l2_file->u.win.curfdr.recsperphysrec)
3068               || (fdr_buf.eof != l2_file->u.win.curfdr.eof)
3069               || (fdr_buf.reclen != l2_file->u.win.curfdr.reclen)
3070               || (get_UINT16LE(fdr_buf.fixrecs_LSW) != get_UINT16LE(l2_file->u.win.curfdr.fixrecs_LSW))
3071               || memcmp(&fdr_buf.creation, &l2_file->u.win.curfdr.creation, 4)
3072               || memcmp(&fdr_buf.update, &l2_file->u.win.curfdr.update, 4)
3073               /*|| memcmp(fdr_buf.id, l2_file->u.win.curfdr.id, 2)*/
3074               || (get_UINT16BE(fdr_buf.parent_FDIR_AU) != get_UINT16BE(l2_file->u.win.curfdr.parent_FDIR_AU))
3075               || ((fdr_buf.xinfo_MSB & 0xf) != (l2_file->u.win.curfdr.xinfo_MSB & 0xf)))
3064         if (memcmp(fdr_buf.name, l2_file->win.curfdr.name, 10)
3065               || (get_UINT16BE(fdr_buf.xreclen) != get_UINT16BE(l2_file->win.curfdr.xreclen))
3066               || (fdr_buf.flags != l2_file->win.curfdr.flags)
3067               || (fdr_buf.recsperphysrec != l2_file->win.curfdr.recsperphysrec)
3068               || (fdr_buf.eof != l2_file->win.curfdr.eof)
3069               || (fdr_buf.reclen != l2_file->win.curfdr.reclen)
3070               || (get_UINT16LE(fdr_buf.fixrecs_LSW) != get_UINT16LE(l2_file->win.curfdr.fixrecs_LSW))
3071               || memcmp(&fdr_buf.creation, &l2_file->win.curfdr.creation, 4)
3072               || memcmp(&fdr_buf.update, &l2_file->win.curfdr.update, 4)
3073               /*|| memcmp(fdr_buf.id, l2_file->win.curfdr.id, 2)*/
3074               || (get_UINT16BE(fdr_buf.parent_FDIR_AU) != get_UINT16BE(l2_file->win.curfdr.parent_FDIR_AU))
3075               || ((fdr_buf.xinfo_MSB & 0xf) != (l2_file->win.curfdr.xinfo_MSB & 0xf)))
30763076            return IMGTOOLERR_CORRUPTIMAGE;
30773077      }
3078      if (cur_fphysrec < l2_file->u.win.fphysrecs)
3078      if (cur_fphysrec < l2_file->win.fphysrecs)
30793079         return IMGTOOLERR_CORRUPTIMAGE;
30803080   }
30813081
r17926r17927
30853085/*
30863086    Open an existing file in TIFILES format
30873087*/
3088static int open_file_lvl2_tifiles(imgtool_stream *file_handle, ti99_lvl2_fileref *l2_file)
3088static int open_file_lvl2_tifiles(imgtool_stream *file_handle, struct ti99_lvl2_fileref *l2_file)
30893089{
30903090   /* set up file handle */
30913091   l2_file->type = L2F_TIFILES;
3092   l2_file->u.tifiles.file_handle = file_handle;
3092   l2_file->tifiles.file_handle = file_handle;
30933093
30943094   /* seek to header */
3095   if (stream_seek(l2_file->u.tifiles.file_handle, 0, SEEK_SET))
3095   if (stream_seek(l2_file->tifiles.file_handle, 0, SEEK_SET))
30963096      return IMGTOOLERR_READERROR;
30973097   /* read it */
3098   if (stream_read(l2_file->u.tifiles.file_handle, &l2_file->u.tifiles.hdr, sizeof(l2_file->u.tifiles.hdr)) != sizeof(l2_file->u.tifiles.hdr))
3098   if (stream_read(l2_file->tifiles.file_handle, &l2_file->tifiles.hdr, sizeof(l2_file->tifiles.hdr)) != sizeof(l2_file->tifiles.hdr))
30993099      return IMGTOOLERR_READERROR;
31003100
31013101   return 0;
r17926r17927
32113211/*
32123212    read a 256-byte physical record from a file
32133213*/
3214static int read_file_physrec(ti99_lvl2_fileref *l2_file, unsigned fphysrec, void *dest)
3214static int read_file_physrec(struct ti99_lvl2_fileref *l2_file, unsigned fphysrec, void *dest)
32153215{
32163216   int errorcode;
32173217   unsigned aphysrec;
r17926r17927
32203220   {
32213221   case L2F_DSK:
32223222      /* compute absolute physrec address */
3223      errorcode = dsk_fphysrec_to_aphysrec(&l2_file->u.dsk, fphysrec, &aphysrec);
3223      errorcode = dsk_fphysrec_to_aphysrec(&l2_file->dsk, fphysrec, &aphysrec);
32243224      if (errorcode)
32253225         return errorcode;
32263226      /* read physrec */
3227      if (read_absolute_physrec(& l2_file->u.dsk.l2_img->l1_img, aphysrec, dest))
3227      if (read_absolute_physrec(& l2_file->dsk.l2_img->l1_img, aphysrec, dest))
32283228         return IMGTOOLERR_READERROR;
32293229      break;
32303230
32313231   case L2F_WIN:
32323232      /* compute absolute physrec address */
3233      errorcode = win_fphysrec_to_aphysrec(&l2_file->u.win, fphysrec, &aphysrec);
3233      errorcode = win_fphysrec_to_aphysrec(&l2_file->win, fphysrec, &aphysrec);
32343234      if (errorcode)
32353235         return errorcode;
32363236      /* read physrec */
3237      if (read_absolute_physrec(& l2_file->u.win.l2_img->l1_img, aphysrec, dest))
3237      if (read_absolute_physrec(& l2_file->win.l2_img->l1_img, aphysrec, dest))
32383238         return IMGTOOLERR_READERROR;
32393239      break;
32403240
32413241   case L2F_TIFILES:
32423242      /* seek to physrec */
3243      if (stream_seek(l2_file->u.tifiles.file_handle, 128+256*fphysrec, SEEK_SET))
3243      if (stream_seek(l2_file->tifiles.file_handle, 128+256*fphysrec, SEEK_SET))
32443244         return IMGTOOLERR_READERROR;
32453245      /* read it */
3246      if (stream_read(l2_file->u.tifiles.file_handle, dest, 256) != 256)
3246      if (stream_read(l2_file->tifiles.file_handle, dest, 256) != 256)
32473247         return IMGTOOLERR_READERROR;
32483248      break;
32493249   }
r17926r17927
32543254/*
32553255    read a 256-byte physical record from a file
32563256*/
3257static int write_file_physrec(ti99_lvl2_fileref *l2_file, unsigned fphysrec, const void *src)
3257static int write_file_physrec(struct ti99_lvl2_fileref *l2_file, unsigned fphysrec, const void *src)
32583258{
32593259   int errorcode;
32603260   unsigned aphysrec;
r17926r17927
32633263   {
32643264   case L2F_DSK:
32653265      /* compute absolute physrec address */
3266      errorcode = dsk_fphysrec_to_aphysrec(&l2_file->u.dsk, fphysrec, &aphysrec);
3266      errorcode = dsk_fphysrec_to_aphysrec(&l2_file->dsk, fphysrec, &aphysrec);
32673267      if (errorcode)
32683268         return errorcode;
32693269      /* write physrec */
3270      if (write_absolute_physrec(& l2_file->u.dsk.l2_img->l1_img, aphysrec, src))
3270      if (write_absolute_physrec(& l2_file->dsk.l2_img->l1_img, aphysrec, src))
32713271         return IMGTOOLERR_WRITEERROR;
32723272      break;
32733273
32743274   case L2F_WIN:
32753275      /* compute absolute physrec address */
3276      errorcode = win_fphysrec_to_aphysrec(&l2_file->u.win, fphysrec, &aphysrec);
3276      errorcode = win_fphysrec_to_aphysrec(&l2_file->win, fphysrec, &aphysrec);
32773277      if (errorcode)
32783278         return errorcode;
32793279      /* write physrec */
3280      if (write_absolute_physrec(& l2_file->u.win.l2_img->l1_img, aphysrec, src))
3280      if (write_absolute_physrec(& l2_file->win.l2_img->l1_img, aphysrec, src))
32813281         return IMGTOOLERR_WRITEERROR;
32823282      break;
32833283
32843284   case L2F_TIFILES:
32853285      /* seek to physrec */
3286      if (stream_seek(l2_file->u.tifiles.file_handle, 128+256*fphysrec, SEEK_SET))
3286      if (stream_seek(l2_file->tifiles.file_handle, 128+256*fphysrec, SEEK_SET))
32873287         return IMGTOOLERR_WRITEERROR;
32883288      /* write it */
3289      if (stream_write(l2_file->u.tifiles.file_handle, src, 256) != 256)
3289      if (stream_write(l2_file->tifiles.file_handle, src, 256) != 256)
32903290         return IMGTOOLERR_WRITEERROR;
32913291      break;
32923292   }
r17926r17927
32983298    Write a field in every fdr record associated to a file
32993299*/
33003300#ifdef UNUSED_FUNCTION
3301static int set_win_fdr_field(ti99_lvl2_fileref *l2_file, size_t offset, size_t size, void *data)
3301static int set_win_fdr_field(struct ti99_lvl2_fileref *l2_file, size_t offset, size_t size, void *data)
33023302{
33033303    win_fdr fdr_buf;
33043304    unsigned fdr_aphysrec;
33053305    int errorcode = 0;
33063306
3307    for (fdr_aphysrec = l2_file->u.win.eldestfdr_aphysrec;
3308            fdr_aphysrec && ((errorcode = (read_absolute_physrec(&l2_file->u.win.l2_img->l1_img, fdr_aphysrec, &fdr_buf) ? IMGTOOLERR_READERROR : 0)) == 0);
3309            fdr_aphysrec = get_win_fdr_nextsibFDR_physrec(l2_file->u.win.l2_img, &fdr_buf))
3307    for (fdr_aphysrec = l2_file->win.eldestfdr_aphysrec;
3308            fdr_aphysrec && ((errorcode = (read_absolute_physrec(&l2_file->win.l2_img->l1_img, fdr_aphysrec, &fdr_buf) ? IMGTOOLERR_READERROR : 0)) == 0);
3309            fdr_aphysrec = get_win_fdr_nextsibFDR_physrec(l2_file->win.l2_img, &fdr_buf))
33103310    {
33113311        memcpy(((UINT8 *) &fdr_buf) + offset, data, size);
3312        if (write_absolute_physrec(&l2_file->u.win.l2_img->l1_img, fdr_aphysrec, &fdr_buf))
3312        if (write_absolute_physrec(&l2_file->win.l2_img->l1_img, fdr_aphysrec, &fdr_buf))
33133313        {
33143314            errorcode = IMGTOOLERR_WRITEERROR;
33153315            break;
r17926r17927
33203320}
33213321#endif
33223322
3323static UINT8 get_file_flags(ti99_lvl2_fileref *l2_file)
3323static UINT8 get_file_flags(struct ti99_lvl2_fileref *l2_file)
33243324{
33253325   int reply = 0;
33263326
33273327   switch (l2_file->type)
33283328   {
33293329   case L2F_DSK:
3330      reply = l2_file->u.dsk.fdr.flags;
3330      reply = l2_file->dsk.fdr.flags;
33313331      break;
33323332
33333333   case L2F_WIN:
3334      reply = l2_file->u.win.curfdr.flags;
3334      reply = l2_file->win.curfdr.flags;
33353335      break;
33363336
33373337   case L2F_TIFILES:
3338      reply = l2_file->u.tifiles.hdr.flags;
3338      reply = l2_file->tifiles.hdr.flags;
33393339      break;
33403340   }
33413341
33423342   return reply;
33433343}
33443344
3345static void set_file_flags(ti99_lvl2_fileref *l2_file, UINT8 data)
3345static void set_file_flags(struct ti99_lvl2_fileref *l2_file, UINT8 data)
33463346{
33473347   switch (l2_file->type)
33483348   {
33493349   case L2F_DSK:
3350      l2_file->u.dsk.fdr.flags = data;
3350      l2_file->dsk.fdr.flags = data;
33513351      break;
33523352
33533353   case L2F_WIN:
3354      l2_file->u.win.curfdr.flags = data;
3354      l2_file->win.curfdr.flags = data;
33553355      break;
33563356
33573357   case L2F_TIFILES:
3358      l2_file->u.tifiles.hdr.flags = data;
3358      l2_file->tifiles.hdr.flags = data;
33593359      break;
33603360   }
33613361}
33623362
3363static UINT8 get_file_recsperphysrec(ti99_lvl2_fileref *l2_file)
3363static UINT8 get_file_recsperphysrec(struct ti99_lvl2_fileref *l2_file)
33643364{
33653365   int reply = 0;
33663366
33673367   switch (l2_file->type)
33683368   {
33693369   case L2F_DSK:
3370      reply = l2_file->u.dsk.fdr.recsperphysrec;
3370      reply = l2_file->dsk.fdr.recsperphysrec;
33713371      break;
33723372
33733373   case L2F_WIN:
3374      reply = l2_file->u.win.curfdr.recsperphysrec;
3374      reply = l2_file->win.curfdr.recsperphysrec;
33753375      break;
33763376
33773377   case L2F_TIFILES:
3378      reply = l2_file->u.tifiles.hdr.recsperphysrec;
3378      reply = l2_file->tifiles.hdr.recsperphysrec;
33793379      break;
33803380   }
33813381
33823382   return reply;
33833383}
33843384
3385static void set_file_recsperphysrec(ti99_lvl2_fileref *l2_file, UINT8 data)
3385static void set_file_recsperphysrec(struct ti99_lvl2_fileref *l2_file, UINT8 data)
33863386{
33873387   switch (l2_file->type)
33883388   {
33893389   case L2F_DSK:
3390      l2_file->u.dsk.fdr.recsperphysrec = data;
3390      l2_file->dsk.fdr.recsperphysrec = data;
33913391      break;
33923392
33933393   case L2F_WIN:
3394      l2_file->u.win.curfdr.recsperphysrec = data;
3394      l2_file->win.curfdr.recsperphysrec = data;
33953395      break;
33963396
33973397   case L2F_TIFILES:
3398      l2_file->u.tifiles.hdr.recsperphysrec = data;
3398      l2_file->tifiles.hdr.recsperphysrec = data;
33993399      break;
34003400   }
34013401}
34023402
3403static unsigned get_file_fphysrecs(ti99_lvl2_fileref *l2_file)
3403static unsigned get_file_fphysrecs(struct ti99_lvl2_fileref *l2_file)
34043404{
34053405   int reply = 0;
34063406
34073407   switch (l2_file->type)
34083408   {
34093409   case L2F_DSK:
3410      reply = get_UINT16BE(l2_file->u.dsk.fdr.fphysrecs);
3410      reply = get_UINT16BE(l2_file->dsk.fdr.fphysrecs);
34113411      break;
34123412
34133413   case L2F_WIN:
3414      reply = l2_file->u.win.fphysrecs;
3414      reply = l2_file->win.fphysrecs;
34153415      break;
34163416
34173417   case L2F_TIFILES:
3418      reply = get_UINT16BE(l2_file->u.tifiles.hdr.fphysrecs);
3418      reply = get_UINT16BE(l2_file->tifiles.hdr.fphysrecs);
34193419      break;
34203420   }
34213421
34223422   return reply;
34233423}
34243424
3425static int set_file_fphysrecs(ti99_lvl2_fileref *l2_file, unsigned data)
3425static int set_file_fphysrecs(struct ti99_lvl2_fileref *l2_file, unsigned data)
34263426{
34273427   switch (l2_file->type)
34283428   {
34293429   case L2F_DSK:
34303430      if (data >= 65536)
34313431         return IMGTOOLERR_UNIMPLEMENTED;
3432      set_UINT16BE(&l2_file->u.dsk.fdr.fphysrecs, data);
3432      set_UINT16BE(&l2_file->dsk.fdr.fphysrecs, data);
34333433      break;
34343434
34353435   case L2F_WIN:
3436      l2_file->u.win.fphysrecs = data;
3436      l2_file->win.fphysrecs = data;
34373437      break;
34383438
34393439   case L2F_TIFILES:
34403440      if (data >= 65536)
34413441         return IMGTOOLERR_UNIMPLEMENTED;
3442      set_UINT16BE(&l2_file->u.tifiles.hdr.fphysrecs, data);
3442      set_UINT16BE(&l2_file->tifiles.hdr.fphysrecs, data);
34433443      break;
34443444   }
34453445
34463446   return 0;
34473447}
34483448
3449static UINT8 get_file_eof(ti99_lvl2_fileref *l2_file)
3449static UINT8 get_file_eof(struct ti99_lvl2_fileref *l2_file)
34503450{
34513451   int reply = 0;
34523452
34533453   switch (l2_file->type)
34543454   {
34553455   case L2F_DSK:
3456      reply = l2_file->u.dsk.fdr.eof;
3456      reply = l2_file->dsk.fdr.eof;
34573457      break;
34583458
34593459   case L2F_WIN:
3460      reply = l2_file->u.win.curfdr.eof;
3460      reply = l2_file->win.curfdr.eof;
34613461      break;
34623462
34633463   case L2F_TIFILES:
3464      reply = l2_file->u.tifiles.hdr.eof;
3464      reply = l2_file->tifiles.hdr.eof;
34653465      break;
34663466   }
34673467
34683468   return reply;
34693469}
34703470
3471static void set_file_eof(ti99_lvl2_fileref *l2_file, UINT8 data)
3471static void set_file_eof(struct ti99_lvl2_fileref *l2_file, UINT8 data)
34723472{
34733473   switch (l2_file->type)
34743474   {
34753475   case L2F_DSK:
3476      l2_file->u.dsk.fdr.eof = data;
3476      l2_file->dsk.fdr.eof = data;
34773477      break;
34783478
34793479   case L2F_WIN:
3480      l2_file->u.win.curfdr.eof = data;
3480      l2_file->win.curfdr.eof = data;
34813481      break;
34823482
34833483   case L2F_TIFILES:
3484      l2_file->u.tifiles.hdr.eof = data;
3484      l2_file->tifiles.hdr.eof = data;
34853485      break;
34863486   }
34873487}
34883488
3489static UINT16 get_file_reclen(ti99_lvl2_fileref *l2_file)
3489static UINT16 get_file_reclen(struct ti99_lvl2_fileref *l2_file)
34903490{
34913491   int reply = 0;
34923492
34933493   switch (l2_file->type)
34943494   {
34953495   case L2F_DSK:
3496      reply = l2_file->u.dsk.fdr.reclen;
3497      if ((reply == 0) && (! (l2_file->u.dsk.fdr.flags & (fdr99_f_program /*| fdr99_f_var*/))))
3498         reply = get_UINT16BE(l2_file->u.dsk.fdr.xreclen);
3496      reply = l2_file->dsk.fdr.reclen;
3497      if ((reply == 0) && (! (l2_file->dsk.fdr.flags & (fdr99_f_program /*| fdr99_f_var*/))))
3498         reply = get_UINT16BE(l2_file->dsk.fdr.xreclen);
34993499      break;
35003500
35013501   case L2F_WIN:
3502      reply = l2_file->u.win.curfdr.reclen;
3503      if ((reply == 0) && (! (l2_file->u.win.curfdr.flags & (fdr99_f_program /*| fdr99_f_var*/))))
3504         reply = get_UINT16BE(l2_file->u.win.curfdr.xreclen);
3502      reply = l2_file->win.curfdr.reclen;
3503      if ((reply == 0) && (! (l2_file->win.curfdr.flags & (fdr99_f_program /*| fdr99_f_var*/))))
3504         reply = get_UINT16BE(l2_file->win.curfdr.xreclen);
35053505      break;
35063506
35073507   case L2F_TIFILES:
3508      reply = l2_file->u.tifiles.hdr.reclen;
3508      reply = l2_file->tifiles.hdr.reclen;
35093509      break;
35103510   }
35113511
35123512   return reply;
35133513}
35143514
3515static int set_file_reclen(ti99_lvl2_fileref *l2_file, UINT16 data)
3515static int set_file_reclen(struct ti99_lvl2_fileref *l2_file, UINT16 data)
35163516{
35173517   switch (l2_file->type)
35183518   {
35193519   case L2F_DSK:
35203520      if (data < 256)
35213521      {
3522         l2_file->u.dsk.fdr.reclen = data;
3523         set_UINT16BE(&l2_file->u.dsk.fdr.xreclen, 0);
3522         l2_file->dsk.fdr.reclen = data;
3523         set_UINT16BE(&l2_file->dsk.fdr.xreclen, 0);
35243524      }
35253525      else
35263526      {
3527         l2_file->u.dsk.fdr.reclen = 0;
3528         set_UINT16BE(&l2_file->u.dsk.fdr.xreclen, data);
3527         l2_file->dsk.fdr.reclen = 0;
3528         set_UINT16BE(&l2_file->dsk.fdr.xreclen, data);
35293529      }
35303530      break;
35313531
35323532   case L2F_WIN:
35333533      if (data < 256)
35343534      {
3535         l2_file->u.win.curfdr.reclen = data;
3536         set_UINT16BE(&l2_file->u.win.curfdr.xreclen, 0);
3535         l2_file->win.curfdr.reclen = data;
3536         set_UINT16BE(&l2_file->win.curfdr.xreclen, 0);
35373537      }
35383538      else
35393539      {
3540         l2_file->u.win.curfdr.reclen = 0;
3541         set_UINT16BE(&l2_file->u.win.curfdr.xreclen, data);
3540         l2_file->win.curfdr.reclen = 0;
3541         set_UINT16BE(&l2_file->win.curfdr.xreclen, data);
35423542      }
35433543      break;
35443544
35453545   case L2F_TIFILES:
35463546      if (data >= 256)
35473547         return IMGTOOLERR_UNIMPLEMENTED;
3548      l2_file->u.tifiles.hdr.reclen = data;
3548      l2_file->tifiles.hdr.reclen = data;
35493549      break;
35503550   }
35513551
35523552   return 0;
35533553}
35543554
3555static unsigned get_file_fixrecs(ti99_lvl2_fileref *l2_file)
3555static unsigned get_file_fixrecs(struct ti99_lvl2_fileref *l2_file)
35563556{
35573557   int reply = 0;
35583558
35593559   switch (l2_file->type)
35603560   {
35613561   case L2F_DSK:
3562      reply = get_UINT16LE(l2_file->u.dsk.fdr.fixrecs);
3562      reply = get_UINT16LE(l2_file->dsk.fdr.fixrecs);
35633563      break;
35643564
35653565   case L2F_WIN:
3566      reply = get_win_fdr_fixrecs(&l2_file->u.win.curfdr);
3566      reply = get_win_fdr_fixrecs(&l2_file->win.curfdr);
35673567      break;
35683568
35693569   case L2F_TIFILES:
3570      reply = get_UINT16BE(l2_file->u.tifiles.hdr.fixrecs);
3570      reply = get_UINT16BE(l2_file->tifiles.hdr.fixrecs);
35713571      break;
35723572   }
35733573
35743574   return reply;
35753575}
35763576
3577static int set_file_fixrecs(ti99_lvl2_fileref *l2_file, unsigned data)
3577static int set_file_fixrecs(struct ti99_lvl2_fileref *l2_file, unsigned data)
35783578{
35793579   switch (l2_file->type)
35803580   {
35813581   case L2F_DSK:
35823582      if (data >= 65536)
35833583         return IMGTOOLERR_UNIMPLEMENTED;
3584      set_UINT16LE(&l2_file->u.dsk.fdr.fixrecs, data);
3584      set_UINT16LE(&l2_file->dsk.fdr.fixrecs, data);
35853585      break;
35863586
35873587   case L2F_WIN:
3588      set_win_fdr_fixrecs(&l2_file->u.win.curfdr, data);
3588      set_win_fdr_fixrecs(&l2_file->win.curfdr, data);
35893589      break;
35903590
35913591   case L2F_TIFILES:
35923592      if (data >= 65536)
35933593         return IMGTOOLERR_UNIMPLEMENTED;
3594      set_UINT16BE(&l2_file->u.tifiles.hdr.fixrecs, data);
3594      set_UINT16BE(&l2_file->tifiles.hdr.fixrecs, data);
35953595      break;
35963596   }
35973597
35983598   return 0;
35993599}
36003600
3601static void get_file_creation_date(ti99_lvl2_fileref *l2_file, ti99_date_time *reply)
3601static void get_file_creation_date(struct ti99_lvl2_fileref *l2_file, ti99_date_time *reply)
36023602{
36033603   switch (l2_file->type)
36043604   {
36053605   case L2F_DSK:
3606      *reply = l2_file->u.dsk.fdr.creation;
3606      *reply = l2_file->dsk.fdr.creation;
36073607      break;
36083608
36093609   case L2F_WIN:
3610      *reply = l2_file->u.win.curfdr.creation;
3610      *reply = l2_file->win.curfdr.creation;
36113611      break;
36123612
36133613   case L2F_TIFILES:
r17926r17927
36163616   }
36173617}
36183618
3619static void set_file_creation_date(ti99_lvl2_fileref *l2_file, ti99_date_time data)
3619static void set_file_creation_date(struct ti99_lvl2_fileref *l2_file, ti99_date_time data)
36203620{
36213621   switch (l2_file->type)
36223622   {
36233623   case L2F_DSK:
3624      l2_file->u.dsk.fdr.creation = data;
3624      l2_file->dsk.fdr.creation = data;
36253625      break;
36263626
36273627   case L2F_WIN:
3628      l2_file->u.win.curfdr.creation = data;
3628      l2_file->win.curfdr.creation = data;
36293629      break;
36303630
36313631   case L2F_TIFILES:
r17926r17927
36333633   }
36343634}
36353635
3636static void get_file_update_date(ti99_lvl2_fileref *l2_file, ti99_date_time *reply)
3636static void get_file_update_date(struct ti99_lvl2_fileref *l2_file, ti99_date_time *reply)
36373637{
36383638   switch (l2_file->type)
36393639   {
36403640   case L2F_DSK:
3641      *reply = l2_file->u.dsk.fdr.update;
3641      *reply = l2_file->dsk.fdr.update;
36423642      break;
36433643
36443644   case L2F_WIN:
3645      *reply = l2_file->u.win.curfdr.update;
3645      *reply = l2_file->win.curfdr.update;
36463646      break;
36473647
36483648   case L2F_TIFILES:
r17926r17927
36513651   }
36523652}
36533653
3654static void set_file_update_date(ti99_lvl2_fileref *l2_file, ti99_date_time data)
3654static void set_file_update_date(struct ti99_lvl2_fileref *l2_file, ti99_date_time data)
36553655{
36563656   switch (l2_file->type)
36573657   {
36583658   case L2F_DSK:
3659      l2_file->u.dsk.fdr.update = data;
3659      l2_file->dsk.fdr.update = data;
36603660      break;
36613661
36623662   case L2F_WIN:
3663      l2_file->u.win.curfdr.update = data;
3663      l2_file->win.curfdr.update = data;
36643664      break;
36653665
36663666   case L2F_TIFILES:
r17926r17927
38293829*/
38303830struct dsk_iterator
38313831{
3832   ti99_lvl2_imgref *image;
3832   struct ti99_lvl2_imgref *image;
38333833   int level;
38343834   int listing_subdirs;      /* true if we are listing subdirectories at current level */
38353835   int index[2];            /* current index in the disk catalog */
r17926r17927
38383838
38393839struct win_iterator
38403840{
3841   ti99_lvl2_imgref *image;
3841   struct ti99_lvl2_imgref *image;
38423842   int level;
38433843   int listing_subdirs;      /* true if we are listing subdirectories at current level */
38443844   int index[MAX_DIR_LEVEL];   /* current index in the disk catalog */
r17926r17927
39953995*/
39963996static int dsk_image_init(imgtool_image *img, imgtool_stream *f, ti99_img_format img_format)
39973997{
3998   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
3998   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
39993999   dsk_vib vib;
40004000   int reply;
40014001   int totphysrecs;
r17926r17927
40244024   image->AUformat.totAUs = totphysrecs / image->AUformat.physrecsperAU;
40254025
40264026   /* extract number of physrecs */
4027   image->u.dsk.totphysrecs = get_UINT16BE(vib.totphysrecs);
4027   image->dsk.totphysrecs = get_UINT16BE(vib.totphysrecs);
40284028
40294029   /* read and check main volume catalog */
4030   reply = dsk_read_catalog(image, 1, &image->u.dsk.catalogs[0]);
4030   reply = dsk_read_catalog(image, 1, &image->dsk.catalogs[0]);
40314031   if (reply)
40324032      return reply;
40334033
4034   image->u.dsk.fdir_aphysrec[0] = 1;
4034   image->dsk.fdir_aphysrec[0] = 1;
40354035
40364036   /* read and check subdirectory catalogs */
40374037   /* Note that the reserved areas used for HFDC subdirs may be used for other
40384038    purposes by other FDRs, so, if we get any error, we will assume there is no
40394039    subdir after all... */
4040   image->u.dsk.catalogs[0].num_subdirs = 0;
4040   image->dsk.catalogs[0].num_subdirs = 0;
40414041   for (i=0; i<3; i++)
40424042   {
40434043      fdir_aphysrec = get_UINT16BE(vib.subdir[i].fdir_aphysrec);
r17926r17927
40474047         /* name is empty: fine with us unless there is a fdir pointer */
40484048         if (fdir_aphysrec != 0)
40494049         {
4050            image->u.dsk.catalogs[0].num_subdirs = 0;
4050            image->dsk.catalogs[0].num_subdirs = 0;
40514051            break;
40524052         }
40534053      }
40544054      else if (check_fname(vib.subdir[i].name))
40554055      {
40564056         /* name is invalid: this is not an HFDC format floppy */
4057         image->u.dsk.catalogs[0].num_subdirs = 0;
4057         image->dsk.catalogs[0].num_subdirs = 0;
40584058         break;
40594059      }
40604060      else
r17926r17927
40634063         if ((fdir_aphysrec == 0) || (fdir_aphysrec >= totphysrecs))
40644064         {
40654065            /* error: fdir pointer is invalid or NULL */
4066            image->u.dsk.catalogs[0].num_subdirs = 0;
4066            image->dsk.catalogs[0].num_subdirs = 0;
40674067            break;
40684068         }
40694069         /* fill in descriptor fields */
4070         image->u.dsk.fdir_aphysrec[image->u.dsk.catalogs[0].num_subdirs+1] = fdir_aphysrec;
4071         /*image->u.dsk.catalogs[0].subdirs[image->u.dsk.catalogs[0].num_subdirs].dir_ptr = fdir_aphysrec;*/
4072         memcpy(image->u.dsk.catalogs[0].subdirs[image->u.dsk.catalogs[0].num_subdirs].name, vib.subdir[i].name, 10);
4073         reply = dsk_read_catalog(image, fdir_aphysrec, &image->u.dsk.catalogs[image->u.dsk.catalogs[0].num_subdirs+1]);
4070         image->dsk.fdir_aphysrec[image->dsk.catalogs[0].num_subdirs+1] = fdir_aphysrec;
4071         /*image->dsk.catalogs[0].subdirs[image->dsk.catalogs[0].num_subdirs].dir_ptr = fdir_aphysrec;*/
4072         memcpy(image->dsk.catalogs[0].subdirs[image->dsk.catalogs[0].num_subdirs].name, vib.subdir[i].name, 10);
4073         reply = dsk_read_catalog(image, fdir_aphysrec, &image->dsk.catalogs[image->dsk.catalogs[0].num_subdirs+1]);
40744074         if (reply)
40754075         {
40764076            /* error: invalid fdir */
4077            image->u.dsk.catalogs[0].num_subdirs = 0;
4077            image->dsk.catalogs[0].num_subdirs = 0;
40784078            break;
40794079         }
40804080         /* found valid subdirectory: increment subdir count */
4081         image->u.dsk.catalogs[0].num_subdirs++;
4081         image->dsk.catalogs[0].num_subdirs++;
40824082      }
40834083   }
40844084
r17926r17927
41284128*/
41294129static imgtoolerr_t win_image_init(imgtool_image *img, imgtool_stream *f)
41304130{
4131   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4131   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
41324132   win_vib_ddr vib;
41334133   int reply;
41344134   int i;
r17926r17927
41474147      return (imgtoolerr_t)reply;
41484148
41494149   /* guess VIB version */
4150   image->u.win.vib_version = memcmp(vib.u.vib_v1.id, "WIN", 3) ? win_vib_v2 : win_vib_v1;
4150   image->win.vib_version = memcmp(vib.u.vib_v1.id, "WIN", 3) ? win_vib_v2 : win_vib_v1;
41514151
41524152   /* extract AU size and number of AUs */
41534153   image->AUformat.physrecsperAU = ((get_UINT16BE(vib.params) >> 12) & 0xf) + 1;
r17926r17927
41574157   memcpy(image->vol_name, vib.name, 10);
41584158
41594159   /* extract data_offset */
4160   switch (image->u.win.vib_version)
4160   switch (image->win.vib_version)
41614161   {
41624162   case win_vib_v1:
41634163      image->data_offset = 64;
r17926r17927
41844184*/
41854185static void ti99_image_exit(imgtool_image *img)
41864186{
4187   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4187   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
41884188
41894189   close_image_lvl1(&image->l1_img);
41904190}
r17926r17927
41964196*/
41974197static void ti99_image_info(imgtool_image *img, char *string, size_t len)
41984198{
4199   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4199   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
42004200   char vol_name[11];
42014201
42024202   fname_to_str(vol_name, image->vol_name, 11);
r17926r17927
42094209*/
42104210static imgtoolerr_t dsk_image_beginenum(imgtool_directory *enumeration, const char *path)
42114211{
4212   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(imgtool_directory_image(enumeration));
4212   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(imgtool_directory_image(enumeration));
42134213   dsk_iterator *iter = (dsk_iterator *) imgtool_directory_extrabytes(enumeration);
42144214
42154215   iter->image = image;
42164216   iter->level = 0;
42174217   iter->listing_subdirs = 1;
42184218   iter->index[0] = 0;
4219   iter->cur_catalog = &iter->image->u.dsk.catalogs[0];
4219   iter->cur_catalog = &iter->image->dsk.catalogs[0];
42204220
42214221   return (imgtoolerr_t)0;
42224222}
r17926r17927
42554255         {
42564256            iter->level = 0;
42574257            iter->index[0]++;
4258            iter->cur_catalog = &iter->image->u.dsk.catalogs[0];
4258            iter->cur_catalog = &iter->image->dsk.catalogs[0];
42594259         }
42604260      }
42614261   }
r17926r17927
42684268   {
42694269      if (iter->listing_subdirs)
42704270      {
4271         fname_to_str(ent->filename, iter->image->u.dsk.catalogs[0].subdirs[iter->index[iter->level]].name, ARRAY_LENGTH(ent->filename));
4271         fname_to_str(ent->filename, iter->image->dsk.catalogs[0].subdirs[iter->index[iter->level]].name, ARRAY_LENGTH(ent->filename));
42724272
42734273         /* set type of DIR */
42744274         snprintf(ent->attr, ARRAY_LENGTH(ent->attr), "DIR");
r17926r17927
42824282         iter->listing_subdirs = 0;   /* no need to list subdirs as only the
42834283                                        root dir has subdirs in DSK format */
42844284         iter->level = 1;
4285         iter->cur_catalog = &iter->image->u.dsk.catalogs[iter->index[0]+1];
4285         iter->cur_catalog = &iter->image->dsk.catalogs[iter->index[0]+1];
42864286         iter->index[iter->level] = 0;
42874287      }
42884288      else
r17926r17927
43004300            ent->filename[0] = '\0';
43014301            if (iter->level)
43024302            {
4303               fname_to_str(ent->filename, iter->image->u.dsk.catalogs[0].subdirs[iter->index[0]].name, ARRAY_LENGTH(ent->filename));
4303               fname_to_str(ent->filename, iter->image->dsk.catalogs[0].subdirs[iter->index[0]].name, ARRAY_LENGTH(ent->filename));
43044304               strncat(ent->filename, ".", ARRAY_LENGTH(ent->filename) - 1);
43054305            }
43064306            fname_to_str(buf, fdr.name, 11);
r17926r17927
43344334*/
43354335static imgtoolerr_t win_image_beginenum(imgtool_directory *enumeration, const char *path)
43364336{
4337   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(imgtool_directory_image(enumeration));
4337   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(imgtool_directory_image(enumeration));
43384338   win_iterator *iter = (win_iterator *) imgtool_directory_extrabytes(enumeration);
43394339   imgtoolerr_t errorcode;
43404340
r17926r17927
44794479static imgtoolerr_t ti99_image_freespace(imgtool_partition *partition, UINT64 *size)
44804480{
44814481   imgtool_image *img = imgtool_partition_image(partition);
4482   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4482   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
44834483   size_t freeAUs;
44844484   int i;
44854485
r17926r17927
45064506#if 1
45074507
45084508   /* extract data as TIFILES */
4509   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4509   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
45104510   ti99_lvl2_fileref src_file;
45114511   ti99_lvl2_fileref dst_file;
45124512   ti99_date_time date_time;
r17926r17927
45724572#endif
45734573   set_file_update_date(&dst_file, date_time);
45744574
4575   if (stream_write(destf, & dst_file.u.tifiles.hdr, 128) != 128)
4575   if (stream_write(destf, & dst_file.tifiles.hdr, 128) != 128)
45764576      return (imgtoolerr_t)IMGTOOLERR_WRITEERROR;
45774577
45784578   /* copy data to TIFILE */
r17926r17927
45934593
45944594#else
45954595
4596   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4596   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
45974597   ti99_lvl3_fileref src_file;
45984598   UINT8 buf[256];
45994599   int reclen;
r17926r17927
46454645static imgtoolerr_t ti99_image_writefile(imgtool_partition *partition, const char *fpath, const char *fork, imgtool_stream *sourcef, option_resolution *writeoptions)
46464646{
46474647   imgtool_image *img = imgtool_partition_image(partition);
4648   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4648   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
46494649   const char *filename;
46504650   char ti_fname[10];
46514651   ti99_lvl2_fileref src_file;
r17926r17927
47464746   switch (dst_file.type)
47474747   {
47484748   case L2F_DSK:
4749      errorcode = (imgtoolerr_t)dsk_alloc_file_physrecs(&dst_file.u.dsk, fphysrecs);
4749      errorcode = (imgtoolerr_t)dsk_alloc_file_physrecs(&dst_file.dsk, fphysrecs);
47504750      if (errorcode)
47514751         return (imgtoolerr_t)errorcode;
47524752      break;
47534753
47544754   case L2F_WIN:
4755      errorcode = (imgtoolerr_t)win_alloc_file_physrecs(&dst_file.u.win, fphysrecs);
4755      errorcode = (imgtoolerr_t)win_alloc_file_physrecs(&dst_file.win, fphysrecs);
47564756      if (errorcode)
47574757         return (imgtoolerr_t)errorcode;
47584758      break;
r17926r17927
47764776   switch (image->type)
47774777   {
47784778   case L2I_DSK:
4779      if (write_absolute_physrec(& image->l1_img, dst_file.u.dsk.fdr_aphysrec, &dst_file.u.dsk.fdr))
4779      if (write_absolute_physrec(& image->l1_img, dst_file.dsk.fdr_aphysrec, &dst_file.dsk.fdr))
47804780         return (imgtoolerr_t)IMGTOOLERR_WRITEERROR;
47814781      break;
47824782
47834783   case L2I_WIN:
47844784      /* save fphysrecs field as well */
4785      if (dst_file.u.win.curfdr_aphysrec == dst_file.u.win.eldestfdr_aphysrec)
4786         set_win_fdr_fphysrecs(&dst_file.u.win.curfdr, dst_file.u.win.fphysrecs);
4787      if (write_absolute_physrec(& image->l1_img, dst_file.u.win.curfdr_aphysrec, &dst_file.u.win.curfdr))
4785      if (dst_file.win.curfdr_aphysrec == dst_file.win.eldestfdr_aphysrec)
4786         set_win_fdr_fphysrecs(&dst_file.win.curfdr, dst_file.win.fphysrecs);
4787      if (write_absolute_physrec(& image->l1_img, dst_file.win.curfdr_aphysrec, &dst_file.win.curfdr))
47884788         return (imgtoolerr_t)IMGTOOLERR_WRITEERROR;
4789      if (dst_file.u.win.curfdr_aphysrec != dst_file.u.win.eldestfdr_aphysrec)
4789      if (dst_file.win.curfdr_aphysrec != dst_file.win.eldestfdr_aphysrec)
47904790      {
4791         dst_file.u.win.curfdr_aphysrec = dst_file.u.win.eldestfdr_aphysrec;
4792         if (read_absolute_physrec(& image->l1_img, dst_file.u.win.curfdr_aphysrec, &dst_file.u.win.curfdr))
4791         dst_file.win.curfdr_aphysrec = dst_file.win.eldestfdr_aphysrec;
4792         if (read_absolute_physrec(& image->l1_img, dst_file.win.curfdr_aphysrec, &dst_file.win.curfdr))
47934793            return (imgtoolerr_t)IMGTOOLERR_WRITEERROR;
4794         set_win_fdr_fphysrecs(&dst_file.u.win.curfdr, dst_file.u.win.fphysrecs);
4795         if (write_absolute_physrec(& image->l1_img, dst_file.u.win.curfdr_aphysrec, &dst_file.u.win.curfdr))
4794         set_win_fdr_fphysrecs(&dst_file.win.curfdr, dst_file.win.fphysrecs);
4795         if (write_absolute_physrec(& image->l1_img, dst_file.win.curfdr_aphysrec, &dst_file.win.curfdr))
47964796            return (imgtoolerr_t)IMGTOOLERR_WRITEERROR;
47974797      }
47984798      break;
r17926r17927
48024802   switch (image->type)
48034803   {
48044804   case L2I_DSK:
4805      catalog = &image->u.dsk.catalogs[parent_ref];
4805      catalog = &image->dsk.catalogs[parent_ref];
48064806      for (i=0; i<128; i++)
48074807      {
48084808         buf[2*i] = catalog->files[i].fdr_ptr >> 8;
48094809         buf[2*i+1] = catalog->files[i].fdr_ptr & 0xff;
48104810      }
4811      if (write_absolute_physrec(& image->l1_img, image->u.dsk.fdir_aphysrec[parent_ref], buf))
4811      if (write_absolute_physrec(& image->l1_img, image->dsk.fdir_aphysrec[parent_ref], buf))
48124812         return (imgtoolerr_t)IMGTOOLERR_WRITEERROR;
48134813      break;
48144814
r17926r17927
48714871static imgtoolerr_t dsk_image_deletefile(imgtool_partition *partition, const char *fpath)
48724872{
48734873   imgtool_image *img = imgtool_partition_image(partition);
4874   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
4874   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
48754875   dsk_fdr fdr;
48764876   int i, cluster_index;
48774877   unsigned cur_AU, cluster_lastfphysrec;
r17926r17927
48914891
48924892   if (is_dir)
48934893   {
4894      catalog = &image->u.dsk.catalogs[catalog_index+1];
4894      catalog = &image->dsk.catalogs[catalog_index+1];
48954895
48964896      if ((catalog->num_files != 0) || (catalog->num_subdirs != 0))
48974897         return IMGTOOLERR_UNIMPLEMENTED;
48984898
4899      catalog = &image->u.dsk.catalogs[0];
4899      catalog = &image->dsk.catalogs[0];
49004900
49014901      /* free fdir AU */
4902      cur_AU = image->u.dsk.fdir_aphysrec[catalog_index+1] / image->AUformat.physrecsperAU;
4902      cur_AU = image->dsk.fdir_aphysrec[catalog_index+1] / image->AUformat.physrecsperAU;
49034903      image->abm[cur_AU >> 3] &= ~ (1 << (cur_AU & 7));
49044904
49054905      /* delete catalog entry */
49064906      for (i=catalog_index; i<2; i++)
49074907      {
49084908         catalog->subdirs[i] = catalog->subdirs[i+1];
4909         image->u.dsk.fdir_aphysrec[i+1] = image->u.dsk.fdir_aphysrec[i+2];
4909         image->dsk.fdir_aphysrec[i+1] = image->dsk.fdir_aphysrec[i+2];
49104910      }
49114911      memset(catalog->subdirs[2].name, 0, 10);
49124912      catalog->subdirs[2].dir_ptr = 0;
4913      image->u.dsk.fdir_aphysrec[3] = 0;
4913      image->dsk.fdir_aphysrec[3] = 0;
49144914      catalog->num_subdirs--;
49154915
49164916      /* update directory and bitmap in vib */
r17926r17927
49234923         for (i=0; i<3; i++)
49244924         {
49254925            memcpy(vib.subdir[i].name, catalog->subdirs[i].name, 10);
4926            set_UINT16BE(&vib.subdir[i].fdir_aphysrec, image->u.dsk.fdir_aphysrec[i+1]);
4926            set_UINT16BE(&vib.subdir[i].fdir_aphysrec, image->dsk.fdir_aphysrec[i+1]);
49274927         }
49284928
49294929         memcpy(vib.abm, image->abm, 200);
r17926r17927
49344934   }
49354935   else
49364936   {
4937      catalog = &image->u.dsk.catalogs[parent_ref];
4937      catalog = &image->dsk.catalogs[parent_ref];
49384938
49394939      if (read_absolute_physrec(& image->l1_img, catalog->files[catalog_index].fdr_ptr, &fdr))
49404940         return IMGTOOLERR_READERROR;
r17926r17927
49924992         buf[2*i] = catalog->files[i].fdr_ptr >> 8;
49934993         buf[2*i+1] = catalog->files[i].fdr_ptr & 0xff;
49944994      }
4995      if (write_absolute_physrec(& image->l1_img, image->u.dsk.fdir_aphysrec[parent_ref], buf))
4995      if (write_absolute_physrec(& image->l1_img, image->dsk.fdir_aphysrec[parent_ref], buf))
49964996         return IMGTOOLERR_WRITEERROR;
49974997
49984998      /* update bitmap */
r17926r17927
50135013static imgtoolerr_t win_image_deletefile(imgtool_partition *partition, const char *fpath)
50145014{
50155015   imgtool_image *img = imgtool_partition_image(partition);
5016   ti99_lvl2_imgref *image = (ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
5016   struct ti99_lvl2_imgref *image = (struct ti99_lvl2_imgref *) imgtool_image_extra_bytes(img);
50175017   int parent_ddr_AU, is_dir, catalog_index;
50185018   win_fdr fdr;
50195019   int i;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team