Skip to content
Permalink
Browse files

CDVDMAN: revised algorithm for unscrambling the PS2 logo. Fixes failu…

…res to correctly unscramble the logo if the first byte of subsequent passes does not represent a black pixel.
  • Loading branch information...
sp193 committed Feb 16, 2019
1 parent f16c52d commit ea01c62019cac315c75bdc1338cf6967253a5f0c
Showing with 9 additions and 3 deletions.
  1. +9 −3 modules/iopcore/cdvdman/cdvdman.c
@@ -385,12 +385,18 @@ static int cdvdman_read_sectors(u32 lsn, unsigned int sectors, void *buf)
break;
}

// PS2LOGO Decryptor algorithm; based on misfire's code (https://github.com/mlafeldt/ps2logo)
/* PS2LOGO Decryptor algorithm; based on misfire's code (https://github.com/mlafeldt/ps2logo)
The PS2 logo is stored within the first 12 sectors, scrambled.
This algorithm exploits the characteristic that the value used for scrambling will be recorded,
when it is XOR'ed against a black pixel. The first pixel is black, hence the value of the first byte
was the value used for scrambling. */
if (lsn < 13) {
u32 j;
u8 *logo = (u8 *)ptr;
u8 key = logo[0];
if (logo[0] != 0) {
static u8 key = 0;
if (lsn == 0) //First sector? Copy the first byte as the value for unscrambling the logo.
key = logo[0];
if (key != 0) {
for (j = 0; j < (SectorsToRead * 2048); j++) {
logo[j] ^= key;
logo[j] = (logo[j] << 3) | (logo[j] >> 5);

0 comments on commit ea01c62

Please sign in to comment.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.