258
Oto programt
0000 |
mi C, 27H |
0012 |
JNZ OOOSH |
0002 |
ŁXI H, 0021H |
0015 |
mi a, o |
0005 |
IN 0 |
0017 |
OUT 0 |
0007 |
KOV B, A '• |
0019 |
JE? 0002H |
0008 |
KOV A, B |
001C |
mi a, 1 |
0009 |
ANA U |
001E |
JKP 0017H |
OOOA |
JJSTJL H |
0021 |
DOH |
OOOB |
CUP u |
0022 |
COH |
OOOC |
JZ 001CH |
0025' |
47H |
OOOF |
one h |
0024 |
05H |
0010 |
M0V A, L |
0025 |
28H |
0011 |
CMP C |
0026 |
00H |
Program ten działa następująco: w komórkach pamięci 0021H 0026H umie
szczono parami 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 ,x2 > • * * >x8 * Procesor wraca do początku programu wczytując nowe dane wejściowe.
Zwróćmy uwagę, że fragment programu pomiędzy adresami OOOSH 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 OOOSH - 0012H różni się tylko pobieraniem z pamięci par danych o innych adresach. Dzięki istnieniu tej pętli 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.3
Przygotować program dla y.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 wczytuje następne 4 liczby.
Już z pobieżnej analizy zadania wynika, że program powinien składać cię z dv;ó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 |
raci sp.ooeoH |
0019 |
JC 002BH |
0003 |
XN 1 |
001 c |
CPI 201 |
0005 |
M0V 3,A |
001E |
JNC 002BH |
0006 |
IN 2 |
0021 |
CPI 20 |
0008 |
CALL 0016H |
0023 |
JC 002BH |
000B |
IN 3 |
0026 |
Ł*VI A,PPH |
OOOD |
CALL 0018K |
0028 |
OUT 1 |
0010 |
IN 4 |
002A |
RET |
0012 |
CALL 0018H |
002B |
LVI A,0 |
0015 |
J!iP 0003H |
002D |
OUT 1 |
0018 |
ADD B |
002F |
RET |
Pierwszy rozkaz ŁXI SP,OOóOH 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 sumę 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 jj.P £080 wykonujący obliczenia z przykładu £.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 |
1X1 SP,OC50H |
0033 |
OUT |
2 |
0003 ' |
program z przykładu 6.2 z odpowiednie zmodyfikowanymi adresami |
003A |
K0V |
M.A |
0029 . |
0033 0030 0030 0030 |
K0ł/ INR AOC OUT |
A,H L M 2 | |
0030 |
FUSH PSW |
001*0 |
KCV |
fi,A |
0031 |
PUSH H |
00M |
POP |
R |
0032 |
IN 2 |
00*2 |
POP |
FlW |
003* |
LXI H,0O65H |
00*. 3 |
El | |
0037 |
ADD M |
00** |
RET |
Pojawienie się sygnału przerwania w dowolnej chwili wykonywania programu zawartego w komórkach 0005H - 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 RSPó. Rozkaz den powoduje z kolei skok do adresu 0030H, 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ściowej z liczbą w pomięci. ?.• z-.kończeniu tych operacji pro-