Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek |
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.
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.
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:
Program w ZX81 BASIC |
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 |
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:
Program w ZX81 BASIC |
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:
Program w ZX81 BASIC |
... 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.
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:
Program w ZX81 BASIC |
POKE 16388,24 POKE 16389,124 NEW |
Od tego momentu mam do swojej dyspozycji 1000B RAM i BASIC mi tego nie ruszy.
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 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 dowolnych danych do tego portu wyłącza generator przerwań niemaskowanych NMI.
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 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) |
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) |
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.
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).
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.
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 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 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.
Chociaż rozszerzenia nazywano dumnie 64KB RAM, to większość z nich pozwalała
zainstalować w systemie ZX81 tylko 56KB RAM w obszarze 2000h-FFFFh
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 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.