Changes

Kempston Mouse

3,242 bytes added, 17:52, 30 June 2024
This mouse is supported by [[The OCP Art Studio]], [[The Advanced OCP Art Studio]] and [[Carrier Command]].
 
It is emulated in [[Arnold (Emulator)|Arnold]], [[ACE_(Emulator)|ACE]] and [[ACE-DL]].
 
== Pictures ==
 
<gallery caption="Kempston Mouse Interface">
Image:KempstonMouseInterfaceTop.jpg|Back (showing mouse connector) - faces away from CPC
Image:KempstonMouseInterfaceBottom.jpg|Front (showing edge connector) - faces CPC
Image:KempstonMouseInterfaceSide1.jpg|Side
Image:KempstonMouseInterfaceSide2.jpg|Other side
Image:KempstonMouseInterfaceAbove.jpg|From above
Image:KempstonMouseInterfaceUnder.jpg|From below
Image:KempstonMousePCBTop.jpg|PCB (joystick connector side)
Image:KempstonMousePCBUnder.jpg|PCB (edge connector side)
</gallery>
 
<gallery caption="Kempston compatible mouse">
Image:KempstonMouse.jpg|Kempston Mouse
Image:KempstonMouseUnder.jpg|Kempston Mouse (under)
</gallery>
== Technical ==
PositionThe 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. It is a ball mouse. Unknown brand.Green label reads "Q.C. PASSED. MADE IN TAIWAN. R. O. C.". Mouse has 9-pin DIN like a joystick. Unknown if compatible with Atari ST or Amiga or neither. The schematics and PCB are 90% the same as the Spectrum's. They differ in the port decoding. NOTE: * Counters are reset to 0 at power on. * Counters are NOT reset to 0 when using bus reset (reset switch) === I/O decoding === Decoding seems to be (some testing to confirm this):  I/O port for X position is decoded as xxxx x0x1 xxx0 xxx0 (FBEE is normally used) I/O port for Y position is decoded as xxxx x0x1 xxx0 xxx1 (FBEF is normally used) I/O port for Buttons is decoded as xxxx x0x0 xxx0 xxxx (FAEF is normally used) Confirmed connected:A10, A0, A4, A8. ==== Movement ====  Port FBEEh READ: Kempston Mouse 8 bit X position(left: -ve, right: +ve) Port FBEFh READ: Kempston Mouse 8 bit Y position(up: +ve, down: -ve) NoteNOTE: * Movement is accumulated so you only need to read the mouse status when you want e.g. once per frame.* Speed is 1 for slow movement of the mouse and 12 for very fast movement.* The position values aren't are not reset after reading. * The position values do not change if the mouse is not moving * Position values wrap around e.g. when moving left with movement speed of 1, 0 wraps around to ff (0-1 -> ff) and when moving right with movement speed of 1, ff wraps around to 0 (ff+1->0)* To calculated the distance moved since last read:subtract the new value read from the previous value read and AND with ff. The value is the amount of movement.0 means no movement. -ve means moving left/down, +ve means right/up. 
dist=new-old, old=new
whereas,
dist=-01h..-80h moved left/down
==== Buttons:==== 
Port FAEFh READ: Kempston Mouse Buttons
bit 0: Left Right Button (active low) bit 1: Right Left Button (active low) bit 2..7: unknownnot used. report as high (1)
Number of supported mouse buttons is unknown. It is believed to be 2. The mouse that comes with the interface has two.
== Review (German) ==
Here is the algorithm in pseudo-code:
// # initMouse initializes variables and centers the mouse pointer on screen function def 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();  }def 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: virtualX = 0 elif virtualX > maxX: virtualX = maxX if virtualY < 0: virtualY = 0 elif virtualY > maxY: virtualY = maxY # now we translate position from the virtual screen to the current CPC screen mode mouseX = virtualX if graphicsMode == 2 else (virtualX >> 1 if graphicsMode == 1 else virtualX >> 2) mouseY = virtualY >> 1 == Manual == * Any manual exists?  == Downloads == * Any kempston example or driver software exists?
// 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
}
[[Category:Peripherals]][[Category:Input Device]]
13,173
edits