Advertisement
Talar97

[AK] Kalkulator (8080)

Nov 25th, 2018
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         ORG 800H        ;Rozpoczęcie programu od 800Hex miejsca w pamięci
  2. START   LXI H,MENU      ;Przeniesienie do rejestru HL łancucha znaków z "MENU" -> "Prosty kalkulator"
  3.         RST 3           ;Wyświetlenie znaków z rejestru  HL
  4.  
  5.                         ;Wprowadzenie pierwszego operandu
  6. OP_1    LXI H,NUM_1     ;Załadowanie NUM_1 do HL
  7.         RST 3           ;Wyświetlenie wartości z HL -> "Wprowadz pierw. operand"
  8.         RST 5           ;Zapis wprowadzonych z klawiatury danych do DE
  9.         MOV B,D         ;Bedziemy potem wprowadzac jeszcze jeden operand, wiec przenosimy
  10.         MOV C,E         ;DE do rejestru BC. BC<-DE
  11.  
  12.                         ;Wprowadzanie znaku operacji
  13. ZN_OP   LXI H,ZNAK      ;Załadowanie do HL wartości z "Znak"
  14.         RST 3           ;Wyświetlenie zawrtości HL -> "Wprowadź znak"
  15.         RST 2           ;Załadowanie do akumulatora jednego znaku
  16.                        
  17.                         ;SPR_ZN ma na celu sprawdzenie wprowadzonego znaku i skok warunkowy
  18.                         ;do odpowiedniego miejsca w kodzie odpowiedzialnego za daną operację
  19. SPR_ZN  CPI 'n'         ;Porównanie wartości z akumulatora (A) z wartością hex 'n'
  20.         JZ NEG          ;Jeżeli flaga po porównaniu Z=1, to wykona się skok do NEG
  21.         CPI '+'         ;Porównanie wartości z akumulatora (A) z wartością hex '+'
  22.         JZ DODW         ;Jeżeli flaga po porównaniu Z=1, to wykona się skok do DODW
  23.         CPI '-'         ;Porównanie wartości z akumulatora (A) z wartością hex '-'
  24.         JZ ODJA         ;Jeżeli flaga po porównaniu Z=1, to wykona się skok do ODJA
  25.         JMP ZN_OP       ;Jeżeli żaden warunek nie został spełniony, to skok do wprowadzania znaku op.
  26.  
  27.                         ;DODW - dodawanie dwóch operandów. Na początku pobieramy drugi operand
  28.                         ;do rejestru DE (pierwszy operand trzymamy w rejestrze BC)
  29.                         ;Po wprowadzeniu operandu zamieniamy miejscami rejestry (..<-..)
  30.                         ;Oraz wykonujemy operację dodawania (poprzez instrukcję DAD) wykonywaną
  31.                         ;na rejestrach (służy ona generalnie do obliczania adresów, ale można ją
  32.                         ;wykorzystać do dodawania). Sprawdzamy czy istnieje przeniesienie, jeśli tak
  33.                         ;to wykonujemy skok warunkowy do etykiety PRZENIESIENIE gdzie wypisana zostanie
  34.                         ;wartość 1 na wyjście, zanim wypiszemy wynik operacji.
  35.                         ;Jeśli nie ma przeniesienia, lub jeśli wróciliśmy z przeniesienia poprzez RET
  36.                         ;to wypisujemy na wyjście zawartość rejestru HL. Przenosimy H i L do akumulatora
  37.                         ;i wywołujemy przerwanie 4.
  38. DODW    LXI H,NUM_2     ;Pobranie do HL<-NUM_2
  39.         RST 3           ;Wyświetlenie komunikatu o wprowadzeniu drugiego operandu
  40.         RST 5           ;Wprowadzenie z klawiatury wartości drugiego operandu
  41.         LXI H,DODW_T    ;Pobranie do HL<-DODW_T
  42.         RST 3           ;Wyświetlanie komunikatu o wyniku
  43.         XCHG            ;Zamiana rejestrów
  44.         DAD B           ;Dodanie do rejestru HL rejestrów BC
  45.         CC PRZENIESIENIE;Sprawdzenie czy przeniesienie wystąpiło. Jeśli C=1 (carry) to skok do PRZENIESIENIE
  46.         MOV A,H         ;Przeniesienie do A<-H
  47.         RST 4           ;Wyświetlenie zawartości akumulatora (liczby)
  48.         MOV A,L         ;Przeniesienie do A<-L
  49.         RST 4           ;Wyświetlenie zawartości akumulatora (liczby)
  50.         JMP KONIEC      ;Skok do etykiety koniec
  51.  
  52.                         ;PRZENIESIENIE służy do wypisania dodatkowej jedynki przed wynikiem
  53.                         ;operacji dodawania, jeżeli wystąpi przeniesienie
  54. PRZENIESIENIE              
  55.         MVI A,1H        ;Zapisujemy w akumulatorze wartość 1 hex
  56.         RST 4           ;Wypisujemy liczbe z akumulatora
  57.         RET             ;Powracamy do miejsca, gdzie został wywołany skok
  58.  
  59.  
  60.                         ;ODJA - odejmowanie liczb 16 bitowych. Najpierw wprowadzamy drugi operand
  61.                         ;następnie żeby zapobiec błędom ustawiamy się na fladze C i negujemy ją
  62.                         ;Dopiero potem, każdy z rejestrów odejmujemy od siebie. Najpierw od C-E
  63.                         ;(A<-C i SUB E), i wynik zapisujemy w L (L<-A), następnie od B-D
  64.                         ;(A<-B i SBB D) odejmujemy z uwzględnieniem pożyczki. Jeżeli po tej operacji
  65.                         ;pożyczka dalej występuje, to musimy zrobić skok do etykiety POŻYCZKA
  66.                         ;gdzie dokonamy zamiany miejscami rejestry z operandami (ponieważ domyślnie
  67.                         ;wynik ujemny zapisany jest w ZU2, a my chcemy w ZM. Zatem dokonujemy zamiany
  68.                         ;wypisujemy na wyjscie minus i wracamy do odejmowania, dopiero wtedy uzyskamy
  69.                         ;poprawny wynik
  70. ODJA    LXI H,NUM_2     ;Przeniesienie do HL<-NUM_2
  71.         RST 3           ;Wypisanie tekstu o wprowadzenie drugiego operandu
  72.         RST 5           ;wprowadzanie znakow z klawiatury
  73.         LXI H,ODEJM_T   ;Przeniesienie do HL<-ODEJM_T
  74.         RST 3           ;Wyswietlenie tekstu z wynikiem
  75. ODJM    STC             ;Ustawienie sie na fladze C
  76.         CMC             ;Negacja flagi C
  77.         MOV A,C         ;Przeniesienie A<-C w celu odejmowania
  78.         SUB E           ;Odejmowanie od A wartosci z E
  79.         MOV L,A         ;Wynik operacji SUB przenosimy do L
  80.         MOV A,B         ;Do a wprowadzamy druga czesc operandu (A<-B)
  81.         SBB D           ;Odejmujemy od A rejestr D z uwzglednieniem pozyczki z poprzedniej operacji
  82.         MOV H,A         ;Przenosimy wynik do rejestru H
  83.         JC POZYCZKA     ;Sprawdzamy, czy po drugiej operacji dalej wystepuje pozyczka, jesli tak to skok
  84.         MOV A,H         ;Przenosimy H do A (A<-H)
  85.         RST 4           ;Wyswietlamy wartosc
  86.         MOV A,L         ;Przenosimy L do A(A<-L)
  87.         RST 4           ;Wyswietlamy wartosc
  88.         JMP KONIEC      ;Skok do zakonczenia programu
  89. POZYCZKA MOV H,B        ;HL<-BC
  90.         MOV L,C         ;
  91.         MOV B,D         ;BC<-DE
  92.         MOV C,E         ;
  93.         XCHG            ;DE<-HL(wartosc z BC)
  94.         MVI A,'-'       ;Zapis '-' do akumulatora
  95.         RST 1           ;wypisanie minusa na wyjscie
  96.         JMP ODJM        ;powrót do odejmowania w celu ponownego wykonania operacji
  97.  
  98.                         ;NEG - operacja negacji, przenosimy do akumulatora najpierw B, potem C
  99.                         ;i negujemy operacją CMA, kazdorazowo wyswietlając wynik na ekran
  100. NEG     LXI H,NEG_T     ;Przeniesienie do HL<-NEG_T
  101.         RST 3           ;Wyswietlenie komunikatu o wyniku negacji
  102.         MOV A,B         ;przeniesienie do A<-B
  103.         CMA             ;Wykonanie negacji na zawratości akumulatora
  104.         RST 4           ;Wyświetlenie zawartości akumulatora na wyjscie
  105.         MOV A,C         ;A<-C
  106.         CMA             ;negacja A
  107.         RST 4           ;wyswietlenie na wyjscie
  108.         JMP KONIEC      ;koniec
  109.  
  110.                         ;Wyswietla komunikat i konczy program
  111. KONIEC  LXI H,INFO  
  112.         RST 3  
  113.         HLT  
  114.                         ;10,13 - skok do nowej linii i powrot karetki
  115.                         ;@ - koniec łancucha znaków
  116. MENU    DB 10,13,'Prosty kalkulator','@'        
  117. NUM_1   DB 10,13,'Wprowadz pierw. operand > ','@'        
  118. ZNAK    DB 10,13,'Wprowadz znak operacji > ','@'        
  119. NUM_2   DB 10,13,'Wprowadz drugi operand > ','@'        
  120. INFO    DB 10,13,'Koniec programu','@'        
  121. NEG_T   DB 10,13,'Wynik negacji > ','@'        
  122. DODW_T  DB 10,13,'Wynik dodawania > ','@'        
  123. ODEJM_T DB 10,13,'Wynik odejmowania > ','@'
  124.  
  125. Kody restartów
  126. RST 0 - Start systemu
  127. RST 1 - Wydruk ZNAKU z A na monitor
  128. RST 2 - Wczytanie ZNAKU do A
  129. RST 3 - Wydruk łańcucha z [HL] do '@'
  130. RST 4 - Wydruk dwóch ZNAKÓW HEX z A
  131. RST 5 - Wczytanie CZTERECH ZNAKÓW HEX do pary rejestrów DE
  132. RST 6 - Wydruk zawartości rejestrów
  133.  
  134. --------------------------------------------------
  135. |               BEZ KOMENTARZY                   |
  136. --------------------------------------------------
  137.         ORG 800H  
  138. START   LXI H,MENU
  139.         RST 3
  140. OP_1    LXI H,NUM_1  
  141.         RST 3  
  142.         RST 5  
  143.         MOV B,D  
  144.         MOV C,E  
  145. ZN_OP   LXI H,ZNAK  
  146.         RST 3  
  147.         RST 2  
  148. SPR_ZN  CPI 'n'  
  149.         JZ NEG  
  150.         CPI '+'  
  151.         JZ DODW  
  152.         CPI '-'  
  153.         JZ ODJA  
  154.         JMP ZN_OP  
  155. DODW    LXI H,NUM_2  
  156.         RST 3  
  157.         RST 5  
  158.         LXI H,DODW_T  
  159.         RST 3  
  160.         XCHG  
  161.         DAD B  
  162.         CC PRZENIESIENIE  
  163.         MOV A,H  
  164.         RST 4  
  165.         MOV A,L  
  166.         RST 4  
  167.         JMP KONIEC  
  168. PRZENIESIENIE  
  169.         MVI A,1H  
  170.         RST 4  
  171.         RET      
  172.         RET  
  173. ODJA    LXI H,NUM_2  
  174.         RST 3  
  175.         RST 5  
  176.         LXI H,ODEJM_T  
  177.         RST 3  
  178. ODJM    STC  
  179.         CMC  
  180.         MOV A,C  
  181.         SUB E  
  182.         MOV L,A  
  183.         MOV A,B  
  184.         SBB D  
  185.         MOV H,A  
  186.         JC POZYCZKA  
  187.         MOV A,H  
  188.         RST 4  
  189.         MOV A,L  
  190.         RST 4  
  191.         JMP KONIEC  
  192. POZYCZKA MOV H,B  
  193.         MOV L,C  
  194.         MOV B,D  
  195.         MOV C,E  
  196.         XCHG  
  197.         MVI A,'-'  
  198.         RST 1  
  199.         JMP ODJM  
  200. NEG     LXI H,NEG_T  
  201.         RST 3  
  202.         MOV A,B  
  203.         CMA  
  204.         RST 4  
  205.         MOV A,C  
  206.         CMA  
  207.         RST 4  
  208.         JMP KONIEC  
  209. KONIEC  LXI H,INFO  
  210.         RST 3  
  211.         HLT  
  212. MENU    DB 10,13,'Prosty kalkulator','@'        
  213. NUM_1   DB 10,13,'Wprowadz pierw. operand > ','@'        
  214. ZNAK    DB 10,13,'Wprowadz znak operacji > ','@'        
  215. NUM_2   DB 10,13,'Wprowadz drugi operand > ','@'        
  216. INFO    DB 10,13,'Koniec programu','@'        
  217. NEG_T   DB 10,13,'Wynik negacji > ','@'        
  218. DODW_T  DB 10,13,'Wynik dodawania > ','@'        
  219. ODEJM_T DB 10,13,'Wynik odejmowania > ','@'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement