- Drukuj
- 26 Jan 2023
- Technikalia
- 3313 czytań
- 0 komentarzy
Tekst został opublikowany w Zin80 #4
by Dariusz „ZX Freeq” Malczewski
czyli migracja danych z jednego nośnika na drugi, a konkretnie z taśmy na dyskietkę (i nie tylko, ale o tym później). Ta ostatnia jako nośnik i stacja FDD 3000 to mój ulubiony, nostalgiczny temat, a czas i odgłos ładowania się systemu TOS mam zakodowany we własnym DNA, dlatego postanowiłem przypomnieć temat. Przypomnieć, ponieważ w literaturze z czasów minionych nie raz o tym pisano, ale jak wiemy pamięć nie odświeżana zanika, dlatego warto pochylić się nad tematem.
Zaczniemy od podstaw, subiektywnie optymalnych rozwiązań i najczęściej używanych opcji, nie wchodząc w najdrobniejsze detale.
LEVEL 0 - INTRO
Zanim sobie coś skopiujemy na dyskietkę musimy ją sformatować poleceniem:
FORMAT *"a" TO "floppy"
lub
FORMAT *"b" TO "floppy"
Jeśli korzystamy z TOSa w wersji v.A2 i stacji 3.5’’ możemy dyskietkę sformatować wykorzystując wszystkie ścieżki:
FORMAT *"b" TO "floppy"d
dzięki czemu dyskietka typu DD (ang. double-density) pomieści aż 620 KB. Bez sufiksu „d” mamy do dyspozycji jedynie 140 KB(TOS v.A2) lub 164 KB (TOS v.A4). Dyskietki 3.5’’ typu DD odróżnimy od dyskietek HD na przykład brakiem otworu w dolnym prawym rogu.
Jeśli wszystko przebiegnie prawidłowo, po wpisaniu:
CAT *
lub
CAT *"b:"
zobaczymy zawartość (pustej póki co) dyskietki i jej etykietę.
Przeniesienie danych z taśmy na dyskietkę FDD3000 to nic innego jak postępowanie wg schematu:
- wczytaj dane z taśmy,
- w przypadku bloku BASICa dopisz gwiazdki do standardowych komend LOAD/SAVE i uzupełnij nazwy w przypadku ich braku,
- zapisz dane na dyskietkę.
Plusem stacji FDD3000 jest jej własna pamięć RAM, w której przechowywany jest system (i ewentualnie programy użytkowe). Zatem nie występuje problem z dostępem do całej pamięci RAM ZX Spectrum, w przeciwieństwie do Opus Discovery 1 lub napędu Microdrive, w przypadku których w dolnej części RAMu przechowywane są procedury do obsługi napędów. Ich nadpisanie kończy się chwilową katastrofą, aż do czasu zresetowania komputera.
LEVEL 1 – BASIC LEVEL
Zacznijmy od prostego przypadku: gra Jet-Pac fi rmy Ultimate. Wczytajmy sam loader w BASICu bez jego uruchamiania komendą:
MERGE ""
a zobaczymy, że wszystkie kawałki kodu wczytywane są z poziomu Basica, to samo tyczy się obrazka. Zatem zmieniamy wszystkie polecenia
LOAD "" SCREEN$
oraz
LOAD "" CODE
na
LOAD *"JETPAC.#" SCREEN$
oraz
LOAD *"JETPAC.#" CODE
gdzie # to kolejny numer pliku.
brazek możemy przenieść wpisując w jednej linii:
LOAD "" SCREEN$ : SAVE *"JETPAC.1" SCREEN$
Możemy tak bezpiecznie zrobić, gdyż procedura zapisu ekranu różni się od odpowiednika taśmowego: nie pojawi się pytanie o naciśnięcie klawisza, które normalnie zamazuje osiem ostatnich linii obrazu.
Kolejne kawałki kodu teoretycznie można przenieść w ten sam sposób, jednak w większości przypadków nie będziemy znali ani adresu pod który kod ma się załadować, ani jego długości. Dlatego najwygodniej skorzystać z oprogramowania, które jest dostępne w narzędziach systemu TOS.
LEVEL 2 – ZEBRA COPY LEVEL
Zebra Copy
„Zebra Copy” to jeden z dwóch dobrych programów, jakie znam, do transferu taśma - dyskietka. Program stworzony przez Kato, dostępny jest w obu wersjach TOSa, albo z poziomu menu z narzędziami, albo jako program do wczytania z dyskietki systemowej. Zebrą możemy przenosić bloki z nagłówkami lub bez, wczytywać w trybie turbo lub standardowym, największy blok może mieć długość maksymalnie 41048 bajtów, a loadery BASICowe program sam przerabia na współpracę z napędem dyskietek.
Zanim zaczniemy działać, najpierw wybieramy opcje klawiszami:
D(rive) – aby zmienić napęd docelowy z A: na B:
M(ode) – aby zmienić tryb pracy z COP (copy) na TRA (transfer), co pozwala przenosić bloki z nagłówkami i bez, ale zapisuje pliki jako TYP=3, czyli odpowiednik taśmowego CODE i upewniam się, że opcja „INS” – poprawiania loaderów, ustawiona jest na ON, a „TURBO” na OFF.
Następnie wciskam L(oad) i zaczynam kopiowanie. Po wczytaniu pierwszego bloku BASICa, program poprosi o nadanie nazwy plikom, zapisze poprawiony loader na dysk po naciśnięciu S(ave) i będzie oczekiwał na wciśnięcie PLAY w magnetofonie. Po skopiowaniu wszystkich bloków, wciskamy kilkakrotnie C(lear), aby wyczyścić pamięć i możemy przystąpić do kopiowania kolejnej gry.
LEVEL 3 – FOX MONITOR LEVEL
Fox Monitor
Teraz spróbujmy przenieść grę „Glug-Glug” fi rmy Computer Rentals Ltd. Uruchamiam Zebrę, wczytuję blok BASICa, Zebra pokazuje, że znalazła i poprawiła jedną komendę LOAD w BASICu. Kopiuję pierwszy blok. To obrazek skoro jego adres zaczyna się od 16384, ale zaraz - jest jeszcze drugi i trzeci blok, na dodatek bez nagłówka. Kopiuję wszystko pamiętając, aby wcześniej Zebrę przestawić (klawisz M) w tryb TRA, a następnie wciskam Q(uit) by wrócić do BASICa. Wczytajmy zapisany już na dyskietce loader wpisując komendę:
MERGE *"GLUGGLUG"
Loader jest krótki, zaczernia ramkę, wczytuje obraz i skacze do pamięci zaraz za ekranem + 1.
1 BORDER 0: LOAD *"GLUGGLUG.1" CODE : PRINT USR 23297
Teraz pobawmy się w detektywa. Od Zebry wiemy, że pierwszy blok zaczyna się od adresu 16384 (adres początku ekranu) i ma długość 7168 bajtów, czyli trochę więcej niż ekran: 6144 bajtów bitmapy plus 768 bajtów atrybutów. PRINT USR 23297 jest skokiem do adresu zaraz za ekranem. Zatem wczytywanie kolejnych bloków odbywa się z poziomu kodu maszynowego. Aby dokładnie obejrzeć co i gdzie jest wczytywane, posłużę się narzędziem “FOX Monitor”. Jego podstawowe zadanie, jak nazwa wskazuje, to monitor pamięci i rejestrów z możliwością ich modyfi kacji. Jego plusem jest to, że pozwala na wczytywanie i zapis danych obsługując zarówno taśmę jak i FDD3000. W wersji TOSa v.A4 FoxMon dostępny jest w każdym momencie z BASICa po wpisaniu *f, a w wersji starszej dostępny standardowo, jako program to załadowania i uruchomienia komendą LOAD *. Po uruchomieniu, wciskam SHIFT+J, aby załadować dane z dyskietki, podaję nazwę oraz adres pod który wczytuję dane oraz ich długość. W pole START wpisuję na przykład 40000 (nie chcę przecież, aby dane zamazały mi ekran), w pole LEN nie wpisuję niczego, wciskam ENTER - program odczyta wtedy cały plik. Ekran ma 6912 bajtów, zatem wciskam M i wpisuję 46912, aby zobaczyć zawartość danych pod tym właśnie adresem. FoxMon oprócz pokazywania danych liczbowych i tekstowych potrafi zdekodować „polecenia” procesora, dzięki czemu na ekranie zobaczymy prosty listing:
46912 00 NOP
46913 00 NOP
46914 00 NOP
46915 00 NOP
46916 DD21C05D LD IX,24000
46920 11322D LD DE,11570
46923 3ED9 LD A,217
46925 37 SCF
46926 CD5605 CALL 01366
46929 00 NOP
46930 00 NOP
46931 00 NOP
46932 00 NOP
46933 00 NOP
46934 C32D86 JP 34349
Wiem z Zebry, że drugi blok gry ma długość właśnie 11570 bajtów. Widać zatem, że do rejestru IX procesora ładowana jest wartość 24000 (tj. początek bloku), a do rejestru DE wartość 11570 (tj. długość bloku). CALL 01366 uruchamia procedurę zaszytej w ROM ZX Spectrum, która wczytuje dane z taśmy na podstawie informacji w powyższych rejestrach. Dalej mamy NOPy, czyli zera – tutaj procesor odpoczywa – jednak bardzo krótko, aby zaraz poleceniem JP 34349 uruchomić program pod tym właśnie adresem. Co ciekawe, ostatni blok jaki zgrałem Zebrą, 140 bajtowy, w ogóle nie jest wczytywany. Można go usunąć z dyskietki, w naszym przypadku wpisując w BASICu:
ERASE *"GLUGGLUG.3"
Pozostaje teraz z pierwszego bloku „wyciągnąć” jedynie sam obrazek:
LOAD *"GLUGGLUG.1" CODE : SAVE *"GLUGGLUG.10" CODE 16384, 6912
Dlaczego w ten sposób? Wczytując pierwszy blok pod jego oryginalny adres, czyli adres ekranu, zapis ponownie pod tą samą nazwą spowoduje wyświetlenie komunikatu
"GLUGGLUG.1 already exists.Supersede (Y/N) ?",
co zamaże nam część obrazka. Dlatego zapisuję pod inną nazwą, aby teraz poleceniami:
ERASE *"GLUGLUG.1"
oraz
LET *"GLUGGLUG.10" TO "GLUGGLUG.1"
nadać obrazkowi właściwą nazwę. Ostatnia rzecz do zrobienia to napisanie poprawnego loadera w BASICu. Wersja minimalna może wyglądać tak:
1 CLS: LOAD *"GLUGGLUG.1" SCREEN$ : LOAD *"GLUGGLUG.2" CODE 24000: RANDOMIZE USR 34349
Loader można upiększyć, ukryć ładowanie obrazka, skompresować go, jak i całość pliku binarnego, żeby zaoszczędzić miejsce na dyskietce. Dostępne w TOSie “Screen Compressor” i “File Compressor” są bardzo intuicyjne w obsłudze. Jednak, aby nie było zbyt pięknie, w naszej przygodzie mogą pojawić się strome schody. Jak bardzo strome, w dużej mierze zależy od wielkości głównego bloku i jego adresu początkowego. Może zdarzyć się, że zwykły, prosty loader BASICowy w wersji FDD zaraz po wywołaniu komendy CLEAR pokaże nam komunikat:
M RAMTOP no good, 0:1
Oznacza to, że nowa wersja komend LOAD z gwiazdkami i nazwami zajmuje zbyt dużo miejsca w przestrzeni pamięci RAM, którą chcemy ograniczyć poleceniem CLEAR. W takim wypadku trzeba skrócić nazwy plików i/lub uprościć sam loader kosztem jego „elegancji”.
Innym razem, w trakcie kopiowania głównego bloku gry, Zebra może nas zaskoczyć komunikatem „File too long” i przerwać wgrywanie. Oznacza to, że plik jest większy niż 40 KB i przenieść go nie możemy. Musimy wtedy skorzystać ze wspomnianego już Fox Monitora. Ponieważ program rezyduje w pamięci ekranu mamy do dyspozycji prawie całe 42 KB RAMu, począwszy od adresu 23296. Klawisz J – to wczytanie danych z taśmy pod wskazany adres. Po załadowaniu bloku, FoxMon pokaże ile bajtów zostało wczytanych. Przyda nam się ta informacja podczas zapisu na dyskietkę klawiszami SHIFT+S
LEVEL 4 – BONUS LEVEL
Na koniec wróćmy do XXI wieku. Zamiast stacji dyskietek wśród użytkowników królują przystawki typu DivMMC/DivIDE. Zamiast kasety, karta microSD/SD/CF, taśmę zastąpiły pliki *.TAP i *.TZX. W jaki sposób przenieść swoje stare zasoby taśmowe do współczesnych plików, zakładając że nie znajdziemy ich w sieci? W przypadku systemu Windows możemy posłużyć się dwoma programami dostępnymi bezpłatnie: “MakeTZX.exe” grupy Ramsoft lub “WAV2TZX.EXE”, za którego rozwój odpowiadają Tomaz Kac, Martijn van der Heide i Miguel Angel Rodriguez Jodar. Osobiście przerzuciłem kilkadziesiąt swoich dawnych taśm tymi programami i w ciągu niezliczonych prób wypracowałem sobie subiektywnie wygodny „workfl ow” gwarantujący wysoki stopień powodzenia.
Powyższe programy generują pliki wyjściowe z sygnału audio zapisanego w pliku PCM WAV. Najlepsze rezultaty osiągniemy, gdy w naszym pliku *.wav próbkowanie ustawimy na 44,1 kHz, rozdzielczość na 8 bitów i kanał mono. Do zgrania taśmy korzystam z opensource’owego Audacity. Po wczytaniu taśmy, dodatkowo fi ltruję sygnał i przy użyciu equalizera odcinam wszystko poniżej 400 Hz i powyżej 16 kHz. Spectrumowe szumy zapisuję do pliku *.wav w katalogu, gdzie znajduje się program maketzx.exe. Następnie z linii poleceń wpisuję:
maketzx.exe -a -ln plik.wav plik.tzx
aby wygenerować plik TZX. Jeśli przechwycony z taśmy sygnał posiada (krótkie) zaniki sygnału lub wahania głośności, używając Audacity dodatkowo wzmacniam sygnał filtrem „Wzmocnienie/Amplify” ustawiając wzmocnienie, z wyczuciem, na około +5 dB (ten etap można powtórzyć wielokrotnie, w granicach rozsądku) koniecznie z włączoną opcją „allow clipping”. Z tak wzmocnionym sygnałem maketzx radzi sobie lepiej, gdy wpiszę:
maketzx.exe -a -ln -f3 plik. wav plik.tzx
Przełącznik -ln pomijam, jeśli gra zapisana jest w systemie Speedlock lub podobnym. Alternatywnie, jeśli maketzx ma problemy z wygenerowaniem poprawnego pliku, korzystam z wav2tzx. Sposób postępowania jest analogiczny, jednak program posiada zdecydowanie więcej opcji. Wszystkie opisane są w samym programie, gdy uruchomimy go bez parametrów. Testowałem wiele ich kombinacji i do programów zapisanych w standardowej prędkości najczęściej sprawdza się taki kombajn:
wav2tzx.exe -filter -rom -alter -sync -middle plik.wav
Dodatkowo, jeśli chcę utworzyć plik TAP zamiast pliku TZX, dopisuję przełącznik -tap.
Powyższe ustawienia pozwoliły mi dotychczas zgrać praktycznie wszystkie taśmy do wersji cyfrowej (z wyjątkami, gdzie sygnał był fi zycznie nadpisany). To całkiem fajna zabawa z ustawianiem właściwych parametrów programów i fi ltrowaniem sygnału, zupełnie jak za dawnych lat, gdy ustawiało się malutkim śrubokrętem nachylenie głowicy w pożyczonym magnetofonie.
DYSKOWA ŚCIĄGAWKA
LOAD *"nazwapliku" odpowiednik taśmowego LOAD””, wczytuje plik BASICa, SCREEN$ i CODE
MERGE *”nazwapliku” jw. dla plików BASICa, bez uruchamiania, dopisuje do istniejącego listingu
SAVE *”nazwapliku” – jw. odpowiednik taśmowego zapisu
CAT * - listuje zawartość aktualnie aktywnego napędu/katalogu
CAT *”+.BAS” listuje tylko pliki z rozszerzeniem BAS
CAT *”:etykieta” wyświetla pliki z napędu o zadanej etykiecie
DIM *”folder.DIR” tworzy nowy katalog (konieczne wpisz rozszerzenie DIR)
ERASE *”nazwapliku” usuwa plik
LET *”oldnazwa” TO ”newnazwa” zmienia nazwę pliku
GO TO *”a”d ustawia aktywny napęd A:
GO TO *”folder” przechodzi do katalogu
FORMAT *”a:” TO ”etykieta” formatowanie dyskietki
Zaloguj się , żeby móc zagłosować.