Nauka asemblera. Część druga.

  Każdy program, nawet najprostszy, należy uruchomić i przetestować. Już w trakcie "kompilacji" zauważyłem, że program "kuleje".

Próbnik stanów logicznych jako LED.
Układ pomiarowy.


Sprawdźmy więc, czy miałem rację. Po wprowadzeniu kodu do RAM i włączeniu programu, zauważymy, że dioda (zamiast niej użyłem próbnika stanów logicznych) owszem miga, jednak nieregularnie. Do diagnozy użyjmy analizatora (od poprzedniej lekcji minęło prawie czterdzieści lat 😉). Żeby było łatwiej podłączyć przewód, zmienię nieco program - w rozkazie XOR zamiast 01H wpiszę 81H - wtedy zmiany będą jednocześnie na dwóch pinach PA0 i PA7. Do modyfikacji wystarczy zlecenie *D. Nie musimy przegenerowywać kodu, "flaszować" i tracić czasu. Po wczytaniu próbki, od razu widać niedoskonałość kodu. Dla lepszego rozpoznania podłączyłem też sygnał NMI, bo to on umożliwia nam pomiar czasu.

Analizator logiczny.
Nieregularna praca PA0.

Uploading program to RAM CA80.
Zmiany w programie zleceniem *D.


Żeby znaleźć przyczynę "dziwnej" pracy, musimy rozciągnąć próbkę, aby zobaczyć moment przełączania.

TIME zmienia się co 2ms.
Dodatkowa zmiana stanu PA0 po NMI.

Wiele zmian stanu PA0.
Mimo wielu przełączeń PA0 oko nie zauważy błędu.


Tak jak przewidywałem, kiedy TIME się wyzeruje, nasz program wiele razy zmieni stan PA0 na przeciwny. CA80 jest taktowany z częstotliwością 4 MHz. Wydawać by się mogło, że to bardzo mało, jednak nasz program składa się tylko z kilku rozkazów i działa bardzo szybko - jedna pętla trwa 33us. W ciągu prawie 2ms wykona się wiele razy. Jeżeli liczba dodatkowych obiegów będzie parzysta, LED zmieni stan zgodnie z oczekiwaniem, jednak nie zawsze tak jest. Dlatego zmieniłem zakończenie pętli dodatkowymi rozkazami, aby TIME był równy zero tylko raz. Daje to dodatkowe możliwości, bo zmieniając wartość wpisywaną do licznika, możemy regulować częstotliwość migania diody.

Zmiany PA0 w czasie TIME = 0.
Okiem trudno to zauważyć.


CA80 ma wbudowane narzędzia do uruchamiania programów. Bezcenna jest praca krokowa i możliwość ustawiania pułapek. Po każdym kroku mamy podgląd rejestrów z możliwością modyfikacji.

CA80 step by step.
Praca krokowa.


    Do debugowania użyłem MSid-mini - przystawkę wyświetlającą stan rejestrów po każdym kroku pracy krokowej, po naciśnięciu [M], po zatrzymaniu programu na pułapce oraz po rozkazie RST 30H. Zbędne jest wtedy korzystanie z *F i znacznie szybciej analizujemy pracę programu.

MSid-mini.
Nasz program nie używa wyświetlacza, więc pozostaje on ciemny.


W czasie pracy krokowej widzimy różne wartości w rejestrze A. Ponieważ czekamy na zero, musielibyśmy długo wciskać [=], żeby w nie trafić. Mamy dwie możliwości: wpisać do A "0" zleceniem *F, albo ustawić pułapkę za skokiem. Wybieramy drugi wariant i możemy zleceniem *C sprawdzić zapalenie czerwonej diody.

CA80 work with trap.
Ustawianie pułapki zleceniem *G.

CA80 trap.
Zatrzymanie programu na pułapce "dobija" kropkę na wyświetlaczu.

CA80 step-by-step again.
Znowu możemy śledzić program zleceniem *C.

Red LED lighting.
Aż do zmiany stanu wyjścia PA0.


Jako ćwiczenie obsługi CA80 możemy wprowadzić różne wartości opóźnienia (zamiast FF w rozkazie LD A,0FFH) i przetestować pracą krokową i z pułapką.

Komentarze

Popularne posty z tego bloga

Uruchamiamy CA80 na RCbus.

Magnetofon CA80.