|
|
(42 intermediate revisions by 6 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 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 of $4016 or $4017 several times.
| | *[[Super NES Mouse]] |
| But its report is 32 bits long as opposed to 8 bits.
| | *[[Hori Track]] |
| 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.
| | *[[Subor Mouse]] |
| But 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.
| |
|
| |
|
| The first byte of the report can be ignored. The other three bytes are sent most significant bit first:
| | [[Category:Pointing devices|*]] |
| <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 (x/4), medium (x/2), or high (x) 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>
| |
| | |
| A program MUST NOT play [[APU DMC|samples]] and read the mouse at the same time.
| |
| On the NES, 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.
| |
| This works because the extra latch pulse to set up the second read has no side
| |
| effects on the standard NES or Super NES controller.
| |
| But an extra latch pulse sent to a mouse will clear the mouse's count of accumulated mickeys.
| |
| | |
| [[category:Controllers]]
| |