|
|
(23 intermediate revisions by 5 users not shown) |
Line 1: |
Line 1: |
| Recent homebrew has adapted the SNES mouse to be used with the NES. Hori released a trackball for Famicom called the Hori Track. A famiclone made by the Subor company also had a mouse. All three use different protocols.
| | Three controllers analogous to a computer '''mouse''' are known to be compatible with software for the NES or FC, either directly or through a simple adapter. |
|
| |
|
| == SNES Mouse ==
| | *[[Super NES Mouse]] |
| | *[[Hori Track]] |
| | *[[Subor Mouse]] |
|
| |
|
| The '''Super NES Mouse''' (SNS-016) is a peripheral for the Super NES that was originally bundled with ''Mario Paint''.
| | [[Category:Pointing devices|*]] |
| It can be used with an NES through an adapter, made from an NES controller extension cord and a Super NES controller extension cord, that [[Controller port pinout|connects the respective power, ground, clock, latch, and data pins]].
| |
| | |
| As with the [[standard controller]], the mouse is read by turning the latch ($4016.d0) on and off, and then reading bit 0 or bit 1 of $4016 or $4017 several times, but its report is 32 bits long as opposed to 8 bits.
| |
| Bit 0 goes to the standard controller ports on an NES or AV Famicom; bit 1 goes to the Famicom 4-player adapter.
| |
| | |
| Some documents about interfacing with the mouse recommend reading the first 16 bits at one speed, delaying a while, and reading the other 16 bits at another speed, following logic analyzer traces from a Super NES console.
| |
| However, these different speeds are merely an artifact of the main loop of ''Mario Paint'', and the mouse will give a correct report when read at any reasonable speed.
| |
| For example, a program could read 8 bits, wait a couple thousand cycles, and then read the other 24.
| |
| | |
| The first byte of the report is all zeroes and may be ignored. The other three bytes are sent most significant bit first:
| |
| <pre>
| |
| 76543210 Second byte of report
| |
| ||||++++- Signature: 0001
| |
| ||++----- Current sensitivity (0: low; 1: medium; 2: high)
| |
| |+------- Left button (1: pressed) | |
| +-------- Right button (1: pressed)
| |
| | |
| 76543210 Third byte of report
| |
| |+++++++- Vertical displacement since last read
| |
| +-------- Direction (1: up; 0: down)
| |
| | |
| 76543210 Fourth byte of report
| |
| |+++++++- Horizontal displacement since last read
| |
| +-------- Direction (1: left; 0: right)
| |
| </pre>
| |
| The displacements are in [[wikipedia:Signed number representations#Sign-and-magnitude method|sign-and-magnitude]], not [[wikipedia:Signed number representations#Two's complement|two's complement]].
| |
| For example, $05 represents five mickeys (movement units) in one direction and $85 represents five mickeys in the other.
| |
| To convert these to two's complement, use [[Synthetic instructions#Negate A|negation]]:
| |
| <pre>
| |
| ; Convert to two's complement
| |
| lda third_byte
| |
| bpl :+
| |
| eor #$7F
| |
| sec
| |
| adc #$00
| |
| :
| |
| sta y_velocity
| |
| | |
| lda fourth_byte
| |
| bpl :+
| |
| eor #$7F
| |
| sec
| |
| adc #$00
| |
| :
| |
| sta x_velocity
| |
| </pre>
| |
| | |
| The mouse can be set to low, medium, or high sensitivity.
| |
| To change the sensitivity, send a clock while the latch ($4016.d0) is turned on:
| |
| <pre>
| |
| ldy #1
| |
| sty $4016
| |
| lda $4016,x
| |
| dey
| |
| sty $4016
| |
| </pre>
| |
| Some revisions of the mouse's microcontroller [http://problemkaputt.de/fullsnes.htm#snescontrollersmousetwobuttonmouse reportedly] power up in an unknown state and may return useless values before the sensitivity is changed for the first time.
| |
| A mouse detection routine should cycle through the sensitivities anyway to ensure that the connected device is in fact a mouse.
| |
| Failure to do so is likely to cause things that are not a mouse to be detected as a mouse, such as half of a Four Score if player 3 or 4 is holding Right.
| |
| | |
| Using more than two mice on an AV Famicom is not recommended for two reasons:
| |
| * A mouse draws 50 mA, which is much more current than the standard controller draws. Drawing too much current is likely to cause the voltage regulator to overheat. | |
| * Changing player 1's sensitivity also affects player 3's, and changing player 2's sensitivity also affects player 4's.
| |
| | |
| A program that reads the mouse while playing [[APU DMC|DPCM samples]] must proceed very carefully.
| |
| Sample playback causes occasional double reads on $4016 and $4017, deleting a bit from the stream read back.
| |
| The re-reading solution that can be used for the [[standard controller]] fails here because each latch pulse sent to a mouse will clear its count of accumulated movement, and there is no known way to reliably detect corrupted data.
| |
| Only the [[Standard controller#APU DMC conflict glitch|OAM DMA sync trick]] reliably avoids these glitches.
| |
| | |
| A program could read the mouse while using the DMC as a interval timer, as long as the mouse is read in the IRQ handler so that the mouse reading subroutine can avoid the sample fetch.
| |
| | |
| Example games:
| |
| * ''[[Thwaite]]''
| |
| | |
| == Hori Track ==
| |
| Hori produced a trackball compatible with ''Moero Pro Soccer'', ''Moero Pro Soccer'', ''Putt Putt Golf'', and ''US Championship V'Ball''.
| |
| It was released in Japan, and what appears to be a prototype U.S. version was [http://forums.nesdev.org/viewtopic.php?f=2&t=15184&p=183787&hilit=hori#p183787 exhibited behind glass in Nintendo World], but the U.S. version never reached stores.
| |
| | |
| Report byte 1 is the same as an NES.
| |
| | |
| Byte 2, MSB first:
| |
| | |
| 7654 3210
| |
| |||| ++++- Axis 2, signed 4 bit, XOR with $F
| |
| ++++------ Axis 1, signed 4 bit, XOR with $F
| |
| | |
| Byte 3, MSB first:
| |
| | |
| 7654 3210
| |
| |||| ++++- Unknown (read and unused by games)
| |
| ||++------ ID byte (1 or 2 depending on version)
| |
| |+-------- Unknown (speculated by nocash to be the speed switch)
| |
| +--------- Rotation mode switch (0: R, 1: L)
| |
| | |
| In rotation mode L, Up on the Control Pad points up, axis 1 points down, and axis 2 points right.
| |
| In rotation mode R, Up on the Control Pad points right, axis 1 points left, and axis 2 points down.
| |
| | |
| == Subor Mouse ==
| |
| | |
| This came with Subor's SB2000 famiclone system.
| |
| | |
| Example games:
| |
| * ''Educational Computer 2000''
| |
| | |
| == References ==
| |
| * [http://problemkaputt.de/everynes.htm#controllerstrackballandmouse Nocash's EveryNES documentation]
| |
| | |
| [[Category:Controllers]][[Category:Super NES]]
| |