08-09-2011, 11:29 AM
(This post was last modified: 08-19-2011, 10:45 PM by Scarlet.Crush.)

CRC Calculation

Celsius has been using the CRC Bypass method, it has been a tad annoying that I could not find a CRC algorithm which would correctly calculate the values used by FFX-2. So I broke out CE and traced through the assembler code which the game uses.

After converting the trace to C code, it turns out that a standard CRC-16 CCITT algorithm is used, with one small exception. The last entry in the hash table is zero (not calculated). It looks like this may be a bug in the games CRC generation code, since a disproportionally large number of the CRCs I've seen while developing/testing Celsius have been 0xFFFF, the distribution of calculated hashes seems to be somewhat skewed.

I decided to try this algorithm on FFX, and it looks like FFX-2 inherited the code from it. CRCs are calculated consistantly between the two.

FFXII by contrast uses a bog standard CRC-32 algorithm.

The following is for FFX-2 UK PAL SLES_518.15

Algorithm

First 64 bytes are not used for hash calculation.

Start = 0x40

End = 0x16270 (File Length from PSU File)

Existing CRC is Zeroed out.

Byte [0x16268] = 0

Byte [0x16269] = 0

Calculate Hash Table with

Polynomial = 0x1021

Zero out last entry

Table[255] = 0

Calculate Hash with

Initial Value = 0

Seed = 0xFFFF

I've attached a quick & dirty C# app (with source) for calculating CRC Hash values for FFX, FFX-2 and FFXII PSU Files.

You may have to adjust the offsets for non UK PAL versions of these games.

The next release of Celsius will include CRC support.

Celsius has been using the CRC Bypass method, it has been a tad annoying that I could not find a CRC algorithm which would correctly calculate the values used by FFX-2. So I broke out CE and traced through the assembler code which the game uses.

After converting the trace to C code, it turns out that a standard CRC-16 CCITT algorithm is used, with one small exception. The last entry in the hash table is zero (not calculated). It looks like this may be a bug in the games CRC generation code, since a disproportionally large number of the CRCs I've seen while developing/testing Celsius have been 0xFFFF, the distribution of calculated hashes seems to be somewhat skewed.

I decided to try this algorithm on FFX, and it looks like FFX-2 inherited the code from it. CRCs are calculated consistantly between the two.

FFXII by contrast uses a bog standard CRC-32 algorithm.

The following is for FFX-2 UK PAL SLES_518.15

Algorithm

First 64 bytes are not used for hash calculation.

Start = 0x40

End = 0x16270 (File Length from PSU File)

Existing CRC is Zeroed out.

Byte [0x16268] = 0

Byte [0x16269] = 0

Calculate Hash Table with

Polynomial = 0x1021

Zero out last entry

Table[255] = 0

Calculate Hash with

Initial Value = 0

Seed = 0xFFFF

Code:

`Start = 0x40`

End = 0x16270

Hash = Initial

Hash ^= Seed

while(Start < End)

{

Hash = Table[(Hash >> 8) ^ Data[Start++]] ^ (Hash << 8)

}

Hash ^= Seed

return Hash

I've attached a quick & dirty C# app (with source) for calculating CRC Hash values for FFX, FFX-2 and FFXII PSU Files.

You may have to adjust the offsets for non UK PAL versions of these games.

The next release of Celsius will include CRC support.