multiMAN v04.19.07 is now available from deank with the changes below:
Download: multiMAN v04.19.07 Update (20130212) (21.77 MB - CEX/DEX/STEALTH updates) / multiMAN v04.19.07 Update (20130212) (Mirror) / Showtime 04.03.010 [CEX].pkg (5.58 MB) / Showtime 04.03.010 [DEX].pkg (5.64 MB) / mM v04.19.07 Arabic Translation by HAIDER / Showtime 04.03.021 [CEX].pkg (standalone) (5.67 MB) / Italian Translation LANG_IT by Dino05 / French Translation LANG_FR by winch03200 / Portuguese Translation LANG_PR by kgb / Arabic Translation LANG_AR by HAIDER / Japanese Translation LANG_JP by Kyan_dudl / Translation PT-Brazil by ajts1989 / Galician Translation LANG_GL by ser8210 / Indonesian Translation LANG_IN by aquarius / Hungarian Translation LANG_HU by JohnDoeHun / EL Translation LANG_EL by tupac4u/ Russian Translation LANG_RU by pvc1
multiMAN 04.19.07 minor update is available online and in the web column. Showtime by Andreas Oman 4.03.010 (for mM and Standalone) are available online and in the web column.- Added support for multi-disc games when using PS1_NETEMU emulator
With this update the ps1 backups support saga should be concluded.
p.s. Here are the two major patches in ps1_netemu. Iris no longer uses 'patched emulators' but provides syscall emulation, but I prefer to keep it this way - it is much clear and simple.
ATAPI 0x4A GET EVENT/STATUS NOTIFICATION
Code:
//case 8 = [fill sector buffer with 0xFF]
//case 7 = [0xBE READ CD]
//case 6 = [0x51 READ DISC INFORMATION]
//case 5 = [0x4A GET EVENT/STATUS NOTIFICATION]
//case 4 = [fill sector buffer with 0xFF]
//case 3 = [0x00 TEST UNIT READY]
//case 2 = [sys_storage_close()]
//case 1 = [sys_storage_open() ]
//4.30
//#define BASE (0x11C8F8) // GET EVENT/STATUS NOTIFICATION in ps1_netemu
//#define RETURN (0x11CA10) //+118 // case 5 return
//#define RETURN_ERR (0x11CFC4) //+6CC // case 5 return
//4.20
//#define BASE (0x11C7E8) // GET EVENT/STATUS NOTIFICATION in ps1_netemu
//#define RETURN (0x11C900) // case 5 return
//#define RETURN_ERR (0x11CEB4) // case 5 return
//3.55
//#define BASE (0x11B038) // GET EVENT/STATUS NOTIFICATION in ps1_netemu
//#define RETURN (0x11B150) // case 5 return
//#define RETURN_ERR (0x11B704) // case 5 return
//3.41
#define BASE (0x11B2D8) // GET EVENT/STATUS NOTIFICATION in ps1_netemu
#define RETURN (0x11B3F0) // case 5 return
#define RETURN_ERR (0x11B9A4) // case 5 return
#define SECTOR_SIZE (0xD0) // address in lv2 memory to store sector size
#define HANDLE (0xD8) // address in lv2 memory to store fd (open handle)
#define DISC (0xE0) // address in lv2 memory to store current disc number (0..7)
#define ABS(target) ((target) - (BASE) - .)
#define ABS2(target) ((target) - .)
#define MEM_BASE(dest) \
li dest, 1; \
rldicr dest, dest, 63, 0;
#define LOAD_LABEL(base, dest, source, address) \
oris dest, source, ((base) + (address))@h; \
ori dest, dest, ((base) + (address))@l;
#define LOAD_LABEL2(dest, source, address) \
LOAD_LABEL(BASE, dest, source, address)
#define PEEK(address) \
ori %r3, %r25, address; \
li %r11, 6; \
sc;
#define POKE(address) \
ori %r3, %r25, address; \
li %r11, 7; \
sc;
#define SLEEP(ms) \
li %r3, ms; \
li %r11, 0x8D; \
sc;
#define RED 0
#define GREEN 1
#define YELLOW 2
#define OFF 0
#define ON 1
#define BLINK 2
#define LED(color, mode) \
li %r3, color; \
li %r4, mode; \
li %r11, 386; \
sc;
// IN:
// %r26 -> address of local stack buffer
// %r27 -> reserved
// %r28 -> reserved
.org 0
MEM_BASE(%r25)
lis %r4, 0x0002
stw %r4, 0x78(%sp) // 00 02 00 00 = packet length
stw %r4, 0x7C(%sp) // 00 02 00 00 = disc in tray, tray closed
li %r3, 0
LOAD_LABEL2(%r3, %r3, disc_name)
ld %r4, 0(%r3)
std %r4, 0(%r26)
ld %r4, 8(%r3)
std %r4, 8(%r26)
mr %r3, %r26
addi %r4, %r26, 0x10
li %r11, 805 // opendir
sc
cmplwi %r3, 0
bne next_disc
lwz %r3, 0x10(%r26)
li %r11, 807 // closedir
sc
b ABS(RETURN)
next_disc:
PEEK(HANDLE)
cmplwi %r3, 0
beq file_closed
li %r11, 804 // close
sc
li %r4, 0 // invalidate handle
POKE(HANDLE)
PEEK(DISC)
addi %r4, %r3, 1
andi. %r4, %r4, 7
POKE(DISC)
file_closed:
lis %r4, 0x0001 // tray open
stw %r4, 0x7C(%sp) // 00 01 00 00 = no disc in tray, tray opened
SLEEP(1000)
b ABS(RETURN_ERR)
.align 2
disc_name:
.string "/psx_cdrom0" ATAPI 0xBE READ CD
Code:
//4.30
//#define BASE (0x11C310) // READCD+0x10 in ps1_netemu
//#define RETURN (0x11BFDC) // +334 // case 7 return
//4.20
//#define BASE (0x11C200) // READCD+0x10 in ps1_netemu
//#define RETURN (0x11BECC) // case 7 return
//3.55
//#define BASE (0x11AA50) // READCD+0x10 in ps1_netemu
//#define RETURN (0x11A71C) // case 7 return
//3.41
#define BASE (0x11ACF0) // READCD+0x10 in ps1_netemu
#define RETURN (0x11A9BC) // case 7 return
//case 8 = [fill sector buffer with 0xFF]
//case 7 = [0xBE READ CD]
//case 6 = [0x51 READ DISC INFORMATION]
//case 5 = [0x4A GET EVENT/STATUS NOTIFICATION]
//case 4 = [fill sector buffer with 0xFF]
//case 3 = [0x00 TEST UNIT READY]
//case 2 = [sys_storage_close()]
//case 1 = [sys_storage_open() ]
#define SECTOR_SIZE (0xD0) // address in lv2 memory to store sector size
#define HANDLE (0xD8) // address in lv2 memory to store fd (open handle)
#define DISC (0xE0) // address in lv2 memory to store current disc number (0..7)
#define ABS(target) ((target) - (BASE) - .)
#define ABS2(target) ((target) - .)
#define MEM_BASE(dest) \
li dest, 1; \
rldicr dest, dest, 63, 0;
#define LOAD_LABEL(base, dest, source, address) \
oris dest, source, ((base) + (address))@h; \
ori dest, dest, ((base) + (address))@l;
#define LOAD_LABEL2(dest, source, address) \
LOAD_LABEL(BASE, dest, source, address)
#define PEEK(address) \
ori %r3, %r25, address; \
li %r11, 6; \
sc;
#define POKE(address) \
ori %r3, %r25, address; \
li %r11, 7; \
sc;
// IN:
// %r24 -> address of local stack buffer
// %r29 -> address of readcd data buffer
// %r9 -> sector number
.org 0
MEM_BASE(%r25)
PEEK(SECTOR_SIZE)
mullw %r30, %r9, %r3
PEEK(HANDLE)
mr %r27, %r3
cmplwi %r3, 0
bne read_sector // handle is valid, file already opened
LOAD_LABEL2(%r3, %r3, iso_name)
ld %r4, 0(%r3)
PEEK(DISC)
sldi %r3, %r3, 8
add %r4, %r4, %r3
std %r4, 0(%r24)
mr %r3, %r24
li %r4, 0
addi %r5, %sp, 0xE0
li %r6, 511
li %r7, 0
li %r8, 0
li %r11, 801 // open
sc
cmpldi %r3, 0
bne abort
lwz %r4, 0xE0(%sp) // store file handle
POKE(HANDLE)
mr %r27, %r4
read_sector:
mr %r3, %r27
mr %r4, %r30
li %r5, 0
addi %r6, %sp, 0xE8
li %r11, 818 // seek
sc
cmpldi %r3, 0
bne close
mr %r3, %r27
mr %r4, %r29
li %r5, 0x940
addi %r6, %sp, 0xE8
li %r11, 802 // read
sc
cmpldi %r3, 0
beq return
close:
mr %r3, %r27
li %r11, 804 // close
sc
li %r4, 0 // invalidate handle
POKE(HANDLE)
abort:
lis %r3, 0x8001
ori %r3, %r3, 0x000A // (BUSY 0x8001000A)
extsw %r3, %r3
return:
mr %r25, %r3
b ABS(RETURN)
.align 2
iso_name:
.string "/psx_d0" mM's main source file would become over 100 000 if I spend the time to follow the 'break line' rule when more than 50-60 characters are used per line and if I used comments. I started with mM as a tool for myself so I don't really care if other people can continue with it, nor I'm weary about someone adopting the code to turn it into a bigger mess. It contains about 200 lines from the original "Open Backup Manager" (which afaik was ~3000 lines) - if you wish you can start with it.
With multiMAN 05.00.00 only 4.30 and higher firmwares will be supported. Supporting 14 different firmwares is too hard to maintain compatibility with.
These will no longer be supported:- 3.41 OFW
- 3.41 OFW + DONGLE
- 3.41 MFW (HERMES)
- 3.55 OFW
- 3.55 CFW KMEAW
- 3.55 CFW COBRA
- 3.55 CFW TB
- 3.55 CFW REBUG/ROGERO
- 3.55 OFW DEX
- 3.55 CFW DEX
- 4.21 OFW DEX
- 4.21 CFW REBUG
- 4.21 CFW ROGERO 1.00..2.03
These and later will be supported:- 4.30 CFW ROGERO 2.05..
- 4.30 CFW REBUG
- 4.31 CFW
In the beginning mM used to support 1.90/3.00/3.14/3.21 firmwares but then suddenly the new additions started to cause issues with these old firmwares so I leveled up at 3.41. Now 2 years and 6 months later I think it is time to go up again.
Users of unsupported firmwares can stay with 04.19.00 or lower multiMAN version - anyway - it has more than everything one may need. Or switch to Iris.
Just a quick note: From the next version mM will use its own payload. No more [Hermes], [Standard], [PL3].
I coded my own payload:- It doesn't use any syscalls
- It is just 252 bytes (over 5-6 times smaller than other payloads)
- It doesn't overwrite any code in LV2 memory
- It doesn't allocate kernel memory
- It supports multiple path/files redirections
- It is memory-position independent and easy to use on all firmwares
- ... and is 252 bytes
Update: multiMAN v04.19.07 Update CEX TEST (20130217) (2.45 MB) - THIS IS A TEST VERSION!- It introduces the new mM payload which makes mM independent and easy to port for various firmwares
- Supports only 3.55 CEX/DEX, 4.21 CEX/DEX, 4.30 CEX, 4.31 CEX
- BD-ROM Emulator option in Settings can be set to "Enable / Disable" - no more "Hermes"/"Standard"
- This payload overwrites 252 bytes of strings in LV2 memory (and not 4000 bytes of code like other payloads), it doesn't use syscalls and doesn't rely on firmware functions, executes fast and improves performance
- Compatibility-wise it is better than "Standard" and slightly better than "Hermes".
Download: multiMAN v04.19.07 Update CEX TEST (20130218) (2.45 MB)
This is another test version with the new payload.- Added option in settings "Redirect /app_home":
- Disable (/app_home will not be mounted at all)
- Enable (/app_home as used in previous versions - points to the game - for disc-less)
- Toolbox (on Rogero firmwares with pre-installed toolbox if you play from discs only - it allows you to return to stealthMAN without restart)
- IMPROVED DISC-LESS COMPATIBILITY:
The new payload allows for some tweaks and there is 80% chance that games that didn't work disc-less will now work. It is somewhat based on the DEX LAN /app_home mounting from remote PC compatibility list, which you can find here: Omnomnom's Tasty A-Z of mmDM Game-Running Tutorials
If you want real improvements please post back with FEEDBACK. For example "Alice: Madness Returns" and "Army of Two: The 40th Day" now work disc-less. Thanks to GotIt4Free for all the tests.
You can use this report_data.txt to update your stealthMAN via the toolbox as usual:
Download: multiMAN v04.19.07 Update STEALTH CEX TEST (20130218) (1.49 MB)
Copy report_data.txt a USB stick, start the toolbox/IPF and press [START] to update stealMAN.