Paging and Subsystem Initialization
In the Crash games, Paging and Subsystem Initialization is the process of readying the system to transfer (page) game content from a specified NSF file on disc into main memory. Using the NSF file's paired NSD file or index, the process occupies a structure with all the information needed to effectively page its content.
Contents
Paging System Structure
The Paging and Subsystem Initialization routine requires as its second argument a pointer to the resultant 'paging system structure'. As a result of the routine's execution, this structure is occupied with all the information needed to effectively page content from an NSF file. (The NSF file used is that of the level with ID specified in the first argument to the routine.)
Crash 1
In Crash 1, a pointer to the 'global paging system structure'-located at 0x5C528-
is passed as the second argument in each call to the Paging and Subsystem Initialization routine.
Format
TBD
Structure
struct pagingsystem
{
bool inited; // 0x5C528
unsigned long levelid; // 0x5C52C
void **entryhashindices; // 0x5C530
struct hashpair *entryhash; // 0x5C534
unsigned long ???; // 0x5C538
void *levelheader; // 0x5C53C
struct NSD *NSD; // 0x5C540
unsigned long ???; // 0x5C544
unsigned long NSFlocation; // 0x5C548
unsigned long flag; // 0x5C54C
unsigned long physicalpagecount; // 0x5C550
struct page physicalpages[22]; // 0x5C554
unsigned long virtualpagecount; // 0x5C91C
struct page virtualpages[38]; // 0x5C920
unsigned long pagecount; // 0x5CFA8
struct page *currentlypaging; // 0x5CFAC
void *itemlist; // 0x5CFB0
struct page *mostrecent8; // 0x5CFB4
unsigned long CIDpaging; // 0x5CFB8
struct page **pagemap; // 0x5CFBC
};
Operation
The inited
flag is first checked to determine whether the paging system has previously been initialized (by this routine). If so, a success code is returned, for the paging system has already been successfully initialized. If not, the routine proceeds to initialize the paging system.
Locate and Load NSD file
At this point, a string for the specified level id's corresponding NSD filename is constructed by concatenating "S00000", the level id, and ".NSD".
A filesystem map exists, which maps NSD files, indexed by level id, to their corresponding sector position and file size on disc; this map has been created by the hardware initialization routine. The level id is used as an index into this table and the malloc routine is used to allocate space of the corresponding file size. The system then begins reading from disc at the corresponding sector position to the newly allocated space. A pointer to this data is saved in the NSD
field of the paging system structure.
Record Level Header and Initialize Entry Hash Table
With the NSD contents in main memory, pointers to its entryhashoffsets
and entryhash
arrays, respectively, are recorded in entryhashindices
and entryhash
of the paging system structure.
At this point, a pointer to the NSD's levelheader
must also be calculated since the preceding block of data in the file structure (i.e. the entry hash table) is of variable size. This pointer is calculated by adding the size of the entry hash table (entryhashcount
) to its location (entryhash
), and stored in levelheader
of the paging system structure. [calculated without pointer arithmetic this is entryhash+(8*entryhashcount)]. The NSD's levelheader
is a structure that specifies its corresponding level ID, the EID of the level's first zone(T7) entry and the index of the first camera path in that zone, an unknown value, and execeidmap
-an array that maps object types to GOOL executable entries.