PS3 Release: PS3 Advanced Tools

Ultimately the problem for me is not cex/dex conversion, I can tweak the code, get the product code from eid5 & use that instead of pscode[3] as the Toolset already extracts stuff from Flash Memory anyway.
How are you doing it ?, i need to take a look at the idpset tool made by zar, im thinking in adding 2 new variables for eid5 to the algorithm and see if the code stays simple

What bothers me more at this stage is the inability to differentiate between cex phat models, using something like "it could be this model or it could be that model or... " is not ideal to display in the tree the "System Manager" tool uses, and no matter how you change the wording of it, it remains somewhat annoying. I was looking for a foolproof way to get the exact model for all CEX consoles at least.
I hate them too, is pretty much the same problem we are suffering in wiki when we want to create a table with all retail PS3 models, there is always 2 groups that requires to display them together because is "one or the other", are this ones, in all the previous versions of the code im prnting them this way, as example for region europe:
Code:
PS3 Model Name: CECHJ04 or CECHK04 (Europe)
The other group is even longer
Code:
PS3 Model Name: CECHL04 or CECHM04 or CECHP04 or CECHQ04 (Europe)
Are the last PS3 fat models, as far i know there is no way to difference them... because uses the same motherboard, platform_id, and product_sub_code, unless someone figures a way to difference them the only solution is to use the trick "one or the other" :/

When i was writing that print function i was thinking in shorting them this way
Code:
PS3 Model Name: CECHJ04/K04 (Europe)
PS3 Model Name: CECHL04/M04/P04/Q04 (Europe)
Other than that... i guess there is no solution to identify this 6 PS3 model names accuratelly :/

Also I think we have to assume that some idps spoofing methods will mess with the entire algorithm & make model identification using product code & sub code unreliable.
Ideally we would need to integrate that possibility in the algo & detect those use cases where some extracted info might contradict other extracted info..
Yeah, i was thinkiing in the IDPS spoofings before, this spoofings happens in memory (volatile), when the PS3 boots it creates several copies of the IDPS in memory (taken from EID0)
The unnofficial CEX2DEX conversions modifyes the IDPS in EID0, but the EID5 stays original
So... by displaying the "PS3 model name" detection from both (EID0 and EID5) we are bypassing that problem, the user "should" know the info from EID5 is the original from factory and the EID0 is an unnoficial hack
Actually... the info from EID0 is not really a mistake because the CEX2DEX conversions are like a clone of an official DEX... lets say... the clone is so good that is imposible to identify it (except from the EID5)

We may be able to overcome those complications however I cannot help but wonder whether it is pertinent to invest more time in this just to get a string written at the back of the console.
Is pretty much the same dilemma in wiki, sometimes it looks that we cant tell the PS3 model name accuratelly (mostly because that groups of the last PS3 fats that requires to use the trick "one or the other") but the other alternative is to not mention the PS3 model name at all, and personally i always have the feeling that is needed in that kind of wiki tables, and in general uses to be handy too
Lets say... if someone says a specific hardware component is used in motherboard DIA-002 most people (me included) is not going to know which PS3 model is the owner of DIA-002 motherboard, i have the feeling the info is incomplete without mentioning the PS3 model
 
Last edited:
How are you doing it ?, i need to take a look at the idpset tool made by zar, im thinking in adding 2 new variables for eid5 to the algorithm and see if the code stays simple
1. Detect whether the console uses nor or nand/emmc, you should be able to get that with a syscall.
2. Use sys_storage_open syscall to open the Flash memory (passing the correct argument for nor or nand/emmc)
3. Malloc a 0x200 bytes buffer (or declare an array of integers or char worth 0x200 bytes).
4. Use sys_storage_read syscall to dump a 0x200 bytes sector containing eid5 idps (work out the exact block to dump from wiki).
5. Extract from dumped data in allocated memory the idps/product code.
6. Free the allocated 0x200 bytes if you malloced in step 3.
7. Use sys_storage_close syscall to close the Flash memory.
 
Code:
#define FLASH_DEVICE_NAND 0x0100000000000001ULL
#define FLASH_DEVICE_NOR 0x0100000000000004ULL
#define FLASH_FLAGS 0x22ULL

u64 buffer[0x40], start_sector = 0x178; // NOR
sys_device_handle_t dev_id;
if(sys_storage_open(FLASH_DEVICE_NOR, 0, &dev_id, 0) != CELL_OK)
{
    sys_storage_open(FLASH_DEVICE_NAND, 0, &dev_id, 0);
    start_sector = 0x204; // NAND
}
u32 read;
sys_storage_read(dev_id, 0, start_sector, 1, buffer, &read, FLASH_FLAGS);
sys_storage_close(dev_id);
u64 eid0_idps[2];
eid0_idps[0] = buffer[0x0E];  
eid0_idps[1] = buffer[0x0F];
 
This is from memory only, unverified so I could be mistaken, to be checked.

But for the eid5 idps, iirc the start sector is something like 0x181 on NOR & 0x20D on NAND, a sector is 0x200 bytes.
And if you dump the entire sector, the idps should be found at sector start + 0x1D0.

Regarding idps spoofing, methods differ & the impact on the algo will be different, depending on the method. A permanent spoof with idpset will be the most impacting whereas psnpatch/wMM spoofing will be less impacting.
 
In the last days i been reviewing the algo to identify the PS3 model and i modifyed it a lot, im going to drop it here before i forget about it, is not a long time project for me, i just wanted to suggest one way to do it
The logic is pretty much the same, but i added some more checks and variables and now it can generate the names of most PS3 models dinamically (except reference tool PS3 models that are hardcoded, because doesnt makes sense to generate his names dinamically, neither the prototype PS3 models that are not fully supported)

One of the most important changes is i put the previous code inside 3 functions named "compare_ps3model", "find_ps3model", and "print_ps3model"
The compare function checks if the "product_code" and "product_sub_code" from inside EID0 and EID1 are identical, then it calls the find function with the improved versions of the switches from the previous version, and finally it calls the print function

I also splitted the char variables that composes the PS3 model names inside an structure named ps3model, the switches fills the data into the structure (up to 2 times incase there is a mistmatch in between EID0 and EID1)

Im not declaring the functions, syscalls, or other implementations of the additional checks, thats over my skills but im declaring some new variables for them
I assume "product_code_eid5" and "product_sub_code_eid5" can be find by reading flash, as mentioned here

The "vsh_target" can be considered is something still under research, but it looks like what m4j0r mentioned here should work here

The "region_dev" is something i dont know how to find, someone knows hoow to find the suffix A (america) or J (japan) in some of the non-retail models ?... maybe is something easy (i hope)

The "hdd_size" is just a weak implementation to find the suffix "A", "B", or "C" in slim and superslim retail PS3 models... the reason why i said is weak is because in the way i wrote the code im checking for the internal storage cacacity of the current hdd, so... in the current code this identification mechanism can be defeated simply by replacing the hdd by other hdd of the sizes specifyed in the checks
If some of you have a better alternative to find this suffix "A", "B", or "C" in slim and superslim retail PS3 models i prefer to change it, but in the meantime it should work in the way i did it

By now im initializing all this variables with a value that doesnt disturbs the logic inside the switches (EID5's to 0, hdd_size to 100GB, region_dev to Z, and vsh_target to 0), so the current version of the code should work even if that new variables are not fully implemented. The algorithm always asigns a valid "fallback" PS3 name incase this new variables are not entered

Code:
char     platform_id[8];                    // syscall 387. sys_sm_get_system_info
uint8_t  product_code_eid0 = pscode[3];     // syscall 867. sys_ss_appliance_info_manager -> get_ps_code. 6th byte of IDPS
uint8_t  product_sub_code_eid0 = pscode[5]; // syscall 867. sys_ss_appliance_info_manager -> get_ps_code. 8th byte of IDPS
uint8_t  product_code_eid5 = 0;             // ? readed from flash ?
uint8_t  product_sub_code_eid5 = 0;         // ? readed from flash ?
uint32_t hdd_size = 100;                    // ? needed to find CECH slims and superslims internal storage capacity suffix (A=Small, B=Medium, C=Big)
char     region_dev[1] = 'Z';               // ? needed to find DECH, DECHS, DECH-S, DECR development region suffix (A=America, J=Japan)
uint8_t  vsh_target = 0;                    // ? needed to find DECHS, DECH-S vshtgt=S. vsh::GetReleaseTarget(void) https://www.psdevwiki.com/ps3/VSH_Exports#vshmain ?

struct ps3model {
    char board[8] = 'UNK-XXX';
                                 //      Retail             |       Debug              |       AV Tool              | Arcade    | Tool         | Tool Proto
    char prefix[4] = 'UNKN';     // CECH     CECH           | DECH        DECH         | DECH         DECH          | GECR      | DECR         | DEH
    char hyphen[1] = '-';        // CECH     CECH-          | DECH        DECH-        | DECH         DECH-         | GECR-     | DECR-        | DEH-
    char vshtgt[1] = ' ';        // CECH     CECH-          | DECH        DECH-        | DECHS        DECH-S        | GECR-     | DECR-        | DEH-R
    char series[2] = 'xx';       // CECHA    CECH-43        | DECHA       DECH-25      | DECHSA       DECH-S25      | GECR-25   | DECR-14      | DEH-R10
    char region[2] = 'xx';       // CECHA01  CECH-4314      | DECHA00     DECH-2500    | DECHSA00     DECH-S2500    | GECR-2500 | DECR-1400    | DEH-R1030
    char suffix[4] = ' ';        // CECHA01  CECH-4314A/B/C | DECHA00A/J  DECH-2500A/J | DECHSA00A/J  DECH-S2500A/J | GECR-2500 | DECR-1400A/J | DEH-R1030A/J

    char report[32] = 'Unknown';
};

void find_ps3model(uint8_t product_code, uint8_t product_sub_code) {
    switch (hwinfo.platform_id) {
        case 'Cok14':
            ps3model.board = 'COK-001';
            ps3model.series = '10';                // GECR-1000 (ARC, CEX2ARC)
            if (product_code != 0xA0) {
                ps3model.hyphen = ' ';
                if (product_sub_code == 1) {
                    ps3model.series = 'A';         // CECHAxx (CEX, SHOP), DECHA00A/J (DEX, CEX2DEX), DECHSA00A/J (AVTOOL)
                } else {
                    ps3model.series = 'B';         // CECHBxx (CEX, SHOP), DECHB00A/J (DEX, CEX2DEX), DECHSB00A/J (AVTOOL)
                }
            }
            break;
        case 'CokB10':
            ps3model.board = 'COK-002';
            ps3model.series = '11';                // GECR-1100 (ARC, CEX2ARC)
            if (product_code != 0xA0) {
                ps3model.hyphen = ' ';
                if (product_sub_code == 3) {
                    ps3model.series = 'C';         // CECHCxx (CEX, SHOP), DECHC00A/J (DEX, CEX2DEX), DECHSC00A/J (AVTOOL)
                } else {
                    ps3model.series = 'E';         // CECHExx (CEX, SHOP), DECHE00A/J (DEX, CEX2DEX), DECHSE00A/J (AVTOOL)
                }
            }
            break;
        case 'CokC12':
            ps3model.board = 'SEM-001';
            ps3model.series = '12';                // GECR-1200 (ARC, CEX2ARC)
            if (product_code != 0xA0) {
                ps3model.hyphen = ' ';
                ps3model.series = 'G';             // CECHGxx (CEX, SHOP), DECHG00A/J (DEX, CEX2DEX), DECHSG00A/J (AVTOOL)
            }
            break;
        case 'CokD10':
            ps3model.board = 'DIA-001';
            ps3model.series = '13';                // GECR-1300 (ARC, CEX2ARC)
            if (product_code != 0xA0) {
                ps3model.hyphen = ' ';
                ps3model.series = 'H';             // CECHHxx (CEX, SHOP), DECHH00A/J (DEX, CEX2DEX), DECHSH00A/J (AVTOOL)
            }
            break;
        case 'CokE10':
            ps3model.board = 'DIA-002';
            ps3model.series = '14';                // GECR-1400 (ARC, CEX2ARC)
            if (product_code != 0xA0) {
                ps3model.hyphen = ' ';
                // ps3model.series = 'J';          // CECHJxx (CEX, SHOP), DECHJ00A/J (DEX, CEX2DEX), DECHSJ00A/J (AVTOOL)
                // ps3model.series = 'K';          // CECHKxx (CEX, SHOP), DECHK00A/J (DEX, CEX2DEX), DECHSK00A/J (AVTOOL)
            }
            break;
        case 'CokF10':
            ps3model.board = 'VER-001';
            ps3model.series = '15';                // GECR-1500 (ARC, CEX2ARC)
            if (product_code != 0xA0) {
                ps3model.hyphen = ' ';
                // ps3model.series = 'L';          // CECHLxx (CEX, SHOP), DECHL00A/J (DEX, CEX2DEX), DECHSL00A/J (AVTOOL)
                // ps3model.series = 'M';          // CECHMxx (CEX, SHOP), DECHM00A/J (DEX, CEX2DEX), DECHSM00A/J (AVTOOL)
                // ps3model.series = 'P';          // CECHPxx (CEX, SHOP), DECHP00A/J (DEX, CEX2DEX), DECHSP00A/J (AVTOOL)
                // ps3model.series = 'Q';          // CECHQxx (CEX, SHOP), DECHQ00A/J (DEX, CEX2DEX), DECHSQ00A/J (AVTOOL)
            }
            break;
    
        case 'CokG11':
            ps3model.board = 'DYN-001';
            ps3model.series = '20';                // DECH-2000A/J (DEX, CEX2DEX), DECH-S2000A/J (AVTOOL), GECR-2000 (ARC, CEX2ARC)
            if (hdd_size = 120) {
                ps3model.suffix = 'A';             // CECH-20xxA (CEX, SHOP)
            } else if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-20xxB (CEX, SHOP)
            } else {
                ps3model.suffix = 'A/B';           // CECH-20xxA/B (CEX, SHOP)
            }
            break;
        case 'CokH11':
            ps3model.board = 'SUR-001';
            ps3model.series = '21';                // DECH-2100A/J (DEX, CEX2DEX), DECH-S2100A/J (AVTOOL), GECR-2100 (ARC, CEX2ARC)
            if (hdd_size = 120) {
                ps3model.suffix = 'A';             // CECH-21xxA (CEX, SHOP)
            } else if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-21xxB (CEX, SHOP)
            } else {
                ps3model.suffix = 'A/B';           // CECH-21xxA/B (CEX, SHOP)
            }
            break;
        case 'CokJ13':
            ps3model.board = 'JTP-001';
            ps3model.series = '25';                // DECH-2500A/J (DEX, CEX2DEX), DECH-S2500A/J (AVTOOL), GECR-2500 (ARC, CEX2ARC)
            if (hdd_size = 160) {
                ps3model.suffix = 'A';             // CECH-25xxA (CEX, SHOP)
            } else if (hdd_size = 320) {
                ps3model.suffix = 'B';             // CECH-25xxB (CEX, SHOP)
            } else {
                ps3model.suffix = 'A/B';           // CECH-25xxA/B (CEX, SHOP)
            }
            break;
        case 'CokJ20':
            ps3model.board = 'JSD-001';
            ps3model.series = '25';                // DECH-2500A/J (DEX, CEX2DEX), DECH-S2500A/J (AVTOOL), GECR-2500 (ARC, CEX2ARC)
            if (hdd_size = 160) {
                ps3model.suffix = 'A';             // CECH-25xxA (CEX, SHOP)
            } else if (hdd_size = 320) {
                ps3model.suffix = 'B';             // CECH-25xxB (CEX, SHOP)
            } else {
                ps3model.suffix = 'A/B';           // CECH-25xxA/B (CEX, SHOP)
            }
            break;
        case 'CokK10':
            ps3model.board = 'KTE-001';
            ps3model.series = '30';                // DECH-3000A/J (DEX, CEX2DEX), DECH-S3000A/J (AVTOOL), GECR-3000 (ARC, CEX2ARC)
            if (hdd_size = 160) {
                ps3model.suffix = 'A';             // CECH-30xxA (CEX, SHOP)
            } else if (hdd_size = 320) {
                ps3model.suffix = 'B';             // CECH-30xxB (CEX, SHOP)
            } else {
                ps3model.suffix = 'A/B';           // CECH-30xxA/B (CEX, SHOP)
            }
            break;
        case 'CokM10':
            ps3model.board = 'MPX-001';
            ps3model.series = '40';                // DECH-4000A/J (DEX, CEX2DEX), DECH-S4000A/J (AVTOOL), GECR-4000 (ARC, CEX2ARC)
            if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-40xxB (CEX, SHOP)
            } else if (hdd_size = 500) {
                ps3model.suffix = 'C';             // CECH-40xxC (CEX, SHOP)
            } else {
                ps3model.suffix = 'B/C';           // CECH-40xxB/C (CEX, SHOP)
            }
            break;
        case 'CokM20':
            ps3model.board = 'MSX-001';
            ps3model.series = '40';                // DECH-4000A/J (DEX, CEX2DEX), DECH-S4000A/J (AVTOOL), GECR-4000 (ARC, CEX2ARC)
            if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-40xxB (CEX, SHOP)
            } else if (hdd_size = 500) {
                ps3model.suffix = 'C';             // CECH-40xxC (CEX, SHOP)
            } else {
                ps3model.suffix = 'B/C';           // CECH-40xxB/C (CEX, SHOP)
            }
            break;
        case 'CokM30':
            ps3model.board = 'MPX-001';
            ps3model.series = '40';                // CECH-40xxA (CEX, SHOP), DECH-4000A/J (DEX, CEX2DEX), DECH-S4000A/J (AVTOOL), GECR-4000 (ARC, CEX2ARC)
            ps3model.suffix = 'A';
            break;
        /*
        case 'CokM40':
            ps3model.board = 'MSX-001';
            ps3model.series = '40';                // CECH-40xxA (CEX, SHOP), DECH-4000A/J (DEX, CEX2DEX), DECH-S4000A/J (AVTOOL), GECR-4000 (ARC, CEX2ARC)
            ps3model.suffix = 'A';
            break;
        */
        case 'CokN10':
            ps3model.board = 'NPX-001';
            ps3model.series = '40';                // DECH-4000A/J (DEX, CEX2DEX), DECH-S4000A/J (AVTOOL), GECR-4000 (ARC, CEX2ARC)
            if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-40xxB (CEX, SHOP)
            } else if (hdd_size = 500) {
                ps3model.suffix = 'C';             // CECH-40xxC (CEX, SHOP)
            } else {
                ps3model.suffix = 'B/C';           // CECH-40xxB/C (CEX, SHOP)
            }
            break;
        /*
        case 'CokN30':
            ps3model.board = 'NPX-001';
            ps3model.series = '40';                // CECH-40xxA (CEX, SHOP), DECH-4000A/J (DEX, CEX2DEX), DECH-S4000A/J (AVTOOL), GECR-4000 (ARC, CEX2ARC)
            ps3model.suffix = 'A';
            break;
        */
        case 'CokP10':
            ps3model.board = 'PQX-001';
            ps3model.series = '42';                // DECH-4200A/J (DEX, CEX2DEX), DECH-S4200A/J (AVTOOL), GECR-4200 (ARC, CEX2ARC)
            if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-42xxB (CEX, SHOP)
            } else if (hdd_size = 500) {
                ps3model.suffix = 'C';             // CECH-42xxC (CEX, SHOP)
            } else {
                ps3model.suffix = 'B/C';           // CECH-42xxB/C (CEX, SHOP)
            }
            break;
        case 'cokP20':
            ps3model.board = 'PPX-001';
            ps3model.series = '42';                // DECH-4200A/J (DEX, CEX2DEX), DECH-S4200A/J (AVTOOL), GECR-4200 (ARC, CEX2ARC)
            if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-42xxB (CEX, SHOP)
            } else if (hdd_size = 500) {
                ps3model.suffix = 'C';             // CECH-42xxC (CEX, SHOP)
            } else {
                ps3model.suffix = 'B/C';           // CECH-42xxB/C (CEX, SHOP)
            }
            break;
        case 'CokP30':
            ps3model.board = 'PQX-001';
            ps3model.series = '42';                // CECH-42xxA (CEX, SHOP), DECH-4200A/J (DEX, CEX2DEX), DECH-S4200A/J (AVTOOL), GECR-4200 (ARC, CEX2ARC)
            ps3model.suffix = 'A';
            break;
        case 'CokP40':
            ps3model.board = 'PPX-001';
            ps3model.series = '42';                // CECH-42xxA (CEX, SHOP), DECH-4200A/J (DEX, CEX2DEX), DECH-S4200A/J (AVTOOL), GECR-4200 (ARC, CEX2ARC)
            ps3model.suffix = 'A';
            break;
        case 'cokR10':
            ps3model.board = 'RTX-001';
            ps3model.series = '43';                // DECH-4300A/J (DEX, CEX2DEX), DECH-S4300A/J (AVTOOL), GECR-4300 (ARC, CEX2ARC)
            if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-43xxB (CEX, SHOP)
            } else if (hdd_size = 500) {
                ps3model.suffix = 'C';             // CECH-43xxC (CEX, SHOP)
            } else {
                ps3model.suffix = 'B/C';           // CECH-43xxB/C (CEX, SHOP)
            }
            break;
        case 'cokR20':
            ps3model.board = 'REX-001';
            ps3model.series = '43';                // DECH-4300A/J (DEX, CEX2DEX), DECH-S4300A/J (AVTOOL), GECR-4300 (ARC, CEX2ARC)
            if (hdd_size = 250) {
                ps3model.suffix = 'B';             // CECH-43xxB (CEX, SHOP)
            } else if (hdd_size = 500) {
                ps3model.suffix = 'C';             // CECH-43xxC (CEX, SHOP)
            } else {
                ps3model.suffix = 'B/C';           // CECH-43xxB/C (CEX, SHOP)
            }
            break;
        /*
        case 'cokR30':
            ps3model.board = 'RTX-001';
            ps3model.series = '43';                // CECH-43xxA (CEX, SHOP), DECH-4300A/J (DEX, CEX2DEX), DECH-S4300A/J (AVTOOL), GECR-4300 (ARC, CEX2ARC)
            ps3model.suffix = 'A';
            break;
        */
        case 'cokR40':
            ps3model.board = 'REX-001';
            ps3model.series = '43';                // CECH-43xxA (CEX, SHOP), DECH-4300A/J (DEX, CEX2DEX), DECH-S4300A/J (AVTOOL), GECR-4300 (ARC, CEX2ARC)
            ps3model.suffix = 'A';
            break;
        case 'Deb01':
            ps3model.board = 'DEB-001';
            ps3model.series = '14';                // DECR-1400A/J (TOOL)
            break;
        case 'Cyt3.2':
            ps3model.board = 'TMU-520';
            ps3model.series = '10';                // DECR-1000A/J (TOOL) or DEH-R1040 (TOOL PROTO)
            break;
        case 'Cyt3.1':
            ps3model.board = 'TMU-520';
            ps3model.series = '10';                // DEH-R1030 (TOOL PROTO)
            break;
        /*
        case 'Cyt2.2':
            ps3model.board = 'TMU-510';
            ps3model.series = '10';                // DEH-R1000, DEH-R1010, DEH-R1020 (TOOL PROTO)
            break;
        */
    }
    
    switch (product_code) {
        case '83':
            ps3model.prefix = 'CECH';
            ps3model.region = '00';
            ps3model.report = 'Japan';
            break;
        case '84':
            ps3model.prefix = 'CECH';
            ps3model.region = '01';
            ps3model.report = 'United States';
            break;
        case '85':
            ps3model.prefix = 'CECH';
            ps3model.region = '04';
            ps3model.report = 'Europe';
            break;
        case '86':
            ps3model.prefix = 'CECH';
            ps3model.region = '05';
            ps3model.report = 'Korea';
            break;
        case '87':
            ps3model.prefix = 'CECH';
            ps3model.region = '03';
            ps3model.report = 'United Kingdom';
            break;
        case '88':
            ps3model.prefix = 'CECH';
            ps3model.region = '11';
            ps3model.report = 'Mexico';
            break;
        case '89':
            ps3model.prefix = 'CECH';
            ps3model.region = '02';
            ps3model.report = 'Australia';
            break;
        case '8A':
            ps3model.prefix = 'CECH';
            ps3model.region = '06';
            ps3model.report = 'South Asia';
            break;
        case '8B':
            ps3model.prefix = 'CECH';
            ps3model.region = '07';
            ps3model.report = 'Taiwan';
            break;
        case '8C':
            ps3model.prefix = 'CECH';
            ps3model.region = '08';
            ps3model.report = 'Russia';
            break;
        case '8E':
            ps3model.prefix = 'CECH';
            ps3model.region = '12';
            ps3model.report = 'Hong Kong';
            break;
        case '8F':
            ps3model.prefix = 'CECH';
            ps3model.region = '14';
            ps3model.report = 'Brazil';
            break;
        case '82':
            ps3model.prefix = 'DECH';
            if (vsh_target == 0x34) {
                ps3model.vshtgt = 'S'; // DECHSx00A/J (AVTOOL fat), DECH-Sxx00A/J (AVTOOL slim and superslim)
            }
            ps3model.region = '00';
            if (region_dev = A) {
                ps3model.suffix = 'A';
                ps3model.report = 'America';
            } else if (region_dev = J) {
                ps3model.suffix = 'J';
                ps3model.report = 'Japan';
            } else {
                ps3model.suffix = 'A/J';
                ps3model.report = 'America/Japan';
            }
            break;
        case '81':
            ps3model.prefix = 'DECR';
            ps3model.region = '00';
            if (strcmp(hwinfo.platform_id, 'Cyt3.1') == 0) {
                ps3model.prefix = 'DEH';
                ps3model.vshtgt = 'R';  // DEH-R1030, dirtyhack, R is not a VSH target
                ps3model.region = '30'; // DEH-R1030, dirtyhack, 30 is not a region
            }
            if (region_dev = A) {
                ps3model.suffix = 'A';
                ps3model.report = 'America';
            } else if (region_dev = J) {
                ps3model.suffix = 'J';
                ps3model.report = 'Japan';
            } else {
                ps3model.suffix = 'A/J';
                ps3model.report = 'America/Japan';
            }
            break;
        case 'A0':
            ps3model.prefix = 'GECR';
            ps3model.region = '00';
            ps3model.suffix = ' ';
            ps3model.report = 'Namco Arcade System';
            break;
    }
}

void print_ps3model(char title) {
    if (strcmp(hwinfo.platform_id, 'CokE10') == 0 && product_code != 0xA0) {
        fprintf(fp, "%s %s%sJ%s/K%s (%s)\n", title, ps3model.prefix, ps3model.vshtgt, ps3model.region, ps3model.region, ps3model.report);
    } else if (strcmp(hwinfo.platform_id, 'CokF10') == 0 && product_code != 0xA0) {
        fprintf(fp, "%s %s%sL%s/M%s/P%s/Q%s (%s)\n", title, ps3model.prefix, ps3model.vshtgt, ps3model.region, ps3model.region, ps3model.region, ps3model.region, ps3model.report);
    } else {
        fprintf(fp, "%s %s%s%s%s%s%s (%s)\n", title, ps3model.prefix, ps3model.hyphen, ps3model.vshtgt, ps3model.series, ps3model.region, ps3model.suffix, ps3model.report);
    }
}

void compare_ps3model() {
    uint8_t product_code = product_code_eid0;
    uint8_t product_sub_code = product_sub_code_eid0;
    char    title[24] = 'PS3 Model Name:';
    if (product_code_eid0 == product_code_eid5 && product_sub_code_eid0 == product_sub_code_eid5) {
        find_ps3model(product_code, product_sub_code);
        print_ps3model(title);
    } else {
        title = 'PS3 Model Name (EID0):';
        find_ps3model(product_code, product_sub_code);
        print_ps3model(title);
        
        title = 'PS3 Model Name (EID5):';
        product_code = product_code_eid5;
        product_sub_code = product_sub_code_eid5;
        find_ps3model(product_code, product_sub_code);
        print_ps3model(title);
    }
    fprintf(fp, "Motherboard Name: %s\n", ps3model.board);
}

Changelog

2022/07/11
Enabled checks for PS3 model CECH-43xx with motherboard REX-001(nor)
https://www.psx-place.com/threads/ps3-super-slim-doesnt-read-or-even-spin-discs.37596/#post-339574
Enabled checks for PS3 model CECH-40xx with motherboard MPX-001(nor)
https://www.psx-place.com/threads/p...d-or-even-spin-discs.37596/page-2#post-339645

2022/07/16
Enabled checks for PS3 model CECH-42xx with motherboard PPX-001(nor)
Enabled checks for PS3 model CECH-43xx with motherboard RTX-001(nor)
https://www.psx-place.com/threads/p...d-or-even-spin-discs.37596/page-3#post-339974
 
Last edited:
Using bguerville PS3 for this example (a CEX2DEX conversion), is going to print it this way:
Code:
PS3 Model Name (EID0): DECH-2500A (America)
PS3 Model Name (EID5): CECH-2504B (Europe)
Motherboard Name: JTP-001
If you convert it back to CEX is going to be printed this way, most PS3 users are going to see it this way
Code:
PS3 Model Name: CECH-2504B (Europe)
Motherboard Name: JTP-001
Otherway, if you complete the CEX2DEX conversion with the custom EID0 copyed to EID5 it should be printed this way, like a real debug
Code:
PS3 Model Name: DECH-2500A (America)
Motherboard Name: JTP-001

Btw @bguerville, i think this version is way better than the previous, but i understand maybe you are not interested in implementing it fully in the toolset, in that case i can do a "lite" version for you later... lets wait a bit to see if some of you completes the implementation of the new checks just incase you want to "cherry pick" the features of the algorithm, lets say... the checks related with arcade PS3 models probably are pointless in the toolset, but the new variable to find the suffix "A", "B", or "C" for slim and superslims retail PS3 models could be a nice improvement, specially if we find an easy way to do it
 
How long does it take to dump syscon?

I've been sitting at a black screen for a good 20 minutes now.

Running hfw 4.89, and v1.0.1
 
Last edited:
I'm not sure how the NAND/NOR dumper works on this release but I don't think it's working properly.
I used it on a a few DECR-1400s and a DECHA and it took an extremely long time to dump the NOR and NAND on all of the consoles, the NAND dump on the DECHA took more than 30 minutes (vs about 2 minutes through rebug toolbox), even when the dumps were done I don't think they were done correctly. I opened the dumped files in @littlebalup s dump checker and it gave me 80 errors (vs about 10 in rebug toolbox).
 
Back
Top