|
|
(21 intermediate revisions by 4 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
| |
| 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'' | |
| | |
| === Input ($4016 write) ===
| |
| | |
| 7 bit 0
| |
| ---- ----
| |
| xxxx xxxS
| |
| |
| |
| +- Strobe
| |
| | |
| === Output ($4017 read) ===
| |
| | |
| 7 bit 0
| |
| ---- ----
| |
| xxxx xxxD
| |
| |
| |
| +- Serial data
| |
| | |
| The mouse returns either 1-byte or 3-byte responses based on the size of the x/y axis movement since the last read.
| |
| If the movement value for both the X and Y axis is between -1 and 1 (inclusively), the mouse returns a 1-byte response. Otherwise, a 3-byte response is sent. In this case, the strobe bit must be toggled 3 times in a row to read the entire response (e.g read $4017 8 times, toggle strobe bit, read 8 more times, etc.)
| |
| | |
| ==== 1-byte response format ====
| |
|
| |
| LRXXYY00
| |
| ||||||||
| |
| ||||||++- Always 0
| |
| ||||++--- Y movement (0: no movement, 1 or 2 = went down 1 unit, 3 = went up 1 unit)
| |
| ||++----- X movement (0: no movement, 1 or 2 = went right 1 unit, 3 = went left 1 unit)
| |
| |+------- Right mouse button (1: pressed)
| |
| +-------- Left mouse button (1: pressed)
| |
| | |
| ==== 3-byte response format ====
| |
|
| |
| | |
| '''Byte 1'''
| |
| LRSXTY01
| |
| ||||||||
| |
| ||||||++- Always 01
| |
| |||||+--- Y movement (Bit 4)
| |
| ||||+---- Y movement direction (1: up, 0: down)
| |
| |||+----- X movement (Bit 4)
| |
| ||+------ X movement direction (1: left, 0: right)
| |
| |+------- Right mouse button (1: pressed)
| |
| +-------- Left mouse button (1: pressed)
| |
| | |
| '''Byte 2'''
| |
| --XXXX10
| |
| ||||||
| |
| ||||++- Always 10
| |
| ++++--- X movement (Bits 0-3)
| |
| | |
| '''Byte 3'''
| |
| --YYYY11
| |
| ||||||
| |
| ||||++- Always 11
| |
| ++++--- Y movement (Bits 0-3)
| |
| | |
| == References ==
| |
| * [http://problemkaputt.de/everynes.htm#controllerstrackballandmouse Nocash's EveryNES documentation]
| |
| | |
| [[Category:Controllers]][[Category:Super NES]]
| |