=====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)