Editing PS2 Emulation
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 17: | Line 17: | ||
==PS2 emulators workload comparison== | ==PS2 emulators workload comparison== | ||
{{PS2 emulators workload comparison}} | {{PS2 emulators workload comparison}} | ||
Note: Apparently ps2_gxemu SPU layout changed at some point (maybe ps2_emu too), and above table is not accurate for latest emu versions.<br> | |||
0-6 layout for ps2_gxemu currently look like this: IOP, SPU2, IPU, VU1, EEDMA, GSGIF, UNK(probably isolation). | |||
==PS2 Emulator Types and Revisions== | ==PS2 Emulator Types and Revisions== | ||
Line 480: | Line 482: | ||
===Video Modes=== | ===Video Modes=== | ||
'''Note:''' Real PS2 : | '''Note:''' Real PS2 : http://users.neoscientists.org/~blue/ps2videomodes.txt | ||
Video Modes | Video Modes | ||
Line 942: | Line 944: | ||
===ps2_netemu.self=== | ===ps2_netemu.self=== | ||
#BD Remote Control | #BD Remote Control | ||
#PLAYSTATION(R)3 Controller (Vendor ID 0x54C, Product ID 0x268), | #PLAYSTATION(R)3 Controller (Vendor ID 0x54C, Product ID 0x268), | ||
Line 958: | Line 957: | ||
#PS3 Dance Dance Revolution Dance Pad - not ps2 accessory, opposite arrows can't be pressed at the same time. | #PS3 Dance Dance Revolution Dance Pad - not ps2 accessory, opposite arrows can't be pressed at the same time. | ||
#Pop'N Music controllers - Require PS2 to USB converter. Wrong button mappings can be fixed by remap in config file. | #Pop'N Music controllers - Require PS2 to USB converter. Wrong button mappings can be fixed by remap in config file. | ||
==BIOS== | ==BIOS== | ||
Line 1,290: | Line 1,288: | ||
Vector at 0xC00 address. | Vector at 0xC00 address. | ||
0x00 - | 0x00 - | ||
0 = | 0 = exec smth, | ||
1 = 0x132 lv1 panic | 1 = 0x132 lv1 panic | ||
2 = 0x133 lv1 panic | 2 = 0x133 lv1 panic | ||
Line 1,302: | Line 1,294: | ||
4 = 0x135 lv1 panic | 4 = 0x135 lv1 panic | ||
else = 0x136 lv1 panic | else = 0x136 lv1 panic | ||
0x03 - Enable additional code related to VU0/COP2. | 0x03 - Enable additional code related to VU0/COP2. | ||
3 = Patch 0x186C10 to NOP | 3 = Patch 0x186C10 to NOP | ||
Line 1,311: | Line 1,300: | ||
anything else = LV1 panic | anything else = LV1 panic | ||
0x04 - Unknown. Available for HW0 only. | 0x04 - Unknown. Available for HW0 only. | ||
0x05 - External | 0x05 - External interrupt disable (48 bit in MSR). | ||
0x06 - External | 0x06 - External interrupt enable (48 bit in MSR) with param 0x8000, otherwise do nothing. | ||
0x0A - IPU emulation related syscall | 0x0A - IPU emulation related syscall | ||
0x0B - IPU emulation related syscall | 0x0B - IPU emulation related syscall | ||
0x0C - Used in PS2 COP0 MTC0/MFC0 r9/r25 (count/perf), decrementer/timing related, return value in r15. | 0x0C - Used in PS2 COP0 MTC0/MFC0 r9/r25 (count/perf), decrementer/timing related, return value in r15. | ||
Config CMD 0x17 disable that syscall for r9 (count) r/w, and alternative path is used. Perf r/w still use it. | Config CMD 0x17 disable that syscall for r9 (count) r/w, and alternative path is used. Perf r/w still use it. | ||
0x10 - lv1 panic. | 0x10 - lv1 panic. | ||
0x1002 - Invalidate gpu hvcalls. | 0x1002 - Invalidate gpu hvcalls. | ||
0x800000XX - HV Syscall where XX is syscall nr. | 0x800000XX - HV Syscall where XX is syscall nr. | ||
Line 1,475: | Line 1,447: | ||
If you want to read some speculation and brainstorming about them, please join the {{talk}} page | If you want to read some speculation and brainstorming about them, please join the {{talk}} page | ||
<div> | |||
<div style="float:top; text-align:center;">'''PS2 Emulators Config Commands Overview'''</div> | |||
<div style="float:left; width:50%;"> | |||
<div style="float:right; padding-right:5px;"> | |||
{| class="wikitable" style="font-size:85%; line-height:100%; text-align:center" | {| class="wikitable" style="font-size:85%; line-height:100%; text-align:center" | ||
| | |- | ||
! rowspan="2" | Command Name !! colspan="3" | Command ID !! rowspan="2" style="padding:1px" | Max<br>Usage !! colspan="4" | Command Data | ! rowspan="2" | Command Name !! rowspan="36" style="padding:0px" | || colspan="3" | Command ID !! rowspan="36" style="padding:0px" | || rowspan="2" style="padding:1px" | Max<br>Usage !! rowspan="36" style="padding:0px" | || colspan="4" | Command Data | ||
|- | |- | ||
! style="padding:1px" | gxemu !! style="padding:1px" | softemu !! style="padding:1px" | netemu !! Length !! colspan="3" | Params | ! style="padding:1px" | gxemu !! style="padding:1px" | softemu !! style="padding:1px" | netemu !! Length !! colspan="3" | Params | ||
Line 1,489: | Line 1,465: | ||
| 0x00 || 0x00 || 0x01 | | 0x00 || 0x00 || 0x01 | ||
| 3 ? || style="text-align:left" | 2 * uint32_t | | 3 ? || style="text-align:left" | 2 * uint32_t | ||
| {{cellcolors|#555|#fff|center}} offset || | | {{cellcolors|#555|#fff|center}} offset || {{cellcolors|#555|#fff|center}} functionid | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} Set something | ! {{cellcolors|#fff|#000}} Set something | ||
| 0x01 || 0x01 || 0x02 | | 0x01 || 0x01 || 0x02 | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 1000=?<br>3000=?<br>6000=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Switch something | ||
| 0x02 || 0x02 || 0x03 | | 0x02 || 0x02 || 0x03 | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
Line 1,504: | Line 1,480: | ||
| 0x03 || 0x03 || 0x04 | | 0x03 || 0x03 || 0x04 | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 8=?<br>0x10=? | ||
|- | |- | ||
! {{cellcolors|#bd5|#000}} | ! {{cellcolors|#bd5|#000}} Set DIRECT/DIRECTHL VIF1 in SP3 EEDMA | ||
| 0x04 || 0x04 || {{cellcolors|#eee|#b44|center}} <abbr style="cursor:help; text-decoration:none" title="Not Available">0x05</abbr> | | 0x04 || 0x04 || {{cellcolors|#eee|#b44|center}} <abbr style="cursor:help; text-decoration:none" title="Not Available">0x05</abbr> | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Switch something | ||
| 0x05 || 0x05 || 0x06 | | 0x05 || 0x05 || 0x06 | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#c96|#000}} Delay | ! {{cellcolors|#c96|#000}} Delay VU xgkick by X cycles | ||
| 0x06 || 0x06 || 0x07 | | 0x06 || 0x06 || 0x07 | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" {{cellcolors|#c96|#000|center}} <abbr title="2=2cycles, 4=4cycles, 8=8cycles">cycles</abbr> | | colspan="3" {{cellcolors|#c96|#000|center}} <abbr title="2=2cycles, 4=4cycles, 8=8cycles">cycles</abbr> | ||
|- | |- | ||
! {{cellcolors|#c96|#000}} Patch | ! {{cellcolors|#c96|#000}} Patch VU memory by <abbr title="two bit masks for original and patched data">bitmask</abbr> | ||
| 0x07 || 0x07 || 0x08 | | 0x07 || 0x07 || 0x08 | ||
| 3 || style="text-align:left" | 8 * uint32_t | | 3 || style="text-align:left" | 8 * uint32_t | ||
| colspan="3" {{cellcolors|#c96|#000|center}} <abbr title="read mask, read mask, original opcode, original opcode, write mask, write mask, replace opcode, replace opcode">MASK</abbr> | | colspan="3" {{cellcolors|#c96|#000|center}} <abbr title="read mask, read mask, original opcode, original opcode, write mask, write mask, replace opcode, replace opcode">MASK</abbr> | ||
|- | |- | ||
! {{cellcolors|#9f9|#000}} Patch EE memory | ! {{cellcolors|#9f9|#000}} Patch EE memory with 2 opcodes | ||
| 0x08 || 0x08 || 0x09 | | 0x08 || 0x08 || 0x09 | ||
| <abbr title="command">1</abbr>→<abbr title="list">32</abbr> || style="text-align:left" | uint32_t + LIST | | <abbr title="command">1</abbr>→<abbr title="list">32</abbr> || style="text-align:left" | uint32_t + LIST | ||
| {{cellcolors|#9f9|#000|center}} <abbr title="amount of patches in the LIST">count</abbr> || colspan="2" {{cellcolors|#9f9|#000|center}} <abbr title="offset, original opcode, original opcode, replace opcode, replace opcode">LIST</abbr> | | {{cellcolors|#9f9|#000|center}} <abbr title="amount of patches in the LIST">count</abbr> || colspan="2" {{cellcolors|#9f9|#000|center}} <abbr title="offset, original opcode, original opcode, replace opcode, replace opcode">LIST</abbr> | ||
|- | |- | ||
! {{cellcolors|#9f9|#000}} Patch EE memory | ! {{cellcolors|#9f9|#000}} Patch EE memory with 1 opcode | ||
| {{NA}} || {{NA}} || 0x0A | | {{NA}} || {{NA}} || 0x0A | ||
| <abbr title="command">1</abbr>→<abbr title="list">32</abbr> || style="text-align:left" | uint32_t + LIST | | <abbr title="command">1</abbr>→<abbr title="list">32</abbr> || style="text-align:left" | uint32_t + LIST | ||
Line 1,544: | Line 1,520: | ||
| 0x0A || 0x0A || 0x0C | | 0x0A || 0x0A || 0x0C | ||
| 1 || style="text-align:left" | 2 * uint16_t | | 1 || style="text-align:left" | 2 * uint16_t | ||
| | | 0=?<br>1=?<br>2=? || colspan="2" | 0=?<br>0x180=?<br>0x400=?<br>0x800=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} Set something | ! {{cellcolors|#fff|#000}} Set something | ||
| 0x0B || 0x0B || 0x0D | | 0x0B || 0x0B || 0x0D | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | | | colspan="3" | 0=?<br>1=?(default?) | ||
|- | |- | ||
! {{cellcolors|#f93|#000}} COP2 and FPU accurate ADD/SUB address | ! {{cellcolors|#f93|#000}} COP2 and FPU accurate ADD/SUB address | ||
Line 1,559: | Line 1,535: | ||
| 0x0D || 0x0D || 0x0F | | 0x0D || 0x0D || 0x0F | ||
| 32 || style="text-align:left" | 2 * uint32_t | | 32 || style="text-align:left" | 2 * uint32_t | ||
| {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start | | {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start offset</abbr> || colspan="2" {{cellcolors|#f93|#000|center}} <abbr title="max 0x1FFFFFFF">end offset</abbr> | ||
|- | |- | ||
! {{cellcolors|#f93|#000}} | ! {{cellcolors|#f93|#000}} COP2 accurate MUL/DIV range | ||
| 0x0E || 0x0E || 0x10 | | 0x0E || 0x0E || 0x10 | ||
| 32 || style="text-align:left" | 2 * uint32_t | | 32 || style="text-align:left" | 2 * uint32_t | ||
| {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start | | {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start offset</abbr> || colspan="2" {{cellcolors|#f93|#000|center}} <abbr title="max 0x1FFFFFFF">end offset</abbr> | ||
|- | |- | ||
! {{cellcolors|#f93|#000}} VU0 accurate ADD/SUB address | ! {{cellcolors|#f93|#000}} VU0 accurate ADD/SUB address | ||
Line 1,571: | Line 1,547: | ||
| colspan="3" {{cellcolors|#f93|#000|center}} <abbr title="min 0x000, max 0xFF8">offset</abbr> | | colspan="3" {{cellcolors|#f93|#000|center}} <abbr title="min 0x000, max 0xFF8">offset</abbr> | ||
|- | |- | ||
! {{cellcolors|#588|#fff}} | ! {{cellcolors|#588|#fff}} VU related ? | ||
| 0x10 || 0x10 || 0x12 | | 0x10 || 0x10 || 0x12 | ||
| <abbr title="command">1</abbr>→<abbr title="list">63</abbr> || style="text-align:left" | uint32_t + LIST | | <abbr title="command">1</abbr>→<abbr title="list">63</abbr> || style="text-align:left" | uint32_t + LIST | ||
Line 1,581: | Line 1,557: | ||
| colspan="3" {{cellcolors|#dda|#000|center}} time ? | | colspan="3" {{cellcolors|#dda|#000|center}} time ? | ||
|- | |- | ||
! {{cellcolors|#f93|#000}} | ! {{cellcolors|#f93|#000}} VU1 transform ADD/SUB | ||
| 0x12 || 0x12 || 0x14 | | 0x12 || 0x12 || 0x14 | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Set something with bit flags | ||
| 0x13 || 0x13 || 0x15 | | 0x13 || 0x13 || 0x15 | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | 2 | | colspan="3" | 2=?<br>4=?<br>0x14=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} Unknown | ! {{cellcolors|#fff|#000}} Unknown | ||
Line 1,596: | Line 1,572: | ||
| colspan="3" | ? | | colspan="3" | ? | ||
|- | |- | ||
! {{cellcolors|#9cf|#000}} | ! {{cellcolors|#9cf|#000}} COP0 configure MTC0/MFC0 | ||
| 0x15 || 0x15 || 0x17 | | 0x15 || 0x15 || 0x17 | ||
| 1 || style="text-align:left" | uint8_t ? | | 1 || style="text-align:left" | uint8_t ? | ||
Line 1,611: | Line 1,587: | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Switch something | ||
| 0x17 || 0x18 || 0x1A | | 0x17 || 0x18 || 0x1A | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Switch something | ||
| 0x18 || 0x19 || 0x1B | | 0x18 || 0x19 || 0x1B | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
Line 1,634: | Line 1,610: | ||
| 0x1B || {{NA}} || 0x1E | | 0x1B || {{NA}} || 0x1E | ||
| 1 || style="text-align:left" | uint8_t | | 1 || style="text-align:left" | uint8_t | ||
| colspan="3" | ? | | colspan="3" | 3=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Set something | ||
| 0x1C || 0x1C || 0x1F | | 0x1C || 0x1C || 0x1F | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | | | colspan="3" | 200=?<br>1000=?(default) | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} Set something | ! {{cellcolors|#fff|#000}} Set something | ||
| 0x1D || 0x1D || 0x20 | | 0x1D || 0x1D || 0x20 | ||
| 1 || style="text-align:left" | uint64_t | | 1 || style="text-align:left" | uint64_t | ||
| colspan="3" | ? | | colspan="3" | 10=?<br>60=?(default)<br>100=?<br>120=?<br>200=?<br>240=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} Set something | ! {{cellcolors|#fff|#000}} Set something | ||
| 0x1E || 0x1E || 0x21 | | 0x1E || 0x1E || 0x21 | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 0=?<br>1=?<br>2=? | ||
|} | |||
</div> | |||
</div> | |||
<div style="float:right; width:50%;"> | |||
<div style="float:left; padding-left:5px;"> | |||
{| class="wikitable" style="font-size:85%; line-height:100%; text-align:center" | |||
|- | |||
! rowspan="2" | Command Name !! rowspan="39" style="padding:0px" | || colspan="3" | Command ID !! rowspan="39" style="padding:0px" | || rowspan="2" style="padding:1px" | Max<br>Usage !! rowspan="39" style="padding:0px" | || colspan="4" | Command Data | |||
|- | |||
! style="padding:1px" | gxemu !! style="padding:1px" | softemu !! style="padding:1px" | netemu !! Length !! colspan="3" | Params | |||
|- | |- | ||
! {{cellcolors|#fff|#000}} Switch something | ! {{cellcolors|#fff|#000}} Switch something | ||
Line 1,656: | Line 1,642: | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Switch something | ||
| 0x1F || 0x20 || 0x23 | | 0x1F || 0x20 || 0x23 | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#ddf|#000}} | ! {{cellcolors|#ddf|#000}} Internal image aspect ratio ? | ||
| 0x20 || 0x21 || 0x24 | | 0x20 || 0x21 || 0x24 | ||
| 1 || style="text-align:left" | uint64_t | | 1 || style="text-align:left" | uint64_t | ||
| colspan="3" | ? | | colspan="3" | 12000=?<br>48000=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} Switch something | ! {{cellcolors|#fff|#000}} Switch something | ||
Line 1,674: | Line 1,660: | ||
| 0x22 || 0x23 || 0x26 | | 0x22 || 0x23 || 0x26 | ||
| 32 || style="text-align:left" | 2 * uint32_t | | 32 || style="text-align:left" | 2 * uint32_t | ||
| {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start | | {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start offset</abbr> || colspan="2" {{cellcolors|#f93|#000|center}} <abbr title="max 0x1FFFFFFF">end offset</abbr> | ||
|- | |- | ||
! {{cellcolors|#f93|#000}} COP2 accurate ADD/SUB range | ! {{cellcolors|#f93|#000}} COP2 accurate ADD/SUB range | ||
| 0x23 || 0x24 || 0x27 | | 0x23 || 0x24 || 0x27 | ||
| 32 || style="text-align:left" | 2 * uint32_t | | 32 || style="text-align:left" | 2 * uint32_t | ||
| {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start | | {{cellcolors|#f93|#000|center}} <abbr title="min 0x100000">start offset</abbr> || colspan="2" {{cellcolors|#f93|#000|center}} <abbr title="max 0x1FFFFFFF">end offset</abbr> | ||
|- | |- | ||
! {{cellcolors|#aaf|#000}} Set something <abbr title="PS2 MECHACON related">(CDVD)</abbr> | ! {{cellcolors|#aaf|#000}} Set something <abbr title="PS2 MECHACON related">(CDVD)</abbr> | ||
| 0x24 || 0x25? || 0x28 | | 0x24 || 0x25? || 0x28 | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 0=?<br>1=?<br>2=?<br>3=? | ||
|- | |- | ||
! {{cellcolors|#aaf|#000}} CDVD seek | ! {{cellcolors|#aaf|#000}} CDVD read/seek timings ? | ||
| 0x25 || 0x26? || 0x29 | | 0x25 || 0x26? || 0x29 | ||
| 1 || style="text-align:left" | 2 * uint32_t | | 1 || style="text-align:left" | 2 * uint32_t | ||
Line 1,696: | Line 1,682: | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|- | |- | ||
! {{cellcolors|#aaf|#000}} | ! {{cellcolors|#aaf|#000}} Switch something <abbr title="PS2 MECHACON related">(CDVD)</abbr> | ||
| 0x27? || 0x28 || 0x2B | | 0x27? || 0x28 || 0x2B | ||
| 1 || style="text-align:left" | 0 | | 1 || style="text-align:left" | 0 | ||
Line 1,704: | Line 1,690: | ||
| 0x28 || 0x29 || 0x2C | | 0x28 || 0x29 || 0x2C | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 1=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} Switch something | ! {{cellcolors|#fff|#000}} Switch something | ||
Line 1,714: | Line 1,700: | ||
| 0x2A || 0x2B || 0x2E | | 0x2A || 0x2B || 0x2E | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 0x172=? | ||
|- | |- | ||
! {{cellcolors|#fff|#000}} | ! {{cellcolors|#fff|#000}} Set something | ||
| 0x2B || {{NA}} || 0x2F | | 0x2B || {{NA}} || 0x2F | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 1=? | ||
|- | |- | ||
! {{cellcolors|#eee|#b44|left}} Reserved | ! {{cellcolors|#eee|#b44|left}} Reserved | ||
Line 1,769: | Line 1,755: | ||
| {{NA}} || {{NA}} || 0x43 | | {{NA}} || {{NA}} || 0x43 | ||
| 1 || style="text-align:left" | uint32_t | | 1 || style="text-align:left" | uint32_t | ||
| colspan="3" | ? | | colspan="3" | 0=?(default)<br>1=? | ||
|- | |- | ||
! {{cellcolors|#fcc|#000}} Disable smoothing filter | ! {{cellcolors|#fcc|#000}} Disable smoothing filter | ||
Line 1,836: | Line 1,822: | ||
| colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | | colspan="3" {{cellcolors|#ddd|#666|center}} ''Nothing'' | ||
|} | |} | ||
</div> | |||
</div> | |||
</div> | |||
<br style="clear: both;" /> | |||
<!-- We need to find a better way to organize the commands info below, right now all the info is "constricted" inside the same table but is better to take them out of the table to have more freedon when adding comments, etc... Are a lot so by now i prefer to dont make page sections for every command. Im going to try something that visually looks like page sections but are not (so are not going to be displayed in the TOC at top of the page). With this change we are moving forward because the command info is not going to be inside the same table anymore, im going to split them but the visual look and other details are not going to be definitive because later can be converted into page sections if someone insists in it --> | <!-- We need to find a better way to organize the commands info below, right now all the info is "constricted" inside the same table but is better to take them out of the table to have more freedon when adding comments, etc... Are a lot so by now i prefer to dont make page sections for every command. Im going to try something that visually looks like page sections but are not (so are not going to be displayed in the TOC at top of the page). With this change we are moving forward because the command info is not going to be inside the same table anymore, im going to split them but the visual look and other details are not going to be definitive because later can be converted into page sections if someone insists in it --> | ||
{{Boxcomm|id=0x00|name=Title ID Enforce | {{Boxcomm|id=0x00|name=Title ID Enforce|data=1x String in format: ABCD-12345}} | ||
Restricts the CONFIG to be used only by a specific [[Template:TITLE_ID_for_Physical_Media|Title ID]] | Restricts the CONFIG to be used only by a specific [[Template:TITLE_ID_for_Physical_Media|Title ID]]<br> | ||
The presence of this command in the CONFIG is optional. If present it needs to be located always at the last position in the CONFIG | The presence of this command in the CONFIG is optional. If present it needs to be located always at the last position in the CONFIG | ||
{{Boxcomm|id=0x01|name=EE_ADD_HOOK|data=2x uint32_t Params (addr, func_id 0-0x3B)}} | {{Boxcomm|id=0x01|name=EE_ADD_HOOK|data=2x uint32_t Params (addr, func_id 0-0x3B)}} | ||
Line 1,918: | Line 1,889: | ||
Command could be potentially useful for games that like to change own code. Eg. Load "bin" files with code (HSG/HST), or modify own code by direct writes to memory (NFS Carbon CE...) | Command could be potentially useful for games that like to change own code. Eg. Load "bin" files with code (HSG/HST), or modify own code by direct writes to memory (NFS Carbon CE...) | ||
|- | |- | ||
|0x0F|| | |0x0F|| | ||
Grand Theft Auto 3 (SLUS-20062) | Grand Theft Auto 3 (SLUS-20062) | ||
using 0x348B40, 0x18E1F0, 0x348EC8 ( + 200000000 base ) | using 0x348B40, 0x18E1F0, 0x348EC8 ( + 200000000 base ) | ||
Line 1,925: | Line 1,896: | ||
0x348EC8 = Almost end (only loading values preserved on stack) of CTheScripts::ClearSpaceForMissionEntity((CVector const &, CEntity *)) | 0x348EC8 = Almost end (only loading values preserved on stack) of CTheScripts::ClearSpaceForMissionEntity((CVector const &, CEntity *)) | ||
|- | |- | ||
|0x10|| | |0x10|| | ||
Grand Theft Auto 3 (SLES-50330) | Grand Theft Auto 3 (SLES-50330) | ||
using 0x349790, 0x18E1F0, 0x349B18 ( + 200000000 base ) | using 0x349790, 0x18E1F0, 0x349B18 ( + 200000000 base ) | ||
Line 1,932: | Line 1,903: | ||
0x349B18 = Almost end (only loading values preserved on stack) of CTheScripts::ClearSpaceForMissionEntity((CVector const &, CEntity *)) | 0x349B18 = Almost end (only loading values preserved on stack) of CTheScripts::ClearSpaceForMissionEntity((CVector const &, CEntity *)) | ||
|- | |- | ||
|0x11|| | |0x11|| | ||
Grand Theft Auto 3 (SLES-50793) | Grand Theft Auto 3 (SLES-50793) | ||
using 0x3495C0, 0x18E1F0, 0x349948 ( + 200000000 base ) | using 0x3495C0, 0x18E1F0, 0x349948 ( + 200000000 base ) | ||
Line 1,953: | Line 1,924: | ||
store 0x010C9E40 in [ 0x208EAB6C + 200000000 base] | store 0x010C9E40 in [ 0x208EAB6C + 200000000 base] | ||
|- | |- | ||
|0x17|| | |0x17|| | ||
condition r18 == 0x8000 | |||
setting: | |||
stores 0x40490FDA somewhere | |||
Note: 0x40490FDA (3.14159250) is the highest float approximation to π in hexadecimal without going over the value.<br /> | |||
Probably can improve FPU accuracy for some games. | |||
|- | |- | ||
|0x18|| Okami PAL specific hook. | |0x18|| Okami PAL specific hook. | ||
Line 1,974: | Line 1,947: | ||
Whole thing looks like HLE version of noped functions. | Whole thing looks like HLE version of noped functions. | ||
|- | |- | ||
|0x19|| | |0x19|| Set lower 64 bits of mips $a1 register to unknown value (value is grabbed dynamically from recompiled code) | ||
|- | |- | ||
|0x1A|| | |0x1A|| | ||
store 0 in [ 0x209FD560 + 200000000 base] | store 0 in [ 0x209FD560 + 200000000 base] | ||
store 0 in [ 0x209F9550 + 200000000 base] | store 0 in [ 0x209F9550 + 200000000 base] | ||
Line 2,036: | Line 2,006: | ||
|- | |- | ||
|0x2B|| | |0x2B|| | ||
|- | |- | ||
|0x2C|| Shin Onimusha - Dawn of Dreams Fix IPU | |0x2C|| Shin Onimusha - Dawn of Dreams Fix ingame IPU runtime - JPN/US release [https://github.com/PCSX2/pcsx2/issues/1141 bug] | ||
|- | |- | ||
|0x2D|| Shin Onimusha - Dawn of Dreams Fix IPU | |0x2D|| Shin Onimusha - Dawn of Dreams Fix ingame IPU runtime - PAL release [https://github.com/PCSX2/pcsx2/issues/1141 bug] | ||
|- | |- | ||
|0x2E|| Shin Onimusha - Dawn of Dreams Fix IPU | |0x2E|| Shin Onimusha - Dawn of Dreams Fix ingame IPU runtime - Unk release (SCKA-20086? SLPM-66275? Why it is unused? Why non PS2 Best JPN release is missing hook?) | ||
|- | |- | ||
|0x2F|| | |0x2F|| | ||
Line 2,072: | Line 2,041: | ||
|0x38|| | |0x38|| | ||
|- | |- | ||
|0x39|| Used silently in command 0x4B with first param from 0x4B as hook address | |0x39|| Used silently in command 0x4B with first param from 0x4B as hook address. | ||
|- | |- | ||
|0x3A|| Used silently in command 0x4C with first param from 0x4C as hook address | |0x3A|| Used silently in command 0x4C with first param from 0x4C as hook address. | ||
|- | |- | ||
|0x3B|| Grand Theft Auto 3 (SLPM-55293 "Rockstar Classics") | |0x3B|| Grand Theft Auto 3 (SLPM-55293 "Rockstar Classics") | ||
Line 2,118: | Line 2,087: | ||
**1 [Dark Cloud] and [Dead Or Alive 2 Hardcore] | **1 [Dark Cloud] and [Dead Or Alive 2 Hardcore] | ||
{{Boxcomm|id=0x0A|name=EE_INSN_REPLACE32|data=uint32_t count, <List> ( | {{Boxcomm|id=0x0A|name=EE_INSN_REPLACE32|data=uint32_t count, <List> (offset, original opcode, replace opcode)}} | ||
Command present only in the ps2_netemu. Maximum List Count: 32 | Command present only in the ps2_netemu. Maximum List Count: 32 | ||
*Valid values found | |||
* | **1 [Deadly Strike] | ||
* | **2 [Dragon Force] | ||
* | |||
{{Boxcomm|id=0x0B|name=MECHA_SET_PATCH|data=1x uint32_t count, <List> {sector id, offset, sizeof present opcodes, replace opcodes, original opcodes)}} | {{Boxcomm|id=0x0B|name=MECHA_SET_PATCH|data=1x uint32_t count, <List> {sector id, offset, sizeof present opcodes, replace opcodes, original opcodes)}} | ||
Line 2,152: | Line 2,118: | ||
{{Boxcomm|id=0x0C|name=Unknown|data=1x (uint16_t, uint16_t)}} | {{Boxcomm|id=0x0C|name=Unknown|data=1x (uint16_t, uint16_t)}} | ||
0/1/2,<0x63> | |||
{{Boxcomm|id=0x0D|name=Unknown|data=1x int32}} | {{Boxcomm|id=0x0D|name=Unknown|data=1x int32}} | ||
Line 2,189: | Line 2,154: | ||
because at some point they are used to "andc" with first 4 bytes. | because at some point they are used to "andc" with first 4 bytes. | ||
Some examples for first 4 bytes: | Some examples for first 4 bytes: | ||
0x100000 = When enabled opcodes like MSUB, MADDA, etc, do proper multiply first, then add/sub. When disabled (default) single opcode is used (vmaddfp / vmmsubfp). Not used in COP2 mode. | 0x100000 = When enabled opcodes like MSUB, MADDA, etc, do proper multiply first, then add/sub. When disabled (default) single opcode is used (vmaddfp / vmmsubfp). Not used in COP2 mode. | ||
Note: When this command is disabled, then "Accurate MUL" is skipped for MADDxx/MSUBxx regardless that 0x30000000 is set or not. | Note: When this command is disabled, then "Accurate MUL" is skipped for MADDxx/MSUBxx regardless that 0x30000000 is set or not. | ||
Line 2,285: | Line 2,248: | ||
{{Boxcomm|id=0x1F|name=Unknown|data=1x uint32_t}} | {{Boxcomm|id=0x1F|name=Unknown|data=1x uint32_t}} | ||
Default 1 | Default 1 | ||
Config value is added to another value, and stored later in negmem. For sure this is VIF0 related command, and can be VIF0 timing/cycle related. | |||
{{Boxcomm|id=0x20|name=Unknown|data=1x uint64_t}} | {{Boxcomm|id=0x20|name=Unknown|data=1x uint64_t}} | ||
Line 2,298: | Line 2,255: | ||
Is worth to note that 0x3C is default multiplier even for PAL titles, so is not stricly related to framerate, | Is worth to note that 0x3C is default multiplier even for PAL titles, so is not stricly related to framerate, | ||
but to vsync counters (where 0x3C is still wrong anyway..). Result of multiply is also compared at some point to vsync delay value. | but to vsync counters (where 0x3C is still wrong anyway..). Result of multiply is also compared at some point to vsync delay value. | ||
{{Boxcomm|id=0x21|name=Unknown|data=1x uint32_t}} | {{Boxcomm|id=0x21|name=Unknown|data=1x uint32_t}} | ||
Line 2,321: | Line 2,277: | ||
{{Boxcomm|id=0x24|name=Unknown|data=1x uint64_t}} | {{Boxcomm|id=0x24|name=Unknown|data=1x uint64_t}} | ||
SIO2 related | SIO2 related | ||
{{Boxcomm|id=0x25|name=N/A|data=N/A}} | {{Boxcomm|id=0x25|name=N/A|data=N/A}} | ||
Command not available in ps2_netemu.self | Command not available in ps2_netemu.self | ||
Line 2,347: | Line 2,301: | ||
{{Boxcomm|id=0x28|name=Unknown|data=1x uint32_t}} | {{Boxcomm|id=0x28|name=Unknown|data=1x uint32_t}} | ||
<=3 | <=3 | ||
{{Boxcomm|id=0x29|name=Unknown|data=2x uint32_t}} | {{Boxcomm|id=0x29|name=Unknown|data=2x uint32_t}} | ||
Seek time | Seek/read time? Maybe seek/read delay? Full/fast seek? Default value is 0x1F40, 0xBB80 (8000, 48000) | ||
{{Boxcomm|id=0x2A|name=Unknown|data=N/A}} | {{Boxcomm|id=0x2A|name=Unknown|data=N/A}} | ||
Line 2,370: | Line 2,323: | ||
{{Boxcomm|id=0x2E|name=Unknown|data=1x uint32_t}} | {{Boxcomm|id=0x2E|name=Unknown|data=1x uint32_t}} | ||
{{Boxcomm|id=0x2F|name=Unknown|data=1x uint32_t}} | {{Boxcomm|id=0x2F|name=Unknown|data=1x uint32_t}} | ||
Line 2,418: | Line 2,370: | ||
{{Boxcomm|id=0x3D|name=Config revision|data=1x uint32_t}} | {{Boxcomm|id=0x3D|name=Config revision|data=1x uint32_t}} | ||
This command works as a restriction, the emulator loads the config contents '''only''' if the '''emulator revision''' is bigger than the '''config revision'''. See: [[PS2_Emulation#PS2 Emulator Types and Revisions|PS2 Emulator Types and Revisions]]<br> | |||
The goal of this restriction is to prevent the emulator to load a config containing unsupported commands, as example netemu command 0x50 is only supported since netemu revision 17495 (shipped with PS3 firmware 4.78 or newer), otherway if you try to load a config with a revision higher than your netemu revision the contents of the config are going to be ignored (as example when trying to load a modern config using commands higher than 0x41 in a custom firmware 3.70)<br> | |||
In general is better to use a low revision with this command to lower the restriction as most as posible (oldest netemu revision is 15686), but '''only''' if the commands inside the config are not higher than 0x41, for a reference when creating custom configs check the table below, those are the minimal '''config revisions''' required that depends of the config commands contents | |||
{| class="wikitable" style="font-size:1em; line-height:1em" | {| class="wikitable" style="font-size:1em; line-height:1em" | ||
Line 2,425: | Line 2,379: | ||
|- | |- | ||
| Up to 0x41 || 15686 || 3.70 or newer | | Up to 0x41 || 15686 || 3.70 or newer | ||
|- | |- | ||
| Up to 0x43 || 16604 || 4.20 or newer | | Up to 0x43 || 16604 || 4.20 or newer | ||
Line 2,442: | Line 2,394: | ||
| Up to 0x50 || 17495 || 4.78 or newer | | Up to 0x50 || 17495 || 4.78 or newer | ||
|} | |} | ||
*Problems: | |||
**The [[PS2 Official Configs|official NET config]] for Gradius V (SLPM-62462) uses config revision = 17498 (is the highest value ever found in a official PS2 classic config), this value is higher than any retail ps2_netemu.self revision, and is breaking the logic of the [[Template:Ps2configrev]] (used to calculate the PS3 firmware version required by the config). So either... 1) the description of this command written above is not accurate enought, or 2) the config has been "faked" to an incorrect revision, or 3) the config is real but sony made a mistake with the revision and the emulator is not loading it | |||
{{Boxcomm|id=0x3E|name=Unknown|data=N/A}} | {{Boxcomm|id=0x3E|name=Unknown|data=N/A}} | ||
Line 2,527: | Line 2,481: | ||
{{Boxcomm|id=0x49|name=Unknown|data=N/A}} | {{Boxcomm|id=0x49|name=Unknown|data=N/A}} | ||
Sets something 0xB,0,0 | |||
Trapt | Trapt | ||
Line 2,538: | Line 2,492: | ||
For proper config we need at least 2 (can be more if needed) 0x4B commands, one to enable redirect, one to disable. | For proper config we need at least 2 (can be more if needed) 0x4B commands, one to enable redirect, one to disable. | ||
First param is EE memory offset that when is hit enable/disable redirection. | First param is EE memory offset that when is hit enable/disable redirection. | ||
Second param is | Second param is partially unknown, seems to be size of next param to read * 4 (3 in known configs), or 0xFFFFFFFF for disable redirect command. | ||
Third param is ID of SAVEDATA we want to use padded with 00 to match 12 bytes, or all 00 in disable redirect config. | Third param is ID of SAVEDATA we want to use padded with 00 to match 12 bytes, or all 00 in disable redirect config. | ||
Important note here is that config have own 00 00 00 00 terminator at the end. | Important note here is that config have own 00 00 00 00 terminator at the end. | ||
So after 12 bytes of ID we need to add 4 bytes of 00. That apply also to disable redirect version. | So after 12 bytes of ID we need to add 4 bytes of 00. That apply also to disable redirect version. | ||
{{Boxcomm|id=0x4C|name=Unknown|data=2x uint32_t + ID: offset, int, char[]}} | {{Boxcomm|id=0x4C|name=Unknown|data=2x uint32_t + ID: offset, int, char[]}} | ||
Used to redirect to different ISO without game reset. First param is EE offset to hook, second param is ID size * 4. Emulator do some checks here, safe value is 3 (3 * 4 bytes), third value is ID in big endian hex ascii (eg. NPJD12345), additionally 0x4C expect own 00 00 00 00 terminator. To eventually end redirection use another 0x4C but with (offset, 0xFFFFFFFF, 4 * 0x00000000 . This config have very similar usage to 0x4B, just redirect to different iso, instead to different MC. Currently is unknown that cobra patched emulators support that config properly. | |||
{{Boxcomm|id=0x4D|name=Unknown|data=1x uint32_t}} | {{Boxcomm|id=0x4D|name=Unknown|data=1x uint32_t}} | ||
Param is | Param is MASK used in some conversion of Q value in RGBAQ writes. Default value 0. | ||
tempQ = Q & 0x7FFFFFFF | |||
tempQ = tempQ & MASK | |||
Q = tempQ | unmasked Q | |||
Wild Arms: The Fifth Vanguard uses 0x3F800000 | |||
Wild Arms: The Fifth Vanguard uses 0x3F800000 | |||
{{Boxcomm|id=0x4E|name=Unknown|data=Unknown}} | {{Boxcomm|id=0x4E|name=Unknown|data=Unknown}} | ||
Line 2,681: | Line 2,618: | ||
| In corner cases emu select wrong block flags pipeline state (both VU0/EEonBE and VU1/VRC affected). || This can cause various issues, mostly SPS, missing graphic, specific slowdowns, etc. Issue seems to occur when branch/jump delay slot have opcode important for flags calculation. Theory is that cached microprogram don't include modified flags state from delay slot instruction. So when already recompiled program is fetched from pool, it will miss one cycle in fmac flags pipeline. This can be crucial in games that rely on it. || Tales of Legendia and Klonoa 2 set sticky flag bits to 0 and branch with sub.xyzw in delay slot (expecting that sub change status flag), Tamsoft engine games set sticky bits to 0 in branch delay slot, this was most ridiculous bug, because problematic branch was pointing to next opcode after delay slot, removing branch was enough. True Crime: NY is only known game where VU0 is affected by this bug. more.. | | In corner cases emu select wrong block flags pipeline state (both VU0/EEonBE and VU1/VRC affected). || This can cause various issues, mostly SPS, missing graphic, specific slowdowns, etc. Issue seems to occur when branch/jump delay slot have opcode important for flags calculation. Theory is that cached microprogram don't include modified flags state from delay slot instruction. So when already recompiled program is fetched from pool, it will miss one cycle in fmac flags pipeline. This can be crucial in games that rely on it. || Tales of Legendia and Klonoa 2 set sticky flag bits to 0 and branch with sub.xyzw in delay slot (expecting that sub change status flag), Tamsoft engine games set sticky bits to 0 in branch delay slot, this was most ridiculous bug, because problematic branch was pointing to next opcode after delay slot, removing branch was enough. True Crime: NY is only known game where VU0 is affected by this bug. more.. | ||
|- | |- | ||
| CTC2 opcode write whole value to R register, while only 23 bits are writable. Rest is hardcoded to 0x3F800000. || Can cause many weird issues like broken physics, broken graphics. PCSX2 was also affected [[https://github.com/PCSX2/pcsx2/pull/6611 more]]. || | | CTC2 opcode write whole value to R register, while only 23 bits are writable. Rest is hardcoded to 0x3F800000. || Can cause many weird issues like broken physics, broken graphics. PCSX2 was also affected [[https://github.com/PCSX2/pcsx2/pull/6611 more]]. || There is only one game that is known to be affected, and is already partially patched (patch still break fog), is Musashi Samurai Legend. | ||
|- | |- | ||
| CFC2 from R register should return only 23 lower bits. || CFC2 from R on real PS2 return only lower 23 bits. Originally found out by PCSX2 team [[https://github.com/PCSX2/pcsx2/pull/8409 more]] and later confirmed to affect ps2_netemu in emu assembly. || There is only one game that is known to be affected, Onimusha Dawn of Dreams. | | CFC2 from R register should return only 23 lower bits. || CFC2 from R on real PS2 return only lower 23 bits. Originally found out by PCSX2 team [[https://github.com/PCSX2/pcsx2/pull/8409 more]] and later confirmed to affect ps2_netemu in emu assembly. || There is only one game that is known to be affected, Onimusha Dawn of Dreams. | ||
Line 2,696: | Line 2,633: | ||
! Bug !! Description !! Known Affected Games | ! Bug !! Description !! Known Affected Games | ||
|- | |- | ||
| No mipmapping support || Emulator does ignore the mipmap layers, probably for performance reasons. It is processing only the level 0 texture base pointer specified in the TEX0 register. There are games writing garbage data into that memory area, when the mipmap level is different than zero. As a result, a garbled texture is shown instead of a correct one. || Ace Combat series, Ape Escape 2, EA Sports F1 series, Harry Potter series, ICO (psuedo volumetric rays), Jak and Daxter series, Nickelodeon Barnyard and Nicktoons Unite (very strange implementation), Ratchet and Clank series and more. | | No mipmapping support || Emulator does ignore the mipmap layers, probably for performance reasons. It is processing only the level 0 texture base pointer specified in the TEX0 register. There are games writing a garbage data into that memory area, when the mipmap level is different than zero. As a result, a garbled texture is shown instead of a correct one. || Ace Combat series, Ape Escape 2, EA Sports F1 series, Harry Potter series, ICO (psuedo volumetric rays), Jak and Daxter series, Nickelodeon Barnyard and Nicktoons Unite (very strange implementation), Ratchet and Clank series and more. | ||
|- | |- | ||
| | | SCANMSK register ignored || Emulator does ignore the SCANMSK setting responsible for restricting the drawing primitives on the odd or even lines. It is used as a fake transparency effect in some games by merging the two display circuits. || Metal Gear Solid series (heavy used in the MGS2 on the water and reflection effects), Gran Turismo series (ghost cars), Raw Danger! (depth of field/tonemapping effect) | ||
|- | |- | ||
|} | |} | ||
Line 3,351: | Line 3,286: | ||
* http://wiki.pcsx2.net/index.php/Category:Software_rendering_only_games | * http://wiki.pcsx2.net/index.php/Category:Software_rendering_only_games | ||
{{Reverse engineering}}<noinclude> | {{Reverse engineering}}<noinclude>[[Category:Main]]</noinclude> | ||
[[Category:Main]] | |||
</noinclude> |