Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autorzy: dr Ian Logan i dr Frank O'Hara
Tłumaczenie: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

SPIS TREŚCI

Procedura klawiatury

PROCEDURA 'SKANOWANIA KLAWIATURY'

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.

PROCEDURA 'KLAWIATURY'

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óć.

PROCEDURA 'POWTARZANEGO KLAWISZA'

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.

PROCEDURA 'K-TEST'

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.

PROCEDURA 'DEKODOWANIA KLAWIATURY'

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

Na początek:  podrozdziału   strony 

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: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.