Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autorzy: dr Ian Logan i dr Frank O'Hara |
©2024 mgr Jerzy Wałaszek |
Ta bardzo ważna procedura jest wywoływana zarówno przez główną procedurę klawiatury jak i przez INKEY$ (w SCANNING). We wszystkich przypadkach rejestr E jest zwracany z wartością w zakresie od +00 do +27, która jest różna dla każdego z czterdziestu klawiszy na klawiaturze, lub z wartością +FF, gdy nie był naciśniety żaden klawisz. Rejestr D jest zwracany z wartością, która określa naciśnięty klawisz pomocniczy SHIFT. Jeśli oba klawisze SHIFT są wciśnięte, to rejestry D i E są zwracane z wartościami odpowiednio dla klawiszy CAPS SHIFT i SYMBOL SHIFT. Jeśli żaden klawisz nie jest naciskany, to para rejestrów DE jest zwracana z wartością +FFFF. Znacznik zera jest zwracany jako wyzerowany, jeśli naciskane jest więcej niż dwa klawisze lub w parze klawiszy żaden nie jest klawiszem SHIFT.
028E KEY-SCAN LD L,+2F Początkowa wartość klawisza dla każdego
wiersza będzie +2F, +2E,...,+28.
(Osiem wierszy.)
LD DE,+FFFF Inicjuj DE na 'brak klawisza'.
LD BC,+FEFE C = adres portu, B = licznik. |
Teraz następuje wejście do pętli. Wykonywane jest osiem obiegów, a w każdym z nich jest inna początkowa wartość klawisza i skanuje się inny wiersz pięciu klawiszy. (Pierwszym wierszem są klawisze CAPS SHIFT, Z, X, C, V.)
0296 KEY-LINE IN A,(C) Czytaj z określonego portu.
CPL Naciśnięty klawisz w tym wierszu ustawi
AND +1F swój odpowiedni bit (od bitu 0 - zewnętrzny
klawisz, do bitu 4 - wewnętrzny klawisz).
JR Z,02AB,KEY-DONE Skocz naprzód, jeśli żaden z tych
pięciu klawiszy nie jest naciskany
LD H,A Bity klawiszy przechodzą do rejestru H
LD A,L podczas gdy zostaje pobrana
początkowa wartość klawisza.
029F KEY-3KEYS INC D Jeśli trzy klawisze są naciskane
RET NZ na klawiaturze, to rejestr D
nie będzie już zawierał +FF
- jeśli tak się stanie, powróć.
02A1 KEY-BITS SUB +08 Powtarzaj odejmowanie '8' od
SRL H bieżącej wartości klawisza, aż
JR NC,02A1,KEY-BITS zostanie znaleziony bit klawisza.
LD D,E Skopiuj każdą wcześniejszą wartość klawisza do
rejestru D.
LD E,A Przenieś nową wartość klawisza do
rejestru E.
JR NZ,029F,KEY-3KEYS Jeśli istnieje drugi lub być może
trzeci naciśnięty klawisz w tym wierszu,
to skocz wstecz.
02AB KEY-DONE DEC L Wiersz został przeskanowany, zatem
początkowa wartość klawisza zostaje zmniejszona
dla kolejnego obiegu.
RLC B Licznik jest przesuwany i
JR C,0296,KEY-LINE zostaje wykonany skok, jeśli wciąż są wiersze
do przeskanowania. |
Teraz wykonywane są cztery testy.
LD A,D Akceptuj każdą wartość klawisza, dla której INC A rejestr D wciąż ma zawartość +FF. RET Z tj. naciśnieto pojedynczy klawisz lub żaden. CP +28 Akceptuj wartość pary klawiszy, RET Z jeśli klawisz 'D' oznacza CAPS SHIFT. CP +19 Akceptuj wartość klawisza dla pary klawiszy, RET Z jeśli klawiszem 'D' jest SYMBOL SHIFT. LD A,E Jednakże możliwe jest, że klawisz 'E' LD E,D pary będzie klawiszem SYMBOL LD D,A SHIFT - więc należy to rozważyć. CP +18 RET Wróć ze znacznikiem zera ustawionym, jeśli był to SYMBOL SHIFT i inny klawisz; inaczej wróć z wyzerowanym znacznikiem zera. |
Ta procedura jest wywoływana przy każdym przerwaniu maskowanym. Zwykle będzie się to zdarzało co 20 ms. Celem tej procedury jest przeszukanie klawiatury i zdekodowanie wartości klawisza. Otrzymany kod zostanie, jeśli pozwala na to stan 'powtarzania', przesłany do zmiennej systemowej LAST-K. Gdy kod jest wstawiany do tej zmiennej, to zostaje ustawiony bit 5 FLAGS w celu pokazania, że został naciśniety 'nowy' klawisz.
02BF KEYBOARD CALL 028E,KEY-SCAN Pobierz wartość klawisza RET NZ w parze rejestrów DE, lecz wróć natychmiast, jeśli znacznik zera jest ustawiony. |
Od tej chwili jest używany podwójny system zmiennych systemowych KSTATE (KSTATE0 - KSTATE 3 i KSTATE4 - KSTATE7).
Dwa zestawy pozwalają wykryć naciśnięcie nowego klawisza (za pomocą jednego zestawu) lub przebywanie wewnątrz okresu powtarzania poprzedniego klawisza (szczegóły w drugim zestawie).
Dany zestaw będzie mógł zająć się nowym klawiszem, jeśli zostanie on przytrzymany przez około 1/10 sekundy, tj. pięć wywołań KEYBOARD.
LD HL,KSTATE0 Rozpocznij z KSTATE0. 02C6 K-ST-LOOP BIT 7,(HL) Skocz naprzód, jeśli 'zestaw jest wolny'; JR NZ,02D1,K-CH-SET tj. KSTATE0/4 zawiera +FF. INC HL Jeśli jednak zestaw nie jest wolny, DEC (HL) to zmniejsz jego 'licznik 5-ciu wywołań', DEC HL a gdy osiągnie zero, zasygnalizuj JR NZ,02D1,K-CH-SET ten zestaw jako wolny. LD (HL),+FF |
Po rozważeniu pierwszego zestawu zmień wskaźnik i rozważ drugi zestaw.
02D1 K-CH-SET LD A,L Pobierz dolny bajt LD HL,KSTATE4 adresu i skocz wstecz, jeśli CP L drugi zestaw trzeba wciąż JR NZ,02C6,K-ST-LOOP rozważyć. |
Powróć teraz, jeśli wartość klawisza oznacza 'brak klawisza' lub tylko jeden z klawiszy SHIFT.
CALL 031E,K-TEST Wykonaj konieczne testy RET NC i w razie potrzeby powróć. Również zmień wartość klawisza na 'główny kod'. |
Powtarzane naciśnięcie klawisza (przytrzymanego) jest teraz rozdzielane od naciśnięcia nowego klawisza
LD HL,KSTATE0 Najpierw zobacz na KSTATE0. CP (HL) Skocz naprzód, jeśli kody JR Z,0310,K-REPEAT są zgodne - powtarzanie. EX DE,HL Zachowaj adres KSTATE0. LD HL,KSTATE4 Teraz popatrz na KSTATE4. CP (HL) Skocz naprzód, jeśli kody JR Z,0310,K-REPEAT są zgodne - oznacza to powtarzanie. |
Lecz nowy klawisz nie będzie zaakceptowany, o ile nie będzie wolny jeden z zestawów zmiennych systemowych KSTATE .
BIT 7,(HL) Rozważ drugi zestaw. JR NZ,02F1,K-NEW Skocz naprzód, jeśli jest 'wolny'. EX DE,HL Teraz rozważ pierwszy zestaw. BIT 7,(HL) Kontynuuj, jeśli ten zestaw jest 'wolny', lecz RET Z wyjdź z procedury KEYBOARD, jeśli nie jest |
Nowy klawisz ma być zaakceptowany. lecz zanim zmienna systemowa LAST-K będzie mogła zostać wypełniona, zmienna KSTATE używanego zestawu musi zostać zainicjowana w celu obsługi powtórzeń, a kod klawisza musi zostać zdekodowany.
02F1 K-NEW LD E,A Kod jest przesyłany do
LD (HL),A rejestru E i doKSTATE0/4.
INC HL 'Licznik 5-ciu wywołań' dla tego zestawu
LD (HL),+05 jest ustawiany na '5'.
INC HL Trzecia zmienna systemowa w
LD A,(REPDEL) tym zestawie przechowuje wartość REPDEL
LD (HL),A (zwykle 0.7 sek.).
INC HL Wskaż na KSTATE3/7. |
Dekodowanie na 'główny kod' zależy od bieżącego stanu MODE, bitu 3 w FLAGS oraz 'bajtu SHIFT'.
LD C,(MODE) Pobierz MODE. LD D,(FLAGS) Pobierz FLAGS. PUSH HL Zachowaj wskaźnik w czasie, gdy CALL 0333,K-DECODE dekodowany jest 'główny kod'. POP HL LD (HL),A Ostateczna wartość kodu jest zapisywana w KSTATE3/7; skąd jest pobierana w przypadku powtarzania. |
Kolejne trzy wiersze instrukcji są wspólne dla obsługi zarówno 'nowych klawiszy' jak i 'powtarzanych klawiszy'.
0308 K-END LD (LAST-K),A Wstaw ostateczna wartość kodu do SET 5,(FLAGS) LAST-K i sygnalizuj 'nowy klawisz'. RET Na koniec powróć. |
Klawisz zacznie 'powtarzać' za pierwszym razem po upływie okresu - REPDEL (zwykle 0.7 sek.) a następnie po upływie okresu - REPPER (zwykle 0.1 sek.).
0310 K-REPEAT INC HL Wskaż na 'licznik 5-ciu wywołań' LD (HL),+05 używanego zestawu i ustaw go na '5'. INC HL Wskaż na trzecią zmienną systemową przechowującą DEC (HL) wartość REPDEL/REPPER i zmniejsz ją. RET NZ Wyjdź z procedury KEYBOARD, jeśli dany okres opóźnienia jeszcze nie minął. LD A,(REPPER) Jednakże, gdy minie, to LD (HL),A okresem opóźnienia następnego powtarzania ma być REPPER. INC HL Powtarzanie zostało zaakceptowane, LD A,(HL) zatem jest pobierana ostateczna wartość kodu z KSTATE3/7 i przekazywana JR 0308,K-END do K-END. |
Wartość klawisza jest testowana i następuje powrót, jeśli 'brak klawisza' lub 'jedynie SHIFT'; w przeciwnym razie znajdowany jest 'główny kod' dla tego klawisza.
031E K-TEST LD B,D Kopiuj bajt SHIFT. LD D,+00 Wyzeruj na później rejestr D. LD A,E Przenieś numer klawisza. CP +27 Wróć teraz, jeśli klawiszem był RET NC tylko 'CAPS SHIFT' lub 'brak-klawisza'. CP +18 Skocz naprzód, chyba że klawiszem 'E' JR NZ,032C,K-MAIN był SYMBOL SHIFT. BIT 7,B Jednakże zaakceptuj SYMBOL SHIFT RET NZ z innym klawiszem; powróć przy samym SYMBOL SHIFT. |
'Główny kod' jest znajdowany przez indeksowanie w tablicy głównych klawiszy.
032C K-MAIN LD HL,+0205 Adres bazowy tablicy. ADD HL,DE Indeksuj w tablicy i pobierz LD A,(HL) 'główny kod'. SCF Sygnalizuj 'ważne naciśnięcie klawisza' RET zanim nastąpi powrót. |
Do tej procedury wchodzi się z 'głównym kodem' w rejestrze E, wartością FLAGS w rejestrze D, wartością MODE w rejestrze C i 'bajtem SHIFT' w rejestrze B.
Przez rozpatrzenie tych czterech wartości i odwołanie się w razie konieczności do sześciu tablic klawiszy zostaje utworzony 'kod końcowy'. Jest on zwracany w rejestrze A.
0333 K-DECODE LD A,E Skopiuj 'główny kod'. CP +3A Skocz naprzód, jeśli jest rozpatrywany JR C,0367,K-DIGIT klawisz cyfrowy, SPACJA, ENTER i oba klawisze shift. DEC C Zmniejsz wartość MODE. JP M,034F,K-KLC-LET Skocz naprzód w razie potrzeby dla JR Z,0341,K-E-LET trybów 'K', 'L', 'C' i 'E'. |
Pozostaje jedynie tryb 'graficzny' i 'kod końcowy' dla znaków w trybie graficznym jest wyliczany z 'kodu głównego'..
ADD A,+4F Dodaj przesunięcie. RET Wróć z 'kodem końcowym'. |
Następnie są rozpatrywane litery w trybie rozszerzonym.
0341 K-E-LET LD HL,+01EB Adres bazowy tablicy 'b'. INC B Skocz naprzód, aby użyć tej tablicy, JR Z,034A,K-LOOK-UP jeśli żaden z klawiszy shift nie jest naciskany. LD HL,+0205 W przeciwnym razie użyj tego adresu bazowego dla tablicy 'c'. |
Wszystkie tablice 'b-f' są obsługiwane przez następującą procedurę wyszukującą. We wszystkich przypadkach znajdowany jest 'kod końcowy' i zwracany.
034A K-LOOK-UP LD D,+00 Wyczyść rejestr F. ADD HL,DE Indeksuj wymaganą tablicę LD A,(HL) i pobierz 'kod końcowy'. RET Następnie powróć. |
Teraz są rozpatrywane klawisze literowe w trybach 'K', 'L' lub 'C'. Lecz najpierw należy się zająć ze specjalnymi kodami z SYMBOL SHIFT.
034F K-KLC-LET LD HL,+0229 Adres bazowy tablicy 'e' BIT 0,B Skocz wstecz, jeśli jest w użyciu klawisz JR Z,034A,K-LOOK-UP SYMBOL SHIFT z literą. BIT 3,D Skocz naprzód, jeśli trwa JR Z,0364,K-TOKENS tryb 'K'. BIT 3,(FLAGS2) Jeśli CAPS LOCK jest ustawione, to RET NZ powróć z 'głównym kodem'. INC B Również powróć w ten sam sposób RET NZ jeśli CAPS SHIFT jest naciskany. ADD A,+20 Jednakże gdy są potrzebne kody małych liter, RET to musi być dodane +20 do 'głównego kodu', aby otrzymać poprawny 'kod końcowy'. |
Wartości 'końcowego kodu' dla symboli są znajdowane przez dodanie +A5 do 'głównego kodu'.
0364 K-TOKENS ADD A,+A5 Dodaj wymagane przesunięcie i RET powróć. |
Następnie są rozpatrywane klawisze cyfr; SPACE, ENTER i oba klawisze SHIFT.
0367 K-DIGIT CP +30 Kontynuuj tylko dla klawiszy cyfr. RET C Powróć ze SPACE (+20), ENTER (+0D) i oboma shift (+0E). DEC C Teraz rozdziel klawisze cyfr na trzy grupy - zgodnie z trybem. JP M,039D,K-KLC-DGT Skocz przy trybach 'K', 'L' i 'C'; JR NZ,0389,K-GRA-DGT również przy trybie 'G'. Kontynuuj przy trybie 'E'. LD HL,+0254 Adres bazowy tablicy 'f'. BIT 5,B Użyj tej tablicy dla SYMBOL JR Z,034A,K-LOOK-UP SHIFT i klawisza cyfry w trybie rozszerzonym. CP +38 Skocz naprzód przy klawiszach cyfr JR NC,0382,K-8-&-9 '8' i '9'. |
Klawisze cyfr '0' do '7' w trybie rozszerzonym mają dawać albo 'kod koloru tła', albo 'kod koloru tuszu' w zależności od użycia CAPS SHIFT.
SUB +20 Zmniejsz zakres od +30 do +37 na +10 do +17. INC B Wróć z tym 'kodem koloru tła', RET Z jeśli CAPS SHIFT nie jest używany. ADD A,+08 Ale gdy jest, to zakres musi się zmienić RET na +18 do +1F - oznaczając 'kod koloru tuszu'. |
Klawisze cyfr '8' i '9' mają dać kody 'BRIGHT' i 'FLASH'.
0382 K-8-&-9 SUB +36 +38 i +39 zmienia się na +02 i +03. INC B Wróć z tymi kodami, jeśli CAPS RET Z SHIFT nie jest używany. (Są to kody 'BRIGHT'.) ADD A,+FE Odejmij '2', jeśli CAPS SHIFT jest RET używany; co da +00 i +01 (jako kody 'FLASH'). |
Klawisze cyfr w trybie graficznym mają dawać znaki grafiki blokowej (+80 do +8F), kod GRAPHICS (+0F) i kod DELETE (+0C).
0389 K-GRA-DGT LD HL,+0230 Adres bazowy tablicy 'd'. CP +39 Użyj tej tablicy bezpośrednio dla JR Z,034A,K-LOOK-UP zarówno klawisza '9', który ma dać CP +30 GRAPHICS oraz klawisza '0', JR Z,034A,K-LOOK-UP który ma dać DELETE. AND +07 Dla klawiszy od '1' do '8' ustaw ADD A,+80 zakres +80 do +87. INC B Wróć z wartością z tego RET Z zakresu, jeśli żaden z klawiszy SHIFT nie jest naciskany. XOR +0F Lecz gdy jest, to ustaw zakres RET od +88 do +8F. |
Na koniec rozpatrz klawisze cyfr w trybach 'K', 'L' i 'C'.
039D K-KLC-DGT INC B Wróć bezpośrednio, jeśli żaden z klawiszy
RET Z SHIFT nie jest używany. (Kody końcowe +30 to +39.)
BIT 5,B Użyj tablicy 'd', jeśli również został naciśnięty
LD HL,+0230 klawisz CAPS SHIFT.
JR NZ,034A,K-LOOK-UP |
Teraz można znaleźć kody dla różnych klawiszy cyfrowych z SYMBOL SHIFT.
SUB +10 Zredukuj zakres, aby otrzymać +20 do +29. CP +22 Odseparuj znak '@' JR Z,03B2,K-@-CHAR od innych. CP +20 Znak '_' również musi zostać odseparowany. RET NZ Teraz powróć z 'końcowymi kodami' +21, +23 do +29. LD A,+5F Nadaj znakowi '-' kod +5F. RET 03B2 K-@-CHAR LD A,+40 Nadaj znakowi '@' kod +40. RET |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.