Mit o instrukcji ROR procesora 6502
Historie wyglądają mniej więcej tak: pierwsza seria produkcyjna mikroprocesorów 6502, która trafiła na rynek w 1975 roku, miała krytyczną wadę - instrukcję przesunięcia w prawo - ROtate Right, zwaną w skrócie ROR, która nie działała poprawnie, a firma MOS Technology musiała przyznać się do błędu i go naprawić.
Procesory z roku 1976 i późniejsze, mają już doskonale działającą instrukcję ROR.
Problem z tą historią jest taki, że nie jest ona prawdziwa!
Chuck Peddle, który kierował zespołem projektującym 6502 w MOS Technology, zawsze twierdził, że kultowy mikroprocesor działał poprawnie od samego początku. Był to dla niego powód do dumy, ponieważ projektanci układów scalonych uwielbiają chwalić się, że ich krzemowy projekt „działa od pierwszego uruchomienia”.
Z drugiej strony ktoś, kto posiada mikroprocesor 6502 w wersji A z 1975 roku, dość łatwo może uruchomić prosty program testowy, aby potwierdzić, że instrukcja ROR (obrotu w prawo) nie działa poprawnie. Jak takie błędne działanie nie jest błędem?!?
Zaraz do tego dojdziemy.
Przy okazji należy wspomnieć, że mikroprocesory 6502 z maską w wersji A z roku 1975 są bardzo rzadkie, wręcz kolekcjonerskie! Wyglądają również dość charakterystycznie dzięki białej ceramicznej obudowie z pozłacanymi nóżkami.
Jak się okazuje, odpowiedź jest dość prosta.
Chuck chciał mieć uproszczony mikroprocesor, który byłby bardzo tani w produkcji i zredukował go do podstawowych, niezbędnych elementów. Jeden z konkurencyjnych układów, Motorola 6800, miał znacznie więcej funkcji, ale kosztował o wiele więcej, ponad 300 USD. Chuck sprzedawał swój mikroprocesor za dwadzieścia pięć dolarów (25 USD).
Za tę cenę pewien przedsiębiorczy młody inżynier kupił mikroprocesor od Chucka na targach WESCON w 1975 roku. Projektował on mały, niedrogi komputer i potrzebował małego, niedrogiego mikroprocesora. Niestety nie mógł kupić 6800, ponieważ sprzedawcy Motoroli go ignorowali. Tym inżynierem był Steve Wozniak, a komputerem - Apple I.
Wracając do historii: jedną z funkcji pominiętych przez Chucka, była instrukcja ROR (przesunięcia w prawo). Bill powiedział mi, że „Chuck nie uważał, że potrzebujemy ROR, więc nie mieliśmy ROR na pierwszym krzemie”.
Oczywiście klienci wrócili później, domagając się tej funkcji, a on zmienił zdanie, dodając tę instrukcję ROR w następnej wersji.
Innymi słowy, według Chucka i Billa, nie było żadnego błędu - wersja A 6502 po prostu nie miała instrukcji przesunięcia w prawo!
Część zamieszania wokół tego wszystkiego wynika błędnego rozumienia niezaimplementowanych instrukcji 6502.
Większość z nich nie robi nic użytecznego - kilka z nich faktycznie zatrzymuje procesor, wymagając twardego restartu w celu odzyskania sprawności. Inne instrukcje dają niestabilne wyniki, które wydają się losowe. Jeśli jesteście ciekawi, co robią te inne instrukcje, skorzystajcie z powyższego linku do artykułu na ten temat.
Kolejną mylącą rzeczą jest to, że wersja A 6502 ma również instrukcję przesunięcia w prawo LSR (Logical Shift Right), która działała i działa poprawnie. Jaka jest różnica między Shift a Rotate?
Przesunięcie w prawo (LSR) przesuwa najmniej znaczący bit (LSB) do bitu przeniesienia (Carry - C), resztę przesuwa o jeden bit w prawo i wstawia 0 do najbardziej znaczącego bitu (MSB).
LSR - Logical Shift Right
Rotacja w prawo (ROR) bierze flagę przeniesienia (C), umieszcza ją w najbardziej znaczącym bicie (MSB), a resztę przesuwa o jeden bit w prawo i umieszcza to, co było najmniej znaczącym bitem (LSB), we fladze przeniesienia.
Gdybyście nie znali historii, łatwo byłoby dojść do wniosku, że był to błąd 6502 i prawdopodobnie tak powstał mit ROR.
Ale dlaczego wierzyć Billowi na słowo? Czy istnieje sposób, w jaki możemy zajrzeć do krzemowego obwodu mikroprocesora 6502 z 1975 roku i jednoznacznie stwierdzić, czy jest to błąd, czy nie?
Zaskakujące jest to, że można!
Ktoś nabył jeden z takich rzadkich ceramicznych układów w wersji A. Został on przypadkowo rozbity, a znajdujący się w środku maleńki krzemowy chip został odsłonięty. Chip został sfotografowany przy użyciu mikroskopu optycznego i można go obejrzeć w Internecie!
Na szczęście wersja D 6502 została poddana inżynierii wstecznej przez ludzi z projektu Visual 6502 i na podstawie ich danych udało mi się stworzyć schemat procesora.
Kilka lat wcześniej Eric Schlaepfer użył tego schematu do zbudowania repliki 6502 ze zwykłych dyskretnych tranzystorów na bardzo dużej płytce drukowanej. Nazwał go MOnSter 6502. Jest to realizacja późniejszej wersji 6502 z działającą instrukcją obracania ROR.
Opierając się na obrazie układu i tym schemacie, trzeba się przyjrzeć, jak dekodowana jest instrukcja ROtate Right. Instrukcja jest kopiowana z pamięci komputera i przechowywana w rejestrze instrukcji. W ten sposób 6502 „pamięta”, co ma robić.
Bity rejestru są podawane do wewnętrznej tablicy ROM, która dekoduje każdą instrukcję na 131 wyjściowych linii sterujących.
Porównując zawartość wewnętrznej tablicy ROM między wersją A i D, Eric Schlaepfer znalazł trzy linie kontrolne, które się różniły.
Dwie z nich kontrolują przerzutnik w jednostce arytmetyczno-logicznej (ALU). W wersji A 6502 brakuje niektórych bitów tej tablicy ROM, które łączą przyszłe kody operacyjne rotacji w prawo (ROR) z przerzutnikiem ALU, pozwoliłoby to instrukcjom przesunięcia w prawo, kontrolować go tak samo, jak w wersji D.
Trzecia linia kontrolna to miejsce, w którym robi się ciekawie. W wersji D 6502 ta linia kontrolna jest całkowicie unikalna dla instrukcji ROR (ROtate Right). Żadna inna instrukcja jej nie używa.
Prześledził on tę linię kontrolną w wersji A 6502 i odkrył, że prowadzi ona w zasadzie donikąd. Nie jest z niczym połączona! Żadna instrukcja nie aktywuje tej linii. Rozgałęzia się na dwie ścieżki i żadna z nich nie łączy się z żadnym tranzystorem (elementem wykonawczym).
Przypuszczam, że była ona używana wcześniej przez inną instrukcję, która została później usunięta lub zmieniona podczas procesu projektowania.
Wszystkie połączenia pozostały na miejscu, ponieważ w tamtych czasach układy scalone były wykonywane ręcznie na przezroczystych arkuszach przy użyciu materiału do tworzenia grafiki (Rubylith - Litografia Rubinowa), która była później przekształcana w fotomaski. Łatwiej było pozostawić rzeczy, niż je usuwać. Dodanie możliwości obrotu ROR do wersji A 6502 było zaskakująco skomplikowane.
Oto problem. Istniejący układ logiczny dla przesunięcia w prawo natychmiast pobiera najmniej znaczący bit i przesuwa go do flagi przeniesienia, nadpisując poprzednią zawartość! Ale przecież potrzebny jest poprzedni stanu flagi przeniesienia, aby umieścić ją w najbardziej znaczącym bicie!
Inżynierowie rozwiązali ten problem, dodając specjalny zatrzask do przechowywania kopii flagi przeniesienia. Flaga ta jest zapisywana w tym zatrzasku, zanim nadpisze ją najmniej znaczący bit. Następnie, podczas operacji przesuwania, zamiast po prostu przesuwać 0 na najbardziej znaczący bit, przesuwają kopię flagi przeniesienia w jego miejsce.
Ponieważ jest to operacja dwuetapowa, dlatego nie została zaimplementowana w pierwszej wersji procesora 6502A.
Aby zapisać kopię bitu przeniesienia do bajtu wyjściowego, projektanci musieli dodać zupełnie nową linię kontrolną ścieżki danych. Ludzie z Visual 6502 nazywają ją ADDSB7 i ustawia ona lub czyści najbardziej znaczący bit bajtu wyjściowego.
Osoby odpowiedzialne za układ musiały przerobić cały spory obszar, aby zrobić na to odpowiednie miejsce.
Innymi słowy, w wersji A 6502 nie było sposobu na przeniesienie bitu przeniesienia do najbardziej znaczącego bitu bajtu wyjściowego. Jest to dosłownie jedna z najbardziej podstawowych funkcji prawa rotacji i każdy projektant układów logicznych o tym wie. Gdyby 6502 naprawdę miał błąd ROR (rotacji w prawo), spodziewałbym się zobaczyć ten obwód na chipie w jakiejś formie. Ale zamiast tego nie widzimy nic.
Dlatego też wersja A układu 6502 z 1975 roku nie zawiera instrukcji ROR (rotate right). Nie ma obwodu, który mógłby ją zaimplementować.













.png)
Komentarze