Większość zainteresowanych tym problemem osób kopiowała programy za pomocą znanego programu „COPY 190” (kopiującego programy o długości do 190 bloków, dającego jednakże LOAD ERROR chociaż program działa), albo poprzez najróżniejszej maści i formatu programy SUPE-REXTRAHIPERCUDOCOPY, z reguły działające wprost odwrotnie niż po ich nazwach można by się było tego spodziewać. Bardzo rzadko udawało nam się spotkać kogoś, kto starałby się rozwiązać ów problem metodami naturalnymi czyli bez pośrednictwa wyżej wymienionych programów kopiujących. Z tego też powodu chcielibyśmy przedstawić Czytelnikom parę pomysłów i rozwiązań umożliwiających przegrywanie NIEKTÓRYCH programów dyskowych na taśmę w systemie przyspieszonego zapisu i odczytu TURBO. Dla niewtajemniczonych podajemy, że system ten pozwala na dziesięciokrotne przyspieszenie zapisu, odczytu oraz weryfikacji programów taśmowych.
W tym miejscu chcielibyśmy jednak ostudzić rozgrzane głowy wszystkich „piratów” — amatorów marzących o posiadaniu na taśmie wszystkich absolutnie programów dyskowych. Prezentowane przez nas sposoby dotyczą (jak to już wyżej zaznaczyliśmy!!!) tylko NIEKTÓRYCH programów, z reguły zresztą tych „gorszych”. Przegrywanie „Kennedy Approach” czy „Summer Games” wymaga przede wszystkim doskonałej znajomości zasad programowania w języku maszynowym i systemu operacyjnego nie mówiąc już o rozeznaniu w technikach zabezpieczania programów czy olbrzymiej ilości czasu oraz cierpliwości. Rozsądniejszym proponujemy po prostu poczekać — z reguły większość tych „lepszych” programów ukazuje się najpierw w wersji dyskowej by po jakimś czasie znaleźć się również na firmowych kasetach. Z tymi zaś potrafi już sobie dać radę nawet przedszkolak...
Drugim kubłem jeszcze zimniej-szej wody będzie spora dawka teorii o której niestety trzeba coś wiedzieć zanim przystąpi się do przegrywania. Teorię tę trzeba także ZROZUMIEĆ, gdyż w przeciwnym wypadku szkoda tylko Twojego czasu na bezowocne próby przegrywania.
Ze względu na obfitość materiału nasz artykuł podzieliliśmy na trzy części. Postaramy sie w nich omówić w miarę dokładnie i szczegółowo wszystkie te zagadnienia, których znajomość jest niezbędna do skutecznego przegrywania programów dyskowych (tylko NIEKTÓRYCH!) na taśmę. Zacznijmy więc od teorii...
Czy zastanawiałeś się kiedykolwiek drogi Czytelniku jaka jest różnica pomiędzy LOAD „PROGRAM”, 1 i LOAD „PROGRAM”, 1,1? Jeżeli nie to postaramy Ci się różnicę tę w miarę dokładnie wytłumaczyć, gdyż jest ona w istocie kolosalna. Pamięć RAM (Random Access Memory — pamięć o swobodnym dostępie) dla użytkownika zaczyna się w Commodore 64 od adresu dziesiętnego 2048 (i w normalnej konfiguracji kończy w komórce o adresie 40959 ($9FFF). Ponieważ komórka 2048 zawiera zawsze wartość 0 dla naszych celów przyjmiemy nieco inne ustawienie — od adresu 2049 ($0801) Następne 8 kb od adresu 40960 do 49151 ($A000 – $BFFF) to obszar „maskowany” przez interpreter języka BASIC — jest to pamięć dla nas niedostępna dopóki nie zostanie on wyłączony. Poprzez „maskowanie” rozumiemy tu pewien kruczek techniczny, który pokrótce postaramy się objaśnić. Otóż cały interpreter jest w rzeczywistości zawarty w pamięci ROM (Read Only Memory) czyli pamięci, którą możemy tylko „czytać” — nie możemy zaś do niej nic wpisać. W zależności od stanu mikroprocesora (ustawienia go na „czytanie” bądź „zapisywanie” danych do pamięci) możemy co prawda wpisać dane do obszaru pamięci leżącej „pod” interpreterem jednakże ze względu na konstrukcję Commodore 64 odczytać możemy jedynie interpreter. Innymi słowy chociaż wpisujemy dane do RAM odczytać możemy użytkownika B — Obszar pamięci „maskowany” przez interpreter C — Dodatkowe 4 kb pamięci RAM nieadresowanej przez BASIC jedynie ROM. Stan ten będzie trwał dopóki interpreter nie zostanie wyłączony. Odczytywanie danych jednakże będzie możliwe jedynie w języku maszynowym, gdyż po wyłączeniu interpretera BASIC nie działa. Taki stan rzeczy powinien również wyjaśnić Ci jakim cudem jest możliwe wczytanie do pamięci programu o długości np. 45 kb pomimo, że w normalnym układzie dostępne dla Ciebie jest łącznie ok. 43 kilobajtów pamięci. Podczas wczytywania programów mikroprocesor jest ustawiony na „zapis” danych do pamięci, może więc dane te wpisać do RAM leżącej pod interpreterem (adresy 40960-49151, $A000-BFFF). Skorzystanie z nich będzie jednakże możliwe dopiero po wyłączeniu interpretera, gdyż ustawienie mikroprocesora na „czytanie” spowoduje wyczytywanie danych z ROM. W praktyce wyłączanie go powoduje krótka, kilkunastobajtowa procedura umieszczona na początku programu, lecz dopiero po jego uruchomieniu, gdyż będzie on nam potrzebny do rozpoznania i wykonania instrukcji SYS uruchamiającej nasz program.
Po interpreterze i leżącej pod nim RAM do dyspozycji użytkownika pozostaje jeszcze 4 kb pamięci RAM od adresu 49152 do 53247 ($ C000-$CFFF). Obszar ten jest nieadresowai-ny przez BASIC (nie można w tym obszarze — w normalnej konfiguracji — umieścić programu napisanego w BASIC-u). Co to wszystko właściwie oznacza? Oznacza to, że BASIC może „obsłużyć” program jedynie w obszarze od adresu 2049 do 40960, w pozostałych zaś 4 kb można jedynie umieścić np. dane dla sprite'ów czy procesora muzycznego. Wyrażenie „normalna konfiguracja” oznacza, że początek pamięci RAM dla użytkownika zaczyna się w komórce o adresie 2049 i kończy w 40959. W rzeczywistości konfiguracja ta może być zmieniana w dowolny sposób, co będzie miało duże znaczenie przy omawianym przez nas temacie.
Jak Ci zapewne wiadomo, program napisany w BASIC może mieć co najwyżej 38911 bajtów długości, zaś program maszynowy nawet ponad 52 kb. Skąd ta różnica? Właśnie z wyłączonego interpretera. Po jego wyłączeniu programista zyskuje dodatkowe 8 kb pamięci co sprawia, że ma on do dyspozycji jeden ciągły blok pamięci RAM od adresu 2049 ($0801) do 53247 ($CFFF). Oczywiście obszar ten będzie musiał być obsługiwany przez język maszynowy gdyż wyłączenie interpretera powoduje wyłączenie BASIC. Co do rekonfigurowania pamięci Commodore 64 to przy minimum wprawy można dojść do zaskakujących rezultatów. Pomijając możliwość operowania dwoma całkowicie różnymi programami umieszczonymi naraz w pamięci, to można również wspomniane wyżej obszary pamięci zamieniać ze sobą. Dobrym przykładem może tu być krótki program napisany w BASIC wykorzystujący np. 35 kb pamięci do przechowywania danych dla procesora muzycznego. W takim wypadku możliwe jest umieszczenie głównego programu np. w obszarze pamięci od 49152 do 53247 ($CFFF) i danych do niego w adresach 2049-40959 ($0801-$ 9FFF). Rekonfigura-cji takiej można dokonać za pomocą czterch POKE'ów! Ale o tym za miesiąc.
Klaudiusz Dybowski, Michał Silski



