Disusun oleh
Nama : Yudi Irwanto
NIM : 021500456
Prodi : Elektronika Instrumentasi
Tanggal Praktikum : 28 April 2017
Asisten : Rokhmat Arifianto
Adib Afham
A. TUJUAN PRAKTIKUM
1. Untuk membiasakan penerapan instruksi-instruksi cabang bersyarat dan tak
bersyarat.
2. Dapat melakukan teknik-teknik perancangan program loop.
B. DASAR TEORI
JR 10H : Loncat ke depan 10H (16) lokasi dari pencacah program yang saat itu
dipakai (alamat instruksi berikutnya). Sebenarnya alamat instruksi yang
akan dilaksanakan berikutnya didapat menambah 10H pada pencacah
program (PC) yang sedang dipakai.
JR C,F0H : Jika carry flag = 1, loncat ke belakang 10H (16) lokasi. Karena bit F0H
yang paling kiri adalah = 1, hal ini diketahui sebagai bilangan negatif
(komplemen ke-2 nya adalah 10H).
JR NC,7FH : Jika carry flag =0, loncat ke depan 127 lokasi (nilai maksimum).
JR Z,80H : Jika zero flag = 1, yaitu bila hasil dari operasi yang terdahulu adalah nol,
loncat ke belakang 128 lokasi. 80H (-128) adalah bilangan negatif
minimum yang dapat digunakan dalam alamat relatif.
Dari contoh-contoh di atas, kita dapat melihat bahwa alamat relatif yang positif berarti loncat
ke depan. Perloncatan yang paling besar adalah 7FH (+127). Alamat relatif yang negatif berarti
loncat ke belakang, perloncatan yang paling besar adalah 80H (-128). Perloncatan ini selalu
diukur dari alamat opcode operasi berikutnya. Jump relatif bisa tak bersyarat ataupun bersyarat.
Loncat bersyarat tergantung dari status carry flag atau zero flag. Dalam sistem Z80, data pada
sign flag atau P/V flag tidak dapat digunakan sebagai syarat dari satu jump relatif.
5. Program Loop
Salah satu keunggulan komputer yang paling penting adalah bahwa komputer tersebut dapat
mengulangi langkah-langkah yang diperlukan dalam menyelesaikan suatu tugas sebanyak
mungkin sampai tugas yang bersangkutan selesai dilaksanakan. Hal ini didapat dengan
mempergunakan program loop. Loop merupakan suatu alat yang penting dalam merancang
program.
Program loop dasar harus mencakup hal-hal dibawah ini:
(1) Suatu preset loop counter (penghitung loop) dengan jumlah loop yang harus dilakukan.
Biasanya, suatu register dalam CPU dapat dipakai sebagai penghitung loop. Tentu saja
memori dapat juga dipakai penghitung loop.
(2) Penghitung loop dikurang dengan 1 setiap kali satu putaran loop selesai dilakukan.
Setiap selesai satu putaran, nilai penghitung loop harus diperiksa. Jika penghitung tidak
sama nol, loop diulangi sampai penghitung loop sama dengan nol.
Program berikut ini dapat digunakan untuk menjulahkan data 8 bit pada alamat 1900H - 190FH
dan menyimpan hasilnya pada pasangan resister DE.
label LD C,10H Pergunakan resister C sebagai penghitung loop. Karena 16
data 8 bit akan dijumlahakan bersama, preset 10H dibuat di C.
XOR A Nol-kan accumulator dan carry flag.
LD HL, 1900H Gunakan pasangan register HL sebagai penunjuk alamat. Isi
memory yang alamatnya ditunjukkan oleh HL akan
ditambahkan ke register A. Alamat pertama adalah 1900H.
LD D, A Register D digunakan untuk menyimpan carry yang dihasilkan
pada operasi penambahan. nol-kan register D.
xx ADD A, (HL) Tambahkan isi memori yang alamatnya ditunjukkan oleh HL
ke register A, Intruksi ini akan diulangi sebanyak 16 kali. xx
dapat diisi sebagai label alamat intruksi ini.
INC HL Menambah HL dengan 1. HL yang baru menunjuk pada data
berikutnya yang ada pada memory untuk ditambahkan pada
register A.
JR NC,YY Jika dihasilkan cary, loncat ke alamat YY untuk melanjutkan
pelaksanaan program.
INC D Jika dihasilkan carry, tambahkan carry ini pada register D.
yy DEC C Kurangi register C dengan 1.
JR NZ, xx Jika hasilnya tidak sama dengan nol (zero flag). Program loop
belum selesai. Loncat ke xx untuk mengulangi loop.
LD E, A Jika zero flag = 1 semua data telah telah ditambahkan
bersama-sama. Isikan A pada E, hasilnya akan disimpan
dalam pasangan register DE
D. PERCOBAN-PERCOBAAN
Ada berbagai metoda dalam merancang suatu program loop. cobalah untuk merancang
program loop yang digambarkan dalam intruksi-intruksi berikut ini :
1. Program Loop dengan jumlah loop lebih kecil dari 256.
Jika jumlah loop lebih kecil dari 256, register B dianggap sebagai penghitung loop. Pada
akhir loop, intruksi DJNZ dapat dipakai untuk mengurangi register B dengan 1. Jika hasilnya
tidak sama dengan nol, loncat ke lokasi yang ditunjuk dengan mempergunakan metode
JUMP RELATIF untuk melanjutkan pelaksanaan program. Gunakan tabel C4 atau tabel C-
21 untuk instruksi Jump. Cobalah untuk menganalisa program berikut ini dan memeriksa
fungsinya masukkan pada uPF-1 dan jalankan.
ORG 1800H
LD HL, 1900H
LD B, 20H
LOOP LD (HL), A
INC HL
DJNZ LOOP
RST 38H
2. Program Bersarang.
Dalam program-program yang lebih rumit, suatu loop dapat bersarang atau berada didalam
loop yang lain secara total.program berikut ini dapat digunakan untuk memmbagi data 256
byte yang tersimpan dalam memori menjadi 16 kelompok. Alamat awal memori adalah
1900H. Ubahlah isi setiap kelompok data dalam bentuk bilngan hexadesimal :
0………(set ke-1), 1……. (set ke-2), 2….. (set ke-3),……; F…..(set ke-16).
LD HL,19FFH
LD C, OFH
LOOP2 LD B, 10H
LOOP1 LD (HL), C
DEC HL
Loop kecil DJNZ LOOP1
DEC C
Loop besar JP NZ, LOOP2
RST 38H
ORG 1800H
LD BC, 0180H
LD HL, 1880H
LOOP LD (HL), AAH
INC HL
DEC BC
JR NZ, LOOP
RST 38H
4. Program Loop tanpa penghitung mundur (down counter)
Suatu program loop tidak membutuhkan penghitung mundur dapat diganti dengan
penghitung ke atas (maju) atau dengan menggunakan metoda perbandingan alamat
atau perbandingan data. Pelajari metoda yang di pakai dalam program loop berikut ini. Isikan
program ke uPF-1, kemudian jalankan.
1) Pindahkan rangkaian data pada daerah memori RAM dengan alamat awal 1A00H.
Perpindahan akan dihentikan bila data FFH ditemukan.
ORG 1800H
LD HL, 1B00H
LD DE, 1A00H
Loop LD A, (HL)
LD (DE), A
CP FFH
JR Z, EXIT
INC HL
INC DE
JR Loop
Exit RST 38H
2) Gantilah semua data yang tersimpan pada daerah memori yang dimulai pada alamat yang
ditunjuk oleh HL sampai alamat yang ditunjuk DE dengan nilai komplemen ke-2 nya.
Untuk mencoba program, nilai HL harus lebih besar dari pada nilai DE.
ORG 1800H
LOOP LD A, (HL)
NEG
LD (HL), A
INC HL
AND A
SBC HL, DE
ADD HL, DE
JR NZ,LOOP
Latihan Soal.
Dalam program-program yang lebih rumit, suatu loop dapat bersarang atau berada
didalam loop yang lain secara total.program berikut ini dapat digunakan untuk membagi
data 256 byte yang tersimpan dalam memori menjadi 16 kelompok. Alamat awal memori
adalah 1900H. Jalankan program tersebut dan analisa hasilnya, mengapa begitu ?
Komentar anda tentang Reg C diisi 00H ?
Alamat Bhs mesin Label Opcode Operand Keterangan
1810 21 FF 19 LD HL,19FFH Isi HL 1900 sbg alamat
1813 0E 00 LD C, 00H Isi reg C dgn 00 cnt besar
1815 06 10 Loop2 LD B, 10H Isi reg B dg 10 cnt kecil
1817 71 Loop1 LD (HL), C Data di reg C msuk ke HL
1818 28 DEC HL Kurangi HL dgn 1
1819 DEC B Kurangi B dgn 1
JP NZ, Loop1 jika belum = 0 ke loop 1
18.. 00 DEC C Kurangi C dgn 1
18.. JP NZ, Loop2 Jika belum 0 ke loop2
18.. FF RST 38H Selesai
E. HASIL PERCOBAAN
1. Percobaan Loop dengan Jumlah Loop Lebih Kecil dari 256
Bahasa
ORG
2. 1800H Mesin
LD HL, 1900H 21 00 19
LD B, 20H 06 20
LOOP LD (HL), A 77
INC HL 23
DJNZ LOOP 10 FC
RST 38H FF
Hasil percobaan :
1. Preset register A pada nol kemudian jalankan program diatas,
hasilnya : Isi memory alamat 1900H – 190FH : 00
Isi memori alamat 1920H : 00
2. Preset register A pada 55H kemudian jalankan program diatas.
Hasilnya : 55 (1900H – 19IFH
3. Preset register A pada 64H dan gantilah intruksi ke dua LD B,20H dengan
intruksi
LD B,0. Jalankan program.
Hasilnya :1900H – 19FF 64
3. Percobaan Bersarang
A. Membagi data 256 byte menjadi 16 kelompok dan mengisi data
perkelompoknya dimulai dari 0F sampai 01.
- Program
LD HL,19FFH
LD C, OFH
LOOP2 LD B, 10H
LOOP1 LD (HL), C
DEC HL
Loop kecil DJNZ LOOP1
DEC C
Loop besar JP NZ, LOOP2
RST 38H
- Data
Alamat Data Alamat Data
1910H-191FH 01 1990H-199FH 09
1920H-192FH 02 19A0H-19AFH 0A
1930H-193FH 03 19B0H-19BFH 0B
1940H-194FH 04 19C0H-19CFH 0C
1950H-195FH 05 19D0H-19DFH 0D
1960H-196FH 06 19E0H-19EFH 0E
1970H-197FH 07 19F0H-19FFH 0F
1980H-198FH 08
Hasil percobaan:
Alamat Data
1880H AAH
1881H AAH
1882H AAH
Dst. . . AAH
19FFH AAH
Hasil program:
Alamat Data Alamat Data
1B00H 01 1A00H 01
1B01H 02 1A01H 02
1B02H 03 1A02H 03
1B03H 04 1A03H 04
1B04H 05 1A04H 05
1B05H 06 1A05H 06
1B06H 07 1A06H 07
1B07H FF 1A07H FF
F. PEMBAHASAN
Percobaan pertama adalah program loop. Program ini dijalankan untuk
menentukan alamat yang ingin di program. Percobaan pertama bertujuan mendapatkan nilai
alamat memori yang sama dari 1900 H-191F H, pada percobaan ini praktikkan hendak
menginputkan nilai 00. Hal ini dapat diperoleh dengan mengubah regrister A dan memasang
alamat 1920 H. Ketika alamat 1920 H diset dengan FF dan regrister A diset pada nol, maka
isi memori pada alamat 1900H-191FH akan bernilai 00. Jadi pengisian memori alamat 1920
H adalah sebagai batas untuk pemasukkan isi memori, dan pengisian memori pada regrister
A akan berpengaruh pada isian memori alamat 1900 H-191F H. Program ini dapat berjalan
karena adanya loop dengan perintah DJNZ untuk regrister B. Regrister HL berfungsi
sebagai alamat memori yang memiliki alamat awalnya adalah 1900 H. Pada regrister B di
set dengan nilai 20 H, lalu dilakukan program loop yang isinya yaitu memasukkan nilai
regrister A di dalam alamat memori yang berasal dari regrister HL, lalu regrister HL
ditambahkan 1 dengan program INC. Kemudian menggunakan program DJNZ untuk
mengurangi regrister B 1, dan dilakukan loop kembali. Jadi akan mendapatkan hasil loopnya
adalah regrister HL terus bertambah 1 dan setiap penambahan alamat memorinya diisi
dengan regrister A dengan pembatas program loop ini adalah regrister B yang dikurangi 1
hingga nol.
Percobaan kedua adalah program bersarang yang terdapat dua percobaan. Yang
pertama adalah membagi data 256 byte menjadi 16 kelompok dan mengisi data
perkelompoknya dari 01 sampai 0F. Program ini dimulai dariLD, HL 19FFH yang artinya
isi memory alamat yang ditunjuk HL ditambahkan ke register A dengan alamat pertama
19FFH. LD C, 0FH yang artinya nilai 0F diisikan ke register C atau sebagai inisiasi Loop 1.
LD B, 10 H yang artinya penghitung loop 10H kali atau sebagai inisiasi Loop 2. LD (HL), C
yang artinya isikan alamat yang ditunjuk HL (dalam program ini alamat dari 19FFH dengan
loop 10H) dengan register C (dalam program ini 0FH-01H). DEC HL yang artinya
menurunkan nilai alamat HL dengan 1. DJNZ yang artinya mengurangi nilai register C
dengan 1. DEC C yang artinya menurunkan nilai register C dengan 1. JPNZ yang artinya
Jump Relatif if Not Zero untuk loncat ke alamat yang ditunjuk HL jika nilai register C tidak
nol. RST yang artinya reset untuk mengakhiri program. Dapat dianalisa bahwa program ini
membagi data 256 byte menjadi 15 kelompok (tanpa 1900-1909) karena program ini jika
nilai register sudah 0 maka program berhenti. Yang kedua adalah membagi data 256 byte
menjadi 16 kelompok dan mengisi data perkelompoknya dari 00 sampai 0F.Program ini
dimulai dari LD, HL 19FFH yang artinya isi memory alamat yang ditunjuk HL ditambahkan
ke register A dengan alamat pertama 19FFH. LD C, 10H yang artinya penghitung loop 10H
kali. LD D, 0FH yang artinya nilai 0F diisikan ke register D atau sebagai inisiasi Loop 1.
LD B, 10 H yang artinya penghitung loop 10H kali atau sebagai inisiasi Loop 2. LD (HL), D
yang artinya isikan alamat yang ditunjuk HL (dalam program ini alamat dari 19FFH dengan
loop 10H) dengan register D (dalam program ini 0FH-00H). DEC HL yang artinya
menurunkan nilai alamat HL dengan 1. DJNZ yang artinya mengurangi nilai register C
dengan 1. DEC C yang artinya menurunkan nilai register C dengan 1.DEC D yang artinya
menurunkan nilai register D dengan 1 JPNZ yang artinya Jump Relatif if Not Zero untuk
loncat ke alamat yang ditunjuk HL jika nilairegister C tidak nol. RST yang artinya reset
untuk mengakhiri program.
Pada percobaan ketiga,program loop yang digunakan lebih besar dari 256, yakni sebesar
180 H atau dalam decimal 384. Ini berarti perintah loop harus dua kali agar dapat
menyelesaikan permasalahan. Pada percobaan ini praktikan menggunakan cara loop dalam
loop. Dalam hal ini, register 16 bit dipakai sebagai perhitungan loop. Yang menjadi masalah
adalah pada penambahan atau pengurangan suatu register 16 bit tidak berpengaruh pada
status flag. Jadi, dalam percobaan ketiga ini dibutuhkan intruksi tambahan untuk
mengetahui program loop sudah bernilai nol. Pada program percobaan ketiga ini, pertama
praktikan melakukan penginisialisasian pada register yang akan digunakan yakni register
HL. Kemudian mengisi register C dengan 02H dimaksudkan untuk melakukan Loop besar
sebanyak 2 kali karena nilai loop >256. Lalu mengisikan register B dengan C0H
dimaksudkan untuk melakukan loop kecil sebanyak C0H kali. Setelah itu barulah
dimasukan data AAH ke isi register HL dan ditambah dengan 1. Kemudian pada program
DJNZ, artinya melakukan penge-loop-an dengan mengurangi 1 isi register B. penge-loop-an
ini akan terus terjadi sampai isi register B bernilai 00. Apabila sudah bernilai 00, nilai
register C dikurangi dengan 1, dan dilakukan lagi penge-loop-an sampai alamat 1805 yakni
pada LD B, C0H. Pada penge-loop-an JPNZ ini akan terus terjadi sampai isi register C
bernilai 00. Apabila sudah bernilai 00, maka proses telah selesai. Dan hasilnya dapat dilihat
pada isi alamat 1880H-19FFH bernilai AAH.
Pada percobaan keempat, yakni program loop penghitung mundur, praktikan melakukan
penyalinan isi data pada alamat yang dituju. Pada percobaan ini, praktikan akan melakukan
penyalinan data pada register HL ke register DE. Pada program awal, praktikan melakukan
inisialisasi dengan memasukan nilai alamat pada register HL dan DE. Lalu, dalam proses
penyalinan datanya, praktikan menggunakan register A sebagai tempat penyimpanan data
pada register HL sebelum dipindahkan ke register DE. Kemudian barulah dari isi register A
dipindahkan ke alamat pada isi register DE, dengan keadaan isi register tidak berubah
nilainya. Untuk menghentikan proses, ditambahkan program CP FFH yang berfungsi untuk
membandingkan apakah nilai diregister HL bernilai FFH. Apabila nilai di isi register HL
bernilai FFH, maka proses akan selesai, namun apabilai tidak bernilai FFH, maka proses
loop akan terus terjadi.
G.KESIMPULAN
1. Percobaan pertama adalah instruksi loop, bertindak sebagai program untuk pengulangan
atau looping. Suatu instruksi loop akan membuat program mengulang sesuai data yang
kita inginkan dengan batasan-batasan yang diseting pada suatu register.
2. Percobaan kedua adalah program bersarang yang dapat digunakan untuk membagi data
256 byte menjadi beberapa kelompok data yang dapat diatur nilai data perkelompoknya.
3. Percobaan ketiga adalah program loop dengan jumlah loop > 256. Dapat dilakukan
dengan cara melakukan penge-loop-an besar dan penge-loop-an kecil. Penge-loopan
besar sebanyak 2X dan penge-loop-an kecil sebanyak C0H kali.
4. Percobaan keempat adalah program loop tanpa penghitung mundur untuk melakukan
penyalinan data dari suatu register ke isi register lainnya. Proses akan berhenti apabila isi
reg (HL) telah sama dengan nilai FFH.
H. FLOW CHART
Percobaan 1
START
LD HL, 1900H
LD B, 20H
LD (HL), A
INC HL
≠0
DJ N, Z
=0
RST 38H
Data tampil di
alamat yang
ditunjuk HL
END
Percobaan 2
A. Membagi data 256 byte menjadi 16 kelompok dan mengisi data perkelompoknya dari
01 sampai 0F
START
LD HL, 19FFH
LD C, 0FH
LD B, 10H
LD (HL), C
DEC HL
DJ N, Z ≠0
DEC C
≠0
JP N, Z
RST 38H
Data tampil di
alamat yang END
ditujnuk HL
B. Membagi data 256 byte menjadi 16 kelompok dan mengisi data perkelompoknya dari
00 sampai 0F
START
LD HL, 19FFH
LD C, 10H; LD D, 0FH
LD B, 10H
LD (HL), D
DEC HL
DJ N, Z ≠0
DEC C; DEC D
≠0
JP N, Z
RST 38H
Data tampil di
END
alamat yang
ditunjuk HL
Percobaan 3
START
LD HL, 1880H
LD C, 02H
LD B, C0H
LD (HL), AAH
INC HL
DJ N, Z ≠0
=0
DEC C
≠0
JP N, Z
=0
RST 38H
Data tampil di
END
alamat yang
ditunjuk HL
Percobaan 4
START
Inisialisasi register HL
Inisialisasi register DE
LD A, (HL)
INC DE
LD (DE), A
INC HL
Reg(HL)=FFH ? tidak
ya
RST 38H
END