Kurs Basic’a cz. 2

Witam w drugim już odcinku „Kursu Programowania”. Najbliższą sprawą jaką się zajmiemy jest programowanie w języku Basic 2.0, czyli, takim jaki otrzymujemy tuż po włączeniu komcia. Naszą naukę postanowiłem podzielić na 4 działy, tzn:

  • zmienne i operatory – poznamy tutaj różne typy zmiennych, które będziemy używać w naszych programach, nazwy zmiennych, operatory arytmetyczne i logiczne (ten artykuł i być może kilka następnych będzie poświęcone temu działowi)

  • polecenia – w tym dziale opiszę wszystkie polecenia, które służą do edycji i pisania programów oraz ich wczytywania, uruchamiania i kasowania

  • instrukcje – opisuje słowa kluczowe, czyli rozkazy Basic’a, które występują w numerowanych liniach programu

  • funkcje – tutaj zostaną opisane funkcje arytmetyczne, łańcuchowe(stringowe) i funkcje służące do drukowania

Zmienne

Bez zbędnych ceregieli przechodzimy do omawianie zmiennych, wykorzystywanych przez komcia. C64 wykorzystuje trzy typy zmiennych, tzn.: zmiennoprzecinkowe (w których możemy przechowywać liczby rzeczywiste), całkowitoliczbowe (liczby naturalne) oraz łańcuchy (szeregi znaków alfanumerycznych).

Nazwa zmiennej musi zawsze rozpoczynać się od dowolnej litery, następnymi znakami mogą być zarówno litery jak i cyfry. Długość nazwy może być taka jaką sobie zapragnie użytkownik, ale nasz komcio rozpoznaje tylko 4 pierwsze znaki. Typ zmiennej podawany jest przy pomocy znaku, który występuje po nazwie zmiennej. I tak: zmienne całkowitoliczbowe są oznaczane znakiem procentu (%), a zmienne łańcuchowe oznacza się znakiem dolara ($).

Przykłady nazw zmiennych:

  • nazwy zmiennych typu zmiennoprzecinkowego: A, A5, BZ

  • nazwy zmiennych typu całkowitoliczbowego: A%, A5%, BZ%

  • nazwy zmiennych typu stringowego: A$, A5$, BZ$

Wszystkie wyżej wymienione typy zmiennych możemy nazwać prostymi. Oczywiście, jeśli jest coś prostego, to musi też być coś złożonego. Złożoną zmienną jest tablica lub inaczej matryca (matrix has you). Tablice są zbiorami zmiennych takiego samego typu i o takiej samej nazwie. Operacje na poszczególnych elementach tablicy realizujemy za pomocą specjalnej zmiennej nazywanej indeksem. Tablice można zdeklarować za pomocą instrukcji DIM (o której będzie jeszcze mowa). Tablica może posiadać każdy z wymienionych wyżej typów: całkowitoliczbowy, rzeczywisty i łańcuchowy. Po nadaniu nazwy tablicy musimy otworzyć nawias okrągły, zawierający liczbę lub liczby mówiące o ilości elementów tablicy. Tablice mogą być zarówno jednowymiarowe, dwu- lub nawet więcej wymiarowe. Jeśli tablica będzie miała mniej niż 11 elementów nie musimy jej deklarować instrukcją DIM. Aby obliczyć całą pojemność tablicy należy pomnożyć przez siebie wszystkie wymiary tablicy powiększone o jeden (każdy wymiar zaczyna się od elementu o indeksie 0).

Przykłady tablic:

  • DIM A(7) – tablica o 8 elementach

  • DIM A$(50) – tablica łańcuchów o 51 elementach

  • DIM PT(20,20) – dwuwymiarowa tablica o 441 elementach

I tu drobna uwaga jeśli chodzi o zmienne: w C64 występują trzy zarezerwowane nazwy zmiennych. Są to: ST, TI i TI$. ST reprezentuje zmienną stanu i zawiera, zależnie od swojej wartości, jedną z realizowanych wcześniej operacji wprowadzania lub wyprowadzania danych. Zmienia ona swoją wartość np. jeśli wystąpi błąd podczas odczytywania lub zapisywania danych na dysk lub kasetę.

Zmienna TI odlicza za pomocą wewnętrznego zegara każdą 1/60 – ą część sekundy. Podczas włączania komcia ma ona wartość zero, a jej wartość można zmienić jedynie za pomocą zmiennej TI$.

TI$ jest łańcuchem tekstowym składającym się z 6 cyfr (nie mylić ze zmiennymi rzeczywistymi lub całkowitoliczbowymi). Ta zmienna jest przez cały czas uaktualniana przez system. Dwie pierwsze cyfry określają godzinę, kolejne dwie minuty i ostatnie sekundy. Najważniejsze jest to, że tej zmiennej można przypisać dowolną wartość, a zmienna TI jest przydatna do generowania losowych liczb.

Przykład zmiennej TI$:

TI$ = „124532” – czyli godz. 12 min. 45 sek. 32

No, to już koniec jeśli chodzi o pojęcie zmiennych, co wcale nie oznacza, że to koniec w ogóle. To co napisałem należy bezwzględnie zapamiętać, aby w czasie pisania programów nie zastanawiać się jakiego typu użyć tu zmiennej.

Operatory

Nasz C64 może służyć w roli kalkulatora (cóż za niewdzięczna rola) i możemy na nim przeprowadzać całą gamę działań artymetycznych i logicznych. Na początek przedstawię operatory bez których nic nie dało by się policzyć:

  • + dodawanie

  • – odejmowanie

  • * mnożenie

  • / dzielenie

  • ^ potęgowanie

Oczywiście wszelkie działania są przeprowadzane zgodnie z regułami matematyki tzn. najpierw wykonywane jest potęgowanie, następnie mnożenie i dzielenie, a na samym końcu dodawanie i odejmowanie. Natomiast jeśli chodzi o pierwiastki, to zajmiemy się nimi odrobinę póżniej.

Dla przeprowadzania porównań używamy następujących operatorów:

  • = równy

  • < mniejszy niż

  • > większy niż

  • <= mniejszy lub równy

  • >= większy lub równy

  • różny od

Wyjaśnieniem dokładnego znaczenia tych operatorów oraz kiedy i gdzie ich używać zajmiemy się podczas pisania naszych pierwszych programów. Na koniec do przerobienia zostały nam operatory logiczne, czyli:

  • AND – operator „i” (koniunkcja logiczna) oznaczaący, że obydwa warunki muszą być spełnione równocześnie

  • OR – operator „lub” (alternatywa logiczna) oznaczające, że co najmniej jeden z warunków musi być spełniony

  • NOT – operator „nie” (zaprzeczenie logiczne) oznacz jące, że żaden z warunków nie może być spełniony

Przykłady zastosowania operatorów logicznych:

IF A=B AND C=D THEN 100 – jeśli a będzie się równało b i c będzie się równało d to skocz do linii 100

IF A=B OR C=D then 100 – jeśli a będzie się równało b lub c będzie się równało d to skocz do linii 100

I w tym miejscu pora zakończyć na razie te wypociny. Uff, trochę tego było. Next Time poznamy polecenia, które umożliwią nam rozpoczęcie pisania FIRST programów.

Kurs Basic’a cz. 1

Witam wszystkich odwiedzających C64 Power, a w szczególności tych, którzy zamierzają coś wiedzieć o programowaniu na naszym starym komodorku. Będziemy zajmować się przede wszystkim językami: Basic v.2.0 (czyli tym oryginalnym), Simon’s Basic’iem (rozszerzeniem, które ułatwia programowanie) oraz królem wszystkich języków, czyli niejakim „assemblerem”. Aby jednak poznać tajniki tego ostatniego należy przynajmniej w stopniu zaawansowanym poznać Basic. Jak napisałem wyżej poznamy również rozszerzenie Basica, które w dużej mierze eliminuje konieczność znajomości pamięci komputera firmy C=.

Niemal każdy użytkownik, po przejściu przez okres fascynacji grami komputerowymi zapragnie napisać swój własny program komputerowy. Właściciel komputera Commodore C64 może do tego celu wykorzystać wbudowany w pamięć ROM Basic v.2.0. Jednak, żeby napisać jakikolwiek program z grafiką i muzyką trzeba odwoływać się do zamotanych komend POKE i PEEK, nie mówiąc już o znajomości architektury pamięci komputera. W końcu dochodzimy do wniosku, że napisanie takowego programu przekracza nasze możliwości. Czy jest na jakaś rada ? Na razie odrzucamy możliwość programowania w assemblerze (jeszcze go nie znamy), Pascal’a musielibyśmy uczyć się, na co nie mamy ochoty ani czasu. A więc co ? Jedynym wyjściem jest skorzystanie z programów rozszerzających Basic naszego komputera. W tym artykule postaram się przedstawić najpopularniejsze odmiany języka Basic:

Drago BASIC, Fast Plot, Graph BASIC
Programy te rozwijają możliwości komputera tylko w jednym kierunku jakim jest grafika, a więc żeby wycisnąć jakiekolwiek dźwięki należy odwoływać się do komend PPOKE i PEEK. Kolejną wadą tych programów jest brak kompilatorów. Zazwyczaj pozbawione są dodatkowych komunikatów błędów i często może dojść do utraty kodu źródłowego. Zaletą tych programów jest prostota i nawet średnio zaawansowani użytkownicy mogą rozbudować interpreter tych języków.

Super BASIC
Jest to jeden z najstarszych programów rozszerzających Basic komputera. Po jego uruchomieniu ukazuje się informacja o ilości wolnego miejsca w pamięci komputera – 30719. Po wydaniu rozkazu HELP na ekranie zostanie wyświetlone 57 nowych rozkazów. Dostępne są instrukcje wspomagające pisanie i uruchamianie programów, rozkazy numeryczne. Najsłabiej rozwinięte są komendy graficzne. Nie zapomniano o nowych poleceniach dotyczących zmiennych oraz o użytkownikach drukarek.

EX BASIC Level II
Program równie stary co Super Basic, lecz dużo bardziej popularny zwłaszcza na zachodzie. Ilość rozkazów niemal pokrywa się z Super Basic’iem. Słyszałem o kompilatorze do tego języka, jednak nie miałem się jak z nim zapoznać, ponieważ nigdy nie miałem go w swoich rękach.

Simon’s BASIC
Jeden z najpopularniejszych interpreterów rozszerzających Basic komodorka. To właśnie na tym rozszerzeniu spędzimy najwięcej czasu, gdyż w łatwy sposób można w nim napisać program zarówno posiadający grafikę, jak i korzystający z możliwości SID-a, czyli układu dźwiękowego komputera. Simon’s Basic doczekał się aż trzech wersji: 1, 2 i 4. Po uruchomieniu programu do dyspozycji pozostaje nam 22527 bajtów, co podczas pisania dużych programów może być nieco kłopotliwe. Program monitora pozwala na bezpośrednie pisanie programów w kodzie maszynowym i późniejsze wykorzystanie ich z poziomu Basic’a, co umożliwia uzyskanie naprawdę czadowych efektów. Simon’s Basic posiada rozbudowane polecenia dotyczące grafiki zarówno w trybach HIRES i MultiColor, nie zapomniano o rozkazach muzycznych, które nawet pozwalają na odgrywanie melodii podczas wykonywania poszczególnych linii programu. System wyposażono również w narzędzia pozwalające na odnajdywanie błędów w programie oraz je modyfikować oraz poprawiać. Osobiście nie przypadła mi do gustu instrukcja RENUM, gdyż zmienia ona tylko numery linii, „zapominając” o przenumerowaniu parametrów przy dyrektywach GOSUB i GOTO. Simon’s Basic pozwala na pewną strukturyzację programu pochodzącą z języka PASCAL. Rozszerzono instrukcje dotyczące operacjach na zmiennych, w łatwy sposób można zarządzać sprite’ami oraz można zaprojektować swój zestaw znaków, m.in. polskie czcionki. Do tego rozszerzenie Basic’a jest dostępny również kompilator umożliwiający szybsze wykonywanie się programów.

Warsaw BASIC
Jak sama nazwa wskazuje jest produkt polskiego pochodzenia. Autorami programu są Krzysztof Gajewski i Bogusław Radziszewski. Standardowo rozszerzenie to uruchamia się z zainstalowanymi polskimi czcionkami i dysponuje dodatkowymi dwudziesto jeden rozkazami Basic’a. Warsaw Basic 2.0 Plus jest bardzo prymitywny, wydaje się mi, że jest jeszcze gorszy od Super Basic i ExBasicLevel 2. Kolejną wadą jest brak kompilatora. Za zaletę można uznać wbudowane polskie znaki oraz zbiór EXEC, który pozwala na wgranie i automatyczne uruchomienie tuż po wczytaniu się interpretera. Najlepsza jest jednak książka „Jak rozbudować interpreter?”, w której autorzy opisuję dokładnie jak napisać własny interpreter. W książce ponadto znajduje się listing programu Warsaw Basic oraz dokładna mapa pamięci Rom komputera z dokładnymi komentarzami. Kolejną wersją programu jest Warsaw Basic 3.2, który jest bardziej rozbudowany od swojego poprzednika. Po uruchomienie interpretera do dyspozycji użytkownika jest 32005 bajtów, czyli więcej niż w Simon’s Basic. Po wydaniu rozkazu HELP zostają wyświetlone wszystkie dodatkowe rozkazy. Miłym dodatkiem są programy demonstrujące możliwości Warsaw-a. Tutaj również można sobie pozwolić na pewną strukturyzację programu. WB dobrze radzi sobie nawet z grafiką trójwymiarów, nie ma kłopotów z dźwiękami. Wersja 3.2 ma wszystkie zalety wersji 2.0 (czyli polskie znaki oraz zbiór EXEC). Za wadę, w porównaniu z Simon’s Basic’iem jest brak wbudowanego monitora pamięci. Ogólnie mówiąc Warsaw Basic jest lepszy od Simon’s Basic’a, ale dyskwalifikuje go brak kompilatora. Poza tym nigdy nie spotkałem się z programem napisanym w tym języku.

SUPER EXPANDER
SuperExtender jest rozszerzeniem dostępnym na tzw. Cartridge-u, choć może istnieć jego wersja zarówno na kasecie jak i na dyskietce. Rozszerzenie to nastawione jest głównie na programowanie sprite’ów, grafiki wysokiej rozdzielczości (Hires i Multicolor). Ciekawostką jest tryb mieszany, który pozwala jednocześnie wyświetlać obraz wysokiej rozdzielczości oraz tekst. Również programowanie ruchomych obiektów jest banalnie proste za pomocą specjalnego edytora. Obsługa możliwości muzycznych pozostaje na poziomie SB. W kraju dostępna jest przeróbka programu pod nazwą SuperExtenderPlus, której autorami są twórcy WB. SEP wyposażony jest w możliwość nagrywania obrazów graficznych na nośnik zewnętrzny oraz ich ładowanie. Nie zapomniano oczywiście o wydruku ekranu graficznego na drukarce oraz o tym, że nagrane obrazki mogą być obrabiane w WB i na odwrót.

No, to na razie tyle jeśli chodzi o rozszerzenia Basic’a. W następnym odcinku zajmiemy się programowaniem w Basic 2.0, gdyż musimy opanować chociaż jego podstawy, czyli słowa kluczowe. Będziemy też pisać nasze pierwsze programy. No to nara.

Action Replay – tajemnice cartridge’a cz. 3

Jakiś czas temu (a konkretnie jeszcze przed wakacjami) ukazały się dwa artykuły o tym module. Teraz nadszedł właściwy moment, aby wykorzystać zdobytą wiedzę i spróbować zrozumieć, a potem napisać samemu swój pierwszy program do opcji PARAMETERS.

Zestaw rejestrów sterujących macie już pewnie w małym palcu, więc teraz ograniczę się tylko do rzeczy nowych (z naszego punktu widzenia). Mam również nadzieję, że zapoznaliście się również z instrukcją obsługi modułu (patrz poprzedni odcinek). Gdyż teraz będziemy zajmować się już tylko pisaniem oprogramowania dla Action Replay…

1. Frezerka

Pewno nie raz zastanawialiście się, jak to możliwe że po wciśnięciu tego przycisku – gra czy też program zostaje zatrzymany. Nie wdając się w długie i nudne wyjaśnienia, powiem tylko że odbywa się to za sprawą przerwań. Zainteresowanych zaś odsyłam do mapy pamięci Commodore 64 – do częsci poświęconej sterowaniem przestrzeni adresowej procesora 6502. Podobnie jak przerwania NMI, taki i tego nie można zablokować programowo!!! Gdyż mają one wiele wspólnego – i to na razie tyle w tym temacie… Gdyż dalsze wyjaśnienia, schodzą na zagadnienia czysto elektroniczne.

Gdy już wdusimy ten guzik, sterowanie nad dalszym przebiegiem programu aktualnie uruchomionego w pamięci C-64, przejmuje na siebie moduł Action Replay – a konkretnie jego procedury zaszyte w pamięci ROM.

Co się zaś stanie potem, to już tylko zależy od nas samych. Możemy wprowadzić modyfikacje do programu np. nieśmiertelność do gry i wiele, wiele więcej rzeczy. Nawet po pobieżnym rozważeniu potencjalnych korzyści płynących z zamrożenia programu, doznamy uczucia panowania nad bezduszną maszyną.

PowiększJeszcze jedna uwaga, odnośnie wywoływania efektu frezowania. Niestety niektóre programy czy raczej gry są zabezpieczone przed działaniem frezerki. Jak to jest możliwe ? No cóż, doświadczeni włamywacze (crackerzy) szybko dostrzegli, że po powrocie do „życia” zamrożonego programu, Action pozostawia po sobie na stosie kilka charakerystycznych bajtów $99, $a7, $02, $88, $10, $fa, $8c, $19, $d0, $ea, $86 (nie zawsze są wszystkie, ale zwykle pierwsze 8 bajtów). Co ilustruje screen obok.

Teraz wystarczy tylko aby program sprawdzał sobie co jakiś czas stos i zawiesił komputer po opuszczeniu menu frezerki. Tą właściwość mają WSZYSTKIE wersje Actiona do 4-tej włącznie… Potem firma Datel, naprawiła te rażące niedociągnięcie i kolejne modele frezowały bez śladu 🙂

2. Po sfrezowaniu

W momencie wywołaniaPowiększ tej funkcji, moduł przerywa wykonywanie aktualnie uruchomionego programu i przy pomocy specjalnych procedur w języku maszynowym (tu znajomość Basic’a jest bezużyteczna) przepisuje do swojej pamięci – we wspomniany w poprzednim odcinku bank RAM – stan wszystkich ważniejszych rejestrów i komórek pamięci komputera, by potem bez przeszkód móc wznowić wykonywanie „zamrożonego” programu.

Nie będę ponownie przynudzał, ale polecam przeanalizowanie sobie procedur obsługi frezerki przez Actiona. Możecie posłużyć się tu programikami, jakie były opublikowane w poprzednich odcinkach (zapis i odczyt pamięci modułu). Gdzie ich szukać ? Wystarczy wysilić szare komórki, przecież znacie wartości sterujące modułem – więc poszukajcie podprogramów je wykorzystujących.

Warto wiedzieć, że z tych ważniejszych danych z pamięci C-64, moduł kopiuje do swego ramu:

– pamięc ekranu z atrybutami
– stronę zerową i wektory
– adres powrotu do programu
– rejestry procesora
– i parę innych rzeczy… ale to najlepiej prześledzić samemu 🙂

Dane sfrezowanego programu, zapisywane są zawsze w ten sam obszar pamięci modułu. Więc wkładając trochę pracy w rozgryzienie tych lokacji, otrzymacie olbrzymi zastrzyk wiedzy i potencjalnych możliwości jakie teraz się przed wami otwierają.

3. Procedury do manipulacji pamięcią frezerki

Na szczęście nie musimy piPowiększsać ich od podstaw. Gdyż projektanci Actiona pozostawili do naszej dyspozycji, dwie niezwykle użyteczne procedury (które nawiasem mówiąc są wykorzystywane przez samą frezerkę).

Przedstawiam to Wam w takiej formie, gdyż w ten sposób możecie na własne oczy je zobaczyć i jednocześnie porównać ze sobą.

Nie są one zbyt skomplikowane, wręcz banalne – ale w tym tkwi ich siła. Nie sposób czegoś tu nie zrozumieć…

Procedurą JSR $02B3 – czytamy dane, a zapisujemy poprzez JSR $02A7, korzystając tylko z akumulatora i ewentualnie rejestru Y

Wszystkie programy do operowania na pamięci zamrożonego programu je wykorzystują, więc i my się nimi posłużymy już w niedalekiej przyszłości, w celu stworzenia swojego programu ładowanego przez frezerkę.

Jak się zapewne słusznie domyślacie, działają one TYLKO podczas pracy frezerki. Bowiem w tym czasie oryginalna pamięć komcia jest kopiowana do ramu Action’a, i w tych samych obszarach jest już pamięć modułu – a konkretnie frezerki. Więc aby podejrzeć co to też te procedury robią, musicie uciec się do drobnego oszustwa…

4. Na zakończenie

Niestety ponownie nie zmieściłem się z zagadnieniem pisania własnych programów do opcji parameters – ale, proszę mi wierzyć. Ta odrobina teorii którą was teraz katuje, jeszcze nie raz okaże się przydatna. Musicie przełknąć te wszystkie niuanse, aby potem bez kompleksów móc pisać w 100% własne programy.

Uczymy się wprawdzie na cudzych przykładach, ale wkrótce to WY będziecie uczyć innych – podobnie jak Ja teraz, początkujących programistów – obsługi jedynie słusznego komputera jakim jest Commodore 64. Co mi zatem pozostaje? Zapraszam więc do kolejnego odcinka…

Action Replay – tajemnice cartridge’a cz. 2

Część 2 – Instrukcja Tak, ale nie dla wszystkich 🙂

Zaszokowani? Zapewne tak. To małe z wyglądu i niepozorne czarne pudełeczko – czyli nasz moduł – kryje w sobie tak ogromny potencjał 🙂 Pora zatem, aby „niecnie” wykorzystać te możliwości, i zaprzęgnąć te niewidoczne „konie mechaniczne” – do pracy…

Z poprzedniego odcinka, dowiedzieliście się, że możliwości modułu (praktycznie) nie zależą od jego wersji – mowa oczywiście o wykorzystaniu furtki pozostawionej nam przez konstruktorów Action’a. Która ukrywa się pod niepozorną nazwą Parameters… I wielu z Was zapewne spróbowało już dociec samemu, co też takiego robi ta opcja z menu frezerki.

PowiększNiestety instrukcja dołączana do polskich kopii, stwierdza lakonicznie – jedynie o możliwości kopiowania oryginałów taśmowych, zabezpieczonych (nagranych) systemem NOVALOAD – to takie zmyślne TURBO dla magnetofonu (nagłówek w normalu, a reszta już w specjalnym systemie TURBO).

Owszem dobra rzecz, ale przez te lata – spotkałem się tylko z paroma grami nagranymi w tym systemie (nawiasem mówiąc, przeszmuglowanymi z zachodu w latach 80-ych).

Po takim „wyczerpującym” omówieniu problemu, można się zniechęcić do dalszego czytania instrukcji – i słusznie… Bo jakość tłumaczenia przyprawia o ból głowy i przeróżne „kwiatki” tam zawarte świadczą jedynie o tłumaczeniu żywcem (bez stosownej wiedzy w tym temacie – konkretnie o C64). Pewnym ratunkiem może okazać się wówczas, załączony do archiwum z modułem (np. w przypadku Action Replay 6) plik tekstowy będący kopią oryginalnej instrukcji ar6pro.zip (rozmiar 22 kB).

Część 2 – Sterowanie modułem.

Nie będzie tego za wiele. To tylko kilka adresów, które po paru użyciach zapadną w pamięć…

Z grubsza możemy podzielić pamięć modułu na kilka banków. Same banki zaś to 4 obszary $8000-$9FFF z danymi (jakby patrzeć pod kątem C64). Które przechowują system operacyjny modułu, tzw. ROM – który z kolei dzieli się na pomniejsze procedury przekopiowywane potem w różne lokacje pamięci, gdyż część z nich wymaga stałej obecności w RAM-ie komputera. Oprócz banków TYLKO do odczytu (z ROM modułu) istnieje 1 bank RAM – którego zawartość modyfikuje sam moduł, poprzez swoje procedury np.: frezerkę czy TURBO dla dysku.

Banków mamy więc w sumie 5, przy czym ten ostatni to RAM. Każdy ma po 8kB pojemności i w przypadku pierwszych 4, zawierają wiele pomocnych procedur – które przy odrobinie wprawy możemy wykorzystywać do własnych potrzeb. Na początek, zajmijmy się zatem wykorzystaniem ostatniego banku. Gdyż poszczególne modele Action’a, różnią się trochę zawartością pamięci ROM i wywoływanie z nich funkcji, może nastręczyć nam początkowo sporo problemów.

Rzut oka do mapy pamięci C64 wystarcza, aby zorientować się, że komórką odpowiedzialną za przełączanie banków jest $DE00. Zakodujmy również sobie, iż jest ona umieszczona w obszarze I/O procesora, i jako taka może być tylko zapisana! Więc chcąc cokolwiek zmodyfikować z reguły będziemy wstawiali do komórki $01 (odpowiedzialnej za konfigurację pamięci C64) wartość $37.

Uff… tyle tytułem wstępu. Poniżej prezentuje wartości, które możemy wstawiać do $DE00, aby uzyskać zamierzony efekt. Wpisywanie innych może zaś doprowadzić do zawieszania się modułu lub komputera – więc raczej nie próbujcie tego robić, chyba że w celach edukacyjnych…

 

Wartość

Opis działania

$00

Włączenie banku 0, w obszar $8000 – $9FFF

$08

j/w ale banku 1

$10

j/w ale banku 2

$18

j/w ale banku 3

$20

Włączenie banku RAM, w obszar $8000 – $9FFF

$23

j/w ale bez zapisu do ram C64

$06

Wyłączenie modułu i obszaru I/O dla modułu

$0A

Wyłączenie modułu

Jeszcze garść wyjaśnień. Banki są podłączane ZAWSZE w obszar RAM $8000 – $9FFF komputera. Aby móc je odczytać/zapisać musimy wcześniej wpisać żądaną wartość do komórki $DE00 i po operacji na pamięci Action’a wstawić do niej KONIECZNIE $0A (czyli ustawić normalną konfigurację pamięci). Aby umożliwić dalszą poprawną pracę modułu. Dodatkowo ogranicza nas „dziwna” cecha tej pamięci.

Pamięć modułu, zachowuje się podobnie jak pamięć ROM tzn. zapis do niej powoduje zapisanie do leżącej pod spodem pamięci RAM. Nie ma jednak sytuacji bez wyjścia. Wpisując $23 otrzymujemy „czysty” ram Action’a – pod pewnymi warunkami:

– pamięć komodorka to teraz tylko RAM w adresach $0000-$0fff
– dostęp do obszaru I/O (czyli rejestry SID, CIA, VIC)
– ROM dla Basic’a i Kernal’a
– VIC nie widzi kopii generatora znaków w adresach $1000-$1FFF i $9000-$9FFF

a w zamian otrzymujemy zapis do ram’u Action’a, nie zapisujący nic do ram’u komputera.

Część 3 – Dobieramy się do pamięci

PowiększPrzerażające, nieprawdaż? Tylko na pierwszy rzut oka… Przyjrzyjcie się teraz stosownym przykładom, by okiełznać te pokręcone sposoby wykorzystywania pamięci Action Replay’a. Stosowne przykłady zebrane w jeden plik pamiec.zip.

 

 

Procedura READ

Kopiuje wskazany bank pamięci Action’a, do pamięci ram komputera w ten sam obszar.

Procedura WRITE

Kopiuje krótki program do pamięci modułu i tam go uruchamia (wciśnij spację), po czym wraca do pamięci komputera.

Powiększ

Na tym pragnę już zakończyć ten odcinek, gdyż w kolejnym zajmiemy się „poważniejszymi” sprawami. Szkoda, że nie zmieściłem się już z opisem, w jaki sposób pisać własne programy pod Action’a. Wynagrodzę to Wam jednak, już w przyszłym odcinku, a nawet pokażę COŚ co powinno Was zainteresować.

 


 

Podziękowania:
Po ukazaniu się pierwszego odcinka o programowaniu Action’a, otrzymałem ciekawy e-mail. Jego autorem był członek grupy Apidya ukrywający się pod pseudonimem Reiter. Otóż poinformował on mnie, że sam jest również autorem kilku „parametrów”. Po zapoznaniu się z nimi, postanowiłem podzielić się nimi również z Wami – Action parameter pack by Reiter.zip.

Action Replay – tajemnice cartridge’a cz. 1

Część 1 – Tak rodzi się legenda.

Nazwa „Action Replay”, kojarzy się zapewne każdemu użytkownikowi C64 z czymś wyjątkowym. Firma „Datel”, producent tego zmyślnego urządzenia, nie przeczuwała prawdopodobnie nawet zamieszania, jakie wywołało ukazanie się tego „cudeńka” na rynku – a potem w zacisznych domowych pieleszach, pierwszych domorosłych crackerów.

Moduł ten utożsamiany jest z tym wszystkim, czego brakowało nam w oryginalnym Commodore 64. Kto pamięta te czasy, gdy gry ładowały się po kilkanaście minut i aby pogrzebać w pamięci, wkładało się cyrkiel do portu (aby wykonać RESET) – tak moi drodzy. Zapominamy już, w jakich to bólach rodziła się świetność naszego pupilka…

Teraz mamy już XXI wiek, od tamtych dni dzieli nas dobre kilkanaście lat. Przez ten czas, nasi rodzimi „piraci” uraczyli nas kilkoma wersjami tego modułu. Niestety, ich numeracja rosła niczym inflacja w ówczesnym PRL-u, nie odzwierciedlając zawartości „magicznego pudełeczka”. Warto teraz jednak rozwiać kilka mitów dotyczących tego cartridge’a.

Po pierwsze – wszystkie wersje na polskim rynku, z numeracją 6 i wyższą są tylko (!) mniej lub bardziej udanymi kopiami wersji 4. Po drugie – co wynika z pierwszego, zapomnijmy o możliwości pozyskania jego nowszych kopii. Od modelu nr 5 Actiona, firma „DATEL” wprowadziła taki zmyślny chip – wspomagający m.in. freezerkę. Nie da się tego skopiować w chałupniczych warunkach.

PowiększWięc nawet kopie tego modułu, krążące po sieci (pliki .CRT) są jedynie namiastkami oryginału – lekko tylko podrasowanymi. Pisząc o wersjach powyżej 6-ki, mam na myśli, na ten przykład produkty: warszawskiej firmy ATRAX (model 7.3 – tragiczny) i wrocławskiego Actiona 7.2 (nawiasem mówiąc, też się na niego kiedyś skusiłem – i możecie mi wierzyć, to najlepsza polska kopia oryginalnej 4-ki). Nie możemy jeszcze zapomnieć o licencjonowanych „klonach”. Na rynek niemiecki, firma „DATEL” wprowadziła np. Action Cartridge Plus v6.0. Wyposażyła go w trochę inne menu, do tego lokalizując go w tym języku. Inne różnice są już do zauważenia tylko dla „fachowców”.

Część 2 – Która to wersja?

Nie przejmujcie się Powiększjednak za bardzo 🙂 – wymienione różnice PRAKTYCZNIE nie mają wpływu na jego możliwości. Co można zaliczyć na plus (bez dwóch zdań) genialnym konstruktorom modułu Action Replay. W dobie wszędobylskiego Internetu, wciskającego się do naszych domów nawet już przez linie energetyczne (popularne 220 V). Zyskaliśmy możliwość posiadania wszystkiego, czego tylko dusza zapragnie. Dzięki netowi mamy już w naszych domowych PC-tach, świetne emulatory np. VICE i wiele nikomu do niczego niepotrzebnych programów…

Idźmy dalej, globalna sieć teleinformatyczna (m.in. Internet) zbliżyły ludzi – normalnie tego arta, czytałoby co najwyżej ze sto osób. Jednak dzięki sieci, czytasz go także TY. Po co jednak o tym wszystkim piszę. Otóż nie wszyscy nasi Czytelnicy mają dostęp do emulatorów, większość z nich jeszcze zapewne posiada komodorka z krwi i kości (np. jako spadek po starszym rodzeństwie). Wszyscy oni, jaki i reszta użytkowników – szuka czasem w sieci, gotowych rozwiązań ich palących problemów. Tu pojawiamy się MY czyli C64 Power – serwis stworzony z myślą o Was, i dla Was.

PowiększWspólną cechą wszystkich modułów Action Replay, jest doskonałe TURBO dla stacji dysków oraz monitor języka maszynowego. Omówię to kiedyś w jednym z przyszłych odcinków, teraz tematem przewodnim będzie FREZERKA. Każdy, kto kiedykolwiek zetknął się z tym modułem, na długo zapamiętał jego możliwości do ingerencji w sfreezowany program.

My jednak poznamy jeszcze kilka sekretów z tym związanych. Małe grono osób zna jego tajemnicę – jaką jest własny ram. Nie mamy tego może za wiele, bo tylko 8kB, ale wierzcie mi – to, czego można dzięki niemu dokonać, nie śniło się jeszcze nawet filozofom. To dzięki niemu perfekcyjnie „zamraża” się gry, ładuje z dysku z 25-krotną dopałką i pisze programy które działają w JEGO pamięci.

Pamiętacie zapewne, krótką wzmiankę o tej unikalnej możliwości w jednym z artów o crackowaniu. Wówczas posłużyliśmy się niewielkim programikiem, który odwalał za nas cała czarną robotę z szukaniem nieśmiertelności. Wprawdzie w sam moduł frezerki, też wbudowano podobne narzędzie – jednak dopiero wersje ostatnie to umożliwiały. A co z pozostałymi „szarymi” użytkownikami, powiedzmy 4-ki ? Tak, możemy pisać sobie własne narzędzia, do bardzo specjalistycznych zastosowań. W trakcie przeglądania swojego archiwum dyskietek i przeglądając dostępne strony i serwery o C64, natrafiłem na kilkanaście takich „programików”. Zaś jak je pisać samemu? O tym opowiem z mnóstwem stosownych przykładów już niebawem. Zatem do tego czasu, wyróbcie sobie jako takie mniemanie, by potem własnoręcznie napisać „te” swoje.