Technical Site

AVSimZ80

Jest to symulator mikroprocesora Z80. Nie jest aż tak źle jak ten program wygląda. Umożliwia pracę w języku asembler – języku, w którym w gruncie rzeczy każde polecenie jest jednocześnie pojedyńczym rozkazem procesora.

Ekran AVSimZ80

Na dobry początek, polecam ściągnięcie tego programu. Jest bardzo stary, ma ponad dwadzieścia lat, także myślę, że mogę go tu zamieścić i nikomu to nie będzie przeszkadzać.

Sciągnij AVSimZ80

Ściągnij AVSimZ80

Na pierwszych zajęciach jest mowa o teorii, zapoznanie się z nawigacją w programie, oraz jedno zadanie do wykonania. Na początek parę definicji. Nie są one potrzebne na kolokwium, jednakże myślę, że warto je tu wypisać, gdyż prędzej czy później i tak koniecznością będzie je poznać.

Definicje

Podstawowa nawigacja

Aby wpisać rozkaz do procesora, należy przejść do drugiego menu (Spacja), następnie wcisnąć P (Patch) i jeszcze raz P (Patch Code). Już można pisać. Gdy rozkazy są gotowe, należy wyjść z trybu wpisywania komend (Ctrl+C), przejść do drugiego menu (Spacja), wcisnąć R (Reset), a następnie C (CPU). Teraz pozostaje symulacja. W zasadzie F1 jest bezużyteczne. Zawsze polecam używać F10.

Komendy

Najpierw postaram się wyjaśnić składnię każdego (poznanego na zajęciach) rozkazu.

OPERATION		 
LD	rejestr,wartość


INC	rejestr

DEC	rejestr

JP	flaga, adres



CP	rejestr



ADD     rejestr,rejestr

ADD     rejestr,wartość

XOR	rejestr
  KOMENTARZ
; załadowanie do podanego
  rejestru (A, B, C, D, E) danej wartości

; zwiększenie zawartości rejestru o jeden

; zmniejszenie zawartości rejestru o jeden

; jeżeli sprawdzana flaga jest prawdziwa
  to ta instrukcja przeniesie nas we
  wskazany obszar pamięci

; porównanie akumulatora z podanym rejestrem
  jeżeli wartości są takie same,
  zmieni się flaga w procesorze

; dodanie pierwszego rejestru do drugiego

; dodanie do rejestru podanej wartości

; wykonanie funkcji XOR na rejestrze

Przydadzą się również przykłady zastosowania tych komend.

OPERATION              
LD	A,A0H


LD	B,11110000B


LD	BC,11553D



INC	A

DEC	BC

JP nz,0000H

CP	B


CP      E
JP nz,0005H

ADD     C,B

ADD     DE,100H

XOR	A

; do akumulatora zostanie wpisana wartość
  heksadecymalna A0, czyli decymalne 160

; do rejestru B zostanie wpisana wartość
  binarna 11110000, czyli decymalne 240

; dwa rejestry zostaną połączone, dzięki czemu
  możesz zapisać dwa bajty pamięci, czyli dość
  spore liczby, tutaj decymalnie 11.553

; zwiększenie zawartości akumulatora

; zmniejszenie zawartości rejestrów BC

; jeżeli rejestr A jest zerem wykona się skok

; ten rozkaz porówna rejestr B z akumulatorem
  jeżeli są równe, flagi zostaną zmienione

; taki zestaw rozkazów powoduje przeskok tylko
  wtedy gdy akumulator i rejestr E są równe

; do rejestru C dodaj B

; do rejestrów DE dodaj wartość 100H (256)

; xor akumulatora skutkuje wyzerowaniem

Przejdzmy do programów.

Program I

Zadaniem programu jest zmniejszanie podanej zmiennej o jeden, aż stanie się zerem.

ADDR
0000H
0002H
0003H
OPERATION       
LD	A,F1H
DEC	A
JP	NZ,0002H

; ładuję heksadecymalną wartość do akumulatora
; zmniejszam wartość akumulatora o jeden
; jeżeli wartość akumulatora nie jest zerem,
  idź do komórki 0002H

Zauważ, że nie wszystkie rozkazy zajmują tyle samo pamięci. Rozkaz LD zajmuje jeden bajt na "własną deklarację", oraz drugi bajt który jest przypisywaną wartością. To gdzie ta wartość ma zostać wpisana znajduje się już w pierwszym bajcie.

Zadanie pierwsze

Ten diagram w uproszczonej postaci pokazuje algorytm, który program wykonuje.

Program II

Kolejmy program miał za zadanie tak długo zwiększać zawartość akumulatora, aż zrówna się z wartością w innym rejestrze.

ADDR
0000H
0002H
0003H
0004H
0005H
OPERATION       
LD	B,F1H
XOR	A
INC	A
CP	B
JP	NZ,0003H

; ładuję określoną wartość do akumulatora
; pamięcio-oszczędny sposób na wyzerowanie
; zwiększam wartość akumulatora o jeden
; porównuję akumulator z rejestrem B
; jeżeli wartość akumulatora nie jest
  zerem (komparacja była nieprawdziwa),
  idź do komórki 0003H

W tym programie ma miejsce to zestawienie komendy porównania i skoku, które razem tworzą warunkowanie.

Program III

Następny program działał tak samo ale na liczbach dwubajtowych.

ADDR
0000H
0003H
0006H
0007H
0008H
0009H
000CH
000DH
000EH
OPERATION       
LD	BC,0H
LD	DE,100FH
INC	BC
LD	A,B
CP	D
JP	NZ,0006H
LD	A,C
CP	E
JP	NZ,0006H

; zeruję rejestry B i C.
; ładuję 100FH do rejestrów D i E.
; zwiększam wartość rejestrów BC o jeden.
; ładuję rejestr B do akumulatora.
; porównuję akumulator z rejestrem D.
; jeśli komparacja nie udała się idź 0006H.
; ładuję rejestr C do akumulatora.
; porównuję akumulator z rejestrem E.
; jeśli komparacja nie udała się idź 0006H.

Dzięki połączeniu rejestrów możliwe było wprowadzenie do pamięci wartości większej niż 11111111B, 255, FFH. W tym przypadku 100FH, czyli 4111.

Program VI

Zadaniem czwartego programu było zsumowanie cyfr jedności i dziesiątek z dnia i miesiąca urodzin programisty. ;)

ADDR
0000H
0002H
0004H
0006H
0008H
0009H
000AH
OPERATION       
LD	A,1H
LD	B,4H
LD	C,1H
LD	D,0H
ADD	A,B
ADD	A,C
ADD	A,D
; ładuję do akumulatora jedności dnia.
; ładuję do rejestru B dziesiątki dnia.
; ładuję do rejestru C jedności miesiąca.
; ładuję do rejestru D dziesiątki miesiąca.
; dodaję rejestr B do akulumatora.
; dodaję rejestr C do akulumatora.
; dodaję rejestr D do akulumatora.

Na kolokwium możliwe, że będzie wymagana prezencja wyniku w konkretnym rejestrze, a nie w akumulatorze. Wystarczy załadować akumulator do któregokolwiek rejestru i napisać, że tam jest wynik.

Ten artykuł jest niekompletny - nie miałem trzecich zajęć, ponieważ prowadzący był nieobecny. Jeżeli posiadasz dobre sprawozdanie na ten temat, napisz do mnie na Gadu-Gadu: 4875413.