FlashD0 - instrukcja użytkowania

Pojęcia. Strona - konkretny obszar pamięci wielkości 16kB określony numerem (np. 0..7). Bank - strona i jej konfiguracja, określona wartością zapisaną do portu (0..255). Sektor - najmniejszy rozmiar pamięci typu EPROM możliwy do przeprogramowania na raz.

FlashD0 to przeprogramowywalna pamięć ROM (PEROM) dla ZX Spectrum, używana zamiast oryginalnego układu PROM. W podstawowej wersji jest 128kB, widoczne jako 8 stron po 16kB. Pamięć jest dostępna pod adresami 0..16383 (#0000..#3FFF), czyli zamiast ROM ZX Spectrum. Oryginalna kość ROM jest usunięta. Strony ROM mają numery 0..7 i nazwane są ROM0..ROM7. (Proszę nie pomylić nazw stron ROM0 i ROM1 przeróbki FlashD0 z nazwami banków ROM0 i ROM1 komputera ZX Spectrum 128K.)

Dodatkowe strony ROM umożliwiają używanie ZX Spectrum z ROM zawierającym różne poprawki (np. błędów, sterownika drukarki, zestawu znaków), zainstalowanie systemów operacyjnych (ZXVGS, NeOS), umieszczenie programów w ROM (np. z cartridge dla Interface 2) oraz wykorzystanie dodatkowej pamięci na pliki możliwe do wczytania (np. PEROM-dysk pod ZXVGS - zobacz opis ROM4, symulacja Interface 1 z kasetką Microdrive).

Banki ROM można przełączać portem 208 (#D0). Adres portu został wybrany z zamiarem zachowania pewnej zgodności sprzętowej z komputerem Z88. W komputerach Timex działa to bezproblemowo. W komputerach ZX Spectrum 48K i 128K musi być zamontowana blokada portów ULA dla adresów z A2=0. (Zapewnia to np. przeróbka na 4MB RAM.) Szczegóły na temat przełączania banków są w opisie zalecanego przeznaczenia poszczególnych stron.

Fizycznie pamięć stanowi układ scalony AT29C010A. Producent zapewnia możliwość przeprogramowania układu co najmniej 10000 razy (np. każdego dnia raz przez kolejne 28 lat). Zamiast tego układu możliwe jest włożenie zwykłego EPROM o pojemności od 16kB do 128kB. Jednak ze zwykłym EPROM układ straci na funkcjonalności. Nadal będą dostępne strony (ilość uzależniona od pojemności EPROM), ale nie będzie możliwe przeprogramowywanie. Można też włożyć oryginalny PROM od ZX Spectrum.

Możliwe jest istnienie FlashD0 z 256kB PEROM (układ AT29C020A). Obsłuży on wtedy dodatkowe 8 stron o numerach 8..15 (ROM8..ROM15). W porównaniu do wersji 128kB wymaga bardziej skomplikowanej logiki i innego kodu do programowania (ma sektory po 256 bajtów).

Dostępna będzie również płytka z układem AT29C040 (512kB) montowanym powierzchniowo. W tym przypadku, dla wartości binarnej %1xxx0cba, zapisanej do portu 208 (#D0), wybierana jest strona ROM0..ROM7 (%cba=0..7, %x nieistotne). Natomiast dla wartości %1edx1cba wybierana jest strona ROM00..ROM31 (%edcba=0..31). Układ ma sektory po 512 bajtów i też wymaga innego kodu do programowania.

Zamiast układów 29C010, 29C020, 29C040 (PEROM) mogą być użyte układy 29F010, 29F020, 29F040 (Flash EEPROM). W tej sytuacji nie będzie możliwe bezpośrednie zapisywanie plików do PEROM-dysku. Sektory w tych układach mają wielkość 8kB, 16kB, 32kB lub 64kB i możliwe jest tylko jednorazowe przeprogramowywanie obszarów tej wielkości. Skutecznym rozwiązaniem może okazać się przeniesienie zawartości PEROM-dysku do RAM (z zachowaniem parametrów dysku), a następnie programowanie Flash EEPROM po zakończeniu zmian w plikach. Wymaga to odpowiedniej ilości RAM, np. rozszerzenia ZX4MB.

Uwaga! Jeśli zainstalowane jest rozszerzenie ZX4MB i nie zostanie ono zainicjowane ani przez stronę startową ROM, ani przez zewnętrzny interfejs, to wykonanie np. OUT 208,128 z BASIC może spowodować zawieszenie komputera. W takiej sytuacji należy komputer zresetować (nie wyłączać!), następnie wpisać OUT 209,21, zresetować po raz kolejny i wpisać OUT 210,18, znów zresetować i wpisać OUT 211,16. Dzięki temu w rejestrach banków będą prawidłowe wartości i wtedy wykonanie OUT 208,128 bezproblemowo przełączy z wartości domyślnych na wartości wpisane do portów.

ROM0 - podstawowy ROM ZX Spectrum

ROM0 jest tą stroną, z którą komputer budzi się po włączeniu. Jest ona przeznaczona do współpracy z zewnętrznymi interfejsami, które wykorzystują zawartość ROM ZX Spectrum (np. Interface 1, Timex Interface M-397 do Timex FDD, Plus D), albo podmieniają część ROM na własną pamięć (np. Macface 2 podmienia początkowe 2kB). Z tego powodu ROM0 powinien zawierać jak najmniej modyfikacji względem oryginalnego ROM ZX Spectrum. Możliwe jest użycie innej zawartości dla ROM0, ale należy się liczyć z problemami po podłączeniu zewnętrznych interfejsów z własną pamięcią.

Z poziomu BASIC, ROM0 może być włączony poprzez wykonanie OUT 208,128.

Obecnie dla ROM0 sugerowane są 3 poprawki. Są one opcjonalne i w razie potrzeby (tzn. zdiagnozowanej niepoprawnej pracy z jakimś interfejsem) można je usunąć, wgrywając oryginalny ROM od ZX Spectrum. (Komputery Timex wymagają ROM ze specyficzną dla siebie poprawką, która nie przeszkadza w ZX Spectrum, a jest niezbędna do prawidłowej pracy.)

Pierwsza poprawka to kod programujący strony FlashD0. Aby zaprogramować dowolną stronę, należy nową zawartość wczytać od adresu 32768 do 49149 (#8000..#BFFF) i wykonać PRINT USR 1460X. Zamiast "X" należy podać numer strony. Dla strony 5 będzie to PRINT USR 14605. Dodatkowo, jako zabezpieczenie przed przypadkowym uruchomieniem, należy zapisać wartości 255 pod adresy 16384 i 16385 (#4000 i #4001). Aby się upewnić, że poprawka jest zainstalowana, należy sprawdzić, czy pod adresami 14600..14614 (#3908..#3916) są zera, a pod adresem 14615 (#3917) jest 121 (#79).

Druga poprawka umożliwia bezpieczne przełączenie na inną stronę ROM. Należy z BASIC wykonać PRINT USR 1480X, gdzie "X" to numer strony. W zalecanej konfiguracji poprawne będą:

Uwaga! Po przełączeniu banku, wystarczy wykonać OUT 208,128, aby powrócić do ROM0. Sprawdzenie istnienia poprawki podobne jak poprzedniej - należy tylko dodać 200 do adresów.

Trzecia poprawka uruchamiana jest zaraz po włączeniu komputera. Jest umieszczona pod adresem 14560 (#38E0). Inicjuje ona rozszerzenie ZX4MB (4MB RAM), zapisując kolejno do portów 208, 209, 210 i 211 (#D0..#D3) wartości 128, 21, 18 i 16 (#80, #15, #12, #10). Odpowiada to konfiguracji startowej banków RAM dla ZX Spectrum 128K.

ROM1 - ZXROM i pułapki TR-DOS dla ZXVGS

ROM1 razem z ROM3 przeznaczone są do wykorzystania w ramach ZXVGS FD0. Zawierają one zmodyfikowany ROM ZX Spectrum, w którym wywołania RST 8 przekierowane są do ZXVGS. ROM1 różni się tym od ROM3, że w obszarze generatora znaków 15360..16383 (#3C00..#3FFF) zawiera kod przekierowujący wywołania TR-DOS (interfejsy Beta) na ZXVGS. ROM1 i ROM3 są wykorzystywane przez ZXVGS FD0, ale również mogą zostać wykorzystane przez ZXVGS 4MB. W przypadku rezygnacji z ZXVGS FD0 i po usunięciu poprawek specyficznych dla wersji FD0 - ROM1 i ROM3 mogą być używane (do obsługi pułapek TR-DOS) przez inne wersje ZXVGS, np. TMX, MB2, UPB.

ROM1 może być odłączony od ZXVGS FD0 poprzez modyfikację kodu ZXVGS. ZXVGS używać będzie wtedy wyłącznie ROM3. W tej sytuacji nie będą działać pułapki TR-DOS, a ROM1 może zależnie od potrzeb zostać przeznaczony do innych celów, np. jako PEROM-dysk (zobacz opis ROM4), albo inną wersję ZXROM.

ROM2 - kod ZXVGS FD0

ROM2 zawiera główny kod ZXVGS FD0. W przypadku rezygnacji z ZXVGS FD0, stronę tą można przeznaczyć na inną zawartość. Aby uruchomić ZXVGS FD0 (o ile aktualnie wybrany jest ROM0), należy wpisać PRINT USR 14802.

ROM3 - ZXROM dla ZXVGS

ROM3 jest razem z ROM1 wykorzystywany przez ZXVGS FD0, jako zmodyfikowany ROM dla ZX Spectrum. Zobacz opis ROM1.

ROM4 - EXROM i sterowniki dyskowe ZXVGS

Pierwsze 8kB ROM4 jest przeznaczone do użycia jako EXROM komputerów Timex 2068. Jeśli tryb 2068 nie jest używany, obszar ten pozostaje wolny dla innych celów.

W pierwszych 8kB ROM4 można umieścić PEROM-dysk dla ZXVGS. Jednak początkowe 256 bajtów (#0000..#00FF) jest zarezerwowane do obsługi przerwań. W związku z tym adresy poszczególnych sektorów są umieszczone w specjalnej tabeli. Obszar zarezerwowany dla ZXVGS w drugich 8kB ROM4 jest oznaczony w PEROM-dysku jako błędne sektory. Niezajęte obszary (zwykle 3kB) drugich 8kB mogą być przeznaczone na pliki PEROM-dysku. PEROM-dysk ma obecnie strukturę CP/M, przez co pamięć nie jest wykorzystana zbyt optymalnie.

Aby PEROM-dysk był widoczny, pod adresem 14976 (#3A80) musi być umieszczony napis "PEROM", a za nim tabela XDPB PEROM-dysku. Pod adresem 15008 (#3AA0) są bajty określające kolejne banki należące do PEROM-dysku. Z kolei pod adresem 15040 (#3AC0) umieszczona jest tabela, której kolejne 64 bajty są starszymi bajtami adresów poszczególnych sektorów (po 256 bajtów), a wartość #00 oznacza sektor niedostępny. PEROM-dysk może być kontynuowany w innych stronach (ROM5, ROM6, ROM7, opcjonalnie w ROM0..ROM3, a także ROM8..ROM15). Do PEROM-dysku można też włączyć strony używane jako alternatywny ROM, co pozwala przeprogramowywać pamięć pod ZXVGS poprzez zapis do takiego pliku. PEROM-dysk w formacie CP/M zwykle obsługuje maksymalnie 31 plików.

Drugie 8kB ROM4 jest używane przez ZXVGS FD0 do przechowywania sterowników dla interfejsów dyskowych (FDD i IDE). Wolne miejsce może być przeznaczone na powiększenie PEROM-dysku. Dla ZXVGS FD0 0.35 jest to 3.25kB pod adresami 12288..12543 (#3000..#37FF) i 15104..16383 (#3B00..#3FFF).

Poniższy przykład opisuje PEROM-dysk umieszczony w stronach ROM0..ROM7 o pojemności 128kB. Opis XDPB (27 bajtów od #3A85): ścieżka ma 32 sektory (#20 #00), jednostka alokacji to 1kB (#03 #07), jedna pozycja katalogu definiuje 16kB pliku (#00), ostatnia jednostka alokacji ma numer 127 (#7F #00), ostatnia pozycja w katalogu ma numer 31 (#1F #00), na katalog zarezerwowana jest jedna jednostka alokacji (#80 #00), nie ma sumy kontrolnej katalogu (#00 #00), nie ma ścieżek zarezerwowanych (#00 #00). Bajty poza standardowym DPB: sektor fizyczny ma długość 128 bajtów (#00 #00), są 4 strony (#03), 8 cylindrów (#08), 32 sektory na ścieżce (#20), pierwszy sektor ma numer 0 (#00), sektor ma 128 bajtów (#80 #00), 2 bajty nie używane (#00 #00), dysk typu PEROM (#1F), format nie ustalany automatycznie (#FF). Tabela banków zawiera wartości odpowiadające włączeniu stron przeznaczonych na PEROM-dysk. Tabela sektorów informuje że pierwszy sektor jest pod adresem #3B00, a 20 sektorów jest "uszkodzonych".

;tabela XDPB PEROM-dysku dla układu 29C010 (128kB)
3A80  50 45 52 4F 4D 20 00 03  07 00 7F 00 1F 00 80 00
3A90  00 00 00 00 00 00 03 08  20 00 80 00 00 00 1F FF

;banki - wartości wybierające kolejne strony PEROM-dysku
3AA0  84 85 86 87 80 81 82 83  00 00 00 00 00 00 00 00
3AB0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00

;sektory (po 256 bajtów) używane w stronie ROM4
3AC0  3B 01 02 03 04 05 06 07  08 09 0A 0B 0C 0D 0E 0F
3AD0  10 11 12 13 14 15 16 17  18 19 1A 1B 1C 1D 1E 1F
3AE0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
3AF0  30 31 32 33 34 35 36 37  00 00 00 00 3C 3D 3E 3F

Jeśli w ROM4 pliki są umieszczone na stałe i nie będą usuwane, można zastosować pewien trik dla lepszego wykorzystania miejsca. Jeśli w ostatniej jednostce alokacji pliku pozostaje wolne 256, 512 albo 768 bajtów, można odpowiadające im sektory oznaczyć jako "uszkodzone", a ze zwolnionej w ten sposób pamięci utworzyć dodatkową jednostkę alokacji w innym miejscu. Jednak usunięcie tak spreparowanego pliku spowoduje problemy z zapisem innych plików w to miejsce, z powodu "błędnych sektorów".

W ZXVGS FD0 0.35 strony ROM0, ROM1, ROM2, ROM3 są widoczne jako pliki w katalogu "15/" (USER 15): "FLASHD00.ROM", "FLASHD01.ROM", "FLASHD02.ROM", "FLASHD03.ROM", każdy wielkości 16kB. Fragmenty ROM4 używane przez ZXVGS są widoczne jako 5kB plik "FLASHD04.ROM". ROM6 i ROM7 są widoczne jako jeden plik 32kB "ZX128.ROM" w katalogu głównym (USER 0). Tylko ten plik może zostać usunięty, dając 32kB miejsca na inne pliki.

W układzie PEROM 512kB sektor fizyczny ma wielkość 512 bajtów. W związku z tym znaczenie mają tylko parzyste bajty tabeli adresów sektorów.

ROM5 - Home ROM trybu Timex 2068

ROM5 jest przeznaczony do włączenia jako Home ROM w trybie Timex 2068. Razem z pierwszymi 8kB z ROM4 umożliwia użytkowanie oprogramowania przeznaczonego na komputery Timex 2068. Tryb ten można uruchomić z ROM0 poprzez PRINT USR 14805. Uwaga! Komputer musi być wyposażony w dodatkowy multiplekser, aby tryb 2068 zadziałał!

ROM5 może również zawierać inną wersję ZXROM (np. SE BASIC lub którąś z modyfikacji, typu GOSH WONDERFUL). ROM5 można wtedy włączyć przez wykonanie z BASIC OUT 208,133. W tym przypadku pierwsze 8kB ROM4 są wolne dla innych celów niż EXROM.

ROM5 może być również użyty jako kontynuacja PEROM-dysku dla ZXVGS, zaczętego w ROM4.

FlashD0 przeznaczony dla komputerów Timex 2068 może mieć zamienione ROM0 z ROM5. To znaczy w ROM0 będzie Home ROM 2068, a w ROM5 - ZXROM. Zależy to od typu podłączanego najczęściej interfejsu, np. wymagać takiej zamiany będzie interfejs dyskietkowy Aerco FD-68 dla Timex Sinclair 2068. Po zamianie tryb 2068 może działać bez dodatkowego multipleksera, przełączając ROM0 dla Home i ROM4 dla EXROM.

ROM6 - ROM0 dla trybu BASIC 128

ROM6 razem z ROM7 mogą być używane do uruchomienia BASIC 128, który standardowo zgłaszał się w komputerach ZX Spectrum 128K. Włączenie tego trybu następuje po wykonaniu OUT 208,166, ale wykonie tego spod BASIC 48K może spowodować zawieszenie komputera. Dlatego zalecaną metodą jest użycie PRINT USR 14806 z ROM0.

W przypadku rezygnacji z trybu BASIC 128, zarówno ROM6 i ROM7 można użyć do innych celów. Jednak PRINT USR 14806 może nie uruchomić prawidłowo alternatywnego ROM umieszczonego w ROM6, ponieważ włączy możliwość przełączenia między ROM6 i ROM7 za pomocą bitu 4 w porcie 32765 (#7FFD). Zapis do tego portu wartości z ustawionym bitem 4 przełączy ROM6 na ROM7. Bezpieczniej jest użyć OUT 208,134.

ROM6 i ROM7 można również przeznaczyć na kontynuację PEROM-dysku, rozpoczętego w ROM4 (zobacz opis ROM4).

ROM7 - ROM1 dla trybu BASIC 128

Strona ta razem z ROM6 przeznaczona jest dla obsługi trybu BASIC 128 - zobacz opis ROM6. Wykonanie OUT 208,135 albo PRINT USR 14807 z ROM0 spowoduje trwałe przełączenie na ROM1 komputera ZX Spectrum 128K. ROM ten zawiera dodatkowy kod testowy, który można uruchomić po wykonaniu PRINT USR 0 i przytrzymaniu pewnych klawiszy.

W przypadku rezygnacji ze zgodności ROM z ZX Spectrum 128K, stronę tą jak również ROM6 można przeznaczyć do innych celów.

ROM8, ROM9, ROM10, ROM11, ROM12, ROM13, ROM14, ROM15

Strony FlashD0 dostępne w wersji 256kB. Przeznaczone są głównie na PEROM-dysk.

ROM00..ROM31

32 strony FlashD0 512kB dostępne po zamontowaniu płytki dodatkowej FlashD0 v201 z układem AT29C040 montowanym powierzchniowo. Dostęp do stron o numerach powyżej 7 (ROM7) uzyskuje się po ustawieniu bitu 3 w porcie 208 (#D0). Ustawienie tego bitu wyłącza dodatkowe opcje przełączania (pułapki TR-DOS i zgodność z ZX Spectrum 128K), za to umożliwia dostęp do wszystkich 32 stron.

Strony ROM08..ROM31 nie mogą być programowane, ani zostać włączone bezpośrednio poprawkami obsługującymi PRINT USR 1460X oraz PRINT USR 1480X. Poprawki te działają tylko dla ROM0..ROM7.

PEROM-dysk w formacie CP/M (pod ZXVGS) będzie miał około 456kB pojemności, jednostkę alokacji 2kB i 127 pozycji w katalogu. Dla zachowania jednostki alokacji 1kB trzeba go rozbić na 2 dyski o wielkości 256kB i 200kB. W przyszłych wersjach ZXVGS będzie możliwe korzystanie z FAT12, czyli jednostek alokacji po 512 bajtów. Jednak dyski takie nie będą dostępne spod CP/M (CPM22QED).


© 2006-04-23 Jarek Adamski