Wewnątrz ZX81


File:ZX81 Leiterkarte.jpg

Programy w kodzie maszynowym

Program w kodzie maszynowym wywoływany jest przy pomocy funkcji języka ZX81 BASIC o nazwie USR, za którą podajemy adres procedury maszynowej. Na przykład:

LET M=USR <adres startowy>

W języku ZX81 BASIC mamy do dyspozycji tylko liczby dziesiętne, nie można zatem podawać adresów szesnastkowo.

Oficjalne wskazówki powrotu z procedury maszynowej wg instrukcji ZX81 są następujące:

Jeśli chodzi o rejestr IY, to informacja z instrukcji ZX81 nie pokrywa się z prawdą, ponieważ zawartość IY jest automatycznie odtwarzana przy powrocie do ZX81 BASIC. Jednakże, jeśli aktywne jest wyświetlanie w trybie SLOW, to procedura obsługi wideo wykorzystuje rejestry IX, IY, I oraz AF'. Zatem nie najlepszym pomysłem jest zmienianie zawartości tych rejestrów - nawet przełączenie na rejestry AF' może być tragiczne w skutkach.

 

Umieszczanie danych/programu w pamięci

Komputer ZX81 bezpośrednio nie obsługuje ładowania plików binarnych z magnetofonu kasetowego. Gdy stosujemy rozkaz LOAD, to załadowany zostaje obraz pamięci zawierający zmienne systemowe (od adresu 4009h), program w języku ZX81 BASIC, pamięć wideo oraz zmienne języka BASIC. Poniżej wymieniam obszary pamięci RAM, które mogą posłużyć do przechowywania różnych danych i procedur maszynowych.

 

Użycie instrukcji REM (w obszarze programu)

Zwykle stosuje się do tego celu pierwszy wiersz programu, ponieważ znajduje się on zawsze pod ustalonym adresem w pamięci - 407Dh (16509). Komentarz REM powinien zawierać początkowo wystarczającą ilość znaków na pomieszczenie docelowych danych. Dane następnie wprowadzamy do komentarza przy pomocy instrukcji POKE - być może za pomocą jakiegoś prościutkiego loadera. Komentarz nie powinien zawierać znaku 76h (118 - NEWLINE). Z tego powodu w programie asemblerowym nie powinno być instrukcji HALT lub jakiegokolwiek innego rozkazu, który w swoim kodzie zawiera tę wartość, np. LD A,76h lub JP4276h.

Pierwszy wiersz programu w języku BASIC jest rozlokowany w pamięci następująco:

10 REM XXXXX

Adres Zawartość Znak Uwagi
407Dh : 16509 0   Numer wiersza 10 - w odróżnieniu od standardowych liczb dwubajtowych, tutaj zamieniona jest kolejność bajtów, najpierw starszy bajt, a następnie młodszy. Spowodowane to jest wykrywaniem końca programu, jeśli wiersz wskazuje na DFILE, które rozpoczyna się bajtem 118 (całkiem sprytne rozwiązanie).
407Eh : 16510 10
407Fh : 16511 7   Długość tekstu wiersza - całkowity wiersz jest dłuższy o 4 bajty (2 bajty na numer oraz 2 bajty na długość). Kolejność bajtów jest standardowa - młodszy, starszy. W tym przypadku długość wiersza jest równa 7 + 4 = 11 bajtów.
4080h : 16512 0
4081h : 16513 234 REM Kod instrukcji REM. Instrukcje przechowywane są w programie jako tzw. TOKENY, czyli jednobajtowe kody.
4082h : 16514 61 X Zawartość komentarza. Tutaj będziesz wstawiał swoje dane. Zatem adres startowy dla pierwszego wiersza REM w programie jest zawsze równy:

4082h (16514)

4083h : 16515 61 X
4084h : 16516 61 X
4085h : 16517 61 X
4086h : 16518 61 X
4087h : 16518 118 N/L Koniec każdego wiersza zaznaczany jest bajtem 118 - znak NEWLINE
4088h : 16519 ? ? Tutaj rozpoczyna się następny wiersz w programie lub bufor wyświetlania DFILE, jeśli program zwiera tylko jeden wiersz.

 

Z tego sposobu przechowywania danych korzysta kompilator MCODER 2 oraz system programowania ZX81 w kodzie maszynowym na PC.

Bezpieczny loader do instrukcji REM w pierwszym wierszu programu wygląda następująco:

  10 REM XXXX...(tutaj tyle znaków ile trzeba)...
  20 IF PEEK 16513<>234 THEN STOP
  30 PRINT "ILE BAJTOW?"
  40 INPUT L
  50 IF L+2 > PEEK 16511+256*PEEK 16512 THEN STOP
  60 FOR I = 16514 TO 16513+L
  70 INPUT B
  80 POKE I,B
  90 NEXT I
100 STOP

 

Użycie łańcucha (w obszarze zmiennych)

Utwórz zmienną łańcuchową, np. A$ i wypełnij ją danymi binarnymi wstawiając do niej znaki o odpowiednich kodach. Loader może być następujący:

10 LET A$=""
20 PRINT "ILE BAJTOW?"
30 INPUT L
40 FOR I=1 TO L
50 INPUT B
60 LET A$=A$+CHR$ B
70 NEXT I
80 STOP

Wszystkie zmienne są zapisywane przez polecenie SAVE. Nie ma konieczności inicjowania ich za każdym razem w programie - jednakże musisz pamiętać, iż takiego programu nie wolno uruchamiać poleceniem RUN, które czyści wszystkie zmienne. Również potencjalnie niebezpieczne jest CLEAR - co prawda nie czyści ono pamięci zmiennych i dane wciąż tam pozostaną, jednakże w najbliższym czasie mogą zostać nadpisane przez nowe zmienne lub bufor wiersza edycji - również nie zostaną zapisane przez polecenie SAVE, ponieważ znajdują się poza obszarem zmiennych.

Zmienna może przemieszczać się w pamięci - np. przy modyfikacji programu, dodaniu nowej zmiennej lub przy zmianie zawartości bufora wyświetlania. Dlatego kod maszynowy nie powinien zawierać adresów stałych - tylko względne.

Osobnym problemem jest znalezienie aktualnego adresu początku kodu przechowywanego w zmiennej. Na szczęście może to za nas zrobić sam ZX81 BASIC. Jeśli w programie przypisujemy jakąś wartość zmiennej, to w zmiennej systemowej DEST (4012h - 16402) BASIC umieszcza adres obszaru tej zmiennej. Zatem można posłużyć się takim oto kodem:

...
nnnn     LET A$(1)=A$(1)
nnnn+1 RAND USR (PEEK 16402+256*PEEK 16403)
...

Ważne jest jedynie to, aby pomiędzy wierszem nnnn a wierszem nnn+1 nie występowało żadne inne przypisanie. Wiersz nnnn nie zmienia zawartości A$, lecz ustawia DEST na pierwszy znak w A$. Wiersz nnnn+1 odczytuje adres z DEST i wywołuje podprogram maszynowy umieszczony pod tym adresem.

 

Użycie pamięci ponad RAMTOP (poza obszarem znanej pamięci RAM)

Standardowo zmienna systemowa RAMTOP ($4004h - 16388) wskazuje adres za wykrytym obszarem RAM (dla ZX81 1K jest to 4400h - 17408, dla ZX81 16K jest to 8000h - 32768). ZX81 nawet mając do dyspozycji pamięć 56KB RAM i tak ustawia RAMTOP na 32768. Użytkownik może zmienić ten adres ręcznie wpisując nową wartość do RAMTOP, a następnie wykonując rozkaz NEW, który jest konieczny po to, aby ZX81 odpowiednio poprzenosił swoje stosy w nowe miejsce pamięci. To co znajduje się ponad RAMTOP może być użyte do dowolnych celów. Wadą takiego rozwiązania jest niezapisywanie tego obszaru przez polecenie SAVE. Również programy maszynowe nie mogą być wykonywane z obszaru ponad 32767, ponieważ w instrukcje procesora ingeruje ULA - jest to konsekwencją przyjętego w ZX81 sposobu tworzenia obrazu telewizyjnego.

Przykład:

Chcę zarezerwować 1000B RAM dla swoich potrzeb. Muszę zatem obniżyć RAMTOP z 32768 na 31768. Adres ten rozbijam na młodszy (LSB) i starszy bajt (MSB):

MSB = INT(31768/256) = 124
LSB = 31768-256*MSB =  24

Teraz wpisuję do komputera trzy polecenia:

POKE 16388,24
POKE 16389,124
NEW

Od tego momentu mam do swojej dyspozycji 1000B RAM i BASIC mi tego nie ruszy.

 

Porty I/O

Zapis danych na port FFh (lub jakikolwiek inny port)

Zapisanie jakichkolwiek danych do dowolnego portu I/O kończy okres powrotu pionowego (jest to okres, w którym strumień elektronów po narysowaniu ramki obrazu powraca z dołu ekranu do góry) i uaktywnia licznik linii LINECNTR.

 

Odczyt danych z portu FEh (lub dowolnego innego przy wyzerowanej linii A0)

Odczyt z tego portu rozpoczyna okres powrotu pionowego oraz zeruje LINECNTR. Licznik ten pozostanie zatrzymany aż do zakończenia okresu powrotu pionowego. W ZX81 dzieje się to wszystko tylko wtedy, gdy są wyłączone przerwania niemaskowane NMI.

Bit Znaczenie
0-4 bity kolumn klawiatury  (0 - klawisz wciśnięty)
5 nieużywany  
6 szybkość odświeżania obrazu  (0 - 60Hz, 1 - 50Hz)
7 wejście sygnału z magnetofonu kasetowego  (0 - brak sygnału, 1 - impuls)

Przy odczycie klawiatury jedna z górnych linii adresowych A8-A15 musi być ustawiona na 0, aby wybrać pożądany rząd klawiatury 0-7. Gdy stosowana jest instrukcja IN A,(nn), to stara zawartość rejestru A umieszczana jest w górnych bitach adresowych, a nn w dolnych bitach. Inaczej, tj. przy rozkazie IN r,(C) lub INI czy IND na magistrali adresowej mikroprocesor umieszcza zawartość pary rejestrów BC.

Matryca klawiatury ZX81
Rząd Kolumna
0 1 2 3 4
0 - A8 SHIFT     Z         X         C         V    
1 - A9     A     S D F G
2 - A10 Q W E R T
3 - A11 1 2 3 4 5
4 - A12 0 9 8 7 6
5 - A13 P O I U Y
6 - A14 NEWLINE L K J H
7 - A15 SPACJA . M N B

 

Zapis do portu FDh

Zapis dowolnych danych do tego portu wyłącza generator przerwań niemaskowanych NMI.

 

Zapis do portu FEh

Zapis dowolnych danych do tego portu włącza generator przerwań niemaskowanych NMI. Przerwania te są używane podczas okresów tworzenia pionowych marginesów obrazu w trybie SLOW do zliczania liczby narysowanych pustych linii. Również stosuje się je do wykonywania programu użytkownika w okresie oczekiwania na zakończenie rysowania linii marginesu. Dzięki generatorowi NMI ZX81 może jednocześnie wykonywać program i tworzyć obraz telewizyjny.

 

Drukarka ZX81 Printer

File:Sinclair.zx.thermal.printer.jpg

Drukarka ZX81 Printer była drukarką termiczną opracowaną w Sinclair Research dla komputerów ZX80 i ZX81. Wypuszczono ją na rynek w roku 1981. ZX81 Printer wykorzystywał specjalny 4-ro calowy papier pokryty warstwą aluminium, na której drukowała głowica drukarki za pomocą wypalania prądem elektrycznym. Pozioma rozdzielczość drukarki była identyczna z rozdzielczością obrazu telewizyjnego tworzonego przez ZX81, tj. 256 pikseli lub 32 znaki - wykorzystując standardowe matryce znakowe.

Komputer ZX81 właściwie nie posiada żadnego złącza drukarkowego - podłącza się ją przy pomocy złącza krawędziowego do szyny systemowej ZX81, lecz jego BIOS udostępnia trzy polecenia w języku ZX81 BASIC - LPRINT, LLIST, COPY - które komunikują się z zewnętrzną drukarką przy pomocy poniższych portów I/O (właściwie drukarka jest adresowana linią A2):

Odczyt portu FBh - status drukarki
Bit Znaczenie
0 Bit enkodera (0=Zajęty, 1=Gotowy)
1-5 Nieużywane (zawsze ustawione na 1)
6 Wykrywanie drukarki (0=OK, 1=Brak)
7 Gotowość drukarki (0=Nie/Brak papieru, 1=Gotowa/Podłączona)

 

Zapis portu FBh - wyjście na drukarkę
Bit Znaczenie
0 Nieużywane  
1 Prędkość przesuwu papieru (0=Szybko, 1=Wolno)
2 Włączenie/wyłączenie silnika (0=Włączony, 1=Wyłączony)
3-6 Nieużywane  
7 Włączenie/wyłączenie igły (0=Wyłączona, 1=Włączona)

 

Mapa pamięci i obszar systemowy

Pamięć ZX81 składa się z następujących obszarów:

0000 - 1FFF  BIOS ROM (8 KB)
2000 - 3FFF  nieużywane
4000 - 43FF  wewnętrzna pamięć RAM (1 KB)
4000 - 7FFF  zewnętrzna pamięć RAM (16 KB)

Wewnętrzna pamięć RAM jest wyłączana (i nie można z niej korzystać), gdy zostaje podłączony moduł zewnętrznej pamięci RAM.

 

Pamięć RAM w ZX81 dzieli się w sposób następujący:

4000  Obszar systemowy (patrz poniżej)
407D  Program w języku BASIC
D_FILE  Pamięć obrazu
VARS  Pamięć zmiennych języka BASIC
E_LINE-1  Bajt 80h oznaczający koniec obszaru zmiennych
E_LINE  Bufor wejścia lub przestrzeń robocza
STKBOT  Stos kalkulatora języka BASIC
STKEND  Wolna pamięć
SP  Stos maszynowy
ERR_SP  Stos GOSUB
RAMTOP  Programy użytkownika - początek obszaru zarezerwowanej pamięci

 

Obszar systemowy ZX81:

4000 - 16384    ERR_NR     Numer błędu - 1
4001 - 16385 FLAGS  Różne znaczniki języka BASIC
    Bit 1 - Przekierowanie wyjścia na drukarkę
4002 - 16386 ERR_SP Wskaźnik szczytu stosu maszynowego / dna stosu GOSUB
4004 - 16388 RAMTOP Wskaźnik nieużywanej/wolnej pamięci - zmiana zostaje uwzględniona po rozkazie NEW.
4006 - 16390 MODE Wybiera kursor  K ,  L ,  F   lub  G .
4007 - 16391 PPC Numer wiersza ostatnio wykonanego rozkazu języka ZX81 BASIC.
 

--- Początek obszaru zapisywanego przez rozkaz SAVE ---

 

4009 - 16393 VERSN Zawiera 00h, które identyfikuje plik kasetowy programu w języku BASIC
400A - 16394 E_PPC Numer wiersza programu, który w listingu jest bieżąco oznaczony kursorem programu >.
400C - 16396 D_FILE Wskaźnik początku pamięci obrazu / końca programu w języku BASIC
400E - 16398 DF_CC Wskaźnik pozycji drukowania w buforze obrazu przez polecenie PRINT
4010 - 16400 VARS Wskaźnik początku obszaru zmiennych języka BASIC
4012 - 16402 DEST Wskaźnik obszaru zmiennej, do której są przypisywane dane
4014 - 16404 E_LINE Wskaźnik bufora wejściowego / obszaru roboczego oraz końca obszaru zapisywanego przez SAVE
4016 - 16406 CH_ADD Wskaźnik następnego znaku do zinterpretowania w programie w języku BASIC
4018 - 16408 X_PTR Wskaźnik znaku poprzedzającego symbol błędu składniowego  S  lub wskaźnik przerwanego wiersza.
401A - 16410 STKBOT Wskaźnik stosu kalkulatora języka BASIC / końca bufora wejściowego i obszaru roboczego
401C - 16412 STKEND Wskaźnik spodu stosu maszynowego / końca stosu kalkulatora
401E - 16414 BREG Rejestr B kalkulatora
401F - 16415 MEM Wskaźnik pamięci kalkulatora
4021 - 16417 - Nieużywane
4022 - 16418 DF_SZ Liczba wierszy na spodzie ekranu zarezerwowana na potrzeby edycji dla języka BASIC
4023 - 16419 S_TOP Numer pierwszego wiersza w automatycznym listingu
4025 - 16421 LAST_K Dane matrycowe odczytane z klawiatury
4027 - 16423 - Dane dla okresu likwidowania drgań styków klawiatury
4028 - 16424 MARGIN Wysokość pionowego pasa nad obrazem TV (55 linii na górze/dole dla 50Hz, 31 dla 60Hz)
4029 - 16425 NXTLIN Adres następnego do wykonania wiersza języka BASIC. Gdy program jest zatrzymany wskazuje na bajt >= 40h. W pliku kasetowym zawiera adres autostartu.
402B - 16427 OLDPPC Numer wiersza dla rozkazu CONT
402D - 16429 FLAGX Znaczniki
402E - 16430 STRLEN Długość łańcucha podczas przypisania
4030 - 16432 T_ADDR Wskaźnik następnego elementu w tablicy składniowej
4032 - 16434 SEED Ziarno generatora liczb pseudolosowych
4034 - 16436 FRAMES Licznik zliczający w dół licznik ramki obrazu TV. Bit15: 0 = PAUSE, tj. obraz jest włączony, program wstrzymany.
4036 - 16438 COORDS Współrzędna X i Y ostatnio narysowanego punktu poleceniem PLOT lub UNPLOT.
4038 - 16440 PR_CC Mniej znaczący bajt wskaźnika bufora drukarki PRBUFF.
4039 - 16441 S_POSN Współrzędne X i Y dla PRINT.
403B - 16443 CDFLAG Znaczniki
    Bit0 - naciśnięcie klawisza (0=Brak, 1=Tak)
  Bit1-5 - nieużywane
  Bit6 - żądana prędkość (lub stara prędkość podczas operacji zapisu/odczytu - kopia bitu 7)
  Bit7 - bieżąca prędkość (1=SLOW, obraz włączony, 0=FAST)
403C - 16444 PRBUFF Bufor drukarki - 32 znaki + NEWLINE.
405D - 16477 MEMBOT Standardowy obszar roboczy dla kalkulatora języka BASIC.
407B - 16507 - Nieużywane (2 bajty)

 

Echa pamięci i rozszerzenia pamięci

Pamięć RAM rozpoczyna się od adresu 4000h (16384). Pamięć RAM w obszarze od 2000 do 3FFF (8192-16383) pojawia się tylko przy zastosowaniu pamięci większej niż 48 KB.

W komputerze ZX81 dostęp do pamięci dzieli się na trzy odrębne kategorie: odczyt danych, zapis danych i odczyt kodu instrukcji maszynowej. Ten ostatni wykrywany jest przez stan linii M1 mikroprocesora Z80 i zachowuje się inaczej niż normalny odczyt danych w przypadku, gdy linia adresowa A15=1 - czyli wykonywany jest kod maszynowy z górnej połowy obszaru adresowego 8000-FFFF (32768-65535). Z uwagi na powyższe trzy kategorie w ZX81 występuje następujący podział pamięci:

Adres Kod Odczyt Zapis
0000-1FFF ROM ROM ---
2000-3FFF RAM4 RAM4 RAM4
4000-7FFF RAM1 RAM1 RAM1
8000-BFFF VRAM2 RAM2 RAM2
C000-FFFF VRAM1 RAM3 RAM3

Obszar pamięci 8000h-FFFFh nie może być wykorzystany do wykonywania programów w kodzie maszynowym - każda instrukcja mikroprocesora w tym regionie pamięci z wyzerowanym bitem 6 kodu jest traktowana przez układ ULA jako dane wideo i zostaje zamieniona na NOP. Dane wideo z obszaru C000h-FFFFh są faktycznie odczytywane przez mikroprocesor z obszaru 4000h-7FFFh - przekierowanie to wykonuje układ ULA, który zawiera dekoder adresowy. Program zapisuje dane wideo do pamięci w obszarze 4000h-7FFFh, a następnie wykonuje skok do echa bufora wideo w obszarze C000h-FFFFh.

Pamięć RAM 1KB

Standardowy komputer ZX81 zawiera tylko 1KB pamięci RAM umieszczonej w obszarze 4000h-43FFh. Jednakże standardowe sygnały wyboru RAM i ROM tworzą echa ROM w obszarach 0000h-3FFFh i 8000h-BFFFh oraz echa RAM w 4000h-7FFFh i (biorąc pod uwagę dostęp przy odczycie) w C000h-FFFFh. Płyta główna ZX81 udostępnia miejsce albo dla dwóch układów 1K × 4bit SRAM (ang. Static RAM - pamięć statyczna - ZX81 nie korzysta z pamięci dynamicznych, ponieważ wykorzystuje sygnał odświeżania do celów generacji obrazu), albo dla jednego układu 1K × 8bit SRAM (przy zwartym łączniku L1).

Pamięć RAM 2KB

Amerykański model ZX81 (zwany Timex TS1000) dostarczany był z wewnętrzną pamięcią RAM 2KB. Gniazdko dla pamięci 1K × 8bit SRAM na płycie głównej ZX81 można wykorzystać (po zwarciu łącznika L2) do zainstalowania pamięci 2K × 8bit SRAM.

Pamięć RAM 16KB

Chociaż sygnały dla wewnętrznej pamięci 1KB RAM udostępniają przestrzeń obejmującą do 16KB RAM, to rozszerzenie Memotech (nie jestem pewny co do rozszerzeń Sinclaira i innych) dostarcza własnych sygnałów wybierania ROM i RAM: w takim przypadku ROM znajduje się tylko w obszarze 0000h-1FFFh, a RAM w obszarze 4000h-7FFFh, wszystkie pozostałe obszary są nieużywane - ich odczyt zwraca wartość FFh (255). Oprócz tego odczyt kodów instrukcji z obszaru wideo C000h-FFFFh jest przekierowywany jak zwykle na obszar 4000h-7FFFh. Timex TS1500 był dostarczany z wbudowaną pamięcią 16KB RAM.

Konfiguracja 16KB RAM może być traktowana jako mniej więcej standardowa - należy pamiętać, iż opisane poniżej rozszerzenia 32KB lub więcej RAM nie stały się zbytnio popularne, głównie z powodu ich ceny oraz nadejścia następcy ZX81 - komputera ZX-Scpectrum, który udostępniał dużo większe możliwości - kolor, dźwięk, szybkość, ulepszoną komunikację z magnetofonem itd. Z tego powodu programy, które wymagają większej ilości pamięci, nie będą pracowały na większości komputerów ZX81 - z drugiej strony mamy jednak dzisiaj dostęp do emulatorów, np. nasz VB81, który posiada 48KB RAM z możliwością rozszerzenia do 56KB.

Pamięć RAM 32KB

Pamięć RAM zajmuje obszar 4000h-BFFFh (16384-49151), gdzie górna połowa może zostać wykorzystana do przechowywania danych lub do tworzenia obrazu TV, lecz nie do umieszczania w niej kodu maszynowego mikroprocesora Z80. Zwróć uwagę, iż systemowe wykrywanie pamięci zawsze zatrzymuje się na adresie 8000h (32768) i BIOS wykryje maksimum 16KB RAM ustawiając rejestr stosu SP na adres 8000h. Zatem załadowanie dużego pliku z kasety spowoduje nadpisanie stosu. Z tego powodu, jeśli wykorzystuje się więcej niż 16KB RAM, to należy ręcznie zmienić zawartość zmiennej systemowej RAMTOP za pomocą instrukcji POKE, a następnie zastosować NEW (lub przesunąć stos pod nowy adres przy pomocy krótkiego programu w języku maszynowym). Należy przy tym zadbać, aby bufor obrazu TV nie przekraczał granicy 7FFFh/8000h. Dane wideo pod adresem 7FFFh są wykonywane pod FFFFh. Dlatego następnym adresem będzie 0000h w ROM zamiast 8000h! Bufor wideo może być umieszczony tylko w jednym bloku 16KB - nigdy w obu.

Pamięć RAM 48KB

Pamięć RAM zajmuje obszar 4000h-FFFFh (16384-65535) i obowiązują te same ograniczenia, co dla 32KB RAM. Pamięć w obszarze C000h-FFFFh (49152-65535) może być wykorzystana wyłącznie do przechowywania danych, a nie dla programów maszynowych oraz bufora wideo. Gdy zmieniasz wartość RAMTOP, wpisz tam wartość maksymalnie FFFFh (65535 - oba bajty równe 255) co oznacza 48KB minus jeden bajt, ponieważ pamięć video musi znajdować się poniżej adresu C000h. Również długość programu w języku BASIC jest ograniczona do mniej niż 32KB, chociaż zmienne mogą bez problemu wykorzystywać dodatkową pamięć. Niektóre rozszerzenia 16KB można łączyć z rozszerzeniami 32KB w celu otrzymania całkowitego rozszerzenia 48KB RAM.

Pamięć RAM 64KB

Chociaż rozszerzenia nazywano dumnie 64KB RAM, to większość z nich pozwalała zainstalować w systemie ZX81 tylko 56KB RAM w obszarze 2000h-FFFFh (8192-65535). RAMTOP ustawia się tak jak dla pamięci RAM 48KB - na FFFFh (65535). Ponieważ podstawa pamięci RAM jest ustalona na 4000h (16384), to dodatkowej pamięci w obszarze 2000h-3FFFh (8192-16383) nie można używać w systemie interpretera języka BASIC. Oczywiście pamięć można wykorzystać do innych celów, np. do własnych znaków UDG.

 

 


   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