O
0000 |
BIVI C, 27H |
0012 |
JNZ 0008H |
0002 |
LXI H, 0021H |
0015 |
MVT A, 0 |
0005 |
IN 0 |
0017 |
OUT 0 |
0007 |
U0V B, A |
0019 |
JE? 0002H |
0008' |
kov a, b |
001C |
KVI A, 1 |
0009 |
ANA ŁI |
001E |
JM? 0017H |
OOOA |
mc h |
0021 |
DOH |
000B |
CMP M |
0022 |
COH |
oooc |
JZ 001CH |
0025' |
47H |
OOOF |
mc h |
0024 |
05H |
0010 |
M0V A, L |
0025 |
28H |
0011 |
CMP C |
0026 |
OOH |
Program ten działa następująco: w komórkach pamięci 0021H * 0026H umieszczono parani bajt maskujący i liczbę porównywaną z zamaskowaną liczbą wejściową (w poprzedniej wersji programu pary te były umieszczone w drugich bajtach rozkazów ANI i CPI). Procesor pobiera z pamięci kolejne pary i sprawdza, czy wynik mnożenia logicznego liczby wejściowej przez bajt maskujący jest równy drugiemu bajtowi pary. Jeżeli tak, to na wyjście zostaje wysłana 1, jeżeli nie, to procesor sprawdza, czy wszystkie pary zostały już sprawdzone (procesor dokonuje tego porównując adres zawarty w rejestrze L z liczbą 27H). Jeżeli adres jest mniejszy od 27H, procesor pobiera i sprawdza następną parę, jeżeli adres jest równy 27H, znaczy to,że wszystkie próby zostały już wykonane i wszystkie z wynikiem negatywnym i procesor wysyła na wyjście sygnał 0* Wysłanie 0 lub 1 kończy obliczenie wartości funkcji dla danej liczby wejściowej x,j ,x^,... ,Xg i procesor wraca do początku programu wczytując nowe dane wejściowe.
Zwróćmy uwagę, że fragment programu pomiędzy adresami 000SK a 0012H, który sprawdza wartość logiczną kolejnego składnika badanej funkcji, może być wykonywany kilkakrotnie w trakcie obliczania wartości funkcji dla jednej liczby wejściowej. Każdy obieg pętli 0006H - 0012H różni się tylko pobieraniem z pamięci par danych o innych adresach. Dzięki istnieniu tej pętl-i przedstawiony program może 'wyznaczać wartość funkcji logicznej skła-dającej się z dowolnej ilości iloczynów. V.'tedy zwiększa się tylko ilość danych zapisanych w pamięci począwszy od adresu 0021H oraz zmienia się pierwszy rozkaz, który powinien wpisywać zwiększony o jeden adres ostatniej danej. #
Następny, podany niżej przykład będzie dotyczył programu, w którym wygodne będzie wykorzystanie podprogramu.
Przykład 6.5
Przygotować program dla ^P 8080 sprawdzający, czy sumy arytmetyczne liczb 8-bitowych wczytanych z urządzenia nr 1 i urządzeń 2,3,4 są zawarte w przedziale 20,200. Pozytywny wynik sprawdzenia jest sygnalizowany wyprowadzeniem jedynek do urządzenia wyjściowego nr 1, zaś negatywny wyprowadzeniem zer. Po wykonaniu trzech sprawdzeń program ?/czytuje następne 4 liczby.
Już z pobieżnej analizy zadania wynika, że program powinien składać cię z dwóch części: pierwszej, która dokonuje wczytywania liczb z zewnątrz
w odpowiedniej kolejności i drugiej, która będzie porównywała sumę dwóch liczb z zadanymi progami. Tę drugą część potraktujemy jako podprogram, do
którego pierwsza część programu będzie się odwoływała rozkazami CALL.
Oto program:
0000 |
LXI SP,0060H |
0019 |
JC 002BH |
0003 |
IN 1 |
001C |
CPI 201 |
0005 |
MOV 3,A |
001E |
JNC 002BH |
0006 |
IN 2 |
0021 |
CPI 20 |
0008 |
CALL 0016H |
0023 |
JC 002BH |
000B |
IN 3 |
0026 |
UVI A,FFK |
00OD |
CALL 0018H |
0028 |
OUT 1 |
0010 |
IN ą |
002A |
RET |
0012 |
CALL 0018H |
002B |
LVI A ,0 |
0015 |
W 0003H |
002D |
OUT 1 |
0018 |
ADD B |
002F |
RET |
Pierwszy rozkaz LXI SP,0060H wprowadza liczbę 0060H do wskaźnika stosu, rezerwując w ten sposób miejsce w pamięci dla przechowywania zawartości licznika rozkazów przy rozkazie CALL. Rozkazy o adresach 0003H+0J15H powodują wczytanie danych z zewnątrz i odwołanie się do podprogramu. Rozkazy o adresach 0018H +■ 002FH stanowią podprogram, który porównuje sumy dwóch liczb z zadanymi progami 20 i 200. **
Ostatni z tej grupy przykładów będzie dotyczył programu obsługi przerwania.
Przykład 6,4
Przygotować program dla y.V 6080 wykonujący obliczenia z przykładu 3.2 oraz obsługujący przerwanie. Obsługa przerwania ma polegać na wczytaniu liczby dwójkowej z urządzenia wejściowego nr 2, dodaniu jej do zawartości pary komórek pamięci zewnętrznej o adresach 0065H i 0066H i podaniu na urządzenie wyjściowe nr 2 aktualnej zawartości tej pary komórek pamięci. •Sygnał przerwania powoduje podanie do procesora rozkazu RST 6.
Oto program:
0000 |
LXI SP,0C5CH |
0033 |
OUT |
2 |
0003 ’ |
program z przykładu 6.2 z odpowiednie zmodyfikowanymi adresami |
003A |
MCV |
M, A |
0029 J |
0033 0033 0030 0033 |
M07 INR ADC OUT |
A, H L H 2 | |
0030 |
FUSH PS* |
0060 |
KC-V |
fi,A |
0031 |
PUSK H |
0061 |
POP |
H |
0032 |
IN 2 |
0062 |
POP |
FlW |
003^ |
LXI H,0O65H |
0063 |
El | |
0037 |
ADD M |
OQUh |
RET |
Pojawienie się sygnału przerwania w dowolnej chwili wykonywania programu zawartego w komórkach OOOpH - 00029H, powoduje ukończenie wykonywanego aktualnie rozkazu i przejście procesora do cyklu POTWIERDZENIE PRZERWANIA, w czasie którego procesor otrzymuje z urządzenia przerywającego rozkaz R3T6. Rozkaz ten powoduje z kolei skok do adresu 003SH, w którym rozpoczyna się program obsługi przerwania. Program ten na początku zabezpiecza przed zniszczeniem, poprzez przesłanie do stosu zawartość rejestru A, wskaźników i rejestrów V i L, a następnie dokonuje wskazanego sumowania liczby wejścicwej z liczbą w p'mięci. r'.kończeniu tych. operacji pro-
*