The Klątwa Set - Part I: Anatomia przeklętego zestawu
To będzie pierwsza część nieco dłuższej opowieści o kasecie dołączonej do zestawu "Klątwa". W tej części opisuję sam zestaw, problem z kompatybilnością różnych wersji software dla Turbo 2000F oraz powód, dla którego ta konkretna konfiguracja praktycznie nie miała prawa działać. W kolejnej części przejdę już do samej zawartości kasety i tego, co udało się z niej odzyskać.
Pewnie pamiętacie, jak parę postów temu opisywałem cartridge dla "Turbo 2000F" z doklejonym napisem "Klątwa". Do kompletu do tego cartridge'a był również magnetofon z przeróbką "Turbo 2000F" oraz kaseta z programami zapisanymi w Turbo 2000F, która teoretycznie powinna się wczytywać z użyciem magnetofonu oraz cartridge'a przeznaczonego dla tego systemu.
Po przywróceniu magnetofonu do życia mogłem wreszcie przetestować całą konfigurację. Naprawa objęła dołożenie brakującego kabelka SIO, wymianę wzmacniacza operacyjnego LM324, zastąpienie połamanych styków czujnikami Halla - o czym też wkrótce napiszę - wymianę kilku kondensatorów, pasków oraz licznika. Ten ostatni był połamany i wcześniej zalany czymś lepkim i żrącym.
Do przetestowania miałem więc następujący komplet:
magnetofon CA12 z Turbo 2000F,
cartridge z systemem "Turbo 2001",
kasetę z programami zapisanymi w systemie Turbo 2000F.
Teoretycznie wszystko powinno zadziałać. Przed rozpoczęciem prób na realnym sprzęcie zgrałem jednak kasetę do postaci cyfrowej, żeby mieć kopię na wypadek jakiejś nieplanowanej katastrofy - na przykład wkręcenia taśmy, gdyby CA12 postanowił zrobić sobie psikusa. :P
Już pierwsze, wstępne analizy zgranej kasety zaczęły mi dawać pewien obraz sytuacji. Powoli zaczynałem się domyślać, skąd mogła wziąć się naklejka "Klątwa". Wszystko układało się w historię tak nieprawdopodobną, że trudno uwierzyć, aby poprzedni właściciel tej kombinacji sprzętu miał aż takiego pecha przy jej kompletowaniu.
Spróbuję to wyjaśnić dość prostym językiem i w miarę zwięźle, opisując mój tok postępowania.
Zaczęło się od obserwacji przebiegu WAV zgranej kasety. Analizując fragmenty nagrań zauważyłem, że magnetofon, na którym dokonano zapisu programów, miał pewną przypadłość. Po rozpoczęciu zapisu, jeszcze w trakcie tonu synchronizującego, pojawiało się krótkie zniekształcenie sygnału - ostre zbocze słyszalne jako charakterystyczne "pyknięcie".
Samo w sobie nie musiałoby to być dużym problemem, ale tutaj pojawia się istotny szczegół: istniało kilka odmian oprogramowania dla systemu Turbo 2000F. Część z nich różniła się adresami pamięci, w których lokowały się procedury systemu - jedne wersje zajmowały niski obszar pamięci, inne umieszczały większość kodu w RAM pod OS-ROM. Istniały też odmiany z nieco zmodyfikowanymi procedurami odczytu.
Nie wnikając zbyt głęboko w szczegóły techniczne: jedne wersje procedury odczytującej dane tolerowały nagłą przerwę w tonie synchronizującym. W takiej sytuacji restartowały synchronizację i ponownie czekały na odpowiednią długość pilota. Inne wersje, gdy już rozpoznały sygnał pilotujący o odpowiedniej długości, zakładały, że po zakończeniu tonu pilota mogą pojawić się wyłącznie impulsy odpowiadające zerom i jedynkom. Impuls o innej długości powodował błąd nr 140.
Pech chciał, że wersja oprogramowania zawarta na cartridge'u "Klątwa" należy właśnie do tej drugiej grupy. To wersja, która nie toleruje przerwania tonu pilota, jeżeli wcześniej uzna, że odebrała już wystarczającą liczbę impulsów synchronizujących.
Ale to nie jedyny problem w tym wypadku. Przed dalszymi wyjaśnieniami muszę jeszcze dodać, że wersja softu z tego cartridge'a lokuje się na dole pamięci, w obszarze $0700-$199D. To za chwilę okaże się bardzo istotną częścią całej układanki.
Teraz muszę opisać kolejny klocek tej układanki. System Turbo 2000F, gdy powstawał, był w 100% zgodny - przynajmniej jeżeli mówimy o formacie zapisu danych - z "KSO Turbo 2000". KSO Turbo 2000 z kolei odziedziczyło format zapisu danych po systemie Turbo 2T06.
W dużym uproszczeniu: te systemy turbo w swoim natywnym formacie zapisywały dane w blokach po 3072 bajty. Przed każdym z takich bloków występował ton pilotujący, a następnie seria impulsów reprezentujących zera i jedynki danych zapisanych w danym rekordzie.
Z czasem ktoś zauważył, że tony synchronizujące pomiędzy kolejnymi rekordami danych zajmują sporo miejsca na taśmie. Ktoś zatem wpadł na pomysł, aby zmienić format zapisu danych tak, by pozbyć się długich "pilotów" przed każdym rekordem. W ten sposób opracowano tzw. "nowy format" zapisu danych, który miał zredukować liczbę tonów pilotujących, a tym samym jeszcze bardziej przyspieszyć wczytywanie programów.
Ten format rozwiązywał jeszcze jeden problem występujący przy klasycznym formacie zapisu danych. Chodziło o to, że przy klasycznym zapisie w blokach po 3072 bajty oprogramowanie systemu musiało mieć zarezerwowany bufor pamięci o takiej właśnie wielkości. To do niego trafiał odczytany rekord.
Po dodaniu rozmiaru kodu obsługującego cały system turbo okazywało się, że wolna pamięć dla ładowanych programów zaczynała się np. dopiero od wspomnianego wcześniej adresu $199D. Dla większości programów ładowanych z DOS-u nie był to wielki problem, bo MEMLO dla DOS-u często oscylowało na podobnym poziomie, zależnie od używanej wersji DOS-u.
Problem z tak wysokim MEMLO pojawia się natomiast w przypadku gier, które ładują się nisko do pamięci RAM. Jeżeli taka gra zajmuje obszar poniżej $199D, może po prostu zniszczyć bufor danych systemu turbo albo sam kod systemu. Loader plików binarnych nie chroni tych obszarów krytycznych - zakłada, że ładowany program nie nadpisze ani jego samego, ani buforów używanych przez system turbo.
Tutaj "nowy format" pokazuje swoją drugą zaletę. Po pierwsze nie wymaga bufora 3072 bajtów na odczytywany rekord danych, ponieważ ładuje dane bezpośrednio pod adres wskazany w nagłówku. Po drugie loader obsługujący ten format jest o wiele krótszy niż rozbudowany handler systemu Turbo, więc MEMLO dla takiego loadera może być znacznie niższe niż w przypadku używania natywnego formatu.
Pojawia się też trzeci aspekt tej sprawy: programy zapisane w takim formacie były znacznie trudniejsze do skopiowania. Jeżeli użytkownik nie dysponował programem kopiującym dedykowanym temu formatowi, nie mógł swobodnie powielić tak zapisanego programu.
Muszę przyznać, że gdy zetknąłem się z tym formatem w przeszłości, nie posiadałem ani nie znałem żadnego programu kopiującego nagrania w tym formacie. Trafiałem jednak na takie nagrania na tyle rzadko, że nie było to dla mnie dużym problemem. W dodatku pozycje, które spotykałem wtedy w tym formacie, nie były żadnymi unikatami ani nowościami, więc po prostu przechodziłem obok nich obojętnie.
W moim przypadku znacznie częściej natykałem się na programy zapisane w formacie znanym jako "Speedy 2700". Dlatego właśnie w latach 90. powstał "Anty *AJEK Copy", który zyskał drugą młodość jakiś czas temu, gdy w kolekcji uicr0Bee trafiłem na kasetę zapisaną w tym formacie.
W tamtych czasach zakładałem, że dla plików zapisanych w "new format" musi istnieć jakieś narzędzie, którym posługiwali się piraci giełdowi. Musieli przecież jakoś od czasu do czasu zapisywać niektóre programy w tym formacie, szczególnie te długie albo ładujące się na tyle nisko do pamięci RAM, że normalna odmiana systemu Turbo 2000F/2001 nie dawała rady ich załadować.
Siedząc w swojej informacyjnej bańce ograniczonej do warszawskiej giełdy na ul. Grzybowskiej i ul. Saskiej, nie byłem świadomy istnienia jakiegokolwiek programu kopiującego obsługującego "nowy format". Dopiero po latach, gdy tutaj na forum pojawił się cartridge "Turbo 2000 v.3.0" od SONIX", dowiedziałem się, że taki program jednak istniał. Dzięki uprzejmości Dely'ego, który wykonał dump cartridge'a, możemy cieszyć się kolejną ciekawostką historyczną z epoki.
Po uruchomieniu carta i wybraniu opcji "Turbo 2000F+":
/Turbo2000_v30_(sonix).png)
...możemy zobaczyć, że mamy do dyspozycji opcję "NCOPY". Okazuje się, że jest to program kopiujący umożliwiający odczyt i zapis plików w "nowym formacie".
/new_format_copy.png)
Mając już "na tapecie" wątek Turbo 2000F+, mogę wspomnieć, że przed powstaniem "new format" autorzy rozwiązań związanych z systemem Turbo 2000F wpadli wcześniej na jeszcze jeden pomysł. Chcąc rozwiązać problem gier i programów wymagających wolnej przestrzeni adresowej w niskich lokacjach pamięci, wymyślili sobie, aby umieścić kod programu obsługującego system oraz 3 kB bufor danych pod OS-ROM, czyli w wysokich lokalizacjach pamięci: $C000-$CFFF oraz $D800-$FFFF.
Na dole pamięci umieszczono jedynie niewielki zestaw procedur umożliwiających kodowi znajdującemu się pod OS-ROM korzystanie z odwołań do ROM-u. Korzystanie z procedur w OS-ROM, gdy ten jest wyłączony, bo właśnie włączyliśmy RAM w obszarze ROM-u, jest dość problematyczne. ;P
Dzięki przeniesieniu większości kodu systemu pod OS-ROM uzyskujemy bardzo niskie MEMLO. W przypadku Turbo 2000F+ znajdującego się pod OS-ROM jest to $0800, co pozwala ładować programy zajmujące dość niskie obszary pamięci.
Pojawia się jednak inny problem: programy, które podczas ładowania próbują lokować się pod OS-ROM, mogą zniszczyć system turbo albo zawartość bufora przechowującego aktualnie wczytany rekord danych.
Pierwszy system Turbo 2000F lokujący się pod OS-ROM, z którym się zetknąłem, był rozwiązaniem sygnowanym przez firmę MUEL. Nie było wtedy jednak jeszcze mowy o "new format". Sądzę, że "new format" powstał jako następny krok ewolucji systemu.
Nie mam niestety pojęcia, kto jest autorem koncepcji "nowego formatu". Jak wspominałem wcześniej, podobne podejście do ładowania danych bez podziału na bloki wprowadził *AJEK. Jeszcze wcześniejsze rozwiązania tego typu można było spotkać w czeskich systemach turbo z serii Turbo 2000.
Wasze zdziwienie może zapewne budzić fakt, że napisałem tyle tekstu i wyjaśnień o systemach turbo, ich lokowaniu się w pamięci, formatach danych itd. Miałem przecież pisać o "przeklętej kasecie". Niestety musiałem poruszyć tyle wątków pobocznych przed właściwym wyjaśnieniem problemów z tą kasetą, ponieważ wszystkie te informacje są kluczowe dla zrozumienia problemu człowieka, który próbował cokolwiek wczytać z tej kasety przy użyciu opisanego wyżej kompletu sprzętu.
Podsumujmy zatem najistotniejsze informacje:
Istniało kilka wersji oprogramowania obsługującego Turbo 2000F:
- wersje lokujące się w dolnym obszarze pamięci, z wysokim MEMLO, np. $199D,
- wersje lokujące się pod OS-ROM, z niskim MEMLO.
Istniały dwa formaty zapisu danych:
- klasyczny format zapisujący dane w blokach po 3 kB,
- "nowy format", zapisujący każdy segment pliku binarnego jako długi, ciągły blok bez podziału na rekordy danych.
I teraz rzecz dość istotna: "nowy format" wymagał specjalnego loadera umożliwiającego wczytywanie danych w tym formacie. System znajdujący się na cartridge'u nie wspierał "nowego formatu". Obsługiwał jedynie klasyczny sposób zapisu danych, czyli ten z podziałem na bloki po 3 kB.
Aby wczytać program zapisany w "nowym formacie", tuż przed właściwym programem umieszczano więc loader. Po uruchomieniu wczytywał on dalsze dane, obsługując już "nowy format".
Zakładam, że postępowano w ten sposób, aby umożliwić w przyszłości zmiany kodu loadera w razie wykrycia w nim problemów albo gdyby zaszła konieczność zmiany formatu danych. Loader zapisany przed właściwym programem na taśmie dawał pełną swobodę wyboru tego, co znajdzie się potem na taśmie. Tak samo postępowano w przypadku loaderów L1 czy L2 - nagrywano je jedynie przed programami, które tego wymagały. Zakładam, że tutaj autorowi pomysłu przyświecała podobna idea. Program ładujący dane w "nowym formacie" był po prostu zapisany jako jeden blok w standardowym formacie Turbo 2000.
I teraz zbliżamy się do momentu, w którym wszystko stanie się jasne. Tą ogromnie pokręconą drogą doszliśmy właśnie do kwestii tego loadera.
Otóż taki loader powinien być bytem niezależnym i samowystarczalnym. Jednak z jakiegoś nieznanego mi powodu twórcy loadera obsługującego "nowy format" postanowili uzależnić go od istniejącego pod spodem systemu Turbo.
Tutaj pojawiają się dwa problemy:
loader ładuje się w obszar $0806-$09EE,
w kodzie loadera są bezpośrednie odwołania do procedur konkretnej wersji systemu turbo, umieszczonych w konkretnych miejscach pamięci.
Przypomnę tylko, że system turbo w cartridge'u "Klątwa" to wersja lokująca się nisko w pamięci RAM, w obszarze $0700-$199D. Dodam również, że większość pozycji zapisanych na omawianej kasecie to gry zapisane właśnie w "nowym formacie".
I teraz możemy wreszcie połączyć kropki: jakakolwiek próba załadowania programów z tej kasety przy użyciu "Klątwa Cartridge" nie miała żadnych szans powodzenia.
Jeżeli już udało się ominąć pyknięcie w pilocie pierwszego bloku, to załadowanie bloku zawierającego loader natychmiast niszczyło system turbo znajdujący się w pamięci. Loader pakował się w obszar $0806-$09EE, nadpisując istniejący już tam kod. Nawet gdyby jakimś cudem trafił w mniej istotne fragmenty systemu, to chwilę później i tak wykonywał bezpośrednie skoki do procedur na siódmej stronie pamięci, zakładając, że zostały one dostarczone przez konkretną wersję systemu - na przykład Turbo 2000F+.
Co ciekawe, nie są to żadne rozbudowane procedury. To naprawdę dwa proste kawałki kodu odpowiedzialne za przełączanie ROM/IRQ/NMI. Gdyby zostały wbudowane bezpośrednio w loader, byłby on niezależny od systemu, z którego został załadowany.
Jedyne, co przychodzi mi do głowy, to celowe działanie autora tego loadera. Być może po prostu chciał "przywiązać" to rozwiązanie do wersji systemu, której sam używał. Jeżeli faktycznie takie było założenie, to udało mu się w 100% doprowadzić człowieka, który trafił na tę "pułapkę", do siwych włosów. ;)
Cartridge "Klątwa" nie miał nigdy realnych szans na wczytanie programów z tej kasety. Po pierwsze: pyknięcia w tonie pilota były traktowane przez soft w cartridge'u jako błąd. Po drugie: loader "nowego formatu" zawieszał cały system już w momencie ładowania go do pamięci.
Magnetofon można było zaklinać, egzorcyzmować, wymienić połowę elementów elektronicznych i mechanicznych, a i tak nic by to nie dało.
Potwierdzeniem może być fakt, że po doprowadzeniu magnetofonu do sprawności i tak nie mogłem poprawnie wczytać żadnego programu właśnie ze względu na opisane wcześniej zjawiska. Dopiero używając cartridge'a "Turbo 2000F v.3.0" od SONIX udało mi się wczytać większość programów bez większych problemów, pomijając oczywiście kwestie plików uciętych i nadpisanych na samej kasecie: eksperymenty? Testy? Bezsilność walczącego z systemem? Próby dogrywania innych programów? Tego pewnie już nigdy się nie dowiemy.
Mogę jedynie podejrzewać, że poprzedni właściciel tego kompletu - magnetofonu, cartridge'a i kasety - napotkał tak złośliwe combo, że uznał cały sprzęt za przeklęty.
Oczywiście może być też tak, że nie jest to żaden komplet, tylko przypadkowa zbieranina różnych artefaktów. Być może programów z tej kasety nikt nigdy nie próbował nawet wczytywać. Bo skąd na kasecie programy zapisane w "new format", jeżeli założymy, że użytkownik magnetofonu posiadał jedynie cartridge niewspółpracujący z tym formatem danych?
Równie dobrze każdy z tych przedmiotów może pochodzić z innego miejsca i czasu. Niemniej jednak naklejka "Klątwa" pozwala snuć różne dziwne pomysły... ;-)
Poświęciłem na to wszystko sporo czasu, mimo że tak naprawdę nie jest to już dziś szczególnie praktyczna wiedza i zapewne nikomu się bezpośrednio nie przyda. Zaintrygowało mnie to jednak na tyle, że mimo pełnej świadomości kompletnie nieuzasadnionego nakładu pracy i czasu brnąłem w ten temat jak "zaklęty". :)
Niby wystarczyło tylko zgrać kasetę i udostępnić ją na forum. Zainteresowani sami wiedzieliby, co zrobić z takim materiałem. Jednak moja wewnętrzna ciekawość oraz wspomnienia z przeszłości nie pozwoliły mi przejść obok tego tematu obojętnie.
Musieliście też długo czekać na moją dalszą aktywność w tym wątku. Mimo że to "tylko jedna kaseta", poza samą obróbką materiału, analizą kodu loadera i deasemblacją wiedziałem, że samo napisanie posta wyjaśniającego zajmie mi sporo czasu. Dlatego odkładałem ten temat, ile się dało. W końcu jednak, chcąc zrzucić kolejny temat ze swoich barków, postanowiłem się zawziąć i zacząć pisać.
Zapewne mało kto dobrnie do końca, bo to, co tu wypisuję, dla większości ludzi będzie pewnie niszowymi bredniami człowieka z epoki, w której 8-bitowy mikroprocesor był szczytem techniki. Zatem pora zakończyć już tę część. Myślę, że powstaną jeszcze dwie kolejne. W części drugiej opiszę zawartość kasety: co udało się z niej odzyskać, co było ucięte albo nadpisane i jakie niespodzianki znalazły się na taśmie. Część trzecia będzie już podsumowaniem oraz krótkim opisem tego, jak postanowiłem zdeasemblować loader i stworzyć jego poprawioną wersję - bardziej uniwersalną oraz niezależną od wersji systemu dołączonej na cartridge'u.
na zakończenie jeszcze "bohaterowie odcinka" o których mowa:

^^^ zdjęcie auorstwa uicr0Bee ^^^