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 short theSum = 0;
unsigned int i; 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++) for (i = 0; i < size; i++)
{ {
theSum += array[i]; theSum += array[i];
@@ -257,47 +264,34 @@ unsigned short sum(unsigned char *array, unsigned int size)
return(theSum); 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 SPC7110Enable;
extern unsigned char BSEnable; extern unsigned char BSEnable;
extern unsigned short Checksumvalue; extern unsigned short Checksumvalue;
void CalcChecksum() void CalcChecksum()
{ {
unsigned char *ROM = (unsigned char *)romdata; unsigned char *ROM = (unsigned char *)romdata;
unsigned short Mbit = NumofBanks >> 2, Checksum; unsigned short Mbit = NumofBanks >> 2;
unsigned int ROMSize = NumofBytes, Bank = infoloc;
if ((Mbit == 10 || Mbit == 20 || Mbit == 40) && !SPC7110Enable) 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), unsigned short part1 = sum(ROM, P1Size),
part2 = sum(ROM+P1Size, ROMSize-P1Size); part2 = sum(ROM+P1Size, NumofBytes-P1Size);
Checksumvalue = part1 + part2*4; Checksumvalue = part1 + part2*4;
} }
else if ((Mbit == 12 || Mbit == 24 || Mbit == 48) && !SPC7110Enable) 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), unsigned short part1 = sum(ROM, P1Size),
part2 = sum(ROM+P1Size, ROMSize-P1Size); part2 = sum(ROM+P1Size, NumofBytes-P1Size);
Checksumvalue = part1 + part2 + part2; Checksumvalue = part1 + part2 + part2;
} }
else else
{ {
Checksumvalue = sum(ROM, ROMSize); Checksumvalue = sum(ROM, NumofBytes);
if (BSEnable) 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) else if (Mbit == 24)
{ {