Prevent crashing when calculating checksum on messed up ROMs, more code cleanup.

This commit is contained in:
n-a-c-h
2003-07-11 08:01:14 +00:00
parent 5dbb414d24
commit 6c46cfe346

View File

@@ -250,6 +250,13 @@ unsigned short sum(unsigned char *array, unsigned int size)
{
unsigned short theSum = 0;
unsigned int i;
//Prevent crashing by reading too far (needed for messed up ROMs)
if (array + size > (unsigned char *)romdata + NumofBytes)
{
return(0xFFFF);
}
for (i = 0; i < size; i++)
{
theSum += array[i];
@@ -257,47 +264,34 @@ unsigned short sum(unsigned char *array, unsigned int size)
return(theSum);
}
//Not entirely accurate pow, but good for our needs and very fast
unsigned int npow(register unsigned int base, register unsigned int exponent)
{
register unsigned int total = base;
register unsigned int i;
for (i = 1; i < exponent; i++)
{
total *= base;
}
return(total);
}
extern unsigned char SPC7110Enable;
extern unsigned char BSEnable;
extern unsigned short Checksumvalue;
void CalcChecksum()
{
unsigned char *ROM = (unsigned char *)romdata;
unsigned short Mbit = NumofBanks >> 2, Checksum;
unsigned int ROMSize = NumofBytes, Bank = infoloc;
unsigned short Mbit = NumofBanks >> 2;
if ((Mbit == 10 || Mbit == 20 || Mbit == 40) && !SPC7110Enable)
{
unsigned int P1Size = npow(2, ROM[Bank + 23] - 7) * 65536;
unsigned int P1Size = 512 << ROM[infoloc + 23];
unsigned short part1 = sum(ROM, P1Size),
part2 = sum(ROM+P1Size, ROMSize-P1Size);
part2 = sum(ROM+P1Size, NumofBytes-P1Size);
Checksumvalue = part1 + part2*4;
}
else if ((Mbit == 12 || Mbit == 24 || Mbit == 48) && !SPC7110Enable)
{
unsigned int P1Size = npow(2, ROM[Bank + 23] - 7) * 65536;
unsigned int P1Size = 512 << ROM[infoloc + 23];
unsigned short part1 = sum(ROM, P1Size),
part2 = sum(ROM+P1Size, ROMSize-P1Size);
part2 = sum(ROM+P1Size, NumofBytes-P1Size);
Checksumvalue = part1 + part2 + part2;
}
else
{
Checksumvalue = sum(ROM, ROMSize);
Checksumvalue = sum(ROM, NumofBytes);
if (BSEnable)
{
Checksumvalue -= sum(&ROM[Bank - 16], 48); //Fix for BS Dumps
Checksumvalue -= sum(&ROM[infoloc - 16], 48); //Fix for BS Dumps
}
else if (Mbit == 24)
{