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 0, pravé je na bitu 1. 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: 2018/07/31 10:05 (upraveno mimo DokuWiki)