Nauka asemblera. Część trzecia.

  Dobre efekty w nauce programowania daje analiza programów innych autorów. Warto zacząć od krótkich przykładów opisanych w podręczniku, np. w MIK06.


Kiedy poprawiła się sytuacja na rynku (elektronika staniała), dostępne stały się "komputery domowe". Najczęściej były one wykorzystywane do gier, ale gry to też programy, więc ktoś je musiał napisać. 😉 Nieliczni używali komputerów do pisania programów, co można zaobserwować również dzisiaj.

ZX Spectrum serial.
Oprogramowanie przystawki do ZX Spectrum.


Na stronie 227 MIK06 znajdziemy opis przystawki do ZX Spectrum, umożliwiającej przesłanie kodu wynikowego programu napisanego za pomocą GENS. Po co się tym zajmować, kiedy nie mamy ZX Spectrum? W CA80 jest zaimplementowana (jakie mądre słowo! 😎) transmisja szeregowa *8E, więc możemy ją wykorzystać i przy okazji czegoś się nauczyć.


Większość programów możemy podzielić na dwie główne części:

  •  rozruch, (wykonuje się tylko raz)
  •  pętlę główną, (wykonuje się określoną liczbę razy, lub jest nieskończona).

Nie inaczej jest w naszym przykładzie: najpierw przesyłane są parametry transmisji (adres i długość bloku danych), a potem w pętli dane.

Procedury wysyłające dane.
Ciąg dalszy programu.


Program wydaje się być bardzo krótki, ale odwołuje się on do podprogramu (procedury) ZAP.

Definicja procedury.
Niektóre synonimy są lepsze.


Tutaj znajdujemy następne procedury, a w nich kolejne... Wszystko zgodnie z pierwszą z "elementarnych zasad dobrego stylu programowania" (str.134, MIK02).

Elementarne zasady.
Dobre rady.


Możemy spróbować utworzyć algorytm programu w pseudo C. Gdybyśmy zdecydowali się na jakiś mikrokontroler, można by pokusić się o gotowy do użytku program. Wybrałem akurat ten przykład, bo bardzo dobrze pokazuje sposób rozwiązywania problemu. Najpierw definiujemy ogólny zarys programu, czyli dzielimy proces na mniejsze funkcje, czy jak chce pan Gardynik procedury. Od ogółu zmierzamy do szczegółu - najpierw piszemy, co chcemy zrobić, a potem jak chcemy to zrobić. Na początku wysyłamy dwie liczby szesnastobitowe, więc tworzymy taką funkcję. Jak wyślemy te liczby? Powinniśmy zacząć od najmłodszego bitu, bo takie są założenia. W takim razie dzielimy liczbę na dwa bajty i wysyłamy najpierw młodszy. Teraz tworzymy procedurę wysłania bajta - zrobimy to w pętli for, gdzie za pomocą przesunięcia bitowego i iloczynu bitowego sprawdzimy wartość kolejnych bitów i wyślemy je do kolejnej funkcji. Teraz doszliśmy już prawie do rozwiązania. Ustawiamy wartość wysyłanego bitu na przeznaczonym do tego celu wyjściu (w oryginale ustawiamy lub kasujemy przerzutnik D w układzie SN7474). Następnie generujemy narastające zbocze sygnału CLK (opisane jako STROB), czyli najpierw na wyjście wysyłamy stan niski (RESS w drugim przerzutniku 7474), czekamy w funkcji DELAY (pętla wykonująca się doświadczalnie dobraną liczbę razy) wysyłamy stan wysoki (SETS) i znowu czekamy w funkcji DELAY, po czym wracamy. Ostatnich punktów nie rozpisałem w algorytmie...

Algorytm w pseudo C.
Próba zapisu programu w języku C.


Możemy teraz przeanalizować działanie programu. Do wysłania 100 bajtów danych, oprócz nich wysyłamy adres i długość bloku czyli razem 104 razy wywołamy funkcję ZAP, która za każdym razem osiem razy wywoła procedurę wysłania bitu. Tyle samo razy (832) wykona się funkcja generująca narastające zbocze STROB, która dwukrotnie wywołuje DELAY. Można oszacować, że całkowity czas wysłania 100 bajtów potrwa nieco ponad 1664 wartości opóźnienia. 


Komentarze

Popularne posty z tego bloga

Uruchamiamy CA80 na RCbus.

Magnetofon CA80.