Editing PS2 Emulation/PS2 Config Commands
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 1: | Line 1: | ||
=PS2 Netemu Commands= | ==PS2 Netemu Commands== | ||
<!-- 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 --> | ||
Line 363: | Line 363: | ||
0x4000000 = Enable type 2 config from cmd 0x12. | 0x4000000 = Enable type 2 config from cmd 0x12. | ||
0x8000000 = Accurate VU0 DIV opcode, not used in COP2 mode. | 0x8000000 = Accurate VU0 DIV opcode, not used in COP2 mode. | ||
0x10000000 = Full Accurate VU0 MUL. Use runtime from CMD 0x10, but for every matching VU0 opcode, including opcodes like MSUB for mul part. | 0x10000000 = Fast Accurate VU0 MUL. Try to round mantissa. Opcodes like MSUB/MADD additionally require 0x100000 to be enabled, otherwise command skip them. Not used in COP2 mode. | ||
0x20000000 = Full Accurate VU0 MUL. Use runtime from CMD 0x10, but for every matching VU0 opcode, including opcodes like MSUB for mul part. | |||
Opcodes like MSUB/MADD additionally require 0x100000 to be enabled, otherwise command skip them. | Opcodes like MSUB/MADD additionally require 0x100000 to be enabled, otherwise command skip them. | ||
Selecting both 0x10000000 and 0x20000000 (0x30000000) work the same way as 0x20000000. | Selecting both 0x10000000 and 0x20000000 (0x30000000) work the same way as 0x20000000. | ||
Line 459: | Line 459: | ||
{{Boxcomm|id=0x20|name=Unknown|data=1x uint64_t}} | {{Boxcomm|id=0x20|name=Unknown|data=1x uint64_t}} | ||
Default 0x3C | Default 0x3C | ||
Config value is used as multiplier for value | Config value is used as multiplier for some value, and result is used in vsync related runtimes. | ||
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. | |||
*Valid values found: 10d, 60d, 100d, 120d, 200d, 240d | *Valid values found: 10d, 60d, 100d, 120d, 200d, 240d | ||
Line 752: | Line 741: | ||
{{Boxcomm|id=0x50|name=Enable pressure sensitive controls|data=N/A}} | {{Boxcomm|id=0x50|name=Enable pressure sensitive controls|data=N/A}} | ||
=PS2 Gxemu Commands= | ==PS2 Gxemu Commands== | ||
PS2 GX Emu commands are Big Endian unless noted. Every command size is 0x18, and unused data need to be filled with zeros. Commands which point to emulator memory have additional data, but command itself is still 0x18 in size. Data fields are just example values and can be changed to different value when needed. | PS2 GX Emu commands are Big Endian unless noted. Every command size is 0x18, and unused data need to be filled with zeros. Commands which point to emulator memory have additional data, but command itself is still 0x18 in size. Data fields are just example values and can be changed to different value when needed. | ||
{{ | {{Boxcomm|id=0x01|name=Unknown|data=1x int32|}} | ||
Used in function that handle D6 CHCR writes (SIF1), seems to be some kind of timing command for EE --> IOP DMA. | Used in function that handle D6 CHCR writes (SIF1), seems to be some kind of timing command for EE --> IOP DMA. | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit data | 32 bit align | 32 bit align | 32 bit align | ||
0x00000001 | 0x00000000 | 0x00000BB8 | 0x00000001 | 0x00000000 | 0x00000BB8 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x02|name=Unknown|data=None|}} | ||
Skip r5900 CACHE IXIN/IHIN (Index/Hit invalidate) opcodes. | Skip r5900 CACHE IXIN/IHIN (Index/Hit invalidate) opcodes. | ||
Format: | Format: | ||
Line 829: | Line 755: | ||
0x00000002 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000002 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x03|name=Unknown|data=1x int32|}} | ||
Patch SPE 4 program (eedma) by searching for ila r4, xxxxx, starting at 0x178A0 and replacing them with (0x42000004 | ((value << 7) & 0x1FFFF80) 0x42000004 is ila r4 opcode. Due to opcode encoding example result of that patch with value 0x08 will be 0x42000404 (ila r4, 0x08). There is little bit more than that, but main purpose is just to patch SPE program behavior. | Patch SPE 4 program (eedma) by searching for ila r4, xxxxx, starting at 0x178A0 and replacing them with (0x42000004 | ((value << 7) & 0x1FFFF80) 0x42000004 is ila r4 opcode. Due to opcode encoding example result of that patch with value 0x08 will be 0x42000404 (ila r4, 0x08). There is little bit more than that, but main purpose is just to patch SPE program behavior. | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit data | 32 bit align | 32 bit align | 32 bit align | ||
0x00000003 | 0x00000000 | 0x00000008 | 0x00000003 | 0x00000000 | 0x00000008 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x04|name=Unknown|data=None|}} | ||
Patch spe 4 program to use alternative VIF1 Direct/DirectHL command handler. | Patch spe 4 program to use alternative VIF1 Direct/DirectHL command handler. | ||
Format: | Format: | ||
Line 841: | Line 767: | ||
0x00000004 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000004 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x05|name=Unknown|data=None|}} | ||
Patch spe 4 program to use alternative VIF1 Offset command handler. | Patch spe 4 program to use alternative VIF1 Offset command handler. | ||
Format: | Format: | ||
Line 847: | Line 773: | ||
0x00000005 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000005 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x06|name=Unknown|data=1x int32|}} | ||
Delay XGKICK by x cycles. | Delay XGKICK by x cycles. | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit data | 32 bit align | 32 bit align | 32 bit align | ||
0x00000006 | 0x00000000 | 0x00000008 | 0x00000006 | 0x00000000 | 0x00000008 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x07|name=Unknown|data=1x int32|}} | ||
Patch 2 x 32 bit opcodes of VU1 microprogram (lower and upper opcode). Config allow to specify bitmask for both read and write. | Patch 2 x 32 bit opcodes of VU1 microprogram (lower and upper opcode). Config allow to specify bitmask for both read and write. | ||
Format: | Format: | ||
Line 867: | Line 793: | ||
writeVu1Code(i, 0x000000008000033C & 0x00000000FFFFFFFF) | writeVu1Code(i, 0x000000008000033C & 0x00000000FFFFFFFF) | ||
{{ | {{Boxcomm|id=0x0A|name=Unknown|data=2x uint16|}} | ||
First param can be 0, 1, or 2. Second param in range of 0 and 0xFFFF. Second param is used only if first param == 1. Default values are (1, 0x1000) for PS2DVD, and (1, 0x400) for PS2CD and PS2CDDA. | First param can be 0, 1, or 2. Second param in range of 0 and 0xFFFF. Second param is used only if first param == 1. Default values are (1, 0x1000) for PS2DVD, and (1, 0x400) for PS2CD and PS2CDDA. | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 16bit data | 16bit data | 32 bit align | 32 bit align | 32 bit align | ||
0x0000000A | 0x00000000 | | 0x0000000A | 0x00000000 | 0x0001 | 0x0400 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x0B|name=Unknown|data=1x int32|}} | ||
Command take bool value and default is 1. When set to 0: Skip some IOP related code responsible for check value from IOP SPE (and skip panic if value is 0 or -1).<br> | Command take bool value and default is 1. When set to 0: Skip some IOP related code responsible for check value from IOP SPE (and skip panic if value is 0 or -1).<br> | ||
Also skip write of value 0x80000000 to SPU Signal Notification 1 Register of IOP SPE. | Also skip write of value 0x80000000 to SPU Signal Notification 1 Register of IOP SPE. | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit data | 32 bit align | 32 bit align | 32 bit align | ||
0x0000000B | 0x00000000 | 0x00000000 | 0x0000000B | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x0C|name=Unknown|data=1x int32|}} | ||
Use PS2 accurate add/sub math for selected opcode/offset. Command is valid for every FPU and COP2 opcode that do add/sub (also for opcodes like VMSUBA, MADD, etc). | Use PS2 accurate add/sub math for selected opcode/offset. Command is valid for every FPU and COP2 opcode that do add/sub (also for opcodes like VMSUBA, MADD, etc). | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit EE memory offset | 32 bit align | 32 bit align | 32 bit align | ||
0x0000000C | 0x00000000 | 0x001264D4 | 0x0000000C | 0x00000000 | 0x001264D4 | 0x00000000 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x0D|name=Unknown|data=1x int32|}} | ||
Use PS2 accurate add/sub math for selected opcode/offsets range. Command is valid for every FPU and COP2 opcode that do add/sub (also for opcodes like VMSUBA, MADD, etc). | Use PS2 accurate add/sub math for selected opcode/offsets range. Command is valid for every FPU and COP2 opcode that do add/sub (also for opcodes like VMSUBA, MADD, etc). | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit EE start memory offset | 32bit EE end memory offset | 32 bit align | 32 bit align | ||
0x0000000D | 0x00000000 | 0x0012A3D4 | 0x0000000D | 0x00000000 | 0x0012A3D4 | 0x0012A468 | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x0E|name=Unknown|data=1x int32|}} | ||
Use PS2 accurate mul/div math for selected opcode/offsets range. Command is valid for every FPU opcode that do mul/div (also for opcodes like MADD, MSUBA etc). Command does not work for COP2 opcodes. | Use PS2 accurate mul/div math for selected opcode/offsets range. Command is valid for every FPU opcode that do mul/div (also for opcodes like MADD, MSUBA etc). Command does not work for COP2 opcodes. | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit EE start memory offset | 32bit EE end memory offset | 32 bit align | 32 bit align | ||
0x0000000E | 0x00000000 | 0x005719D8 | 0x0000000E | 0x00000000 | 0x005719D8 | 0x00571C2C | 0x00000000 | 0x00000000 | ||
{{ | {{Boxcomm|id=0x0F|name=Unknown|data=1x int32|}} | ||
Use PS2 accurate add/sub math for selected opcode/offset in VU0 microprogram. Command is valid for every VU0 opcode that do add/sub (also for opcodes like MSUBAQ, MADDAx, etc).<br> | Use PS2 accurate add/sub math for selected opcode/offset in VU0 microprogram. Command is valid for every VU0 opcode that do add/sub (also for opcodes like MSUBAQ, MADDAx, etc).<br> | ||
Valid VU0 memory offset is in range (0x000 to 0xFFF) & 0xFF8, which mean that last nibble needs to be either 0 or 8. <!--Todo: Is it really VU0 offset in plain hex or (offset >> 8)--> | Valid VU0 memory offset is in range (0x000 to 0xFFF) & 0xFF8, which mean that last nibble needs to be either 0 or 8. <!--Todo: Is it really VU0 offset in plain hex or (offset >> 8)--> | ||
Format: | Format: | ||
32 bit ID | 32 bit align | | 32 bit ID | 32 bit align | 32bit VU0 memory offset | 32 bit align | 32 bit align | 32 bit align | ||
0x0000000F | 0x00000000 | 0x00000208 | 0x0000000F | 0x00000000 | 0x00000208 | 0x00000000 | 0x00000000 | 0x00000000 | ||