0. Pengantar
• Mikroprosesor yang akan kita bahas dalam mata kuliah Sistem Tertanam adalah “Zilog Z80”. Lebih
lanjut kita akan merangkai suatu sistem mikrokomputer yang lengkap dengan menggunakan
mikroprosesor ini. Tetapi sebelumnya kita perlu mengenal cara pemrograman dengan menggunakan satu
sistem yang sudah jadi dan dibuat khusus untuk mempelajari tentang mikrokomputer yaitu dengan
menggunakan “Learning System LS Z80” dari perusahaan “Binary System”/Singapore.
• Mikroprosesor Z80 dibuat oleh perusahaan “Zilog”. Z80 merupakan mikroprosesor 8-Bit (Databus: 8-
Bit) yang paling canggih, sehingga dipakai dalam Personal Computer yang menggunakan sistem operasi
CPM. Perkembangan lebih lanjut dari CPM adalah DOS. Program-program dari CPM masih bisa
dijalankan dalam DOS. Program-program itu bersuffix (akhiran nama file) .COM.
• Dalam praktikum ini kita tidak akan menggunakan sistem operasi. Dalam Learning Sistem yang kita
gunakan sudah diprogram suatu sistem MONITOR. Sistem monitor itu berfungsi mirip dengan
DEBUGGER. Dengan monitor kita dapat melihat segala macam akses seperti misalnya melihat isi
register-register mikroprosesor atau isi memori, kita bisa mengubah semua data dan menjalankan
program-program yang kita buat.
• Kita menggunakan mikroprosesor Z80 karena untuk experiment Hardware, Z80 lebih sederhana
daripada mikroprosesor yang lain. Sedangkan untuk kemampuan software kita menggunakan bagian
perintah mesin yang kompatibel dengan seri mikroprosesor Intel 8080 dan Intel 8085. Sehingga untuk
sintax bahasa Assembler kita menggunakan yang dipakai oleh Intel bukan yang dari Zilog. Jadi kalau
Anda mencari buku-buku, untuk Hardware sebaiknya dipakai buku-buku tentang mikroprosesor Z80
dan untuk Software sebaiknya dipakai buku tentang Assembler untuk mikroprosesor Intel 8080/8085.
Struktur Register:
8 bit 8 bit
A (Accu) Flags A (Accu/ Akumulator): Akumulator mengumpulkan segala macam data,
khususnya hasil-hasil perhitungan yang selalu disimpan dalam Accu.
B C B,C (8-Bit General Purpose Registers): BC dapat menjadi pasangan register
data yang mempunyai pointer 16 Bit dengan B sebagai High Byte dan C
sebagai Low Byte.
D E D,E (8-Bit General Purpose Registers): DE dapat menjadi pasangan register
data yang mempunyai pointer 16 Bit dengan D sebagai High Byte dan E sebagai
Low Byte.
H L H,L: Pointer-Register. Sebagai operand Assembler disebut M, yaitu [HL], tetapi
juga bisa dipakai sebagai General Purpose Register
PC PC: Program Counter (menunjuk ke alamat dengan perintah mesin yang akan
dikerjakan)
SP SP: Stack Pointer (menunjuk ke alamat yang merupakan puncak Stack)
16 bit
Ada problem atau soal 1. Program atau soal harus dianalisa dan
dipecahkan agar menghasilkan suatu
yang harus dikerjakan.
struktur data dan suatu algoritma yang
dapat diprogram. Algoritma tersebut
Menganalisa
agar 1 ditampilkan dalam bentuk Flowchart atau
dapat algoritma menjelaskannya dengan kata-kata. Tetapi
untuk bahasa Assembler Flowchart sangat
Flowchart efisien!
Kalau kita sudah dapat opcode dan sudah memasukkan opcode itu ke dalam memori di LS Z80, tinggal kita
menjalankan program kita. Kalau programnya tidak berfungsi, kita harus mencari kesalahan. Tergantung
kesalahannya, mungkin kita harus memperbaiki atau mengulangi langkah 4 (memasukkan opcode), langkah
3 (mengasseblerkan), langkah 2 (memrogram) atau langkah 1 (memperbaiki algoritma kita).
1. Menganalisa problemnya.
Satu variable harus pada awal=3 dan kemudian beberapa kali dikurangi dengan 1 sampai variable itu
menjadi 0.
Counter 3..0
Variable = 3
Ulang
Variable dikurangi
dengan 1
Tidak
Variable = 0 ?
Ya
END
2. Membuat program
• Penentuan struktur data: Sebagai variable sebaiknya dipakai register A (Accu).
• Perintah pertama (Variable := 3) direalisasikan dengan perintah MOV A,3. Namun dalam sintax
Assambler 8085 tidak ada perintah MOV A,3 sehingga harus dipakai perintah MVI (move immediate =
load konstanta) dengan huruf “I” untuk menunjukkan cara pengalamatan “immediate” = konstanta.
• Untuk perintah berikutnya pada label “Ulang” (Variable dikurangi dengan 1) kita menggunakan perintah
“DCR A”.
• Perintah keputusan: Kalau syarat “Variable = 0” tidak digenapi maka kita harus bercabang ke label
“Ulang”. Kita menggunakan perintah “JNZ Ulang” yang berarti akan bercabang ke ulang apabila Zero-
Flag tidak aktif (Z<>0). Perintah sebelumnya (yaitu DCR A) mempengaruhi Zero-Flag dan membuat
Zero-Flag aktif bila hasil dari DCR A menjadi “0”. Apabila Zero-Flag menjadi aktif (Z=0), perintah JNZ
tidak akan bercabang, tetapi program akan berakhir.
• Sebagai perintah terakhir kita memilih perintah “HLT”, yang menghentikan seluruh kegiatan
mikroprosesor sampai direset.
• Untuk melakukan praktek kita harus mencatat program Assembler sesuai dengan cara-cara berikut:
(Bandingkan dengan program-listing berikut!)
3. Mengassemblerkan program
• Tentukanlah alamat awal dari program terlebih dahulu! Kita pilih alamat 2100 yang merupakan alamat
“default” (selalu dipakai kalau tidak ada alasan untuk memilih yang lain).
• Berikutnya kita mengisi Byte-Byte opcode untuk baris pertama dari program kita: Ada perintah MVI
A,3. Kita harus mencari pada lembar “opcode-opcode untuk semua perintah”. Di sana ada satu
kelompok perintah bernama “Move Immediate” di mana ada perintah “3E MVI A, D8”. Itu berarti
bahwa 3Eh merupakan opcode untuk perintah MVI A dan D8 berarti 8 Bit konstanta masih juga perlu
sebagai opcode dari perintah itu. Maka opcode untuk perintah MVI A,3 menjadi dua Byte: 3E dan 03.
Sekarang kita mengisi tempat untuk opcode di program kita:
• Langkah berikutnya adalah mengisi alamat pada perintah berikutnya. Alamat sekarang menjadi 2102h
karena ditambahkan dua byte opcode dari perintah pertama ke alamat awal 2100h.
• Sekarang kita harus lagi mencari perintah baru, yaitu “DCR A” pada lembar “opcode-opcode untuk
semua perintah”. Di situ kita dapat opcode 3D di kelompok perintah “Decrement”. Ini perintah tanpa
parameter lagi selain A, maka perintah ini hanya memiliki satu Byte Opcode. Sekarang kita mengisi
tempat untuk opcode di program kita:
• Sekarang kita harus mencari opcode untuk JNZ. Kita mencarinya pada lembar “opcode-opcode untuk
semua perintah” pada kelompok perintah “Jump”. Di sana tertulis: “C2 JNZ Adr”. Itu berarti opcode
untuk JNZ adalah C2h dan diperlukan Adr (yaitu Address=alamat) 2 Byte lagi untuk alamat Jump!
Alamat kita adalah label “Ulang”. Label “Ulang” merupakan alamat 2102. Maka 02 adalah Low Byte
yang harus disimpan pada Low Address (2104h) dan 21 adalah High Byte yang harus disimpan pada
High Address (2105h). Jadi seluruh opcode untuk perintah “JNZ Ulang” adalah C2 02 21, yaitu 3 Byte
• Langkah berikutnya adalah mengisi alamat pada perintah berikutnya (“HLT”), alamat sekarang menjadi
2106h karena ditambahkan tiga byte opcode dari perintah terakhir pada alamat 2103.
• Tinggal kita mencari opcode untuk perintah “HLT”. Ini bisa ditemukan di kelompok perintah
“Control”dan mempunyai opcode 76h. Maka kita mengisi opcode dari perintah terakhir dari program
yang telah kita buat pada tempat yang disiapkan untuk Byte-Byte opcode sebelumnya.
Jadi sekarang program kita sudah diassemblerkan. Tinggal langkah-langkah praktis, yaitu bagaimana
...
• menyimpan Byte-Byte program dan data dalam memori dari LS Z80 / mengedit isi memori.
• menjalankan satu program (single step, run, set/clear breakpoint).
• memeriksa dan mengubah isi register-register.
1. Menghidupkan LS Z80
1. Buka kotak untuk LS Z80. Keluarkan board LS Z80 dari plastik. Simpan plastiknya baik-baik, sebab
setelah memakainya kita akan memasukkan kembali ke dalam plastik.
2. Keluarkan adaptor power-supply dari kotaknya. Pasangkan ke dalam stopkontakt yang ada di atas meja.
Kemudian steker dari kabel adaptor power supply kita masukkan ke jack untuk power supply pada
board LS Z80, yang terletak di sebelah kanan LED-7-segment display. Ada dua jack yang sama lagi di
kiri dari display, tetapi bukan untuk power supply, melainkan untuk load/save dari tape.
2 1 0 0 X X
Alamat Data
• Sekarang cobalah untuk memasukkan alamat yang baru, yaitu 2234. Tekan tombol-tombol berikut:
• Setellah alamat-alamat berikut untuk latihan dan catatlah isi memori yang ditunjuk pada kedua angka.
Tulislah pada tabel di sebelah kanan.
•
Alamat Isi
098D
0525
0818
• Dalam modus untuk mengisi memori, kita sekarang bisa mengubah data pada alamat yang sedang aktif.
Alamat yang sedang aktif adalah alamat yang ditunjukkan di keempat angka 7-segment display.
• Contoh: Kita akan mengubah data pada alamat 2234 menjadi 5A. Apabila alamat 2234 belum disetel
Anda harus menyetelnya dulu dengan perintah/tombol <MEM> seperti dijelaskan pada nomor 2.2. .
Kalau alamatnya sudah 2234 tekan tombol-tombol berikut:
• Sekarang kita mencoba prinsip indikator aktif, yaitu titik-titik. Kalau titik-titik nyala pada sisi display
alamat, maka kita bisa mengubahkan alamat (memory-mode), kalau titik-titik nyala pada sisi display
• Selain menaikkan alamat untuk memori ada juga beberapa fungsi lain dari tombol <+>. Fungsi-fungsi
tersebut nanti dijelaskan menurut konteksnya masing-masing.
• Contoh: Kita akan menyimpan data 7E pada lokasi/alamat memori 2235. Kalau alamat yang sedang aktif
2234, maka kita harus mengubah/menaikkan pada lokasi/alamat memori berikutnya, yaitu 2235 dan
kemudian menyimpan data 7E pada lokasi tersebut. Tekanlah tombol-tombol seperti berikut:
• Selain menurunkan alamat untuk memori ada juga beberapa fungsi lain dari tombol <->. Fungsi-fungsi
tersebut nanti dijelaskan menurut konteksnya masing-masing.
• Contoh: Kita mengubah isi dari lokasi/alamat memori 2234 menjadi 10. Bila alamat yang sedang aktif
2235, maka kita harus mengubah/menurunkan lokasi memori agar menjadi lokasi memori sebelumnya,
yaitu 2234 dan kemudian menyimpan data 10. Tekanlah tombol-tombol seperti berikut:
• Perintah/tombol <INS> akan memasukkan satu byte kosong (00) ke alamat yang sedang aktif. Semua
data mulai dari alamat aktif akan digeser ke satu lokasi yang lebih tinggi. Sesudah <INS> kita bisa
memasukkan data baru. <INS> berfungsi dalam “memory mode” atau “entry mode”.
• Contoh: Kita akan meng-insert-kan data 22 pada lokasi/alamat memori 2235. Jadi sekarang memori
harus diset ke alamat 2235 dulu, kemudian kita menekan <INS> dan memasukkan 22. Tekanlah tombol-
tombol seperti berikut:
Isi memori sebelum dan sesudah insert menjadi seperti ditunjukkan di bawah:
• Perintah/tombol ini akan menghapus isi dari lokasi/alamat yang sedang aktif. Semua data yang disimpan
pada alamat-alamat yang lebih tinggi daripada alamat yang sedang aktif akan digeser satu posisi yang
lebih rendah. Perintah/tombol <DEL> berfungsi dalam “memory-mode” dan “entry-mode”.
• Contoh: Kita menghapus isi dari lokasi memori 2235. Jadi kita menyetel lokasi/alamat yang sedang aktif
menjadi 2235 dan kemudian kita menekan <DEL>. Tekanlah tombol-tombol seperti berikut:
Isi memori sebelum dan sesudah Delete ditunjukkan seperti tabel di bawah:
• Sekarang masukkan program contoh dari pengantar. Mulai dari alamat 2100, simpan Byte-Byte berikut:
3E, 03, 3D, C2, 02, 21, 76. Jadi Byte terakhir, yaitu 76 harus disimpan pada alamat 2106. Dengan
demikian kita sudah memasukkan satu program ke dalam memori yang bisa kita jalankan.
• Program Monitor dari LS Z80 aktif lagi sesudah perintah itu dikerjakan, dan dengan demikian kita bisa
memeriksa seluruh pengaruh terhadap memori/register/flag-flag oleh perintah yang baru selesai
dijalankan. Jadi satu program bisa dijalankan secara perintah demi perintah serta bisa diperiksa pengaruh
setiap perintahnya.
• Setiap kali sesudah dijalankan satu <STEP> maka alamat dari perintah berikutnya ditunjukkan serta isi
dari alamat itu.
• Contoh: Kita menjalankan perintah pertama dari program yang ada pada nomor 2.7 yang sudah kita
simpan, yaitu “MVI A,03”. Perintah “MVI A,03” terdiri atas dua Byte, yaitu 3E (pada alamat 2100)
dan 03 (pada alamat 2101). Maka kita harus mengaktifkan alamat/lokasi memori dari Byte pertama dari
perintah “MVI A,03”, yaitu 2100. Sesudah kita menjalankan/me-STEP-kan perintah “MVI A,03”, maka
alamat dari perintah baru yang ditunjukkan harus 2102. Tekanlah tombol-tombol seperti berikut:
• Contoh: Kita menjalankan program yang ada pada nomor 2.7 yang sudah tersimpan. Untuk itu kita
harus menyetel alamat 2100 aktif dulu dan kemudian tekan tombol <RUN>. Kerjakan dua langkah itu.
Apa yang ditunjukkan pada display sesudah dijalankan <RUN>?
• Contoh: Sesudah program kita di-run (pada nomor 3.2.) tekan tombol <EXIT>. Maka monitor akan aktif
dan menunjukkan alamat sesudah perintah terakhir dari program kita, yaitu alamat 2107. Pada alamat
2106 ada perintah HLT yang menginaktifkan prosesor. Jadi tekan tombol-tombol berikutnya:
• Kalau program kita dijalankan dengan <RUN> maka program itu tidak akan berhenti sendiri pada lokasi
di mana kita ingin memeriksa sistem kita. Sebab itu ada “Breakpoint”, yaitu berarti “titik/lokasi
berhenti”. Dengan <SBP> kita bisa menandai satu lokasi program, yaitu alamat, di mana perjalanan
program kita akan berhenti.
• Maksimal enam Breakpoint bisa di-set. Tanda bahwa ada Breakpoint pada satu alamat adalah bahwa
titik-titik pada semua angka menyala.
• Contoh: Misalnya kita ingin melihat kondisi register A (Accu) setiap kali sebelum A dikurangi dengan
satu (dengan perintah “DCR A”). Sebab itu kita harus me-set satu “Breakpoint” pada alamat untuk
perintah “DCR A”. Maka program kita akan berhenti sebelum perintah ini dijalankan. Jadi kita harus
mengaktifkan alamat dari perintah “DCR A”, yaitu 2102 dan kemudian menekan <SBP>. Sesudah itu
program bisa dijalankan dari awal 2100 dengan <RUN>, tetapi akan berhenti pada alamat 2102.
Kemudian kita bisa periksa, misalnya isi dari register A dan melanjutkan program kita dengan <STEP>
dan kemudian <RUN> sampai program kita mencapai lagi alamat Breakpoint. Jadi tekan tombol-tombol
berikutnya:
• Contoh: Kita menghapus “Breakpoint” yang tadi di-set pada nomor 3.4.. Untuk itu kita harus menjadikan
alamat 2102 sebagai alamat yang sedang aktif dan kemudian tekan tombol <CBP>.
• Contoh: Kita memeriksa isi dari register C dan mengubahnya menjadi 47. Tekan tombol-tombol berikut:
Contoh: Kita sekarang mengubah isi dari register B sehingga menjadi 5A. Tekan tombol-tombol berikut:
X.X.X X D.E
X.X.X X H.L
4.4. Tombol <AF> (Memeriksa dan Mengubahkan Isi Accumulator A dan Register Flag F)
• Dengan Tombol <AF> kita bisa memeriksa dan mengubah isi dari register Accumuator A dan register
Flag F. Caranya mengubah dan memeriksanya sama dengan cara pada tombol <BC>. Hanya display
menjadi:
X.X.X X A.F
Maka untuk mengetahui apakah suatu Zero-Flag diset atau tidak, kita harus mengubah nilai heksadesimal
(yang bisa kita baca) untuk isi register F menjadi dual. Misalnya F=66h berarti F= 0110 0110. Maka
bit6=“1”, jadi Zero-Flag=“1”. Atau kalau kita membaca F= 3Dh berarti F= 0011 1101. Maka bit6=“0”,
jadi Zero-Flag=“0”.
• Contoh: Kita menjalankan program yang ada pada nomor 2.7. yang sudah tersimpan dan dengan
memakai Breakpoint sebelum perintah “JNZ Ulang” (disimpan: 2103: C2 02 21) dan memeriksa isi dari
Accu serta memeriksa kondisi Zero-Flag. Dari kondisi Zero-Flag kita bisa mengetahui apakah perintah
“JNZ Ulang” akan bercabang lagi ke label Ulang atau program akan masuk ke perintah “HLT” untuk
berakhir. Kalau Zero-Flag masih “0” maka “JNZ Ulang” (JNZ = Jump if not Zero) akan bercabang.
Tekan tombol-tombol berikut dan isi kondisi-kondisi apa yang Anda baca untuk A dan Zero-Flag:
Variable = 3
MVI A,3
Ulang
Variable dikurangi
dengan 1; DCR A
Tidak
Variable = 0 ?
JNZ Ulang
Ya
END
HLT
4.5. Tombol <SP> (Memeriksa dan Mengubahkan Isi Stack Pointer SP)
• Dengan Tombol <SP> kita bisa memeriksa dan mengubah isi dari register “Stack Pointer” SP.
• Contoh: Kita memeriksa isi dari SP dan mengubahnya menjadi 2655. Tekanlah tombol-tombol seperti
berikut:
• Prosedur BEEP memiliki dua parameter: Yang pertama adalah parameter1 untuk menentukan
frekwensi dari bunyi itu, dan yang kedua adalah parameter2 untuk menentukan jumlah gelombang yang
akan kita keluarkan. Parameter1 harus disimpan dalam alamat/lokasi memori 2041 dan parameter2
harus disimpan pada alamat 2042.
• Untuk menentukan frekwensi dari bunyi yang akan dikeluarkan terdapat rumus sebagai berikut:
5000
Parameter1=
Frekwensi
Jadi apabila kita mau mengeluarkan satu bunyi dengan frekwensi 500Hz, maka dalam rumus harus mengisi
5000
nilai untuk frekwensi 500. Maka rumus untuk parameter1 menjadi, Parameter1 = = 10 . Sehingga
500
pada alamat 2041 (alamat untuk parameter1) kita harus menyimpan 0A (=10 desimal).
• Untuk mengeluarkan 250 gelombang maka parameter2 harus menjadi FA. Maka pada alamat 2042 kita
harus menyimpan nilai FA.
5.2. Program dalam Bahasa Assembler untuk Memanggil BEEP dengan Parameternya
• Sebelum kita bisa memanggil prosedur BEEP, terlebih dulu kita harus menyimpan parameter-parameter
yang program BEEP perlukan. Untuk menyimpan satu konstanta ke memori kita perlu dua perintah.
Pertama kita “load” konstanta ke register A, dan kemudian kita menyimpan isi dari A ke lokasi memori.
• Perintah untuk me-“load” satu konstanta (misalnya 0A untuk parameter1=> frekwensi = 500Hz) ke
dalam register A adalah “MVI A,0A”.
• Perintah untuk menyimpan isi dari register A ke memori pada alamat 2041 adalah “STA 2041”, yaitu
berarti “Store Accu at Address 2041”.
• Untuk menyimpan konstanta FA ke alamat 2042 untuk parameter2 (untuk mengeluarkan 250
gelombang) kita harus memakai dua langkah yang sama seperti untuk parameter1. Pertama kita
menyimpan konstanta FA ke dalam register A dengan perintah “MVI A,FA”. Kemudian kita
menyimpan isi dari register A ke memori pada alamat 2042 dengan perintah “STA 2042”.
• Sesudah itu kita bisa memanggil prosedur BEEP dengan perintah CALL. Maka perintah kita menjadi
“CALL 079E”.
• Jalankan program ini dengan <RESET>, <MEM>, <RUN>. Ubahkan parameter1 dengan nilai-nilai
04,07, 0D dan 12. Maka Byte di program pada alamat berapa harus diganti?
Buatlah loop ke alamat 2100 kembali dengan menggantikan perintah “HLT” dengan “JMP START”.
Tanda tangan dosen / asistent:
5. Soal-Soal yang harus dikerjakan dulu sebelum bisa masuk Praktikum ini
1. Jelaskan langkah-langkah untuk membuat satu program dengan LS Z80. Mulai dari problem yang mau
dikerjakan dengan LS Z80 sampai menjalankan programnya !
2. Jelaskan mengapa ada perintah-perintah dengan 1, 2 dan 3 Byte opcode. Berikan contoh untuk setiap
macam jumlah opcode.
3. Contoh: Mulai pada alamat 2300h harus disimpan JMP LOOP. LOOP adalah label untuk alamat 2340.
Maka ketiga Byte opcode dari alamat 2300, 2301 dan 2302 menjadi berapa? Jelaskan secara rinci
bagaimana peraturan “High Byte ke High Address dan Low Byte ke Low Address” diaplikasikan untuk
urutan menyimpan parameter alamat label LOOP.
4. Kalau untuk kondisi register F dibaca 3E, maka Sign-Flag, Zero-Flag dan Carry-Flag masing-masing
dalam kondisi apa? Bagaimana kalau register F = 97?