|
|
(35 intermediate revisions by 5 users not shown) |
Line 1: |
Line 1: |
| The '''Super NES Mouse''' (SNS-016) is a peripheral for the Super NES that was originally bundled with ''Mario Paint''.
| | 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. |
| 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.
| | *[[Super NES Mouse]] |
| Bit 0 goes to the standard controller ports on an NES or AV Famicom; bit 1 goes to the Famicom 4-player adapter.
| | *[[Hori Track]] |
| | *[[Subor Mouse]] |
|
| |
|
| {{RFC 2119}}
| | [[Category:Pointing devices|*]] |
| 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 MAY 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 erratic 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 and not half of a [[Four Score]].
| |
| | |
| Using more than two mice on an AV Famicom is NOT RECOMMENDED for two reasons.
| |
| First, a mouse draws 50 mA, which is much more current than the standard controller draws.
| |
| Second, changing player 1's sensitivity also affects player 3's, and changing player 2's sensitivity also affects player 4's.
| |
| | |
| A program MUST NOT play [[APU DMC|samples]] and read the mouse at the same time, as sample playback causes occasional double reads on $4016 and $4017, which the program sees as bit deletions from the serial stream.
| |
| Ordinarily, one would read each controller twice, compare the data, and use the previous frame's data if they don't match.
| |
| Rereading works on the standard NES or Super NES controller because the extra latch pulse to set up the second read has no side effects, but an extra latch pulse sent to a mouse will clear the mouse's count of accumulated movement.
| |
| A program MAY read the mouse while using the DMC as a interval timer, but if so, it MUST read the mouse in an IRQ handler so that the mouse reading subroutine can finish before the next sample data fetch.
| |
| | |
| [[Category:Controllers]][[Category:Super NES]]
| |