PS1 Emulation

From PS3 Developer wiki
Jump to: navigation, search

Description[edit]

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 changes related with PS1 emulation
  • 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 and ps1_rom.bin
    • 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).
    • Note: since 2.10++ all PS1 emulators, ps1_emu.self, ps1_netemu.self, ps1_newemu.self uses the since then added ps1_rom.bin bios file.

Files[edit]

Emulator versions[edit]

There is no accurate info in wiki about the different PS1 emulator .self revisions, if you want to collaborate documenting this info see the experimental table on Discussion page

Game formats[edit]

See: PSISOIMG0000 and Iso.bin.edat

Savegames[edit]

  • 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:

Arguments[edit]

ps1_emu.self[edit]

ps1_emu.self arguments
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[edit]

ps1_netemu.self arguments
7 arguments Name Example Notes
argv[0] self starting location dev_flash/ps1emu/ps1_netemu.self
argv[1] ISO.BIN.EDAT location
argv[2] unknown
argv[3] unknown
argv[4] unknown
argv[5] unknown
argv[6] unknown

ps1_newemu.self[edit]

ps1_newemu.self arguments
9 arguments Name Example Notes
argv[0] self starting location dev_flash/ps1emu/ps1_newemu.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 600
argv[5] unknown null/empty
argv[6] unknown 1
argv[7] unknown 2
argv[8] unknown 2

Game settings[edit]

Game settings hardcoded in PS1 emulators[edit]

http://www.ps3hax.net/showpost.php?p=261592&postcount=1264

CONFIG[edit]

Created/loaded by ps1_newemu.self and ps1_netemu.self, at path: /USRDIR/CONFIG

Content:

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)

PS1 games management in multiman[edit]

Manual starting SELF method[edit]

  1. Insert PSX/PSone disc (region/pressed doesn't matter)
  2. 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).
  1. Switch to filemanager mode
  2. Browse to /dev_flash/ps1emu
  3. Select either one of the ps1 emulation SELF files

Note: Some games run better with ps1_emu.self (e.g. Motal 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[edit]

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[edit]

From multiman.cpp source (line 2502) http://code.google.com/p/multiman/source/browse/source/multiman.cpp?r=8c5b662f1c54d4f95f646949cae3d033b15b1a2e

Codecode
{
	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:
    • The full screen commented argument seems to be the Upscaler setting available from XMB Settings[Game Settings][PS/PS2 Upscaler], with values: full/normal/off = 2/1/0