Uživatelské nástroje

Nástroje pro tento web


lnxspectrum:kempstonmouse

Kempston Mouse

Kempston mouse je přídavné interface pro ZX Spectrum, umožňující připojit myš k ZX Spectrum. Existuje několik variant Kempston Mouse, většina z nich je vytvořena komunitou nadšenců ZX hardware. Existují varianty s podporou tří a více tlačítek, s podporou Scroll posuvníku a dokonce s možností připojení dvou myší najednou. LnxSpectrum emuluje klasický Kempston Mouse, tedy jedna myš + 2 tlačítka. Kemptston Mouse se v LnxSpectrum emulátoru aktivuje a deaktivuje pomocí prostředního tlačítka myši.

Emulovaný Kempston Mouse používá tyto porty:

Port Popis
64479 Pozice X
65503 Pozice Y
64223 Tlačítka myši

Pozice X (Port 64479), Pozice Y (Port 65503)

Na tomto portu není absolutní pozice 0-vlevo, 255-vpravo, ale poziční přírůstek. Pokud se myší posuneme například o 20 pixelů doprava, zvýší se sice hodnota na portu o 20, ale také může přetéct. To znamená, že pokud předchozí hodnota byla 250, přeteče a nová hodnota bude o 20 větší - tj. 14. ZX rutina s tím musí počítat. Naopak díky tomu nejsme omezeni na posuv jen v rozmezí 0-255. To platí samozřejmě i pro posuv vlevo, nahoru a dolů.

Tlačítka (Port 64223)

Levé tlačítko je na bitu 1, pravé je na bitu 0 (Cože? Bohužel ano.). Hodnoty jsou negativní, tedy pokud není tlačítko stisknuté, je hodnota 1, pro stisknuté je hodnota 0.

Čtení pozice myši na obrazovce pomocí assembleru

; LnxSpectrum ASM editor (www.ilnx.cz) 30.11.2015

		org	60000

; Zinicializujeme myš na pozici na obrazovce, kterou chceme
		ld	a,128
		ld	(MouseX),a
		ld	a,96
		ld	(MouseY),a
		call	Mouse_init

; Nasimulujeme si volání Mouse rutiny 50x za sekundu
		ei
smy:		halt
		call	Mouse_int	;aktualizace souřednice myši

; Tady jen zobrazíme hodnoty X, Y a tlačítka myši ve VideoRam, aby byly vidět hodnoty
		ld	a,(MouseX)
		ld	(16384),a	;pozice X
		ld	a,(MouseY)
		ld	(16386),a	;pozice Y

		ld	bc,64223
		in	a,(c)
		ld	(16388),a	;stav tlačítek
		jr	smy		;a opakujeme 50x za sec

; Tady začíná inicializační rutina pro aktualizaci pozice myši
Mouse_init: 	ld	bc,64479
		in	a,(c)
		ld	(KM_tx),a
		ld	b,255
		in	a,(c)
		ld	(KM_ty),a
		ret

; Tuto rutinu musíme volat 50x za sec (třeba pomocí přerušení)
Mouse_int:	ld	bc,64479
		in	d,(c)

		ld	e,d

		ld	a,(KM_tx)

		sub	d
		jr	nc,KM_Right1
		jp	p,KM_Left1
KM_right:	neg

		ld	d,a
		ld	a,(MouseX)
		add	a,d
		jr	nc,KM_right2
		ld	a,255
KM_right2:	ld	(MouseX),a

		ld	a,e
		ld	(KM_tx),a
		jr	KM_up_down

KM_Right1:	jp	m,KM_right

KM_Left1:	ld	d,a
		ld	a,(MouseX)
		sub	d
		jr	nc,KM_left2
		xor	a
KM_left2:	ld	(MouseX),a

		ld	a,e
		ld	(KM_tx),a
	
KM_up_down:	ld	b,255
		in	d,(c)

		ld	e,d

		ld	a,(KM_ty)

		sub	d
		jr	nc,KM_Up1
		jp	p,KM_Down1
KM_Up0:		neg
		ld	d,a
		ld	a,(MouseY)
		sub	d
		jr	nc,KM_Up2
		xor	a
KM_Up2:		ld	(MouseY),a

		ld	a,e
		ld	(KM_ty),a
		ret

KM_Up1:		jp	m,KM_Up0

KM_Down1:	ld	d,a
		ld	a,(MouseY)
		add	a,d
		jr	c,KM_Down2
		cp	192
		jr	c,KM_Down3
KM_Down2:	ld	a,191
KM_Down3:	ld	(MouseY),a

		ld	a,e
		ld	(KM_ty),a
		ret

KM_tx:		defb	0
KM_ty:		defb	0
MouseX:		defb	128		;Skutečná pozice X na obrazovce (0-255)
MouseY:		defb	96		;Skutečná pozice Y na obrazovce (0-191)
lnxspectrum/kempstonmouse.txt · Poslední úprava: 2021/01/28 23:45 autor: lanex