The .pkg/.ndx format as used for Starcon.pkg on the 3DO cd.
Acquired directly from the source.

This format is used both in the file and is memory. There are some
little differences; where this is this is the case, this is
mentioned below in square brackets.

Everything is stored LSB first.

Main header: (resinit.c, _GetResFileData())
position   length  meaning
0x00       2       Whether or not the file is packaged (res_flags)
                       (has all files in the .pkg file itself)
                   bit 0: 0 - the .pkg file is not packaged
                          1 - the .pkg file is packaged
0x02       4       offset from the beginning of the file where the list
                       of package information is stored (packmem_list_offs)
0x06       4       offset from the beginning of the file where the list
                       of pathnames is stored (path_list_offs)
0x0a       4       offset from the beginning of the file where the list
                       of filenames is stored (file_list_offs)
0x0e       2       number of packages in the file (num_packages)
0x10       2       number of types of packages present in the file (num_types)
0x12       4       length of this header. (index_info.header_len)
                       (unused if the .pkg file is not packaged)
0x16       8*num_packages:
                   On position i the information for package i + 1 is
                       stored. There is no package 0.
           4       p.packmem_info
                   bits 0-7: number of resource types
                   bits 8-20: number of resource instances
                   bits 21-31: index in file_list_offs of the file name for
                       this resource (only for packaged files)
           4       p.flags_and_data_loc
                   MSB is flags, rest is data_loc,
                   if MSB == 0, then of the data_loc only the low 16 bits
                       are used as a MEM_HANDLE [only in memory],
                   if MSB == 0xff, then the data_loc is an offset in the
                       file to the actual data
0x16+8*num_packages  Type information
           2*num_types
                   t.instance_count
                   The number of instances there are of this type.
                   On position i the instance count for type i + 1 is
                       stored. There's no type 0.
packmem_list_offs (should be directly after the index info):
                   for each of the num_packages packages:
                     for each of the resource types for this package
                         (as in p.packmem_info):
           4           bits 0-7: The type number for this type. What that
                                     number means isn't specified, and may
                                     vary per .pkg file.
                                 For the 3DO SC2 starcon.pkg file these are:
                                 0 - not a type
                                 1 - Graphics data (GFXRES)
                                 2 - String data (STRTAB)
                                 3 - Music data (MUSICRES)
                                 4 - Resource index (RES_INDEX)
                                 5 - Code (CODE)
                       bits 8-20: The instance number of the first instance
                                  of this type in this package. Every
                                  following instance has a number 1 higher
                                  than the one before.
                       bits 21-31: number of resources of this type in the
                                   package
                     for each of the resource instances for this package
                         (as in p.packmem_info):
           2           if this is a packaged file: multiply by 4 to get
                           the length of this package.
                       if this is a file that is not packaged: 
                           [the same position is in memory used as a
                           MEM_HANDLE to the actual data]
path_list_offs     (should be directly after the packmem list)
           ?       null terminated path strings, indexed from the file list
                       table
file_list_offs     (should be directly after the path list)
           ?       A number of file info structures. For packaged files,
                       these are indexed from the p.packmem_info (so (at most)
                       one per package). For non-packaged files, these are
                       indexed from an entry for an instance from
                       p.packmem_list (so possibly more per package)
                   These structures are in this form:
           13        file info:
           2         location relative to path_list_offs of the
                         the path to this file, or 0xffff if no path.
           8         filename (8 chars or null-terminated)
           3         extension (3 chars or null-terminated)

For each package p:
p.data_loc         for each type p.t:
                     for each instance p.t.i:
           p.t.i.length
                       the data for the resource
                       As the length always is a multiple of 4, the last
                       few bytes may not belong to the resource itself.
                       Their content is unspecified.


Resources with type 'resource index' (type 4 in the 3DO sc2 starcon.pkg file)
are files with the same format as this .pkg file itself.



Initial version of this file 2002-10-10 by Serge van den Boom.

