Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Tłumaczenie: mgr Jerzy Wałaszek

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

Rozdział 14

Zestaw znaków

Spojrzenie na zestaw znaków ZX Spectrum wraz z grafiką oraz jak stworzyć swoje własne znaki graficzne
CODE, CHR$, POKE, PEEK, USR, BIN

SPIS TREŚCI

Rozdział 14: Zestaw znaków

Podsumowanie

CODE, CHR$
POKE
, PEEK
USR
BIN


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ć
obrazek 128  G 
8
  obrazek 143  G 
SHIFT+8
obrazek 129  G 
1
  obrazek 142  G 
SHIFT+1
obrazek 130  G 
2
  obrazek 141  G 
SHIFT+2
obrazek 131  G 
3
  obrazek 140  G 
SHIFT+3
obrazek 132  G 
4
  obrazek 139  G 
SHIFT+4
obrazek 133  G 
5
  obrazek 138  G 
SHIFT+5
obrazek 134  G 
6
  obrazek 137  G 
SHIFT+6
obrazek 135  G 
7
  obrazek 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:

 

obrazek

 

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

obrazek

  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.
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
©2021 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.