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

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Rozdział 24

Pamięć

Spojrzenie od środka na ZX Spectrum
CLEAR

SPIS TREŚCI

Rozdział 24: Pamięć

Podsumowanie

CLEAR


Głęboko wewnątrz komputera wszystko przechowywane jest jako bajty, tj. liczby od 0 do 255. Możesz myśleć, że umieściłeś w nim cenę wełny lub adres dostawców nawozu, lecz to wszystko zostało zamienione na zbiór bajtów, a bajty są tym, co widzi komputer.

Każde miejsce, w którym można przechować jakiś bajt, posiada adres, który jest liczbą od 0 do FFFFh (zatem adres może być zapisany w pamięci jako dwa bajty), więc możesz potraktować pamięć jako długi rząd ponumerowanych pudełek, z których każde może zawierać bajt. Jednakże nie wszystkie z tych pudełek są takie same. W standardowej maszynie 16K RAM po prostu brak pudełek o numerach od 8000h do FFFFh. Pudełka od 4000h do 7FFFh są pudełkami RAM, co oznacza, że możesz w nich otworzyć wieczko i zmienić zawartość, a te o numerach od 0 do 3FFFh są pudełkami ROM, które posiadają jakby przezroczystą szybkę, przez którą widać zawarty w pudełku bajt, lecz nie można ich otwierać i zmieniać zawartości. Wolno ci jedynie odczytywać wszystko to, co zostało włożone do środka, gdy komputer był robiony w fabryce.

ROM

RAM

Nieużywane

0 ... 3FFFh
0 ... 16383

4000h ... 7FFFh
16384 ... 32767

8000h ... FFFFh
32768 ... 65535

Aby sprawdzić zawartość jakiegoś pudełka, stosujemy funkcję PEEK: jej argumentem jest adres tego pudełka, a wynikiem jego zawartość. Na przykład, ten program wypisuje pierwsze 21 bajtów z ROM (oraz ich adresy):

10 PRINT "Adres"; TAB 8;"Bajt"
20 FOR a=0 TO 20
30 PRINT a; TAB 8; PEEK a
40 NEXT a

obrazek

Wszystkie te bajty prawdopodobnie nic ci nie będą mówiły, lecz układ procesora rozpoznaje je jako instrukcje, które mówią mu, co ma robić.

Do zmiany zawartości pudełka (jeśli jest to RAM) używamy polecenia POKE. Ma ono postać:

POKE adres, nowa zawartość

gdzie adres  oraz nowa zawartość  są wyrażeniami liczbowymi. Na przykład, jeśli wpiszesz:

POKE 31000,57

to bajt pod adresem 31000 przyjmie nową wartość 57 — wpisz:

PRINT PEEK 31000

aby się o tym przekonać. (Spróbuj wstawiać inne wartości do pamięci, aby pokazać, że nie ma tu żadnego oszukiwania.) Nowa wartość musi leżeć w zakresie od -255 do +255, a jeśli jest ujemna, to zostaje do niej dodane 256.

Możliwość wstawiania wartości do pamięci daje ci olbrzymią władzę nad komputerem, jeśli wiesz, jak się tym posługiwać; a olbrzymie możliwości destrukcji, jeśli tego nie wiesz. Jest bardzo łatwo stracić kontrolę nad programem tworzonym godzinami przez wstawienie złych wartości w złe miejsce pamięci. Na szczęście nie uszkodzisz w ten sposób trwale komputera.

Teraz bardziej szczegółowo przyglądniemy się sposobie używania pamięci RAM, lecz nie czytaj tego, o ile cię to nie interesuje.

Pamięć RAM jest podzielona na różne obszary (pokazane na dużym rysunku), w których przechowywane są różne rodzaje informacji. Obszary te są tylko na tyle duże, aby w całości przechować informację, którą faktycznie zawierają, a jeśli wstawisz w jakimś miejscu coś więcej (na przykład przez dodanie wiersza programu lub zmiennej), to miejsce zostanie zrobione przez przesunięcie w górę wszystkiego ponad tym miejscem. W przypadku odwrotnym, gdy usuwasz informację, to wszystko jest przesuwane w dół.

Obszar ekranu przechowuje obraz telewizyjny. Jest on dosyć dziwnie zorganizowany, zatem prawdopodobnie nie będziesz stosował w nim PEEK lub POKE.  Każda pozycja znakowa na ekranie posiada kwadrat 8x8 punktów, z których każdy może mieć wartość albo 0 (papier), albo 1 (tusz): a używając notacji dwójkowej, możemy ten wzór przechować jako 8 bajtów, po jednym dla każdego wiersza. Jednakże te 8 bajtów nie znajduje się razem. Odpowiednie linie w 32 znakowych wierszach są przechowywane razem jako grupy 32 bajtów, ponieważ to jest potrzebne strumieniowi elektronów w telewizorze, gdy przebiega z lewej krawędzi ekranu do prawej. Ponieważ pełny obraz składa się z 24 wierszy po 8 linii skanujących w każdym, to mógłbyś oczekiwać, że wszystkie 172 linie skanujące są przechowywane w pamięci jedna za drugą; myliłbyś się. Najpierw pojawiają się pierwsze linie skanujące z wierszy od 0 do 7, następnie kolejne linie skanujące wierszy 0 do 7 i tak dalej aż do ostatnich linii skanujących tych wierszy; wtedy to samo występuje dla wierszy od 8 do 15; a jeszcze później dla wierszy od 16 do 23. Morał z tego taki, że jeśli jesteś przyzwyczajony do komputera, który korzysta z PEEK i POKE na ekranie, to zamiast nich będziesz musiał używać SCREEN$ i PRINT AT lub PLOT i POINT.

Atrybuty kolorów dla poszczególnych pozycji znakowych są przechowywane wiersz po wierszu w oczekiwanej przez ciebie kolejności.

Bufor drukarki przechowuje znaki przeznaczone dla drukarki.

Zmienne systemowe zawierają różne informacje, które określają stan komputera. Są wymienione szczegółowo w następnym rozdziale, lecz chwilowo zwróć uwagę, że niektóre z nich (zwane CHANS, PROG, VARS_E, E_LINE itd.) zawierają adresy granic pomiędzy różnymi obszarami w pamięci. Nie są to zmienne języka BASIC i ich nazwy nie zostaną rozpoznane przez komputer.

obrazek

Mapy Microdrives są używane tylko ze stacjami Microdrive. Zwykle nic tam nie ma.

Informacja o Kanałach zawiera informacje na temat urządzeń wejścia i wyjścia, mianowicie o klawiaturze (z dolną połówka ekranu), o górnej połówce ekranu oraz o drukarce.

Każdy wiersz języka BASIC posiada postać:

obrazek

Zwróć uwagę, że w przeciwieństwie do wszystkich innych przypadków liczb dwubajtowych dla Z80 tutaj numer wiersza jest przechowywany z bajtem bardziej znaczącym jako pierwszym: tj. w kolejności zapisu.

Po stałej liczbowej w programie jest umieszczana jej postać dwójkowa przy wykorzystaniu znaku CHR$ 14, za którym idzie pięć bajtów samej liczby.

Zmienne mają różny format w zależności od ich różnych typów. Nazwy należy sobie wyobrażać jako rozpoczynające się od małej litery.

Zmienne o nazwie jednoliterowej:

obrazek

Zmienne o nazwie wieloliterowej:

obrazek

Tablica liczb:

obrazek

Kolejność elementów jest następująca:

najpierw elementy, dla których pierwszy indeks ma wartość 1

następnie elementy, dla których pierwszy indeks ma wartość 2

następnie elementy, dla których pierwszy indeks ma wartość 3

i tak dalej dla wszystkich możliwych wartości pierwszego indeksu.

Elementy o danym pierwszym indeksie są uporządkowane w ten sam sposób za pomocą drugiego indeksu i tak dalej aż do ostatniego indeksu.

Na przykład elementy tablicy c(3,6) z Rozdziału 12 są umieszczone w pamięci w kolejności:

c(1,1) c(1,2) c(1,3) c(1,4) c(1,5) c(1,6) c(2,1) c(2,2) ... c(2,6) c(3,1) c(3,2) ... c(3,3)

Zmienna sterująca pętlą FOR - NEXT:

obrazek

Łańcuch znaków:

obrazek

Tablica znaków:

obrazek

Kalkulator jest częścią systemu języka BASIC, który zajmuje się arytmetyką, a liczby używane w działaniach są przechowywane głównie na stosie kalkulatora.

Zapas zawiera nieużywany dotąd obszar pamięci.

Stos maszynowy jest stosem wykorzystywanym przez mikroprocesor Z80 do przechowywania adresów powrotu i tym podobnych danych.

Stos GOSUB został wspomniany w Rozdziale 5.

Bajt wskazywany przez RAMTOP jest najwyższym adresem wykorzystywanym w systemie języka BASIC. Nawet NEW, które czyści pamięć RAM, idzie tylko do tego miejsca — więc nie zmienia ono grafik definiowanych przez użytkownika. Możesz zmienić adres RAMTOP przez dodanie liczby do polecenia:

CLEAR nowe RAMTOP

Operacja ta:

  (i) usuwa wszystkie zmienne

 (ii) czyści ekran (jak CLS)

(iii) resetuje pozycję PLOT do lewego dolnego narożnika ekranu

(iv) wykonuje RESTORE

 (v) czyści stos GO SUB i umieszcza go pod nowym adresem RAMTOP — przy założeniu, że będzie on leżał pomiędzy stosem kalkulatora a fizycznym końcem pamięci RAM; w przeciwnym razie RAMTOP nie jest zmieniane.

RUN również wykonuje CLEAR, chociaż nigdy nie zmienia RAMTOP.

Używając CLEAR w ten sposób, możesz albo przesunąć RAMTOP w górę, aby zrobić miejsce dla języka BASIC przez nadpisanie grafik definiowanych przez użytkownika, albo możesz przesunąć je w dół, aby otrzymać więcej pamięci RAM zabezpieczonej przed NEW.

Wpisz NEW, następnie CLEAR 23800, aby zorientować się, co się dzieje z komputerem, gdy zaczyna mu brakować pamięci.

Jedną z pierwszych rzeczy, które zauważysz, będzie to, że po rozpoczęciu wpisywania programu w pewnej chwili komputer przestanie przyjmować cokolwiek i zacznie buczeć na ciebie. Oznacza to, że komputer jest zapchany i musisz go nieco opróżnić. Istnieją również dwie wiadomości błędu o mniej więcej tym samym znaczeniu, 4 Memory full (4 Pamięć pełna) i G No room for line (G Brak miejsca dla wiersza).

Buczenie również pojawia się, gdy wpiszesz wiersz dłuższy niż 23 wiersze ekranu — wtedy wpisywana przez ciebie informacja nie jest ignorowana, chociaż nie możesz jej zobaczyć; a buczenie ma cię zniechęcić do wprowadzania więcej.

Długość buczenia ustawia się przez wstawienie liczby do pamięci pod adres 23608. Normalna długość wynosi 64.

Dowolna liczba (za wyjątkiem 0) może być zapisana jednoznacznie jako

gdzie  ± jest znakiem liczby
  m  jest mantysą  i ma wartość od 1/2 do 1 (wartości 1 nie może przyjąć).
a c  jest cechą, liczbą całkowitą (również może być ujemna).

Załóżmy, że m  zapiszemy w systemie dwójkowym. Ponieważ jest ona ułamkiem, to będzie posiadała punkt dwójkowy (tak samo jak liczby dziesiętne posiadają punkt dziesiętny — w systemie polskim jest to przecinek) a następnie ułamek binarny (jak ułamek dziesiętny): zatem dwójkowo:

pół jest zapisywane jako .1
ćwierć jako .01
trzy czwarte jako .11
jedna dziesiąta jako .000110011001100110011... itd.

Przy naszej liczbie m, ponieważ jest ona zawsze mniejsza od 1, to przed punktem dwójkowym nie ma żadnych bitów, a ponieważ ma ona wartość co najmniej 1/2, to pierwszy bit po punkcie dwójkowym ma zawsze wartość 1.

Aby zapamiętać liczbę w komputerze, używamy pięciu bajtów w sposób następujący:

  (i) zapisujemy pierwsze osiem bitów ułamkowych mantysy w drugim bajcie (wiemy, że pierwszy bit zawsze ma wartość 1), drugie osiem bitów w trzecim bajcie, trzecie osiem bitów w czwartym i czwarte osiem bitów w piątym bajcie,

 (ii) zastępujemy pierwszy bit w drugim bajcie — o którym wiemy, że ma wartość 1 — przez bit znaku: 0 dla liczby dodatniej i 1 dla ujemnej,

(iii) zapisujemy cechę + 128 w pierwszym bajcie. Załóżmy przykładowo, że nasza liczba ma wartość 1/10

Stąd mantysa m  ma wartość dwójkową .11001100110011001100110011001100 (ponieważ bit nr 33 ma wartość 1, zaokrąglimy bit nr 32 z 0 do 1), a mantysa c  ma wartość -3.

Stosując powyższe trzy reguły otrzymujemy pięć pożądanych bajtów:

obrazek

Istnieje alternatywny sposób przechowywania liczb całkowitych pomiędzy -65535 a +65535:

  (i) pierwszy bajt ma wartość 0,

 (ii) drugi bajt ma wartość 0 dla liczby dodatniej, FFh dla ujemnej,

(iii) trzeci i czwarty bajt to mniej znaczący i bardziej znaczący bajt liczby (lub liczby + 131072, jeśli jest ona ujemna),

(iv) piąty bajt ma wartość 0.


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.