Organizacja pamięci |
|
Pamięć w ZX Spectrum ma charakterystyczną organizację. Całym komputerem steruje 8-bitowy mikroprocesor Z80, który może bezpośrednio zaadresować tylko 64kB. Obszar ten musi być podzielony na pamięć ROM i RAM. Podstawową różnicą jest to, że pamięć ROM można tylko odczytywać, zaś pamięć RAM służy do przechowywania w niej danych i programów, można dowolnie modyfikować w jej zawartość. Pamięć ROM (Read Only Memory) jest pamięcią stałą, co oznacza, że nawet po wyłączeniu komputera nie ulega wyczyszczeniu. Natomiast zapisywalna pamięć RAM (Random Access Memory) działa niezawodnie tak długo, dopóki jest zasilana energią elektryczną (w dużym uproszczeniu).
ZX Spectrum jest prostym komputerem, dlatego też jego przestrzeń adresowa została podzielona na pewne obszary, w których nie ma dziur. W zasadzie pamięć Spectrum nie kryje tylu tajemnic co np. C-64. Podstawym podziałem jest rozdział na ROM i RAM. Dane można zapisywać tylko w obszarze RAM. Odczytywać można oczywiście całą przestrzeń od adresu 0 do 65535. Ale o szczegółach przeczytasz niżej, w tabelce. Pamięć ROM zaczyna się od adresu 0, gdyż od tego adresu mikroprocesor pobiera polecenia po rozpoczęciu pracy. W pamięci stałej jest zapisany interpreter języka BASIC oraz procedury obsługujące ekran, magnetofon, klawiaturę, drukarkę ZX Printer itp. Dzięki temu programista może korzystać z gotowych procedur systemowych w swoich programach. Zaraz za pamięcią stałą znajduje się specjalny obszar pamięci RAM - tzw. pamięć ekranu. Wszystko, co znajduje się w tym obszarze jest wyświetlane na monitorze. Czasami ten obszar (zazwyczaj jego większy fragment) bywa wykorzystywany przez "pamięciożerne" programy np. kopiery, do przechowywania danych (wtedy widać charakterystyczną sieczkę na ekranie). Dalej znajdują się obszary wykorzystywane przez sam system operacyjny, BASIC i pamięć do wykorzystania przez użytkownika. Standardowy podział obejmuje taką klasyfikację obszarów jak np. bufor drukarki, obszar zmiennych systemowych czy grafikę użytkownika, ale wprawny programista wie, które fragmenty tych obszarów może wykorzystać do innych celów w swoich programach.
Dobra znajomość mapy pamięci ZX Specgtrum pozwala na dokonywanie różnych sztuczek w programach w BASIC-u, na łamanie zabezpieczonych programów, przerabianie programów itp. To już zależy od pomysłowości programisty. Brak standardowego sposobu rozszerzania pamięci wymusza pisanie programów wykorzystujących optymalnie przestrzeń oferowaną przez producenta. Można, owszem, dorobić proste rozszerzenie np. popularne w Polsce 80kB, można też podłączyć odpowiedni interface z dodatkową pamięcią, lecz program napisany dla danej konfiguracji sprzętowej prawdopodobnie nawet nie ruszy na innej. W dodatku znane mi rozszerzenia pamięci są niezgodne (programowo) z podziałem pamięci w Spectrum 128.
Od poniższego podziału mogą istnieć odstępstwa w przypadku podłączenia do maszyny różnych rozszerzeń, które podmieniają pamięć. Można tu zaliczyć np. niektóre przystawki dla hackerów, które posiadają własny ROM i pamięć RAM itd. W podstawowym ZX Spectrum 48kB/+ pamięć jest zgodna z przestawionym tu opisem. Na pewno na jej organizacje nie wpływa podłączenie joysticka czy AY-greka (to informacja dla mniej zorientowanych).
Mapa pamięci ZX Spectrum 48 / PLUS
Adres lub zmienna |
Adres zmiennej |
Pocz. wartość zmiennej |
Obszar |
Uwagi |
0 |
|
|
ROM |
Adresy w zapisie dziesiętnym |
16384 |
|
|
Pamięć ekranu |
|
22528 |
|
|
Atrybuty |
|
23296 |
|
|
Bufor drukarki |
|
23552 |
|
|
Zmienne systemowe |
Dokładny opis w osobnej tabelce |
23734 |
|
|
Mapa microdrive'u |
|
CHANS |
23631 |
23734 |
Informacja o kanałach |
Znacznik końca: 80h |
PROG |
23635 |
23755 |
Program w BASIC-u |
Początek systemu BASIC |
VARS |
23627 |
|
Zmienne BASIC-a |
Znacznik końca: 80h |
E_LINE |
23641 |
|
Obszar (bufor) edytora BASIC-a |
Na końcu obszaru są 2 bajty: 0Dh i 80h |
WORKSP |
23649 |
|
Bufor instrukcji INPUT |
Znacznik końca: 0Dh |
STKBOT |
23651 |
|
Stos kalkulatora |
|
STKEND |
23653 |
|
Wolny obszar pamięci |
|
rejestr SP |
|
|
Stos maszynowy |
Wykorzystwany przez mikroprocesor |
ERRSP |
23613 |
|
Stos instrukcji GO SUB |
To jest ostatni obszar systemu BASIC |
RAMTOP |
23730 |
65367 |
Miejsce na kod maszynowy |
Znacznik końca: 3Eh |
UDG |
23675 |
65368 |
Grafika definiowana |
Np. na polskie znaki |
P_RAMT |
23732 |
65535 |
Koniec pamięci |
|
Zmienne systemowe
Adres |
Długość |
Nazwa |
Zawartość |
23552 |
8 |
KSTATE |
obszar roboczy procedury wczytywania znaków z klawiatury |
23560 |
1 |
LAST K |
kod ostatnio wciśniętego klawisza |
23561 |
1 |
REPDEL |
czas (1/50 s) przez jaki musi być wciśnięty klawisz, by został wczytany ponownie; domyślnie 35 |
23562 |
1 |
REPPER |
czas (1/50 s) pomiędzy kolejnymi wczytaniami wciśniętego klawisza; domyślnie 5 |
23563 |
2 |
DEF ADD |
adres argumentu funkcji FN |
23565 |
1 |
K DATA |
drugi bajt sterujący kolorem wprowadzonym z klawiatury |
23566 |
2 |
TV DATA |
bajty sterujące kolorem i pozycją (AT, TAB) znaków wprowadzanych na ekran |
23568 |
38 |
STRMS |
względne adresy kanałów dołączonych do poszczególnych strumieni: |
23606 |
2 |
CHARS |
adres (-256) graficznych form zbioru znaków (generatora znaków) |
23608 |
1 |
RASP |
długość dźwięku ostrzegawczego |
23609 |
1 |
PIP |
czas trwania dźwięku potwierdzającego wciśnięcie klawisza |
23610 |
1 |
ERR NR |
kod błędu (minus 1); początkowo 255 |
23611 |
1 |
FLAGS |
znaczniki we/wy. Znaczenie bitów: |
23612 |
1 |
TV FLAG |
znaczniki ekranu. Znaczenie bitów: |
23613 |
2 |
ERR SP |
adres procedury obsługi błędu |
23615 |
2 |
LIST SP |
adres powrotu dla automatycznego listowania |
23617 |
1 |
MODE |
rodzaj kursora: 0 dla L/C, 1 dla E, 2 dla G, 4 dla K |
23618 |
2 |
NEWPPC |
numer linii, do której wykonywany jest skok |
23620 |
1 |
NSPPC |
numer instrukcji w linii, do której wykonywany jest skok |
23621 |
2 |
PPC |
numer aktualnie wykonywanej linii |
23623 |
1 |
SUBPPC |
numer instrukcji w aktualnie wykonywanej linii |
23624 |
1 |
BORDCR |
kolor brzegu ekranu (*8) |
23625 |
2 |
E PPC |
numer linii, w której znajduje się kursor programu (">") |
23627 |
2 |
VARS |
adres pola zmiennych programu w BASIC |
23629 |
2 |
DEST |
adres zmiennej, której aktualnie przypisywana jest wartość |
23631 |
2 |
CHANS |
adres pola rekordów kanałów |
23633 |
2 |
CURCHL |
adres aktualnie używanego kanału |
23635 |
2 |
PROG |
adres programu w języku BASIC |
23637 |
2 |
NXTLIN |
adres następnej linii w programie |
23639 |
2 |
DATADD |
adres początku następnej danej w zbiorze DATA |
23641 |
2 |
E LINE |
adres aktualnie poprawianej instrukcji |
23643 |
2 |
K CUR |
miejsce kursora we wprowadzanej/poprawianej linii |
23645 |
2 |
CH ADD |
adres następnego znaku do interpretacji |
23647 |
2 |
X PTR |
adres znaku po znaczniku "?" |
23649 |
2 |
WORKSP |
adres obszaru roboczego interpretera |
23651 |
2 |
STKBOT |
adres początku stosu kalkulatora |
23653 |
2 |
STKEND |
adres końca stosu kalkulatora |
23655 |
1 |
BREG |
rejestr B kalkulatora |
23656 |
2 |
MEM |
adres pamięci kalkulatora (zwykle MEMBOT) |
23658 |
1 |
FLAGS |
znaczniki (flagi). Bity: |
23659 |
1 |
DF SZ |
liczba linii w oknie systemowym (dolnej części ekranu) |
23660 |
2 |
S TOP |
numer linii na początku automatycznego listingu |
23662 |
2 |
OLDPPC |
numer linii dla instrukcji CONTINUE |
23664 |
1 |
OSPPC |
numer instrukcji w linii dla CONTINUE |
23665 |
1 |
FLAGX |
znaczniki (flagi). Bit numer: |
23666 |
2 |
STRLEN |
długość aktualnie analizowanego łańcucha znaków |
23668 |
2 |
T ADDR |
adres następnej pozycji w tabeli analizy syntaktycznej |
23670 |
2 |
SEED |
podstawa generacji liczb losowych (RND) ustawiana przez RANDOMIZE |
23672 |
3 |
FRAMES |
licznik ramek TV zwiększany co 1/50 sekundy; pierwszy bajt najmniej znaczący |
23675 |
2 |
UDG |
adres pola grafiki definiowanej (UDG) |
23677 |
2 |
COORDS |
współrzędne (xy) ostatnio rysowanego punktu (PLOT) |
23679 |
1 |
P POSN |
numer kolumny drukowania |
23680 |
1 |
PR CC |
mniej znaczący bajt adresu pozycji znaku do drukowania z bufora drukarki |
23681 |
1 |
nie używany |
|
23682 |
2 |
ECHO E |
numer kolumny i numer wiersza na ekranie; numer końca bufora dla wprowadzania (INPUTz kanału "K") |
23684 |
2 |
DF CC |
adres kursora w górnej części ekranu (kanał "S") |
23686 |
2 |
DFCCL |
adres kursora w dolnej części ekranu (kanał "K") |
23688 |
2 |
SPOSN |
zawiera 33 minus numer kolumny (pozycja dla PRINT w kanale "S") 24 minus numer wiersza |
23690 |
2 |
SPOSNL |
j.w., ale dla okna systemowego (kanał "K") |
23692 |
1 |
SCR CT |
liczba przesunięć linii na ekranie (+1) do pytania "scroll?" |
23693 |
1 |
ATTR P |
atrybuty globalne (dla całego ekranu) |
23694 |
1 |
MASK P |
maska przezroczystych stałych kolorów |
23695 |
1 |
ATTR T |
atrybuty lokalne (PRINT, INPUT) |
23696 |
1 |
MASK T |
maska przezroczystych atrybutów lokalnych |
23697 |
1 |
P FLAG |
znaczniki barw. Znaczenie bitów: |
23698 |
30 |
MEMBOT |
pamięć kalkulatora |
23728 |
2 |
nie używane |
|
23730 |
2 |
RAMTOP |
adres ostatniego bajtu dostępnego dla BASIC-a |
23732 |
2 |
P RAMT |
adres ostatniego bajtu dołączonej pamięci RAM |
Zmienne układu "Interface 1"
Adres |
Długość |
Nazwa |
Zawartość |
23734 |
1 |
FLAGS 3 |
Znaczniki; bit zapalony podczas: |
23735 |
2 |
VECTOR |
adres używany do rozszerzenia interpretera BASIC-a (normalnie 01F0) |
23737 |
10 |
SBRT |
Podprogram wywołania procedury z ROM-u Spectrum: |
23747 |
2 |
BAUD |
Szybkość przesyłania danych przez RS232 |
23749 |
1 |
NTSTAT |
Własny numer w sieci (od 1 do 64) |
23750 |
1 |
IOBORD |
kolor brzegu ekranu podczas operacji we/wy |
23751 |
2 |
SERFL |
Obszar roboczy RS232. Pierwszy bajt = znaczniki; drugi bajt = wprowadzany znak |
23753 |
2 |
SECTOR |
Obszar roboczy microdrive'u - zwykle służy do zliczania sektorów |
23755 |
2 |
CHADD |
Chwilowe przechowywanie zawartości CHADD |
23757 |
1 |
NTRESP |
kod zwrotny stacji w sieci |
23758 |
1 |
NTDEST |
Numer stacji przeznaczenia w sieci |
23759 |
1 |
NTSRCE |
Numer stacji nadającej w sieci |
23760 |
2 |
NTNUMB |
liczba bloków przesyłanych w sieci (0-65535) |
23762 |
1 |
NTTYPE |
Nagłówek typu danych w sieci (0-dane, 1-EOF) |
23763 |
1 |
NTLEN |
Długość bloku przesyłanego w sieci (0-255) |
23764 |
1 |
NTDCS |
suma kontrolna bloku przesyłanego w sieci |
23765 |
1 |
NTHCS |
suma kontrolna nagłówka bloku w sieci |
23766 |
2 |
D STR 1 |
Początek 8-bajtowego pola nagłówka pliku, drugi bajt - numer microdrive'u (1-8) lub numer stacji przeznaczenia w sieci lub szybkość pracy łącza szeregowego |
23768 |
1 |
S STR 1 |
Numer strumienia (0-15) |
23769 |
1 |
L STR 11 |
typ urządzenia: M, N, T, B |
23770 |
2 |
N STR 1 |
Długość nazwy pliku |
23772 |
2 |
T STR 1 |
adres początku nazwy pliku |
23774 |
8 |
D STR 2 |
Kolejne 8 bajtów nagłówka pliku w instrukcji MOVE i LOAD |
23782 |
1 |
HD 00 |
Rodzaj pliku |
23783 |
2 |
HD 0B |
Długość danych |
23785 |
2 |
HD 0D |
adres początku danych |
23787 |
2 |
HD 0F |
Długość programu (lub nazwa tablicy) |
23789 |
2 |
HD 11 |
Numer linii do automatycznego startu programu |
23791 |
1 |
COPIES |
liczba kopii tworzonych instrukcją SAVE |