Zenon Rakoczy napisał:
Poniższy tekst zawiera prawie wszystkie (a na pewno wszystkie
niezbędne informacje) o cartridge'u - tym najcudowniejszym
rozszerzeniu dla Atari. Wzbogacony jest niezbędnymi schematami
ideowymi oraz opisem moich doświadczeń w projektowaniu różnorakich
cartridge'y.
1. Opis styków gniazda cartridge'a
Styki ułożone są w dwu rzędach po 15 styków w każdym. Na poniższym
schemacie przedstawiony jest widok i opis styków gniazda
cartridge’a dla Atari 800XL po rozsunięciu „klapek”:
Kolejny schemat, to widok gniazda cartridge’a komputerów serii XE.
Gniazdo widziane od strony tylnej Atari:
CCTL - sygnał sterowany przez dekoder adresowy Atari. Stan
niski informuje, że na szynie adresowej pojawił się adres strony
$D5 pamięci czyli adres z przedziału $D500-$D5FF.
RD4 - stan wyskoki informuje układ MMU o konieczności
przełączenia bloku 8kB pamięci w przestrzeni adresowej $8000-$9FFF.
Sygnał generowany jest przez układ elektroniczny cartridge’a.
RD5 - stan wykoki informuje układ MMU o konieczności
przełączenia bloku 8kB pamięci w przestrzeni adresowej $A000-$BFFF.
Sygnał generowany jest przez układ elektroniczny cartridge’a.
S4 - sygnał sterujący, przyjmuje stan niski gdy sygnał RD4=1
oraz na szynie adresowej pojawi się adres z przedziału $8000-$9FFF.
Sygnał generowany jest przez układ MMU.
S5 - sygnał sterujący, przyjmuje stan niski gdy sygnał RD5=1
oraz na szynie adresowej pojawi się adres przedziału $A000-$BFFF.
Sygnał generowany jest przez układ MMU.
F/2 - podstawowy sygnał zegarowy wyznaczający takt pracy
procesora i pozostałych układów Atari. Zbocze opadające jest
zboczem aktywnym dla operacji zapis/odczyt ustabilizowanych danych
na szynie danych. W nietypowych zastosowaniach zboczem aktywnym
jest zbocze narastające.
R/W - sygnał odczytu (R - stan wysoki ) lub zapisu (W - stan
niski) dla operacji zapis/odczyt danych, np. do rejestru
sprzętowego cartridge’a.
GND - masa, ujemny biegun zasilania.
Vcc - zasilanie +5V.
D0-D7 - szyna danych.
A0-A12 - szyna adresowa.
2. Cartridge w pamięci komputera
Dla cartridge’a przewidziano w przestrzeni adresowej pamięci
konkretne umiejscowienie. Pamięć cartridge’a stanowią dwa bloki
8kB. Pierwszy ulokowany jest w przestrzeni adresowej $8000-$9FFF,
drugi w przestrzeni adresowej $A000-$BFFF. Przełączaniem bloków
(pamięć Atari - pamięć cartridge”a) zarządza układ MMU na płycie
Atari. Dwa sygnały sterujące uaktywniają dany blok pamięci, kolejne
dwa informują układ MMU o konieczności przełączenia danego
bloku.
Cartridge w przestrzeń adresową Atari włączony może być na różne
sposoby:
- jako blok pamięci 8kB włączony w obszar $8000-$9FFF,
- jako blok pamięci 8kB włączony w obszar $A000-$BFFF,
- jako blok pamięci 16kB włączony w obszar $8000-$BFFF,
- jako blok pamięci o mniejszej pojemności w powyższych
konfiguracjach,
- cartridge może w ogóle nie zawierać pamięci. Funkcjonować może
na zasadzie użycia rejestrów sprzętowych umieszczonych na stronie
$D5xx.
Na potrzeby urządzeń podłączanych do gniazda cartridge’a wydzielona
jest strona $D5 pamięci Atari. W rozbudowanych cartridge’ach tu
umieszcza się rejestry sprzętowe służące między innymi do
przełączania bloków pamięci cartridge’a. Kilka poglądowych
schematów wyjaśnia zasadę wyżej opisaną:
Schematy zamiast potoku słów
Mamy zadanie: zaprojektować cartridge o pojemności pamięci 8kB.
Cartridge włączony ma być w przestrzeń adresową Atari $8000-$9FFF.
Podać opis schematu i zasadę działania.
Do pamięci EPROM 8kB doprowadzone są sygnały danych D0-D7, sygnały
adresowe A0-A12 oraz zasilanie Vcc, GND. Sygnał OE=0 więc z pamięci
można odczytywać dane. Sygnał RD4=1 poprzez połączenie go z Vcc.
Informuje MMU o potrzebie przełączenia pamięci w obszarze
$8000-$9FFF. Z chwilą zaadresowania obszaru $8000-9FFF sygnał S4=0
tym samym CS=0 i pamięć EPROM zostaje uaktywniona. Można odczytać
dane z zaadresowanej komórki pamięci cartridge’a.
A tak należy podłączyć pamięć według powyższych założeń, ale w
przestrzeń adresową $A000-$BFFF. Jak widać, zamiast sygnałów S4 i
RD4, użyć należy sygnałów S5 i RD5:
Powyższe rozwiązania zakładają użycie tylko jednej przestrzeni
adresowej przeznaczonej dla cartridge’a. $8000-$9FFF lub
$A000-$BFFF. Możliwe jest wykorzystanie 16kB przewidzianych dla
cartridge’a. Oto schemat z użyciem dwu pamięci, jako oddzielnych
kostek, każda po 8kB. Styki RD4, RD5 połączone są z Vcc, czyli
wymuszony jest na nich stan 1, informujący MMU o potrzebie
przełączenia pamięci w obszarach $8000-$9FFF i $A000-$BFFF. Z
chwilą zaadresowania jednego z nich, sygnał S4 lub S5 przyjmuje
wartość 0, uaktywniając odpowiednią pamięć w danym obszarze
adresowym.
Od razu rodzi się myśl, by zamiast dwu oddzielnych pamięci 8kB
zastosować jedną 16kB. Odpowiedni schemat takiego połączenia
znajduje się poniżej.
Sygnał RD4 i RD5=1, więc MMU przełączy pamięć Atari na pamięć
cartridge’a jako blok 16kB. Po zaadresowaniu $8000-$9FFF sygnał
S4=0, tym samym A13=0, wybrana jest dolna połówka 8kB pamięci
EPROM. Jednocześnie sygnał S5=1. Złożenie sygnałów S4 i S5 na
bramce AND wygeneruje na jej wyjściu zero logiczne. Tym samym
pamięć EPROM zostanie uaktywniona bo CS=0. Jeżeli zaadresowana
zostanie przestrzeń $A000-$BFFF wtedy sygnał S5=0. Ponownie
uaktywniona zostanie pamięć EPROM bo CS=0. W tym czasie sygnał
S4=1, tym samym A13=1, więc wybrana zostaje górna połówka 8kB
pamięci EPROM.
Zamiast bramki AND zastosować można bramkę diodową AND. Układ taki
stosować można jako oszczędny lub z braku miejsca na płytce
cartridge’a. Ostatecznie, dolne 8kB EPROM włączone jest pod adresy
$8000-$9FFF, górne 8kB EPROM pod adresy $A000-$BFFF.
Nagłówek cartridge'a
System operacyjny Atari pozwala uruchomić program zapisany w
pamięci cartridge’a jako BOOT. Dotyczy to gier i innych programów
użytkowych. Nagłówek to informacja dla systemu, w jaki sposób
uruchomić program. Składa się z sześciu bajtów które umieszczone
muszą być pod adresami $BFFA-$BFFF. Oznacza to, że programu
zapisanego tylko w przestrzeni $8000-$9FFF nie można uruchomić jako
BOOT. Pod wskazanymi adresami powinny znaleźć się następujące dane,
precyzujące nagłówek:
$BFFA – LSB adresu startu
programu
$BFFB – MSB adresu startu programu
$BFFC – bajt, który musi być zerem
$BFFD – bajt opcji, poszczególne bity mają znaczenie jak niżej:
- Bit 0 = 0 – Niedozwolony BOOT dla stacji dysków
- Bit 0 = 1 – BOOT dla stacji dysków może być przeprowadzony
- Bit 2 = 0 – Tylko zainicjowanie cartridge’a bez uruchamiania
programu
- Bit 2 = 1 – Inicjalizacja i start programu z cartridge’a
- Bit 7 = 0 – Jest to normalny cartridge
- Bit 7 = 1 – Jest to cartridge diagnostyczny
$BFFE – LSB adresu inicjalizacji
$BFFF – MSB adresu inicjalizacji
System Atari w czasie trwania BOOT, próbuje zainicjować cartridge
wedle procedury, której adres wskazuje nagłówek. Procedura
inicjalizacji może być lub może jej nie być. Jeżeli jest, powinna
kończyć się rozkazem RTS; jeżeli jej nie ma, adres inicjalizacji
powinien wskazywać dowolny rozkaz RTS w pamięci komputera. Aby nie
szukać RTS’a, proponuję poszerzyć wielkość nagłówka o jeden bajt
(jeżeli pozwala na to tworzone oprogramowanie). Pod adresem $BFF9
można umieścić kod ($60) RTS’a, wtedy adres inicjalizacji może
odwoływać się do niego.
Przykład budowy nagłówka cartridge’a
Cartridge nie jest diagnostycznym, więc w bajcie opcji bit D7=0.
Program główny rozpoczyna się od adresu $A000, natomiast procedura
inicjalizacji rozpoczyna się od adresu $B000. Dozwolony jest BOOT z
dysku.
$BFFA - $00… młodszy bajt adresu
startu programu głównego
$BFFB - $A0… starszy bajt adresu startu programu ($A000)
$BFFC - $00… bajt = 0, informacja dla systemu że cartridge jest w
gnieździe
$BFFD - $05… bit 0=1, dozwolony BOOT dla stacji dysków, Bit 2 =1,
inicjalizacja i start programu z cartridge’a
$BFFE - $00… młodszy bajt adresu inicjalizacji
$BFFF - $B0… starszy bajt adresu inicjalizacji ($B000)
Od adresu $A000 musi rozpoczynać się program główny umieszczony w
pamięci cartridge’a. Od adresu $B000 musi rozpoczynać się procedura
inicjalizująca, zakończona rozkazem RTS ($60). Po włączeniu
komputera, gdy cartridge jest włożony do gniazda, MMU odłączy BASIC
i w jego miejsce włączy pamięć cartridge’a. System sprawdzi czy
cartridge jest obecny w gnieździe na podstawie odczytu bajtu spod
adresu $BFFC. Następnie zainicjuje cartridge, wykona to procedura
umieszczona w pamięci cartridge’a od adresu $B000. Po jej wykonaniu
uruchomi program główny umieszczony w pamięci cartridge’a od adresu
$A000.
Jeżeli nagłówek jest tak skonstruowany, że w bajcie opcji ($BFFD)
bit D7=1, system rozpozna, że w gnieździe jest cartridge
diagnostyczny. Umieszczona w pamięci cartridge’a procedura/program
przejmuje kontrolę nad całym systemem Atari przed zainicjowaniem go
i wykonaniem pełnego BOOT. Można w ten sposób przejąć kontrolę nad
systemem Atari lub zdiagnozować go. Temat zostanie szerzej omówiony
w dalszej części dokumentacji.
Kilka pytań i odpowiedzi do omówionych zagadnień
Czy pamięć cartridge’a musi być typu EPROM?
Nie, nie musi. Może to być pamięć PROM, EEPROM, SRAM, itp. Może być
nawet pamięcią dynamiczną, tyle że zadbać należy o zaprojektowanie
mechanizmu odświeżania jej.
Czy pamięć cartridge’a musi mieć pojemność 8kB lub 16kB?
Nie, nie musi. Można zamontować pamięć o pojemności np. 2kB, 4kB
lub mniejszą 1kB. Po prostu dla pamięci o mniejszej pojemności nie
używa się wszystkich sygnałów adresowych. Dla pamięci 4kB
umieszczonej tylko w przestrzeni adresowej $8000-$9FFF nie używa
się sygnału A12. W takim wypadku dana komórka adresowana może być
dwa razy, raz jako $8000 i drugi raz jako $9000. Następuje tzw.
„zawijanie” adresów. Tak zaadresowana komórka da ten sam odczyt , a
wpis danej pod adres $9000 w rzeczywistości wykona się pod adres
$8000.
Jeżeli pamięć cartridge’a ma mniejszą pojemność niż 8kB to pod
jakimi adresami umieścić należy nagłówek dla cartridge’a?
Zawsze pod najwyższymi, według zasady opisanej wyżej. Jeżeli pamięć
ma pojemność 4kB to nagłówek umieścić należy pod adresami $FFA-$FFF
rzeczywistej pamięci. Pamięć umieszczona w cartridge’u i włożona do
gniazda znajdzie się w przestrzeni adresowej $A000-$AFFF. Nie używa
się sygnału adresowego A12, tak więc system adresy $AFFA-$AFFF
potraktuje jako $BFFA-$BFFF i po włączeniu zasilania nastąpi BOOT z
cartridge’a.
Czy pamięć cartridge’a może mieć większą pojemność niż 8kB lub
16kB?
Tak, może mieć. W takim wypadku stosuje się rejestr sprzętowy
adresujący pamięć jako bloki po 8kB lub 16kB. Można też zastosować
pojemniejszą pamięć umieszczając program czy dane tylko w
przewidzianej pojemności 8kB lub 16kB, rezygnując z pozostałej
pojemności.
Czy z poziomu BASIC’a można odczytać dane znajdujące się w
pamięci cartridge’a?
Jeżeli cartridge używa tylko pamięci w przestrzeni $8000-$9FFF to
bez problemu. Poniższa procedura odczyta 8kB danych i umieści je
jako znaki ASCII w zmiennej tekstowej A$:
10 DIM A$ (8192)
20 FOR K=0 TO 8191: A$(K+1, K+1) = CHR$ (PEEK(32768+K))
30 NEXT K
Jeżeli cartridge używa pamięci w przestrzenia $A000-$BFFF to należy
dokonać modyfikacji cartridge’a. Odciąć sygnał RD5 od styku gniazda
cartridge’a i połączyć go do styku RD4. Odciąć sygnał S5 od gniazda
cartridge’a i połączyć go do styku S4. Odczytu danych dokonać można
powyższą procedurą. Zwrócić należy uwagę na to, że dana odczytana
spod adresu $8000 w rzeczywistości znajduje się pod adresem $A000 i
tak dalej.
Jeżeli cartridge ma pojemność 16kB to odciąć należy sygnał RD5 od
gniazda cartridge’a (chodzi o to, by nie wykonał się BOOT) i
powyższą procedurą odczytać dane z przestrzeni $8000-$9FFF.
Następnie odciąć sygnał RD4 od styku gniazda i połączyć do niego
sygnał RD5. Odłączyć należy sygnały S4 i S5 od styków gniazda i
powyższe sygnały połączyć do gniazda odwrotnie. Powyższą procedurą
odczytać można dane z przestrzeni $8000-$9FFF. W rzeczywistości są
to dane z przestrzeni $A000-$BFFF.
Cartridge RAM-Cart
Odrębną grupę cartridge’a stanowią modele RAM-CART. Różnią się od
standardowych zastosowaniem pamięci SRAM oraz podtrzymaniem
bateryjnych zawartości pamięci po wyłączeniu zasilania. Niżej
zamieszczony jest schemat RAM-CARTA o pojemności 8kB. Pamięć
umieszczona jest w przestrzeni adresowej $8000-$9FFF:
Z bramek NAND zbudowany jest klasyczny układ Zapis/Odczyt
uwzględniający dla tych operacji sygnał R/W oraz F/2. Opadające
zbocze sygnału zegarowego F/2 dokonuje wpisu danej lub odczytu
danej z zaadresowanej komórki pamięci.
Bateria 3V podtrzymująca zawartość pamięci SRAM w momencie
odłączenia napięcia zasilania odseparowana jest diodą od napięcia
zasilającego Vcc. Opornik włączony pomiędzy wejście CS a zasilanie
wprowadza pamięć SRAM w stan niskiego poboru prądu, gdy odłączone
jest napięcie zasilania Vcc.
Przed włączeniem zasilania przełącznik P powinien być w pozycji B,
wtedy zablokowany jest wpis danych do pamięci SRAM. W czasie
wykonywania BOOT, MMU przełączy obszar pamięci $8000-$9FFF bo w tym
miejscu znalazła się pamięć SRAM cartridge’a (RD4=1). Sprawdzając
dostępną wielkość pamięci, system ustali że obszar pamięci
$8000-$9FFF nie jest pamięcią zapisywalną i między innymi umieści
DL (Display List) w innym miejscu. Gdy wykona się BOOT i zgłosi się
BASIC, przełącznik należy ustawić w pozycję A. Od tej pory do
pamięci SRAM (do RAM-CARTA) można wpisywać dane i odczytywać je.
Oczywiście, jeżeli dane mają być tylko odczytywane przełącznik P
może pozostać w pozycji B. Po zapisaniu danych w pamięci RAM-CARTA
a przed wyłączeniem zasilania, przełącznik P należy ustawić w
pozycji B, zabezpieczy to pamięć przed przypadkowym wpisem w
momencie wyłączenia zasilania.
Jeżeli w momencie włączenia zasilania, przełącznik P jest w pozycji
A, system w czasie wykonywania BOOT ustali, że pamięć RAM-CARTA
jest normalną pamięcią i umieści w niej DL. Zapisanie danych do
pamięci RAM-CARTA, jeżeli znajdą się w obszarze DL, spowoduje że na
ekranie pojawi się tak zwana „kaszana”. Brak DL skutkuje tym, że
ANTIC nie generuje prawidłowo obrazu, stąd wspomniany efekt
widoczny na ekranie. Można przywrócić prawidłowe ulokowanie DL
poprzez przestawienie przełącznika P w pozycję B, naciśnięcie RESET
w Atari i przestawienie przełącznika w pozycję A. DL ulokuje się
poniżej pamięci RAM-CARTA i możliwe będzie prawidłowe zapisywanie
do niego danych.
Oczywiście RAM-CART umieszczony może być w obszarze $A000-$BFFF.
Wystarczy na schemacie sygnał RD4 zamienić na RD5, a sygnał S4 na
S5. Oczywistym jest, że w momencie włączenia zasilania system
będzie próbował uruchomić RAM-CART jak normalny cartridge,
poszukując nagłówka (którego nie ma). Nastąpi zatem wykrycie błędu
i system wywoła SELF-TEST. Jeżeli aktywna jest stacja dysków to
nastąpi próba BOOT z dyskietki. Jeżeli znajduje się na niej DOS,
zostanie załadowany i uruchomiony. Z poziomu DOSa lub innego
programu przez niego uruchomionego można mieć dostęp do pamięci
RAM-CARTA na zasadach opisanych wyżej.
Rejestr sprzętowy
Projektanci Atari ustalili, że strona $D5 przeznaczona będzie do
wykorzystania przez urządzenia dołączane do gniazda cartridge’a. W
czasie normalnej pracy Atari system nie używa tej strony i 256
komórek pamięci jest po prostu odłączonych, nie ma tam nic. Odczyt
danej spod adresów $D500-$D5FF daje wartość $FF. Dzieje się tak
dlatego, że procesor odczyta daną z szyny danych, która jest w
stanie wysokiej impedancji. Jednak nie we wszystkich komputerach.
Niektóre modele komputerów nie maja zamontowanych ośmiu oporników
„podciągających” szynę danych do Vcc (zapewne ze względów
oszczędnościowych). W takich modelach odczyt spod wymienionych
adresów daje przypadkowy wynik, który zawierać się może w
przedziale $00-$FF. Poniższa procedura pozwala przetestować czy
oporniki są wmontowane czy nie.
10 FOR K=54528 TO 54528+256
20 IF PEEK(K) < 255 THEN PRINT “Brak opornikow”
30 NEXT K
Jeżeli oporników nie ma wystarczy je wlutować na szynę danych.
Osiem sztuk oporników o wartości 4k7. Każdy do jednej linii danych
D0-D7, drugie końcówki połączyć do +5V. W pewnych sytuacjach dzięki
temu uniknąć można błędnego działania niektórych cartridge,
szczególnie tych, które mają rejestr sprzętowy przewidziany do
odczytu.
W szczególności na stronie $D5 umieścić można pamięć RAM (SRAM) i
używać jej jak normalnej pamięci operacyjnej. Jednak umieszcza się
tu rejestry sprzętowe dołączanych urządzeń. Rejestr sprzętowy może
być tylko do zapisu, tylko do odczytu lub do zapisu i odczytu. Może
być rejestrem jednobitowym lub 1-8 bitowym. Część bitów może służyć
tylko do zapisu, a część tylko do odczytu. Projektanci mają tu
szerokie pole do działania. Dodatkowo, ustawienie rejestru odbywać
się może poprzez wpis do niego danej (D0-D7) lub rejestr może być
zapisywany stanem szyny adresowej A0-A15 (w większości przypadków
używa się ośmiu bitów A0-A7).
Strona $D5 pomieścić może 256 rejestrów ośmiobitowych. W większości
przypadków umieszcza się tylko jeden i w dodatku sterowany tylko
jednym bitem szyny danych np. D0. Jeżeli rejestr jest jeden,
zazwyczaj dostępny jest pod dowolnym adresem strony $D5. Niemniej,
dążyć należy do tego by każdy rejestr dostępny był tylko pod jednym
adresem, unika się wtedy kolizji w jego sterowaniu we współpracy z
innymi cartridge’ami. Na przykład współpraca cartridge’a z modułem
SpartaDOS X wymaga by rejestr miał przydzielony konkretny
adres/adresy.
Pora na praktyczne przykłady rozwiązań rejestru, który nie jest
niczym innym jak zestawem przerzutników typu D. Co nie znaczy że w
jego roli nie mogą być zastosowane inne przerzutniki, na przykład
r-s. W najprostszym przypadku rejestr może symulować bramka
NOT.
Zadania: zaprojektować rejestr sprzętowy dostępny pod dowolnym
adresem strony $D5. Rejestr ma być tylko do zapisu; zaprojektować
cartridge o pojemności pamięci 4kB z wykorzystaniem rejestru
sprzętowego.
Po włączeniu zasilania kondensator i opornik generują impuls
ujemny, który na wyjściu Q przerzutnika r-1 ustawia 1.
Zaadresowanie strony $D5 powoduje że sygnał CCTL = 0, zatem zmienia
stan przerzutnika r-s. Cykl może się powtórzyć, po wyłączeniu i
włączeniu komputera.
Tego rodzaju rejestr stosowany jest, by po uruchomieniu
oprogramowania znajdującego się w pamięci cartridge, odłączyć go,
przywracając w miejsce pamięci cartridge’a standardową pamięć Atari
(blok 8kB lub 16kB). Na schemacie cartridge’a widoczne jest
sterowanie sygnału RD5 poprzez przerzutnik r-s. Sterowanie
przerzutnika zostało zmodyfikowane poprzez dodanie przycisku P. W
czasie, gdy komputer zawiesi się lub zajdzie potrzeba ponownego
uruchomienia programu z cartridge’a, niepotrzebnym staje się
wyłączanie komputera i ponowne jego włączenie. Wystarczy nacisnąć
przycisk P, co spowoduje że sygnał RD5=1. Potem należy nacisnąć
RESET w Atari, by system rozpoznał że cartridge jest w gnieździe i
wykonał BOOT uruchamiając ponownie zawarty w nim program.
Poniżej schemat sterowania rejestrami sprzętowymi tylko do
zapisu:
Dekoder adresowy to układ 74138. Wejścia adresowe wybierają jedno z
wyjść. Wybrane wyjście przyjmuje stan 0. Zostaje uaktywnione, gdy
pojawi się sygnał zegarowy F/2, sygnał wpisu R/W=0, oraz gdy
zaadresowana zostanie strona $D5, CCTL=0. Pierwszy rejestr Q1
dostępny jest pod adresami $D500 oraz $D502. Drugi rejestr Q2
dostępny jest pod adresami $D503 oraz $D507. Pojawienie się na
szynie adresowej adresu $D500 lub $D503 powoduje, że na wyjściu Q
danego rejestru pojawia się 1. Gdy na szynie adresowej pojawi się
adres $D502 lub $D507 dany rejestr zostaje wyzerowany Q=0.
Zastosowany dekoder jest dekoderem niepełnym, więc na przykład
rejestr Q1 dostępny jest również pod adresami $D508, $D50QA i tak
dalej… To samo dotyczy drugiego rejestru.

Dekoder adresowy to układ 74138. Adresuje dwa rejestry sprzętowe
tylko do zapisu. Jeden z nich dostępny pod adresem $D500 i drugi
pod adresem $D501. Dekodowanie jest niepełne więc rejestrom
przypisanych jest po 128 adresów. Dane do wpisania do rejestrów
pobierane są z szyny danych z bitu D0.
LDA #$00
STA $D500 ; zeruje pierwszy rejestr
LDA $01
STA $D501 ; zapisuje 1 do drugiego rejestru
W tym rozwiązaniu rejestr pod adresem $D500 sterowany jest bitem
D0, natomiast rejestr pod adresem $D501 sterowany jest bitem
D1.
LDA #$00
STA $D500 ; zeruje rejestr pierwszy
LDA #$02
STA $D501 ; wpisuje 1 do rejestru drugiego
W poprzednich przykładach rejestry były jednobitowe, tu
przedstawiony jest rejestr dwubitowy, dostępny pod dowolnym adresem
strony $D5, sterowany bitami szyny danych D0 i D1.
LDA #$00
STA $D500 ; zeruje dwubitowy rejestr
LDA #$02
STA $D500 ; wpisuje do rejestru liczbę 2, rejestr pierwszy jest
zerowany, do rejestru drugiego wpisana jest jedynka
LDA #$01
STA $D550 ; inne zaadresowanie rejestru
Rejestr A jest do zapisu i odczytu, dostępny pod adresem $D500
LDA #$00
STA $D500 ; zapis (bit D0)
LDA $D500 ; odczyt (bit D0)
Rejestr B jest tylko do zapisu, dostępny pod adresem $D501
LDA #$02
STA $D501 ; zapis (bit D1)
Rejestr C jest tylko do odczytu, dostępny pod adresem $D503
LDA $D503 ; odczyt (Bit D1)
Na schemacie powyżej klasyczny dekoder adresowy sterowany jest
poprzez bity adresowe A0, A1. Sygnał R/W też pełni rolę bitu
adresowego. Zastosowane bramki buforów z wyjściami trójstanowymi
zapobiegają tworzeniu się zwarć na szynie danych. Gdy generowany
jest impuls zegarowy wpisujący daną do rejestru A lub B, wyjścia
bramek buforów są w stanie wysokiej impedancji. Z kolei gdy
dokonywany jest odczyt z rejestru, nie jest generowany impuls
zegarowy wpisujący daną do rejestru A lub B. Wpis danej do rejestru
C, który jest rejestrem tylko do odczytu, następuje przez
współpracujące urządzenie, (patrz wejścia C i D). Z tego względu,
że sygnał R/W wykorzystany jest jako bit adresowy możliwe jest
naprzemienne adresowanie rejestrów tylko do zapisu, tylko do
odczytu lub do zapisu i odczytu.
Pora na bardziej zaawansowany schemat cartridge’a o pojemności
pamięci 128kB. Pamięć podzielona jest na banki po 8kB włączane w
przestrzeń adresową $8000-$BFFF. Wybór banków dokonywany jest
poprzez rejestr sprzętowy posiadający dekoder adresowy który
pozwala zaadresować rejestr tylko jednym adresem (tu: $D5FF).
Rejestr jest do zapisu i odczytu. Dodatkowo, można programowo
odłączyć cartridge, lub programowo go włączyć. Bitem sterującym
będzie bit D7, natomiast bitami D0-D3 adresowany jest wybrany
bank... Zastosowana pamięć jest typu SRAM, jest to zatem RAM-CART,
ale bez podtrzymywania bateryjnego jej zawartości. Rejestr
sprzętowy jest rejestrem ośmiobitowym a nieużywane bity D4-D6
sterują diodami LED by całości nadać bardziej rozrywkowy charakter.
Rejestr jest do zapisu i odczytu, z tym że w czasie odczytu bity
D4-D6 zawsze będą podawały stan zero, a bity D0-D3 i D7 aktualną
zawartość rejestru odnoszącą się do tych bitów.

Rejestr sprzętowy stanowi układ 74273 jako zespół ośmiu
przerzutników typu D. W momencie włączenia zasilania układ R,C
generuje ujemny impuls, który podany zostaje na wejście zerujące R
rejestru sprzętowego. Wyjścia rejestru przyjmują stan zera, tym
samym adresowany jest BANK-0 pamięci SRAM poprzez jej wejścia
adresowe A13-A16. Stan wyjścia Q7 rejestru sprzętowego zostaje
poprzez bramkę NOT zanegowany i steruje sygnałem RD4. Tak więc
RD4=1 i stanowi informację dla MMU by w przestrzeni adresowej
$8000-$9FFF odłączyć wewnętrzną pamięć RAM i w to miejsce włączyć
zaadresowany BANK-0 pamięci cartridge’a.
Poprzez klasyczny układ Zapis/Odczyt zbudowany na bramkach NAND
można do pamięci cartridge’a zapisywać lub odczytywać dane, w
obrębie zaadresowanego BANKU-0 o pojemności 8kB. Dekoder adresowy
dla rejestru sprzętowego to układ 7430 i 74138. Ośmiowejściowa
bramka NAND generuje na wyjściu stan zero, gdy na szynie adresowej
bity A0-A7 przyjmują wartość %11111111. Gdy na szynie adresowej
dodatkowo adresowana jest strona $D5, sygnał CCTL=0. Dane do zapisu
do rejestru pobierane są z szyny danych. Wykonanie:
LDA #%00000001
STA $D5FF
spowoduje, że na wyjściu Y0 dekodera adresowego pojawi się ujemny
impuls, którego narastające zbocze wpisze daną do rejestru
sprzętowego, adresując w tym przypadku BANK-1. Odczyt z rejestru
sprzętowego wykona proste LDA $D5FF. Ujemny impuls z wyjścia Y4
dekodera adresowego uaktywni bufor trójstanowy 74244 i dane z jego
wejść B pojawią się na wyjściach A, tym samym na szynie danych.
Jak można zauważyć, dzięki doprowadzeniu sygnału R/W (Odczyt/Zapis)
do wejścia adresowego C dekodera adresowego, zero logiczne pojawia
się na wyjściu Y0 albo na wyjściu Y4. Dzięki temu nie dochodzi do
zwarć na szynie danych w momencie odczytu lub zapisu danych do
rejestru sprzętowego. Do wyjść Q4-Q6 rejestru sprzętowego
podłączone są diody LED które można zapalać lub gasić ustawiając
lub zerując bity D4-D6 wpisywane do rejestru. Z kolei wejścia B
(B4-B6) bufora 74244 podłączone są na stałe do GND więc odczyt z
rejestru sprzętowego dla tych bitów da zawsze zero.
Cały cartridge można odłączyć programowo. Wykona to sekwencja
rozkazów:
LDA #$1xxxxxxx ;x – wartość bitu dowolna
STA $D5FF
która spowoduje że sygnał RD4=0, więc MMU włączy w obszar
$8000-$9FFF standardowy blok 8kB pamięci RAM komputera. Rejestr
sprzętowy wyposażony jest w przycisk, który w dowolnej chwili
zeruje rejestr. Zerowanie rejestru równoważne jest z ustawieniem
sygnału RD4 w stan jedynki, więc po naciśnięciu potem RESET w
Atari, system uaktywni cartridge i jego BANK-0. Czasami w tym
momencie na ekranie monitora obraz może być zakłócony, to skutek
nieprawidłowego działania DL. Naciśnięcie klawisza RESET przywróci
porządek w systemie.
Kolejna porcja pytań i odpowiedzi
Ile rejestrów sprzętowych może mieć cartridge i jak mogą być
konfigurowane?
Może ich mieć 256 i w każdym przypadku mogą to być rejestry
ośmiobitowe. Można je zaprojektować na kilka sposobów:
1 – jako rejestry tylko do zapisu
2 – jako rejestry tylko do odczytu
3 – jako rejestry do zapisu i odczytu
4 – część rejestrów jako tylko do zapisu, część tylko do odczytu a
część do zapisu i odczytu
Z kolei poszczególny rejestr może być tak zaprojektowany, że część
bitów będzie tylko do zapisu, część tylko do odczytu a część do
zapisu i odczytu
Tego typu rejestry nazwać można rejestrami o bezpośrednim dostępie,
bo zaprojektować można cartridge z większą ilością rejestrów,
wymaga to oczywiście rozbudowania elektroniki, ale jest możliwe.
Takie rejestry sterowane będą przez dodatkowy dekoder.
Ile banków pamięci może zaadresować jeden rejestr
sprzętowy?
Maksymalnie 256, jeżeli będzie to rejestr ośmiobitowy.
Jaką największą pojemność pamięci może posiadać
cartridge?
Jeżeli cartridge będzie o dosyć „strzelistej” konstrukcji, to
znaczy mieć będzie 256 rejestrów ośmiobitowych i każdy rejestr
włączać będzie 256 banki 16kB w przestrzeń $8000-$BFFF to łatwo
policzyć: 256 x 256 x 16384 = ... bajtów pamięci, czyli bardzo
dużo. Ale nic nie stoi na przeszkodzie by rejestry sprzętowe
sterujące pamięcią cartridge’a umieścić pod innymi adresami niż na
stronie $D5. Jeżeli do tego celu wykorzystana zostanie na przykład
przestrzeń adresowa $8000-$9FFF i banki będą 8kB to oczywistym
jest, że 8192 rejestry ośmiobitowe zaadresują 8192 x 256 x 8192 =
... czyli też bardzo dużo bajtów pamięci.
Wiadomo, że Atari jest komputerem ośmiobitowym. Czy istnieje
możliwość zaprojektowania rejestrów szesnastobitowych?
Jest tak możliwość. Jedną z nich jest użycie dwu rejestrów
ośmiobitowych. W pierwszym cyklu zapisuje się pierwszy rejestr, w
cyklu drugim, drugi rejestr, a ich zawartość traktuje się jako
szesnastobitową dla na przykład przetwornika cyfrowo-analogowego.
Ale można też zaprojektować jeden i tylko jeden rejestr sprzętowy
szesnastobitowy, który w jednym cyklu zostanie zapisany. Zapis jest
dwa razy szybszy od poprzedniego rozwiązania. Wadą jest, że może to
być tylko jeden rejestr umieszczony na stronie $D5, gdyż informację
ośmiu bitów przekazuje się poprzez szynę danych, a kolejnych ośmiu
poprzez szynę adresową.
Jak zaprojektować elektronikę by dekoder adresowy dla rejestru
sprzętowego adresował go tylko pod jednym adresem?
Jeżeli cartridge jest już działającym, znaczy się, jest to jakiś
standardowy cartridge zawierający w sobie jakąś grę i jego rejestr
sprzętowy może być adresowany pod dowolnym adresem strony $D5,
można w tym celu użyć ośmiu diod krzemowych + jeden opornik.
Przykład: rejestr sprzętowy ma być adresowany TYLKO adresem $D500.
Z analizy programu znajdującego się w pamięci cartridge’a wynika,
że używany jest tylko ten adres, pomimo że mógł być używany dowolny
strony $D5. Poniższy schemat podaje ewentualne, istniejące
rozwiązanie oraz sposób modyfikacji przy użyciu ośmiu diod i
opornika lub przy użyciu bramki logicznej:
Rejestr pierwszy adresowany jest dowolnym adresem strony $D5.
Rejestr drugi adresowany jest tylko adresem $D5FF. A0-A7=11111111,
diody są polaryzowane zaporowo i wejście A dekodera 74138 przyjmuje
stan wysoki poprzez opornik. Rejestr trzeci adresowany jest tylko
adresem $D500. A0-A7=00000000, i na wyjściu bramki NOR występuje
stan wysoki podawany na wejście A dekodera 74138.
Nietypowe rozwiązania
Poniżej opisane zostały niestandardowe rozwiązania stosowane w
cartridge’ach w celu zaoszczędzenia elementów elektronicznych lub
upraszczających oprogramowanie sterujące.


Układy generują kilkusekundowy dodatni impuls. Po włączeniu
zasilania, tranzystor (tranzystory) przewodzą, do linii RD4, RD5
doprowadzona jest jedynka logiczna i wykonać i może się standardowy
BOOT według nagłówka umieszczonego w pamięci cartridge’a.
Rozpoczyna się ładowanie kondensatora, które trwa kilka sekund. Gdy
napięcie na nim osiągnie odpowiednio wysoki poziom (około 3.3V dla
układu z jednym tranzystorem i około 2.6V dla układu dwu
tranzystorowego) tranzystor (tranzystory) przestają przewodzić. Na
wyjściu pojawia się logiczne zero. W tym czasie uruchomione
oprogramowanie zawarte w pamięci cartridge’a zostało zainicjowane i
pamięć cartridge’a może zostać przełączona na standardową pamięć
Atari. Jak można zauważyć, układy mogą pełnić rolę swoistego
rejestru sprzętowego, który służy do włączenia/wyłączenia pamięci
cartridge’a. Przełączenie następuje na drodze czysto
elektronicznej, a nie programowej, choć i to nie jest
wykluczone.

Powyżej model rejestru sprzętowego do zapisu i do odczytu, który
jednak działa tylko jako rejestr do zapisu. Po włączeniu napięcia
zasilania generowany jest ujemny impuls, który podany na wejście
ustawiające (S) przerzutnika typu D, wymusza na jego wyjściu Q stan
wysoki. Polecenie STA $D500 powoduje, że na wyjściu Q pojawi się
logiczne zero, natomiast LDA $D500 logiczna jedynka. W ten sposób
sterować można sygnałami RD4, RD5 przełączającymi blok pamięci
Atari – pamięć cartridge’a.


Powyższe układ mają możliwość odczytu zawartości bitu D6 po
zaadresowaniu strony $D5xx. Pierwszy, zbudowany na bramkach typu
otwarty kolektor i drugi zbudowany na standardowych bramkach, ale z
zastosowaniem diody D1 symulującej wyjście bramki NAND jako otwarty
kolektor. Jest to konieczne, aby nie dochodziło do zwarć na linii
D6 szyny danych. Kondensator C (około 470pF) dołączony do linii
CCTL opóźnia nieco ten sygnał, by układy prawidłowo działały. W
momencie odczytu (LDA $D5xx) na linii D6 pojawia zero logiczne.
Takie rozwiązanie pozwala wykryć czy cartridge jest w gnieździe.
Gdy go nie ma, odczyt powinien dać wartość $FF (patrz: opis
rejestru sprzętowego).

W celach oszczędnościowych stosować można uproszczone bramki
zbudowane z kilku diod i opornika. Układ zastępuje bramkę AND. W
momencie, gdy sygnał S4 lub S5 jest zerem, pamięć EPROM zostaje
uaktywniona poprzez swoje wejścia OE i CS. Jednocześnie sygnał S4
służy jako bit adresowy wybierający połówki pamięci EPROM.
Sytuacja, gdy zarówno S4 jak i S5 przyjmują stan niski jest
wykluczona, wynika to z zasady adresowania pamięci cartridge’a.
Jeżeli adresowana jest przestrzeń $8000-$9FFF wtedy sygnał S4 jest
zerem, pamięć EPROM staje się aktywną i jednocześnie do wejścia
adresowego A13 pamięci doprowadzone jest zero logiczne. Dolna
połówka pamięci „widoczna” jest w powyższej przestrzeni adresowej.
Jeżeli adresowana jest przestrzeń $A000-$BFFF wtedy sygnał S5 jest
zerem, pamięć EPROM staje się aktywną, ale w tym czasie sygnał S4
przyjmuje stan jedynki logicznej, zatem poprzez wejście adresowe
A13 adresowana jest górna połówka pamięci i jest ona „widoczna” w
przestrzeni adresowej $A000-$BFFF.

Ten rejestr nazwać można rejestrem szeregowym. Stanowi go licznik
binarny. Po włączeniu zasilania licznik jest zerowany i potem każde
zaadresowanie strony $D5xx poprzez STA $D5xx zwiększa jego
zawartość o jeden. Tym samym jego wyjścia Q posłużyć mogą do
adresowania banków pamięci cartridge’a, co symbolicznie zaznaczono
poprzez opis A13-A16. W czasie pracy takiego rejestru trudno
określić jaka jest jego zawartość i jaką będzie po kolejnym
zwiększeniu jego zawartości. Można wprowadzić rejestr cień w
pamięci RAM komputera, który to rejestr cień będzie przechowywał
liczbę odwołań do strony $D5xxx lub dobudować można układ odczytu
jego zawartości. Rejestr taki współpracować może z cartridge’m
zawierającym kilka gier. Po wyborze z MENU jednej z nich, program
generuje wymaganą liczbę impulsów, tym samym rejestr wskaże
właściwy bank z zawartością gry. Potem nastąpi jej
uruchomienie.

Rejestr sprzętowy sterowany bitami szyny adresowej. Jak można
zauważyć, wpis danej do rejestru następuje na narastającym zboczu
sygnału zegarowego F/2. Spowodowane jest to opóźnieniami wnoszonymi
przez bramki tworzące sygnał zegarowy dla rejestru 74175.Aby
„zatrzasnąć” w rejestrze prawidłowe dane sygnał zegarowy dla
rejestru powinien nieco wcześniej „złapać” dane pojawiające się na
szynie adresowej. Tego typu rejestr zajmuje kilka adresów strony
$D5, w tym wypadku osiem (D500-D507), dodatkowo adresy się
„zawijają”. W stosunku do klasycznego rozwiązania, gdy rejestr
sterowany jest sygnałami szyny danych, ten jest szybszy, bo
wystarczy podać tylko odpowiedni adres, np. STA $D502.
Cartridge diagnostyczny
Jak nazwa wskazuje jest to cartridge służący do testów, w
szczególności do wykrycia nieprawidłowości w działaniu komputera.
Tym różni się od standardowego cartridge’a, że bajt opcji w
nagłówku ma ustawiony bit D7. Bajt opcji znajduje się pod adresem
$BFFD. W czasie wykonywania BOOT procedura reset inicjująca cały
komputer wykrywa ten fakt już w początkowej fazie, przed
zainicjowaniem jakiegokolwiek układu w komputerze. Dzięki temu,
program umieszczony w pamięci cartridge’a diagnostycznego po
przejęciu kontroli na całym komputerem „widzi” jego wnętrze w
postaci, nazwijmy to, dziewiczej. Nazwa cartridge diagnostyczny
jest nieco myląca, bo aby prawidłowo mógł wykonywać swoje funkcje
spełnionych musi być kilka warunków. Po pierwsze procesor musi być
sprawny, sprawna musi być pamięć RAM, i mówiąc szczerze, sprawne
powinny być wszystkie układy komputera, a przynajmniej ich
zdecydowana większość. Uszkodzenie jakiegokolwiek z nich zazwyczaj
powoduje zwarcie na szynie danych lub adresowej, a wtedy nie ma
mowy o uruchomieniu oprogramowania znajdującego się w pamięci
cartridge’a diagnostycznego. Więc po co taki cartridge?
Projektanci tak sobie to wymyślili, że rolą użytkownika będzie
określenie, do czego taki cartridge zostanie zaprojektowany i
użyty. Niewątpliwie, w sprawnym komputerze pozwala podglądnąć jego
wnętrze. Przemyślne oprogramowanie może kontrolować proces
zainicjowania komputera do pracy, krok po kroku, wyświetlając
wyniki testu, co jest nader pouczające dla chcących zgłębić
tajemnice Atari. No a poza tym taki cartridge, na równoprawnych
zasadach jak każdy inny wykorzystany może być do gier, umieszczenia
na nim programów narzędziowych, etc. Tak, cartridge diagnostyczny
służy do zdiagnozowania... nieuszkodzonego komputera.
Elektronika - oprogramowanie
Schemat wyjaśnia powiązania elektroniki cartridge’a z płytą
główną:
Dekoder adresowy 74138 generuje ujemny impuls, gdy na szynie
adresowej pojawi się adres strony pamięci $D5. Z jego pinu 10
wprowadzony jest sygnał CCTL. Do MMU do pinów 7 i 8 dochodzą
sygnały RD4 i RD5 informujące o potrzebie przełączenia bloków
pamięci w obszarach $8000-$9FFF i $A000-$BFFF. Sygnał te są
„podciągnięte” opornikami 1k do GND, zatem gdy cartridge’a nie ma w
gnieździe zarówno RD4 jak i RD5 przyjmują stan zera logicznego, co
MMU interpretuje jako "nie przełączać". Dodatkowo, sygnał RD5
doprowadzony jest do pinu 11 (T3) układu GTIA. Steruje na drodze
elektronicznej rejestrem TRIG3 o adresie $D013. Z MMU wyprowadzone
są dwa sygnały S4 i S5 informujące stanem niskim, że na szynie
adresowej pojawił się adres z zakresu $8000-9FFF lub $A00-$BFFF.
Sygnały te są aktywne tylko wtedy gdy RD4 i/lub RD5 są w stanie
wysokim.
Po uruchomieniu komputera, gdy cartridge jest w gnieździe procedura
systemowa reset ustali czy cartridge jest obecny. W tym celu
sprawdzana jest zawartość rejestru TRIG3 ($D013). Jeżeli zawiera
jedynkę, cartridge jest obecny (sygnał RD5=1) i najprawdopodobniej
można wykonać inicjowanie cartridge’a. Dodatkową informację niesie
z sobą bajt nagłówka $BFFC, który musi być zerem. Oczywiście,
dotyczy to sytuacji, gdy przełączona ma zostać przestrzeń adresowa
$A000-$BFFF. Jeżeli przełączenie ma dotyczyć TYLKO przestrzeni
adresowej $8000-$9FFF to gdy sygnał RD4=1, MMU dokona przełączenia,
a procedura reset ustali tylko wielkość dostępnej pamięci RAM i na
tej podstawie ewentualnie dokona odpowiednich ustawień, na przykład
wpisze do odpowiednich rejestrów adres DL, gdy w w/w obszarze
pamięcią jest pamięć nie zapisywalna. Jeżeli cartridge zostanie
wykryty, zostaje ustalone jaki to cartridge. Odczytany zostaje bit
D7 spod adresu $BFFD (bajt opcji nagłówka cartridge’a). Jeżeli
D7=1, cartridge jest diagnostycznym i poprzez wykonanie
bezwzględnego skoku pod adres zawarty w $BFFE, $BFFF (nagłówek
cartridge’a) nastąpi jego uruchomienie. Gdy D7=0, chodzi o
standardowy cartridge i dokonuje się dalsza inicjalizacja systemu
Atari, w tym określenie czy pamięć cartridge’a jest zapisywalną czy
nie. Po ustawieniu odpowiednich znaczników i wektorów, w tym
odłączeniu lub nie BASIC’a, następuje zainicjowanie lub nie, i
uruchomienie programu zawartego w pamięci cartridge’a.
Procedura reset oblicza miedzy innymi sumę kontrolną obszaru
pamięci $BFF0-$C0EF. Jeżeli cartridge w czasie pracy komputera (gdy
jest włączone zasilanie główne) zostanie z gniazda wyjęty lub
zamieniony na inny, to raz: procedura systemowa reset wykryje ten
fakt, ponieważ nowo obliczona suma kontrolna powyższego obszaru nie
będzie zgodna z poprzednio obliczoną i zapamiętaną (chyba że dane w
obydwu cartridge’ach będą tożsame), a dwa: w czasie inicjalizowania
systemu zawartość rejestru TRIG3 ($D013) jest kopiowana do komórki
pamięci GINTLK $03FA. Po wyjęciu cartridge’a z gniazda, najdalej po
upływie 1/50 sekundy fakt ten zostanie wykryty poprzez porównanie
zawartości TRIG3 i GINTLK które będą różne: TRIG3=0 natomiast
GINTLK=1.
Wykryte nieprawidłowości spowodują albo zawieszenie się komputera,
co tak naprawdę równoważne jest wywołaniu procedury WAIT ($C0DF),
która oczekuje na naciśnięcie klawisza RESET, albo przejście do
SELF-TEST’u, bez możliwości ponownego uruchomienia komputera, chyba
że poprzez wyłączenie i ponowne włączenie zasilania. W czasie
rozpoznawania cartridge’a niebagatelną rolę odgrywa jego nagłówek
($BFFA-$BFFF). Na jego podstawie, nie tylko cartridge zostanie
uruchomiony, dokonać się może odczyt ze stacji dysków lub
magnetofonu. Możliwa jest zatem współpraca cartridge’a ze stacją
dysków lub magnetofonem.
Gniazdo cartridge w komputerach serii
XEGS
Dwa gniazda cartridge'y w komputerach Atari
800
Na zamieszczonych schematach poglądowych można zauważyć, że rejestr
sprzętowy jest automatycznie zerowany (ustawiany). Aby wykluczyć
potrzebę wyłączania i włączania zasilania po zawieszeniu się
komputera, można do elektroniki cartridge’a dobudować przycisk,
który będzie „lokalnym resetem” dla całego systemu. Co to daje? Gdy
komputer się zawiesi lub nastąpią jakieś inne nieprawidłowości,
naciśnięcie tego przycisku a potem klawisza RESET w Atari spowoduje
ponowne prawidłowe uruchomienie cartridge’a bez potrzeby
„pstrykania” wyłącznikiem zasilania Atari, co jak wiadomo jego
zdrowiu nie służy.
Mam nadzieję ze zamieszczone tu informacje pomogą w prawidłowym
projektowaniu cartrige’a i tworzeniu dla niego oprogramowania.