Chciałem napisać artykuł, co to są te nośniki i po co, ale wyszedł tak długi, że zanim skończyłem go pisać, to sam odpadłem po drodze. Więc będzie w kawałkach. Dziś część pierwsza, o tym jak wprowadzano dane do pierwszych komputerów domowych, tych raczej nie spotykanych w Polsce.
Komputer Altair 8800, czy jego poprawione kopie, występujące pod nazwą IMSAI 8080 (na zdjęciu), o których pamięta się jako o pierwszych komputerach domowych, nie miały ani klawiatury, ani monitora. Pamięci też w zasadzie za dużo nie miały. Podstawowy model mógł przechować na raz tylko 256 bajtów, czyli 256 liczb od 0 do 255.
Programy dla nich pisało się… na kartce. Czytając dokumentację użytkownik mógł dowiedzieć się, jakie operacje mógł wykonywać mikroprocesor, stanowiący serce komputera i jakie były spodziewane rezultaty tych operacji. Polecenie wykonania pojedynczej operacji zwane jest rozkazem. Jak w wojsku. Biegnij. Kop. Padnij. Możemy to sobie wyobrazić tak, że procesor ma wbudowaną listę rozkazów które umie realizować, a programista do wykonania przekazuje mu liczbę, określającą numer rozkazu na owej liście.
Jeżeli sierżant krzyknie: “Padnij”, żołnierz raczej wie co ma robić. Niektóre rozkazy wymagają doprecyzowania, tak żeby odbiorca wiedział, przykładowo, do kogo ma strzelać, albo jak długo czy głęboko kopać. Stąd i procesor spodziewa się niekiedy, że zaraz po kodzie rozkazu przekazana zostanie mu dodatkowa liczba lub liczby, wskazujące specyficzne parametry wykonania danej instrukcji. Rezultat wykonania rozkazu, czyli co i jak zmieni się, czy to w pamięci, czy w stanie samego procesora (on też ma pewną ograniczoną zdolność do przechowywania informacji) jest opisany w jego specyfikacji. Przy czym, żołnierz prawdopodobnie zastanowiłby się chwilę, a może nawet dopytał, jaki rezultat sierżant miał na myśli, gdy wydawał wyjątkowo kontrowersyjny rozkaz. Procesor natomiast jest wolny od tego typu refleksji i polecenie wykona bez szemrania.
Wspomniana pamięć komputera, zwana pamięcią operacyjną, jest przestrzenią, gdzie umieszczamy sekwencje rozkazów dla procesora. Jest to też miejsce, do którego trafiają produkty pracy powstałego w ten sposób i wykonywanego przez komputer programu. Rozbijając zadanie na pojedyncze czynności i decyzje, typu: “Wczytaj liczbę spod wskazanego adresu”, “Dodaj ją do wartości przechowywanej w rejestrze procesora”, “Porównaj wartość rejestru i wskazanej komórki pamięci”, czy wreszcie: “Jeżeli wynik porównania jest pozytywny, to rozpocznij wykonywanie sekwencji rozkazów od wskazanego miejsca w pamięci” jesteśmy w stanie rozwiązywać praktycznie dowolnie złożone problemy. Procesor, w takt podawanych mu impulsów zegarowych, sięga do kolejnych komórek pamięci, interpretuje umieszczone tam polecenia i bezzwłocznie je wykonuje.
Pozostaje jednakże kwestia naszej interakcji z procesorem, czy z pamięcią do której ten ma dostęp. Pierwsze, wspomniane przeze mnie komputery, miały na przednim panelu zestawy przełączników i świecących diód. Przełącznikami mogliśmy wybrać tryb pracy (zatrzymać program, wykonać kolejną instrukcję, przejść w tryb odczytu czy wprowadzania danych), miejsce w pamięci, które chcieliśmy czy to podglądać, czy zapisywać i wreszcie wybrać wartość, jaka miała być tam wprowadzona (rozbite na kolejne potęgi dwójki, reprezentowane jako zera i jedynki na pojedynczych przełącznikach). Rezultat naszych działań obserwowaliśmy w formie zapalonych lub zgaszonych lampek na odpowiedniej pozycji (taką pojedynczą jednostkę informacji, przyjmującą wartość 0 lub 1, nazywamy bitem).
Pierwsze programy zapisywane więc były na… kartkach papieru. Długopisem, czy ołowkiem, programista zapisywał instrukcje, wyobrażając sobie, jaki będzie ich rezultat i dopisując kolejne. Dla ułatwienia, liczbowym numerom rozkazów z listy procesora przypisane były też literowe nazwy, aby zapisywany program był czytelniejszy na pierwszy, lub trzeci, rzut oka. Przykładami są: LDA (LoaD Accumulator – załaduj wartość do pomocniczego rejestru), JMP (JuMP – wykonaj skok), czy CMP (CoMPare – porównaj wartość rejestru z komórką pamięci). Taki program następnie, bajt po bajcie, ustawiając odpowiednie przełączniki na “właściwe” zera i jedynki, był ładowany do pamięci, po czym procesor otrzymywał rozkaz skoku na jego początek, i w zależności od tego, czy programista popełnił błąd wymyślając, zapisując, czy wprowadzając program, czy też nie, program działał jak się spodziewano, lub też nie.
Leave a Reply