Toto je starší verze dokumentu!
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)