Rozdział 14


Zestaw znaków

 

Podsumowanie

 

Litery, cyfry, znaki przystankowe itd. pojawiające się w łańcuchach są zwane znakami i tworzą alfabet lub zestaw znaków, który używa ZX Spectrum. Większość z tych znaków to pojedyncze symbole, lecz jest jeszcze kilka zwanych tokenami, które reprezentują całe wyrazy, takie jak PRINT, STOP, <> itd.

Jest 256 znaków o kodach od 0 do 255. Ich kompletna lista znajduje się w Dodatku A. To konwersji pomiędzy kodami i znakami służą dwie funkcje: CODE oraz CHR$.

 

CODE stosowana jest z łańcuchem i daje kod pierwszego znaku w tym łańcuchu (lub 0, jeśli łańcuch jest pusty).

CHR$ używana jest z liczbą i daje pojedynczy znak, którego kodem jest ta liczba.

 

Ten program wypisuje cały zestaw znaków

 

10 FOR a=32 TO 255: PRINT CHR$ a;: NEXT a

 

Na górze zobaczysz spację, 15 symboli i znaków przystankowych, dziesięć cyfr i siedem kolejnych symboli, duże litery, sześć następnych symboli, małe litery i pięć dalszych symboli. Wszystkie (za wyjątkiem £ i ©) są wzięte z szeroko używanego zestawu znaków znanego pod nazwą ASCII (z ang. American Standard Code for Information Interchange - Amerykański Standardowy Kod dla Wymiany Informacji); ASCII również przypisuje kody liczbowe do tych znaków, a są to kody używane przez ZX Spectrum.

Reszta znaków nie jest częścią ASCII i odnosi się wyłącznie do ZX Spectrum. Wśród nich najpierw pojawia się spacja i 15 wzorków białych i czarnych kwadratów. Nazywane są symbolami graficznymi i można je wykorzystywać do rysowania obrazków. Możesz wprowadzić je z klawiatury w trybie graficznym. Jeśli naciśniesz GRAPHICS (CAPS SHIFT z 9), to kursor zmieni się na  G . Teraz klawisze cyfr od 1 do 8 dają symbole graficzne: same dają symbole wyrysowane na klawiszach, a z wciśniętym klawiszem SHIFT dają te same symbole w negatywie.

Bez względu na stan klawiszy SHIFT naciśnięcie klawisza 9 powoduje powrót do normalnego trybu  L , a cyfra 0 kasuje znaki.

Oto 16 symboli graficznych:

 

Symbol

Kod

Jak otrzymać:

    

Symbol

Kod

Jak otrzymać

128

 G 
8

 

143

 G 
SHIFT+8

129

 G 
1

 

142

 G 
SHIFT+1

130

 G 
2

 

141

 G 
SHIFT+2

131

 G 
3

 

140

 G 
SHIFT+3

132

 G 
4

 

139

 G 
SHIFT+4

133

 G 
5

 

138

 G 
SHIFT+5

134

 G 
6

 

137

 G 
SHIFT+6

135

 G 
7

 

136

 G 
SHIFT+7

 

Po symbolach graficznych zobaczysz coś, co będzie wyglądało jak kopia alfabetu od A do U. Są to znaki, które możesz samemu przedefiniować, chociaż gdy maszyna jest po raz pierwszy włączona, to zostają one ustawione na kształt liter — nazywają się grafiką definiowaną przez użytkownika. Możesz je wpisać z klawiatury po przejściu do trybu graficznego i użyciu klawiszy od A do U.

Aby zdefiniować sobie nowy znak, postępuj wg poniższego przepisu — definiuje on znak pokazujący π.

 

(I)

 

Określ wygląd znaku. Każdy znak jest matrycą 8x8 kropek, z których każda pokazuje albo kolor papieru, albo kolor tuszu (zobacz do broszurki wprowadzającej). Powinieneś narysować rysunek jak poniżej, gdzie czarne kwadraty oznaczają kolor tuszu:

 

 

Zostawiliśmy margines jednego kwadratu wokół krawędzi, ponieważ wszystkie inne litery go posiadają (za wyjątkiem małych liter z ogonkami, u których dotyka on dolnej krawędzi matrycy znaku).

(II)

 

Ustal, która grafika użytkownika ma pokazywać π — powiedzmy, że będzie to grafika odpowiadająca P, zatem jeśli w trybie graficznym naciśniesz klawisz P, to otrzymasz znak π.

(III)

 

Zapisz ten nowy szablon. Każda z grafik użytkownika posiada swój szablon zapisany jako osiem liczb, po jednej na każdy wiersz. Każdą z tych liczb możesz zapisać jako BIN, za którym umieszczasz 8 zer lub jedynek — 0 dla tła, 1 dla tuszu — zatem te osiem liczb dla naszego znaku π jest następujące:

 

BIN 00000000
BIN 00000000
BIN 00000010
BIN 00111100
BIN 01010100
BIN 00010100
BIN 00010100
BIN 00000000

 

(Jeśli słyszałeś o liczbach dwójkowych, to pomocna dla ciebie będzie informacja, że BIN jest używane do zapisu liczby w systemie dwójkowym zamiast normalnego systemu dziesiętnego.)

Te osiem liczb zapisuje się w pamięci w ośmiu komórkach, z których każda posiada adres. Adres pierwszego bajtu lub grupy ośmiu cyfr ma wartość USR "P" (P, ponieważ to właśnie wybraliśmy w punkcie II), adres drugiego bajtu to USR "P"+1 itd. aż do ósmego bajtu, który będzie miał adres USR "P"+7.

USR jest tutaj funkcją zamieniającą argument łańcuchowy na adres pierwszego bajtu w pamięci odpowiadającej mu grafiki definiowanej przez użytkownika. Argument łańcuchowy musi być pojedynczą literą, która może być albo samą grafiką użytkownika, albo odpowiadającą jej literą (dużą lub małą). Funkcja USR posiada jeszcze inne zastosowanie z argumentem liczbowym i zajmiemy się nią później.

Jeśli tego nie rozumiesz, to poniższy program wykona pracę za ciebie:

 

10 FOR n=0 TO 7
20 INPUT wiersz: POKE USR "P"+n,wiersz
30 NEXT n

 

Zatrzyma się on osiem razy dla danych INPUT, aby pozwolić ci wprowadzić osiem liczb BIN podanych powyżej — wprowadź je we właściwej kolejności, rozpoczynając od górnego wiersza.

Polecenie POKE umieszcza liczbę bezpośrednio w komórce pamięci, pomijając mechanizm zwykle wykorzystywany przez BASIC. Przeciwieństwem POKE jest PEEK, które pozwala zaglądnąć do zawartości komórki pamięci bez jej zmiany. Zajmiemy się tym odpowiednio w Rozdziale 24.

 

Po grafikach użytkownika występują tokeny.

Zauważysz, że nie wyświetliliśmy pierwszych 32 znaków o kodach od 0 do 31. Są to znaki sterujące. Nie tworzą one nic drukowalnego, lecz posiadają pewien mniej uchwytny efekt na ekran lub używa się ich do sterowania czymś innym od ekranu, a na ekranie pojawia się znak ? w celu pokazania, że nie zostały zrozumiane w rozkazie PRINT. Są one w pełni opisane w Dodatku A.

Ekran rozumie trzy z nich o kodach 6, 8 i 13; z nich tylko CHR$ 8 faktycznie może ci się przydać.

CHR$ 6 drukuje spacje dokładnie tak samo, jak robi to przecinek w poleceniu PRINT, na przykład

 

PRINT 1; CHR$ 6;2

 

robi dokładnie to samo co

 

PRINT 1,2

 

Oczywiście nie jest to zbyt zrozumiały sposób do używania tego kodu. Bardziej subtelne będzie

 

LET a$="1"+CHR$ 6+"2"
PRINT a$

 

CHR$ 8 cofa  wydruk o jedną pozycję wstecz — wypróbuj

 

PRINT "1234"; CHR$ 8;"5"

 

co wyświetli 1235

 

CHR$ 13 to znak nowego wiersza 'newline': przenosi pozycję druku na początek następnego wiersza na ekranie.

Ekran wykorzystuje również kody od 16 do 23; są one wyjaśnione w Rozdziałach 15 i 16. Wszystkie znaki sterujące są opisane w Dodatku A.

 

Używając kodów znaków możemy poszerzyć pojęcie 'porządku alfabetycznego' o łańcuchy zawierające dowolne znaki, nie tylko litery. Jeśli zamiast alfabetu zbudowanego z 26 liter przyjmiemy alfabet 256 znaków uporządkowany wg kodów, to zasada pozostaje taka sama. Na przykład poniższe łańcuchy są w porządku alfabetycznym dla ZX Spectrum. (Zwróć uwagę na dosyć dziwną cechę: małe litery są za wszystkimi dużymi, zatem "a" idzie za "Z"; również spacje mają znaczenie.)

 

CHR$ 3+"ZOOLOGICZNE OGRODY"
CHR$ 8+"ALARM"
"  AAAARGH!"
"(Uwaga w nawiasach)"
"100"
"129.95 z VAT"
"AASVOGEL"
"Aardvark"
"PRINT"
"Zoo"
"[interpolacja"
"aardvark"
"aasvogel"
"zoo"
"zoologia"

 

Oto reguła pozwalająca określić kolejność dwóch łańcuchów. Najpierw porównaj pierwsze znaki. Jeśli są różne, to jeden z nich posiada kod mniejszy od drugiego, a łańcuch, z którego pochodzi znak o mniejszym kodzie, jest wcześniejszy w porządku alfabetycznym. Jeśli znaki są takie same, to przejdź do porównania kolejnych znaków. Jeśli w trakcie tego procesu w jednym z łańcuchów skończą się znaki, to ten krótszy łańcuch jest wcześniejszy; w przeciwnym razie oba łańcuchy są równe.

Relacje =, <, >, <=, >= i <> są używane tak samo dla łańcuchów jak i dla liczb: < znaczy 'jest wcześniejszy', a > znaczy 'jest późniejszy', zatem relacje

 

"AA facet"<"AARDVARK"
"AARDVARK">"AA facet"

 

są obie prawdziwe.

<= i >= działają w ten sam sposób jak dla liczb, więc

 

"To samo"<="To samo"

 

jest prawdziwe, lecz

 

"To samo"<"To samo"

 

jest fałszywe.

Poeksperymentuj z tym wszystkim za pomocą poniższego programu, który wczytuje dwa łańcuchy i porządkuje je alfabetycznie względem siebie.

 

10 INPUT "Wpisz dwa teksty:",a$,b$
20 IF a$>b$ THEN LET c$=a$: LET a$=b$: LET b$=c$
30 PRINT a$;" ";
40 IF a$<b$ THEN PRINT "<";: GO TO 60
50 PRINT "="
60 PRINT " ";b$
70 GO TO 10

 

Zwróć uwagę na sposób wprowadzenia c$ w wierszu 20, gdy wymienialiśmy a$ z b$,

 

LET a$=b$: LET b$=a$

 

nie przyniosłoby pożądanego efektu.

 

Ten program tworzy grafikę użytkownika w celu pokazania figur szachowych:

 

P dla pionka
R dla wieży
N dla konia
B dla gońca
K dla króla
Q dla hetmana

 

Figury szachowe:

 

    5 LET b=BIN 01111100: LET c=BIN 00111000: LET d=BIN 00010000
  10 FOR n=1 TO 6: READ p$: REM 6 figur
  20 FOR f=0 TO 7: REM czytaj figure w 8 bajtach
  30 READ a: POKE USR p$+f,a
  40 NEXT f
  50 NEXT n
100 REM goniec
110 DATA "b",0,d, BIN 00101000, BIN 01000100
120 DATA BIN 01101100,c,b,0
130 REM krol
140 DATA "k",0,d,c,d
150 DATA c, BIN 01000100,c,0
160 REM wieza
170 DATA "r",0, BIN 01010100,b,c
180 DATA c,b,b,0
190 REM hetman
200 DATA "q",0, BIN 0101011, BIN 00101000,d
210 DATA BIN 01101100,b,b,0
220 REM pion
230 DATA "p",0,0,d,c
240 DATA c,d,b,0
250 REM kon
260 DATA "n",0,d,c, BIN 01111000
270 DATA BIN 00011000,c,b,0

 

Zauważ, że 0 może być używane zamiast BIN 00000000.

Gdy uruchomisz ten program, zobacz na figury w trybie graficznym.

 

Ćwiczenia

  1. Wyobraź sobie, że obszar zajmowany przez jeden znak jest podzielony na cztery ćwiartki jak ciasto Bettenberg (patrz powyżej): wtedy każda z ćwiartek może być albo biała, albo czarna, istnieje 2x2x2x2=16 możliwości. Wyszukaj je wszystkie w zbiorze znaków.
  2. Uruchom ten program:

            10 INPUT a
            20 PRINT CHR$ a;
            30 GO TO 10

    Jeśli poeksperymentujesz z nim, to odkryjesz, że CHR$ a jest zaokrąglane do najbliższej liczby całkowitej; a jeśli a nie jest w przedziale od 0 do 255, to program zatrzyma się z raportem błędu
    B integer out of range   (B liczba całkowita poza zakresem)
  3. Który z tych dwóch łańcuchów jest wcześniejszy?

            "LIZAK"
            "lizak"
     
  4. Jak zmodyfikować program ustawiający grafiki użytkownika, aby zamiast odczytywać dane poleceniem INPUT, korzystał on z poleceń READ i DATA.

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe