Difference between revisions of "Kempston Mouse"
(→Technical) |
(→Technical) |
||
Line 1: | Line 1: | ||
This mouse is supported by [[The OCP Art Studio]], [[The Advanced OCP Art Studio]] and [[Carrier Command]]. | This mouse is supported by [[The OCP Art Studio]], [[The Advanced OCP Art Studio]] and [[Carrier Command]]. | ||
+ | |||
+ | == Pictures == | ||
+ | |||
+ | <gallery caption="Kempston Mouse Interface"> | ||
+ | Image:KempstonMouseInterfaceFront.jpg|Back (showing mouse connector) - faces away from CPC | ||
+ | Image:KempstonMouseInterfaceBack.jpg|Front (showing edge connector) - faces CPC | ||
+ | Image:KempstonMouseInterfaceSide1.jpg|Side | ||
+ | Image:KempstonMouseInterfaceSide2.jpg|Other side | ||
+ | Image:KempstonMouseInterfaceAbove.jpg|From above | ||
+ | Image:KempstonMouseInterfaceBelow.jpg|From below | ||
+ | </gallery> | ||
+ | |||
+ | <gallery caption="Kempston compatible mouse"> | ||
+ | Image:KempstonMouse.jpg|Kempston Mouse | ||
+ | Image:KempstonMouseBelow.jpg|Kempston Mouse (under) | ||
+ | </gallery> | ||
+ | |||
== Technical == | == Technical == |
Revision as of 10:41, 30 August 2015
This mouse is supported by The OCP Art Studio, The Advanced OCP Art Studio and Carrier Command.
Pictures
- KempstonMouseInterfaceFront.jpg
Back (showing mouse connector) - faces away from CPC
- KempstonMouseInterfaceBack.jpg
Front (showing edge connector) - faces CPC
- KempstonMouseInterfaceBelow.jpg
From below
- KempstonMouseBelow.jpg
Kempston Mouse (under)
Technical
The interface described here was loaned to arnoldemu by yoshi.doshi.
PCB has a 50-way edge connector. There is no through connector. The mouse connects via a 9-pin female D-sub (standard joystick socket) which is on the PCB.
The board is labelled "(C) KEMPSTON MICRO AMSTRAD MOUSE I/F" and "ISS B".
The ICs are labelled and are:
IC1 DM74LS00N QUAD 2-INPUT NAND IC2 DM74LS191N SYNCHRONOUS UP/DOWN COUNTERS WITH DOWN/UP MODE CONTROL (4-bit binary counter) IC3 DM74LS191N SYNCHRONOUS UP/DOWN COUNTERS WITH DOWN/UP MODE CONTROL (4-bit binary counter) IC4 74LS125APC QUAD 3-STATE BUFFER IC5 DM74LS191N SYNCHRONOUS UP/DOWN COUNTERS WITH DOWN/UP MODE CONTROL (4-bit binary counter) IC6 DM74LS191N SYNCHRONOUS UP/DOWN COUNTERS WITH DOWN/UP MODE CONTROL (4-bit binary counter) IC7 DM74LS138N 1-OF-8 DECODER/DEMULTIPLEXER IC8 DM74LS257BN 3-STATE QUAD 2-DATA SELECTORS/MULTIPLEXERS IC9 DM74LS257BN 3-STATE QUAD 2-DATA SELECTORS/MULTIPLEXERS
The mouse that comes with the interface has 2 buttons.
Port decoding to be confirmed. Number of mouse buttons supported to be confirmed.
Position:
Port FBEEh READ: Kempston Mouse 8 bit X position Port FBEFh READ: Kempston Mouse 8 bit Y position Note: The position values aren't reset after reading. To calculated the distance since last read: dist=new-old, old=new whereas, dist=00h : no move dist=+01h..+7Fh moved right/up dist=-01h..-80h moved left/down
Buttons:
Port FAEFh READ: Kempston Mouse Buttons bit 0: Left Button (active low) bit 1: Right Button (active low) bit 2..7: unknown
Review (German)
From an article about the "Amstrad Consumer Show" in German magazine "Happy Computer 12/1986":
- "Bewundern Sie auch die Maussteuerung eines Atari ST oder eines Schneider PC? Bei Kempston gibt es für 69,95 Pfund auch für Ihren CPC oder Joyce so eine komfortable Benutzeroberfläche. Die Maus entspricht dabei völlig dem Standard mit zwei unabhängigen Tasten. Das mitgelieferte Desktop-Programm braucht sich vor den Brüdern auf 16-Bit-Computern nicht zu verstecken."
Get mouse position on screen
Calculating the mouse position from the information given on the Kempston mouse ports is easy.
We will proceed in 2 steps:
1. Calculate mouse pointer location on a virtual screen that has a 640*400 resolution. 2. Translate position from the virtual screen to the current CPC screen mode.
Here is the algorithm in pseudo-code:
// initMouse initializes variables and centers the mouse pointer on screen function initMouse() { maxX = 639; maxY = 399; // centering the mouse pointer on the screen virtualX = maxX >> 1; // virtualX = maxX/2 virtualY = maxY >> 1; // virtualY = maxY/2 // store raw mouse values oldX = inp(&FBEE); oldY = inp(&FBEF); // get mouse pointer position refreshMouse(); }
// refreshMouse has to be called before you redraw the mouse pointer (and ideally on every frame) function refreshMouse() { // get raw mouse values rawX = inp(&FBEE); rawY = inp(&FBEF); // get the relative mouse displacement since last call deltaX = rawX - oldX; deltaY = rawY - oldY; // store raw mouse values oldX = rawX; oldY = rawY; // calculate new unclipped virtual position virtualX = virtualX + deltaX; virtualY = virtualY - deltaY; // Kempston mouse Y-axis is inverted compared to screen coordinates! // perform clipping if (virtualX < 0) then virtualX = 0; else if (virtualX > maxX) then virtualX = maxX; if (virtualY < 0) then virtualY = 0; else if (virtualY > maxY) then virtualY = maxY; // now we translate position from the virtual screen to the current CPC screen mode mouseY = virtualY >> 1; // mouseY = virtualY/2 if (mode2) then mouseX = virtualX; else if (mode1) then mouseX = virtualX >> 1; // mouseX = virtualX/2 else if (mode0) then mouseX = virtualX >> 2; // mouseX = virtualX/4 }