Wprowadzenie

Co to jest Wizjer 6502?

Wizjer 6502 to jest symulacja istniejącego procesora MOS 6502. Jest przeznaczona dla każdego, który zna podstawy programowania w językach C/C++, czy Java, ale chcą poznać najniższy poziom abstrakcji, gdzie się ma pełną kontrolę nad systemem komputerowym oraz poznać podstawowe pojęcia dotyczące architektur systemów komputerowych. Powinni jednak znać podstawowe pojęcia informatyczne takie, jak bit, bajt, pamięć RAM, procesor, systemy binarny i szesnastkowy, naturalny kod binarny (NKB), system uzupełnienia do dwóch (U2) czy podstawy programowania w języku wyższego poziomu.

Język asemblera 6502, który jest tłumaczony na kod maszynowy "zrozumiały" dla procesora jest o wiele prostszy od popularniejszego języka asemblera x86, który posiada ponad 1000 instrukcji! Asembler dla procesora 6502 (nazywanego w skrócie Asemblerem 6502) ma ich jedynie 56. W tej symulacji i nieraz, w rzeczywistym systemie 6502 masz całkowitą kontrolę nad systemem komputerowym i możesz robić z pamięcią RAM i wieloma rejestrami procesora to, co ci się żywnie podoba. Nie ma tu żadnego systemu operacyjnego czy maszyny wirtualnej, która wspomaga zarządzanie pamięcią lub nawet całkowicie uwalnia od tego użytkownika. Wszystkie dane, w tym kod są widoczne jako liczby w pamięci RAM i rejestrach, przez co możesz (musisz) sam zdecydować, które liczby będą adresami, opkodami, kodami koloru, kodami ASCII czy po prostu zwykłymi liczbami do obliczeń. W zależności od twoich intencji może się stać tak, że dokładnie ta sama dana zostanie potraktowana, jako zwykła liczba, jak i kod ASCII np. możemy dodać do rejestru liczbę z pamięci, a sumę potraktować ją jako kod ASCII znaku, który chcemy wyświetlić na ekranie. Należy jedynie zapisać liczbę w komórce pamięci, z której urządzenie wyświetlające regularnie odczytuje dane, na podstawie których wyświetla odpowiednią zawartość na ekranie. W programowaniu wysokopoziomowym, w tym też w języku C kompilator porządkuje instrukcje tak, że jeśli stos sprzętowy został użyty w trakcie wykonania podprogramu, to kompilator zawsze dorzuci instrukcję powrotu, a w chwili powrotu wskaźnik stosu zawsze wskazuje na bajt zawierający adres powrotu. Pisząc w wielu asemblerach, w tym w 6502, programista sam może zdecydować, czy ma nastąpić powrót do miejsca wywołania lub wykorzystać adres powrotu jako inną daną, lecz o tej samej wartości "widzianej" przez system komputerowy. Możesz nawet nadpisać kod programu zupełnie innymi danymi.

W programie możesz zarówno ręcznie edytować pamięć, jak i pisać w asemblerze, po czym napisany kod przetłumaczyć na kod maszynowy i wrzucić w wybrane przez Ciebie miejsce w pamięci. Oprócz pamięci RAM możesz też zobaczyć najważniejsze komponenty procesora. Zarówno pamięć RAM, jak i komponenty procesora są podświetlane, gdy biorą udział, a wartości komórek pamięci dowolnego rodzaju są aktualizowane. W Wizjerze 6502 na każdy krok wykonywania programu przypada jeden cykl zegara.

Wykonywanie programu przebiega w taki sposób, że są odczytywane każde komórki pamięci po kolei. Procesor "przesuwa" się po pamięci, niczym dysza nad matrycą. Informacja o tym, w którym miejscu "znajduje się procesor" znajduje się w liczniku programu. Pobrana liczba z adresu wskazywanego przez licznik programu może być potraktowana jako informacja o tym, jaki rozkaz ma wykonać i jaki tryb adresowania ma zostać wybrany, pod warunkiem, że jest wykonywany pierwszy cykl pewnego rozkazu. W następnych cyklach dalsze liczby wskazywane przez licznik są traktowane jak argumenty, jeśli pobrano wcześniej opkod rozkazu przyjmującego argumenty. Na jeden krok wykonywania programu przypada jeden cykl zegara, a nie wykonanie całej instrukcji, jak ma to miejsce w pozostałych symulatorach asemblera.

Komórki pamięci od $0600 do $07FF są skojarzone z konsolą. Wartości w parzystych komórkach pamięci decydują o tym, jakie znaki mają być wyświetlone na poszczególnych komórkach konsoli, natomiast nieparzyste komórki pamięci przechowuje kod koloru tła i tekstu. Liczba decydująca o kolorze ma rozmiar jednego bajtu. Starszy półbajt decyduje o kolorze tła, natomiast młodszy o kolorze tekstu. Nie ma oczywiście żadnego problemu, aby nie spróbować przeprowadzać obliczeń czy wczytać kod programu na tą stronę pamięci.

Oznacza to, że masz cały system komputerowy do twojej dyspozycji i to od ciebie zależy przebieg każdej, nawet drobiazgowej operacji. Ta symulacja jest w sam raz dla tych, którzy chcą "bawić" się całym systemem komputerowym! ;)

W podglądzie procesora dla zwiększenia czytelności pominięto niektóre komponenty np. zegar wyznaczający cykle, podczas których są wykonywano operacje.

Interpretacja danych przez systemy komputerowe

Należy wiedzieć, że programując w asemblerze 6502, dokładnie poznajemy współdziałanie kluczowych komponentów procesora i reprezentację danych w pamięci. Nieważne, czy dane zostaną przetworzone jako obraz, dźwięk, czy nawet liczby ujemne, komputer widzi je tylko jako ciągi zer i jedynek. Dowodem na to jest to, jak komputer widzi sumę dwóch liczb, nieważne, czy to w reprezentacji NKB czy U2, np. gdy dodamy liczby $03 i $FF, a obliczenia są dokonywane na jednym bajcie. Po przekształceniu tych liczb z postaci szesnastkowej na dziesiętny w systemie U2 dla jednego bajtu otrzymujemy odpowiednio liczby 3 i -1. Suma tych liczb wynosi 2. Z kolei, gdy potraktujemy jako NKB, to wtedy to będą liczby 3 i 255. Po dodaniu tych liczb otrzymujemy liczbę 257 ($102). Ta liczba nie mieści się w jednym bajcie, dlatego po odrzuceniu starszego bajtu liczba ta ma wartość $02. Wyniki obu działań komputer widzi jak liczbę 00000010. Oznacza to, że to człowiek ma decydować, jak użyć tych liczb, aby można było odczytać je jako dane, które człowiek chce wykorzystać i w programowaniu niskopoziomowym nie jest tak, że każda liczba (dana) musi mieć niezmienną rolę, jak w językach Java, czy C#, lub czasem w C. W Asemblerach, w tym 6502 tą samą liczbę człowiek może potraktować np. jako składnik dodawania arytmetycznego lub jako kod koloru piksela na ekranie, który decyduje o tym, w jakim kolorze monitor ma wyświetlić piksel.