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) 0 - the .pkg file is not packaged else - 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.