Prevent crashing when calculating checksum on messed up ROMs, more code cleanup.
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user