PS1 Emulation
Description
Note: there are no PS1 emulators available in early Tool/DECR and Debug/DEX firmwares (does not have dev_flash/ps1emu or ps2emu folder. dev_flash/vsh/etc/version.txt & index.dat say: ¨ps1emu:NA@NA: ps2emu:NA@NA: ps2gxemu:NA@NA: emerald:NA@NA: bdp:NA@NA:¨).
- Firmware 1.02:
- Added ps1_emu.self
- Firmware 1.70:
- Added ps1_netemu.self
- Added the ability to play original PlayStation format games downloaded from the PlayStation Store.
- Added rumble functionality for USB accessories which support it when playing PS2 games.
- Saved data from PlayStation format software now usable on both PSP and PS3 systems.
- Backwards compatibility for PS1 and PS2 games was improved.
- Firmware 1.80:
- Ability to upscale PS1 and PS2 games
- Ability to copy PS1/PS2 game saves from PS3 to Memory Cards using a Memory Card adapter.
- Backwards compatibility for PS1 and PS2 games was improved.
- Firmware 2.10:
- Added ps1_newemu.self
- Added ps1_rom.bin (MD5: FBB5F59EC332451DEBCCF1E377017237)
- Users can now play PS1 game discs on a PSP with remote play, PSP firmware version 3.50 or newer is required. (this feature was not announced).
- Backwards compatibility for PS1 and PS2 games was improved (Update was also unannounced but evident in Sony's backwards compatibility search site).
- Firmware 4.00
- Updated ps1_rom.bin (MD5: 81BBE60BA7A3D1CEA1D48C14CBCC647B). The new rom is stripped from PS2 related functions. As a result is 3565296 bytes smaller than previous version.
PS1 Emulator Types and Revisions
Firmware | Size | MD5 | Timestamp | Rev | Comm |
---|---|---|---|---|---|
1.00 AV | 10 296 408 | 981A7428C2A59219FA05861EDEEDBD4A | 06/10/04/12:16 | ? | ? |
1.02 | 10.296.408 | C5FE03742A951194C336EE33783F5CD6 | 06/10/21/00:01 | ? | ? |
1.10 | 10.296.408 | C9C9D7D2E36F3E3579A5DF713E9ABE1E | 06/11/09/06:09 | ? | ? |
1.11 | 10.296.408 | 26271CCA29B77483DC3D7FDDE7B9CC3C | 06/11/21/17:55 | ? | ? |
1.30 | 10.296.496 | E7932EC24E72B3005EE152B141A63690 | 06/12/05/05:34 | ? | ? |
1.31 | 10.296.496 | 2244DE70C85093D7E37BC3D3F4278BE1 | 06/12/12/18:48 | ? | ? |
1.32 | 10.296.496 | 601BCADBBBC0A2D0433C932A2D67C4EF | 06/12/18/05:55 | ? | ? |
1.50 | 10.303.536 | F8050B006CDFCC64DF742D7BBDC03130 | 07/01/18/22:53 | ? | ? |
? | ? | ? | ? | ? | ? |
1.70 | 6.857.648 | EA49942B6789FBE0A1C98BC12E282533 | 07/04/16/16:12 | ? | 0x14? |
? | ? | ? | ? | ? | ? |
1.90 | 6.974.864 | 478CFED0F7EE13C94F01C2A246C83D45 | 07/07/21/06:45 | ? | ? |
? | ? | ? | ? | ? | ? |
Stripped/extracted rom/bios | |||||
2.10 | 2.887.152 | AEE181B061E586F99E76C033C9DCF726 | 07/12/15/05:30 | ? | 0x15 |
? | ? | ? | ? | ? | ? |
3.40 | 2.824.576 | A6ABFB04739575E2264A4D3FEB2A9CBF | 10/06/23/15:45 | ? | ? |
? | ? | ? | ? | ? | ? |
3.66 | 2.824.832 | 95399A202003E216794511BD2D2E9DF6 | 11/06/16/03:52 | ? | ? |
3.70 | 2.824.920 | 045D81147B9BDFB8C8A416FD5F5A0C56 | 11/08/05/03:42 | same | ? |
~ | Any | ||||
3.72 | C745A30231103B83F04539021E4878FC | 11/09/14/01:17 | |||
3.73 | 2.824.920 | EB3AFF30B3206CFA6A8962AB393F773E | 11/10/04/12:55 | same | ? |
3.74 | E2A77C3DC9FD5AD4264341196462D096 | 11/10/25/00:38 | |||
4.00 | 2.829.784 | 94A8E6A8063C08FAD8CA9B340CCCAE67 | 11/11/22/03:17 | same | ? |
~ | Any | ||||
4.11 | 02B7F6D5F517959161B2154135D4B3BC | 12/02/11/07:13 | |||
4.15 | ? | ? | ? | ? | ? |
4.20 | 2.829.912 | 3778948C92F5FA12CB0AABE65BEE5465 | 12/06/15/02:09 | same | ? |
4.21 | B7B662397E3FFDD7C11F9617C1B41856 | 12/06/30/01:13 | |||
4.23 S | 2.829.912 | 6E74CC51E0C6462DF1F9278ED9DB9593 | 12/07/31/00:22 | ? | ? |
4.25 | 2.829.912 | 03EA65C3EA3F8DB04F236C49C6B6C0E1 | 12/09/07/07:03 | same | ? |
? | ? | ? | ? | ? | ? |
? | ? | ? | ? | ? | ? |
? | ? | ? | ? | ? | ? |
4.78 | 2.765.488 | 354F1DEEDCA3C4CFA1B49B6B28B1648D | 15/12/17/01:18 | ? | ? |
4.80 | ? | ? | ? | ? | ? |
4.81 | 2.765.616 | 2123E3D6A8E81647CB41F51AFEE6CCD6 | 16/10/24/19:23 | ? | ? |
Abandoned (last revision) | |||||
4.82 | 2.765.616 | 64BFA4DBD595A20E317B2189B54BF673 | 17/08/24/15:42 | Last | 0x15 |
~ | Any | ||||
4.88 | 0C553CE93A2A6322E16636DD76D75E32 | 21/04/12/11:34 |
· Decrypted (elf): changes every firmware version
· Build label: yes, with timestamp, search for -sgpu-sspu-sli4
· Target Firmware: yes repeated one time
· Revision: unknown
Firmware | Size | MD5 | Timestamp | Rev | Comm |
---|---|---|---|---|---|
1.70 | 6.872.592 | 5DA8492C4702F94DDDC4530921316789 | 07/04/16/16:13 | ? | 0x16? |
? | ? | ? | ? | ? | ? |
? | ? | ? | ? | ? | ? |
1.90 | 6.853.368 | 8A5A3676B461C97A9A467D5651D6EAAD | 07/07/21/06:47 | ? | ? |
? | ? | ? | ? | ? | ? |
Stripped/extracted rom/bios | |||||
2.10 | 2.764.288 | 7826B1C6799404216D4771C07DE12F53 | 07/12/15/05:31 | ? | 0x18? |
? | ? | ? | ? | ? | ? |
3.40 | 2.971.288 | FD32C7B7CBA2639FC8DB9EB615A16461 | 10/06/23/15:46 | 6520 | 0x2C? |
? | ? | ? | ? | ? | ? |
3.66 | 2.971.976 | 9586FC8B121E59526C31405DCFFB79CA | 11/06/16/03:54 | ? | ? |
3.70 | 2.972.168 | AA1DB63461EE0BE021ED45F85A6EECE0 | 11/08/05/03:43 | same | ? |
~ | Any | ||||
3.72 | 32F45129EC2844D419582912E54CEB22 | 11/09/14/01:18 | |||
3.73 | 2.972.168 | 17063FFAB205B72ABF7F59582B8A7988 | 11/10/04/12:56 | same | ? |
3.74 | 89C03D80ACE7C4FA914DD699621EB4F8 | 11/10/25/00:40 | |||
4.00 | 2.977.128 | DBB8FB62BE3F2064D31332FCB7575DF1 | 11/11/22/03:19 | same | ? |
4.01 | 9E60379FA979B0440C27C6AEE38754AF | 11/12/23/01:10 | |||
4.10 | 2.977.208 | B3CD41AB8235906AB41D3DA18D04F00E | 12/02/05/23:19 | same | ? |
4.11 | 4DDF2C3289AD9BEDF0719DBE1BDA971C | 12/02/11/07:15 | |||
4.15 | ? | ? | ? | ? | ? |
4.20 | 2.977.432 | 363A2D5EE2246E9CEFCBF1078593C771 | 12/06/15/02:10 | same | ? |
4.21 | 5E08C86EC07E4F227D3591DD9530CC95 | 12/06/30/01:15 | |||
4.23 S | 2.977.416 | 149E5E6AD727B1B37E29D4E8D15D5BB0 | 12/07/31/00:23 | ? | ? |
4.25 | 2.977.432 | 295B61D9EEE704077FEC870C8EAC7D35 | 12/09/07/07:04 | same | ? |
? | ? | ? | ? | ? | ? |
? | ? | ? | ? | ? | ? |
? | ? | ? | ? | ? | ? |
4.78 | 2.913.480 | 398A7CA9F0E8449E15FCB33B87C96194 | 15/12/17/01:19 | ? | ? |
4.80 | ? | ? | ? | ? | ? |
4.81 | 2.913.656 | 8765A00EE467B8635A13ECCBB1F85B89 | 16/10/24/19:24 | ? | ? |
4.82 | 2.913.752 | FCEB6595F9F8E5C77BA36C73C38397D9 | 17/08/24/15:43 | ? | ? |
Abandoned (last revision) | |||||
4.83 | 2.913.992 | CA9509623B9885E18D12E14FA1488EEF | 18/09/02/18:03 | 11624 | 0x3C |
~ | Any | ||||
4.88 | D3283D3F3B5CDF68113560829530E7B3 | 21/04/12/11:34 |
· Decrypted (elf): changes every firmware version
· Build label: yes, with timestamp, search for -sgpu-sli4
· Target Firmware: yes repeated two times
· Revision: sometimes, search for Revision
Firmware | Size | MD5 | Timestamp | Rev | Comm |
---|---|---|---|---|---|
2.10 | 2.763.848 | C792C72A06B94705374B846B94981B1A | 07/12/15/05:31 | ? | 0x19? |
? | ? | ? | ? | ? | ? |
3.40 | 2.708.856 | C866D54E85BAA06D111C8300F9EA85F1 | 10/06/23/15:51 | ? | 0x18? |
? | ? | ? | ? | ? | ? |
3.66 | 2.708.864 | 9AB86CFAEB12675F3DB08FCAA3541534 | 11/06/16/03:54 | ? | ? |
3.70 | 2.708.880 | 7AB7C32901778E3F0C9B8DB45296821B | 11/08/05/03:44 | same | ? |
~ | Any | ||||
3.72 | 2863E9B70B4FB6C5A0938FF508C46057 | 11/09/14/01:18 | |||
3.73 | 2.708.880 | 871E256771632569D664FF2A1ECE82C3 | 11/10/04/12:57 | same | ? |
3.74 | 8A8AC80CBA58561CC754C6CF66B059AB | 11/10/25/00:40 | |||
4.00 | 2.713.832 | F9E840430B2BC982CB1A71B7BDD7FC35 | 11/11/22/03:19 | same | ? |
4.01 | 953090CBCB96626899731B711B3D5B6A | 11/12/23/01:11 | |||
4.10 | 2.713.720 | 47E7FA52DB7BDEDF2187EB02D868834D | 12/02/05/23:20 | same | ? |
4.11 | 8A90DB2A206BE79423A99D4CF2458241 | 12/02/11/07:16 | |||
4.15 | ? | ? | ? | ? | ? |
4.20 | 2.713.904 | 8AC80356D1EFDDCFF7A7AD82136137D2 | 12/06/15/02:11 | same | ? |
4.21 | E482927E47B00C1478313E343DD652C4 | 12/06/30/01:15 | |||
4.23 S | 2.713.888 | A2CF9C4C00B40779FB5C529849E0D6A4 | 12/07/31/00:24 | ? | ? |
4.25 | 2.713.904 | 24107753F0B02075DAB20492BA67167D | 12/09/07/07:05 | same | ? |
? | ? | ? | ? | ? | ? |
? | ? | ? | ? | ? | ? |
? | ? | ? | ? | ? | ? |
4.78 | 2.649.144 | BF78A0DC74084B43777A7F8CE6C7B66A | 15/12/17/01:20 | ? | ? |
4.80 | ? | ? | ? | ? | ? |
4.81 | 2.649.272 | 0C76DE974439B12546EA494639C8EE9A | 16/10/24/19:25 | ? | ? |
Abandoned (last revision) | |||||
4.82 | 2.649.288 | C5957F268EE9E1429DE3AF0BC15F1395 | 17/08/24/15:44 | Last | 0x18 |
~ | Any | ||||
4.88 | 4002EC6CB88F5D2D5E7DF0B0F80A6A0A | 21/04/12/11:35 |
· Decrypted (elf): changes every firmware version
· Build label: yes, with timestamp, search for -sgpu-sspu-sli4
· Target Firmware: yes repeated two times
· Revision: unknown
PS1 emulators workload comparison
All emulators seems to use similar workload. Note that SPU 0-4 don't use JOB name per se, so is just info what they do.
Core | Job | Source | Notes |
---|---|---|---|
SPU0 | PS1 GPU SLI0 | SPU ASM | PS1 GPU software emulation |
SPU1 | PS1 GPU SLI1 | SPU ASM | PS1 GPU software emulation |
SPU2 | PS1 GPU SLI2 | SPU ASM | PS1 GPU software emulation |
SPU3 | PS1 GPU SLI3 | SPU ASM | PS1 GPU software emulation |
SPU4 | PS1 SPU | SPU ASM | PS1 SPU software emulation |
SPU5 | _libadec_at3CellSpursKernel0 | SPU ASM | AT library from ps3 firmware |
SPU6 | Isolation | C++ Raw SPU | Not PS1 emu specific |
SPU7 | - | - | Unavailable: Factory disabled SPU |
PPU:0 | ? | ? | |
PPU:1 | ? | ? |
Core | Job | Source | Notes |
---|---|---|---|
SPU0 | PS1 GPU SLI0 | SPU ASM | PS1 GPU software emulation |
SPU1 | PS1 GPU SLI1 | SPU ASM | PS1 GPU software emulation |
SPU2 | PS1 GPU SLI2 | SPU ASM | PS1 GPU software emulation |
SPU3 | PS1 GPU SLI3 | SPU ASM | PS1 GPU software emulation |
SPU4 | PS1 SPU | SPU ASM | PS1 SPU software emulation |
SPU5 | _libadec_at3CellSpursKernel0 | SPU ASM | AT3 library from ps3 firmware |
SPU6 | Isolation | C++ Raw SPU | Not PS1 emu specific |
SPU7 | - | - | Unavailable: Factory disabled SPU |
PPU:0 | ? | ? | |
PPU:1 | ? | ? |
Core | Job | Source | Notes |
---|---|---|---|
SPU0 | PS1 GPU SLI0 | SPU ASM | PS1 GPU software emulation |
SPU1 | PS1 GPU SLI1 | SPU ASM | PS1 GPU software emulation |
SPU2 | PS1 GPU SLI2 | SPU ASM | PS1 GPU software emulation |
SPU3 | PS1 GPU SLI3 | SPU ASM | PS1 GPU software emulation |
SPU4 | PS1 SPU | SPU ASM | PS1 SPU software emulation |
SPU5 | _libadec_at3CellSpursKernel0 | SPU ASM | AT3 library from ps3 firmware |
SPU6 | Isolation | C++ Raw SPU | Not PS1 emu specific |
SPU7 | - | - | Unavailable: Factory disabled SPU |
PPU:0 | ? | ? | |
PPU:1 | ? | ? |
PS1 BIOS
The PS1 emulators included in between PS3 firmwares 1.00 up to 2.01 contains a PS1 BIOS embedded inside the emulator .SELF structure
In PS3 firmware 2.10 (at the same time the ps1_newemu.self was introduced) the PS1 BIOS was stripped from the .SELF and distributed as an independant file named ps1_rom.bin. This BIOS had a size of 4.089.584 bytes (MD5: FBB5F59EC332451DEBCCF1E377017237) and is exactly the same file that was previously embedded in all PS1 emulators
In PS3 firmware 4.00 the ps1_rom.bin file was reduced in size, down to 524.288 bytes (MD5: 81BBE60BA7A3D1CEA1D48C14CBCC647B) by removing the unrelated PS2 functions
The latest version of ps1_rom file is the first 512KB of the 1.90 PS2 rom.
Firmware | Size | MD5 |
---|---|---|
2.10 ~ 3.74 | 4.089.584 | FBB5F59EC332451DEBCCF1E377017237 |
4.00 ~ 4.88 | 524.288 | 81BBE60BA7A3D1CEA1D48C14CBCC647B |
The PS1 BIOS version can be seen in two strings with this text, where the suffix "A" at the end of the first string indicates the region (A=NTSC U/C)
System ROM Version 5.0 06/23/03 A Copyright 1993-1999 (C) Sony Computer Entertainment Inc.
Region patch
Inside the emulators there is a string with the characters: JJJJAEJEAEJJEJJA that works as a selector based on the Product Code (also known as TargetID)
When the emulators are executed (inmediatly before booting the game) the PS1 BIOS is loaded into memory and a patch is applyed to the version string to replace the suffix "A" by one of the characters from the selector string
This patch is related to the region, it changes the video output, and is unknown if is responsible for anything else, like timings etc...
Console Type | NOT IN USE | TOOL SD | DEX DTCP-IP AV TEST | CEX Template:Shop | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Release Region | WorldWide | Japan | US Canada |
Europe | Korea | U.K. Ireland |
Mexico | Australia New Zealand |
Singapore Malaysia |
Taiwan | Russia Ukraine India |
China | Hong Kong | Brazil | ||
PS3 Models | N/A | DECR-xx00 DEH-Zxx00 |
DECH-xx00 DECH-Sxx00 |
CECHx00 CECH-xx00 |
CECHx01 CECH-xx01 |
CECHx04 CECH-xx04 |
CECHx05 CECH-xx05 |
CECHx03 CECH-xx03 |
CECHx11 CECH-xx11 |
CECHx02 CECH-xx02 |
CECHx06 CECH-xx06 |
CECHx07 CECH-xx07 |
CECHx08 CECH-xx08 |
N/A | CECHx12 CECH-xx12 |
CECHx14 CECH-xx14 |
Product Code | 0x80 | 0x81 | 0x82 | 0x83 | 0x84 | 0x85 | 0x86 | 0x87 | 0x88 | 0x89 | 0x8A | 0x8B | 0x8C | 0x8D | 0x8E | 0x8F |
PS1 PS2 Region | N/A | NTSC-J | NTSC-U/C | PAL | NTSC-J | PAL | NTSC-U/C | PAL | NTSC-J | NTSC-J | PAL | NTSC-J | NTSC-J | NTSC-U/C | ||
PS1 BIOS patch | J | J | J | J | A | E | J | E | A | E | J | J | E | J | J | A |
J J J J A E J E A E J J E J J A 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B 0x8C 0x8D 0x8E 0x8F
Patch apply to string in VERSTR, X is replaced with appropriate region:
System ROM Version 5.0 06/23/03 X Copyright 1993-1999 (C) Sony Computer Entertainment Inc.
Is worth to note that X is always on the same offset in ALL ps1 bios versions, and all ps2 bios images. So in case of bios swap
(Talk:PS1_Emulation#ps1_rom.bin ) correct region will be still set.
Patched offset is 0x7FF52 in rom file itself. Cobra have region free patch that in the end make X set to A (America) region, which apparently make bios region free. This can be true as similar thing happen on PCSX2 in ps1 mode. US rom is able to run all regions games, while JPN/EU fail to load different regions. It is because later JPN/EU BIOS versions have got an additional CD licence check introduced, accepting only the discs matching the hardcoded region. US BIOSes have never got this check implemented. By the way, it is the same thing with the PS2 BIOSes - only the US one will accept the discs from all over the world by default (that is why you have to patch the MECHACON for the US DTL region to get true region free playback).
PS1 GPU emulation
That part of all 3 emulators is quite impressive. Task is split between 4 SPE cores, but not in usual way. Every core is responsible for different part of PS1 GPU command flow, which is done dynamically. All that is linked by so called sli (spu link?), and all SPE cores run exactly same elf file. SPE program synchronize using sliTick, and sliTock functions with use of channels 16 - 24, and with help of PPU. That way 4 different PS1 GPU emulators can proceed 4 different PS1 GPU commands at the same time, with synchronization enough to not override other PS1 GPU tasks. As a example you can remove dithering by patch only on SPU0, and observe that only 1/4 of displayed lines will be missing dither pattern.
PSone Classic format
See: ISO.BIN.EDAT and PSISOIMG0000
- Savegames Location: /dev_hdd0/savedata/vmc
Note: capitalisation of filename is important: name it xxx.VM1 instead of xxxx.vm1 (e.g. Internal Memory Card.VM1 for PSX/PSone, Internal Memory Card.VM2 for PS2/PStwo)
The .VMx files appear to be raw memory card data:
- .VM1 Playstation 1 Memory cards can be edited with MemcardRex
- .VM2 Playstation 2 Memory cards can be edited with mymc
Arguments
ps1_emu.self
7 arguments | Name | Example | Notes |
---|---|---|---|
argv[0] | self starting location | dev_flash/ps1emu/ps1_emu.self | |
argv[1] | VM1-1 location | dev_hdd0/savedata/vmc/filename1.VM1 | |
argv[2] | VM1-2 location | dev_hdd0/savedata/vmc/filename2.VM1 | |
argv[3] | Regionnumber/TargetID | 0082 | |
argv[4] | unknown | 1200 | |
argv[5] | unknown | 1 | XRegistry.sys/setting/game/emuUpConvert ? (full/normal/off = 2/1/0) |
argv[6] | unknown | 0 | XRegistry.sys/setting/game/emuSmoothing ? (on/off = 1/0) |
ps1_netemu.self
9 arguments | Name | Example | Notes |
---|---|---|---|
argv[0] | Self starting location | dev_flash/ps1emu/ps1_netemu.self | |
argv[1] | VM1-1 name | (dev_hdd0/savedata/vmc/)argv[1] | |
argv[2] | VM1-2 name | (dev_hdd0/savedata/vmc/)argv[2] | |
argv[3] | Regionnumber/TargetID | 0084 | |
argv[4] | Unknown | 1200 | |
argv[5] | Path to ps1 game | /dev_hdd0/game/NPUJ01324 | |
argv[6] | Vibration on/off? | 1 | Seems to be XRegistry.sys/setting/pad/vibrationEnable |
argv[7] | Emu UpConvert | 0 | XRegistry.sys/setting/game/emuUpConvert ? (full/normal/off = 2/1/0) |
argv[8] | Emu Smoothing | 0 | XRegistry.sys/setting/game/emuSmoothing ? (on/off = 1/0) |
ps1_newemu.self
9 arguments | Name | Example | Notes |
---|---|---|---|
argv[0] | self starting location | dev_flash/ps1emu/ps1_newemu.self | |
argv[1] | VM1-1 name | (dev_hdd0/savedata/vmc/)argv[1] | |
argv[2] | VM1-2 name | (dev_hdd0/savedata/vmc/)argv[2] | |
argv[3] | Regionnumber/TargetID | 0082 | |
argv[4] | unknown | 600 | |
argv[5] | path to ps1 game | /dev_hdd0/game/NPUJ01324 | |
argv[6] | unknown | 1 | |
argv[7] | unknown | 2 | |
argv[8] | unknown | 2 |
PS1 games management in multiman
Manual starting SELF method
- Insert PSX/PSone disc (region/pressed doesn't matter)
- Start MultiMAN (e.g. 2.07.01++)
- Since 02.07.05 the PSX and PS2 discs are properly detected. PSX discs will show in XMB Game Column and you can launch the PS1 game from there. It uses ps1_emu.self default (you can choose Load or Load (Net), latter uses ps1_netemu).
- Switch to filemanager mode
- Browse to /dev_flash/ps1emu
- Select either one of the ps1 emulation SELF files
Note: Some games run better with ps1_emu.self (e.g. Mortal Kombat) while others run better with ps1_netemu.self (e.g. Resident Evil 3). If it doesn't work, try another ps1 emulation SELF file.
Downside: memory card options are unavailable unless you created a Virtual Memorycard before starting MultiMAN (XMB::Category Game:: Memory Card Utility (PS/PS2) > Create a PS1 memory card. Set it to Slot 1 (Press Triangle while selecting the Memory Card, then Assign it). Note: naming it "Internal Memory Card" sometimes works better than other names. MultiMAN 02.07.07 seems to solve the savegame issues.
Changes in MultiMAN 2.07.00/01 for ps1_emu handling
These options where needed to make above work:
- Added: LV2 access rights to use LV1 Storage Manager (syscall 864)
- Added: LV1 patch for user access to sys_storage functions (syscalls 600 to 623)
Arguments handling
From multiman.cpp source (line 2502) http://code.google.com/p/multiman/source/browse/source/multiman.cpp?r=8c5b662f1c54d4f95f646949cae3d033b15b1a2e
{ char* launchargv[9]; memset(launchargv, 0, sizeof(launchargv)); launchargv[0] = (char*)malloc(strlen(mc1)+1); strcpy(launchargv[0], mc1); launchargv[1] = (char*)malloc(strlen(mc2)+1); strcpy(launchargv[1], mc2); launchargv[2] = (char*)malloc( 5); strcpy(launchargv[2], "0082"); launchargv[3] = (char*)malloc( 5); strcpy(launchargv[3], "1600"); launchargv[4] = (char*)malloc(10); strcpy(launchargv[4], app_path); launchargv[5] = (char*)malloc( 2); strcpy(launchargv[5], "1"); launchargv[6] = (char*)malloc( 2); strcpy(launchargv[6], "2"); // full screen on/off = 2/1 launchargv[7] = (char*)malloc( 2); strcpy(launchargv[7], "1"); // smoothing on/off = 1/0 launchargv[8] = NULL; unload_modules(); exitspawn((const char*) "/dev_flash/ps1emu/ps1_netemu.self", (char* const*)launchargv, NULL, NULL, 0, 1001, SYS_PROCESS_PRIMARY_STACK_SIZE_1M); } { char* launchargv[7]; memset(launchargv, 0, sizeof(launchargv)); launchargv[0] = (char*)malloc(strlen(mc1)+1); strcpy(launchargv[0], mc1); launchargv[1] = (char*)malloc(strlen(mc2)+1); strcpy(launchargv[1], mc2); launchargv[2] = (char*)malloc( 5); strcpy(launchargv[2], "0082"); // region launchargv[3] = (char*)malloc( 5); strcpy(launchargv[3], "1200"); launchargv[4] = (char*)malloc( 2); strcpy(launchargv[4], "1"); // full screen on/off = 2/1 launchargv[5] = (char*)malloc( 2); strcpy(launchargv[5], "1"); // smoothing on/off = 1/0 launchargv[6] = NULL; unload_modules(); exitspawn((const char*) "/dev_flash/ps1emu/ps1_emu.self", (char* const*)launchargv, NULL, NULL, 0, 1001, SYS_PROCESS_PRIMARY_STACK_SIZE_1M); }
- Notes:
Game settings
External CONFIG file
Created/loaded by ps1_newemu.self and ps1_netemu.self at path: /USRDIR/CONFIG
Example:
00000000 1C 00 00 00 50 53 31 45 6D 75 43 6F 6E 66 69 67 ....PS1EmuConfig 00000010 46 69 6C 65 00 97 0A 54 04 00 00 00 01 00 00 00 File...T........ 00000020 0F D4 CC B9 10 00 00 00 64 69 73 63 5F 6E 6F 00 ........disc_no. 00000030 04 00 00 00 00 00 00 00 93 D1 5B F8 ..........[.
Offset | size | data | notes |
---|---|---|---|
0x00 | 0x04 | 1C 00 00 00 | size of the next 4 values |
0x04 | 0x10 | PS1EmuConfigFile | name/id |
0x14 | 0x04 | 00 97 0A 54 | ? |
0x18 | 0x04 | 04 00 00 00 | ? |
0x1C | 0x04 | 01 00 00 00 | ? |
0x20 | 0x04 | 0F D4 CC B9 | crc32 of the previous 4 values |
0x24 | 0x04 | 10 00 00 00 | size of the next 3 values |
0x28 | 0x08 | disc_no | name/id |
0x30 | 0x04 | 04 00 00 00 | amount of discs |
0x34 | 0x04 | 00 00 00 00 | disc number |
0x38 | 0x04 | 93 D1 5B F8 | crc32 of the previous 3 values |
- Other posible entries/commands/id
- user_memory_size ? (in both ps1_newemu.elf and ps1_netemu.elf appears next to PS1EmuConfigFile and disc_no)
Embedded Game settings
All the PS1 emulators contains a list of game settings embedded inside his .SELF structure inside 3 tables we could name the Checksums Table, the Titles table, and the Commands Table. The offsets of this tables differs by emulator revision and type
The entry point to read the whole structure of this tables starts by reading the 4 bytes of the first Checksum of the first game from the checksums table (see below), next 4 bytes are an offset (to read the Titles table), next 4 bytes is a Command Count and next 4 bytes is a Command offset (to read the Commands Table), to load the data in the other tables is needed to substract 0x10000 to this offsets located next to the checksum of a specific game
The Title IDs (from inside the Titles table) doesnt seems to be used for any logic check, seems to be mostly identifyers (with typos) intended to be displayed in some kind of debug menu in "human readable format" only for informative purposes. Are text strings null terminated in the format "ABCD_123.45" and aligned to 8 bytes, so most of them have a total size of 0x10 but in old firmwares there are some entries with the text "unknown" with a size of 8 bytes (in other words, the entries with the text "unknown" are half the size of the others)
Every command inside the Commands Table is composed by 8 bytes, where the first 4 bytes are the Command ID (see talk page) and the next 4 bytes is the Command Data
All the Command Data values can be considered the most bottom of this hierarchy... except command ID=0x02(netemu 3.40 up to 4.88) containing an offset to a deeper level of the hierarchy where is stored a list with some of the disc sectors for a few libcrypt protected games
Game checksum
Checksum is simple Adler32 calculated from 2048 bytes of disc data, starting from 0x9318 offset in raw image. Emulator perform check if that sector have CD001 string, if string is missing "unknown" string is used, and hash calculation is not performed. You can use tools like hashtab to easily calculate checksum for new game.
Is calculated using the data contents only (2048 bytes or 0x800h) of the sector 16 (beginning at the 0x9318 of the RAW/2352 image). Every single byte is used in the process. Calculation code does start at 0xC1658 in the ps1_netemu from 4.88 firmware.
Super simple python script to calculate checksum, script lack of some checks performed by emu, and is hardcoded to 0x9318 offset, but should be enough.
Usage: edit *your first.bin* to name of your image, run script from CMD. Require python (3?).

import zlib with open('your first.bin', 'rb') as f: f.seek(0x9318) suma = zlib.adler32(f.read(2048)) print (hex(suma))
Game settings access
Like mentioned above config is created from 2x u32 values. Lets call first value command, and second value param.
Command is used to calculate address for param, and only param is stored on obtained address.
Emulator then check for params, and if found (usually when not zero) apply settings based on them.
Beside functions that read command params directly, every emulator have function (madeup name) ReadInternalConfigValue(u32 command_id). This function take command_id as only variable, and return param in r3 for selected command. This is used widely to read command params, that include libcrypt commands.
Function mentioned above is placed on (in emu memory, 4.86):
- ps1_emu 0x10638
- ps1_newemu 0x12F54
- ps1_netemu 0xB65F0