2009-02-09 21:15:56 +00:00
|
|
|
/***************************************************************
|
|
|
|
* romdir.c, based over Alex Lau (http://alexlau.8k.com) RomDir *
|
|
|
|
****************************************************************/
|
|
|
|
#include "romdir.h"
|
|
|
|
|
|
|
|
// searches between beginning and end addresses for a romdir structure.
|
|
|
|
// if found it returns info about it in romDirInfo.
|
|
|
|
//
|
|
|
|
// args: address to start searching from
|
|
|
|
// address to stop searching at
|
|
|
|
// gets filled in with info if found
|
|
|
|
// returns: a pointer to the filled in romDirInfo if successful
|
|
|
|
// NULL if error
|
|
|
|
ROMDIR_INFO* searchRomDir(const u32* searchStartAddr, const u32* searchEndAddr, ROMDIR_INFO* romDirInfo)
|
|
|
|
{
|
|
|
|
int offset = 0;
|
|
|
|
ROMDIR_ENTRY* dir_entry = (ROMDIR_ENTRY*)searchStartAddr;
|
|
|
|
while (dir_entry < (ROMDIR_ENTRY*)searchEndAddr)
|
|
|
|
{
|
|
|
|
if(dir_entry->name[0] == 'R' &&
|
|
|
|
dir_entry->name[1] == 'E' &&
|
|
|
|
dir_entry->name[2] == 'S' &&
|
|
|
|
dir_entry->name[3] == 'E' &&
|
|
|
|
dir_entry->name[4] == 'T' &&
|
|
|
|
dir_entry->name[5] == 0 &&
|
|
|
|
(ROUND_UP(dir_entry->fileSize,16) == offset) )
|
|
|
|
{
|
|
|
|
romDirInfo->romPtr = (u32)searchStartAddr; // start of rom
|
|
|
|
romDirInfo->romdirPtr = dir_entry; // start of romdir structure
|
|
|
|
romDirInfo->extinfoPtr = (u32)dir_entry + dir_entry[1].fileSize; // start of extinfo
|
|
|
|
return romDirInfo;
|
|
|
|
}
|
|
|
|
|
|
|
|
dir_entry++;
|
|
|
|
offset += sizeof(ROMDIR_ENTRY);
|
|
|
|
}
|
|
|
|
|
|
|
|
// not found
|
|
|
|
romDirInfo->romdirPtr = NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// find a file in the romdir table and return info about it
|
|
|
|
//
|
|
|
|
// args: info about romdir to search through
|
|
|
|
// filename to search for
|
|
|
|
// structure to get info about file into
|
|
|
|
// returns: a pointer to fileinfo if successful
|
|
|
|
// NULL otherwise
|
|
|
|
ROMFILE_INFO* searchFileInRom(const ROMDIR_INFO* romdirInfo, const char* filename, ROMFILE_INFO* fileinfo)
|
|
|
|
{
|
|
|
|
register ROMDIR_ENTRY* dir_entry;
|
|
|
|
register ext_offset=0, file_offset=0;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (dir_entry = romdirInfo->romdirPtr; dir_entry->name[0]; dir_entry++) {
|
|
|
|
|
|
|
|
for(i = 0; i < 10; ++i) {
|
|
|
|
if( filename[i] == 0 )
|
|
|
|
break;
|
|
|
|
if( dir_entry->name[i] != filename[i] ) {
|
|
|
|
i = -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i > 0 ) {
|
|
|
|
fileinfo->entry = dir_entry;
|
|
|
|
fileinfo->fileData = file_offset + romdirInfo->romPtr; // address of file in rom
|
|
|
|
fileinfo->extData = (u32)NULL; // address of extinfo in rom
|
|
|
|
|
|
|
|
if (dir_entry->extSize)
|
|
|
|
fileinfo->extData = ext_offset + romdirInfo->extinfoPtr; // address of extinfo in rom
|
|
|
|
return fileinfo;
|
|
|
|
}
|
|
|
|
|
|
|
|
file_offset += ROUND_UP(dir_entry->fileSize,16);
|
|
|
|
ext_offset += dir_entry->extSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
// error - file not found
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// gets a hex number from *addr and updates the pointer
|
|
|
|
//
|
|
|
|
// args: pointer to string buffer containing a hex number
|
|
|
|
// returns: the value of the hex number
|
|
|
|
u32 getHexNumber(char** addr)
|
|
|
|
{
|
|
|
|
register char *p; //a1
|
|
|
|
register u32 h = 0; //a2;
|
|
|
|
|
|
|
|
for (p=*addr; *p >= '0'; p++)
|
|
|
|
{
|
|
|
|
int num;
|
|
|
|
if(*p <= '9') num = *p - '0';
|
|
|
|
else if(*p >= 'a') num = *p - 'a' + 10;
|
|
|
|
else num = *p - 'A' + 10;
|
|
|
|
|
|
|
|
h = h*16 + num;
|
|
|
|
}
|
|
|
|
|
|
|
|
*addr = p;
|
|
|
|
return h;
|
|
|
|
}
|