Line 515:
Line 515:
The Wii Motion Plus is at register 0xA60000 instead of register 0xA40000, because it has its own extension port on the back allowing a Nunchuk for example to be plugged in along with the Wii Motion Plus.
The Wii Motion Plus is at register 0xA60000 instead of register 0xA40000, because it has its own extension port on the back allowing a Nunchuk for example to be plugged in along with the Wii Motion Plus.
−
Games attempt to detect the Wii Motion Plus by trying to read the two-byte expansion identifier at 0xA600FE. It is unknown what value the Wii Motion Plus returns for expansion type. If a Wii Motion Plus is not detected then the attempt to read those bytes will fail.
+
The Wii Motion Plus is identified by the 6 bytes: 00 00 A6 20 00 05 at register address 0x(4)a600fa (instead of 0x(4)a400fa like a regular extension). Games attempt to detect the Wii Motion Plus by trying to read the two-byte expansion identifier at 0xA600FE. If a Wii Motion Plus is not detected then the attempt to read those bytes will fail.
+
+
Initializing the extension with the standard 0x55/0x00 bytes at 0x0(4)4a600f0 and 0x0(4)a600fb (again, instead of 0x(4)a400f0/0x(4)a400fb like a regular extension) shows data changing for a couple seconds, and then stops.
+
+
Reading 0x100 bytes from 0x(4)a60000 produces the following:
+
+
<pre>
+
4a60000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+
4a60010: 00 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff
+
4a60020: 78 d9 78 38 77 9d 2f 0c cf f0 31 ad c8 0b 5e 39
+
4a60030: 6f 81 7b 89 78 51 33 60 c9 f5 37 c1 2d e9 15 8d
+
4a60040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+
4a60050: b9 3f 25 93 9d 17 bb 9c 05 9d c3 38 18 3c ba 33
+
4a60060: ba 18 d1 7a bc 03 d3 55 32 ec 81 38 7d a6 77 a8
+
4a60070: 4c e6 c7 11 7c 50 78 80 77 35 08 81 f6 14 4e 67
+
4a60080: d4 b5 cb de 6a 54 5f 66 3c c4 25 fd 33 da 1d 75
+
4a60090: 58 98 15 6d 5e 63 51 ee 8f dd 3a b2 94 fe 5b 58
+
4a600a0: bf 17 91 78 7f 84 b4 9b b0 f9 75 c2 2e 7f 1f ed
+
4a600b0: e5 6b 02 f4 f2 7d 74 17 3d 23 35 5c e0 72 22 6e
+
4a600c0: 3b a7 7b 65 6c 3c 72 7e 5b ae e7 09 09 f0 01 00
+
4a600d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+
4a600e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+
4a600f0: 55 ff ff ff ff ff ff 10 ff ff 00 00 a6 20 00 05
+
</pre>
+
+
It appears that the 16 bytes from 0x(4)a60020 are, as usual, calibration information, but it is unknown how they work.
+
+
The 128 bytes from 0x(4)a60050 - 0x(4)a600cf change briefly after the extension is initialized.
The Wii Motion Plus consists of two rate-gyros. These gyros measure rotation SPEED, but can't actually measure absolute orientation, which causes drift if not corrected by some other data source. Speed is one step better than the acceleration reported by the accelerometers. One of the two gyros will obviously have to measure yaw, since that can't be measured by accelerometers. The other axis is unknown, but I would guess pitch. Unlike the rotation measured by accelerometers, whose axes are defined by gravity, the gyro axes are relative to the angle of the Wiimote. So even if it can measure yaw when the Wiimote is in the normal orientation, it won't be able to detect yaw when the Wiimote is vertical.
The Wii Motion Plus consists of two rate-gyros. These gyros measure rotation SPEED, but can't actually measure absolute orientation, which causes drift if not corrected by some other data source. Speed is one step better than the acceleration reported by the accelerometers. One of the two gyros will obviously have to measure yaw, since that can't be measured by accelerometers. The other axis is unknown, but I would guess pitch. Unlike the rotation measured by accelerometers, whose axes are defined by gravity, the gyro axes are relative to the angle of the Wiimote. So even if it can measure yaw when the Wiimote is in the normal orientation, it won't be able to detect yaw when the Wiimote is vertical.