Mikroprosessor & Antarmuka
} }
}
}
Sinyal input Fungsi: meminta pelayanan prosesor Kerja gabungan antara h/w dan s/w dikarenakan uP untuk kaki INTR dan NMI NMI = non maskable interrupt à tidak bisa dihalangi oleh software
1. 2.
◦ ◦
◦ ◦
H/W : Devais mengirim INT S/W :
Menghentikan program yang sedang berjalan Simpan parameter-parameter penting dari program tersebut à agar bisa kembali meneruskan program tsb Menjalankan program pelayanan interupt Ambil parameter-parameter program awal dan teruskan
}
Isi dari register FLAG
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 X X X X O D I T S Z X A X P X C O = Overflow D = Direction I = interrupt X = tidak terpakai
T = Trap S = Sign Z = Zero
A = Auxiliary carry P = Parity C = Carry
I = 0 à melayani interupt, I = 1 à tidak melayani interupt
Alamat : IP dan CS } Isi dari register-register data yang digunakan oleh program interupt }
}
Dihasilkan oleh instruksi INT yang diikuti nomor interupsinya. Contoh : INT 13 berarti interupsi nomor 13H.
Tipe interupsi ini memiliki 2 bagian : a. Bagian yg dihasilkan oleh ROMBIOS (untuk nomor interupsi 0 s.d. nomor interupsi 1FH) b. Bagian yg dihasilkan oleh sistem operasi yg digunakan (untuk nomor interupsi 20H keatas) }
}
Adanya instruksi INT dalam program akan menyebabkan 8088 meninggalkan program yg sedang dikerjakan, dan mengerjakan routine khusus untuk nomor interupsi tersebut. Setelah routine tersebut selesai dikerjakan, maka 8088 akan kembali ke program semula yg tadinya ditinggalkan.
Urutan kerja 8088 saat mengerjakan instruksi INT XX (nilai XX dapat berharga 00H sampai FFH) : 1. Menyimpan isi register ke Stack 2. Mencari alamat routine XX 3. Lompat ke alamat routine tersebut 4. Mengerjakan routine tersebut 5. Kembali ke program semula dgn cara mengembalikan semua isi register dari Stack }
Langkah ini ditujukan untuk mengembalikan kembali isi register setelah routine XX selesai dijalankan. } Yang dilakukan : 1. Push Flag 2. Clear Interrupt Flag 3. Clear Trap Flag 4. Push CS 5. Push IP }
Sebelum dapat menjalankan routine XX, 8088 harus mencari terlebih dahulu dimana routine XX tersebut berada. } Untuk mendapatkan alamat routine tsb, 8088 akan mencarinya di Interrupt Vector Table yg ada di alamat 00000H sampai 003FFH (setiap interupsi membutuhkan 4 byte : 2 byte untuk alamat Segment dan 2 byte untuk alamat Offset) }
address
Content
003FF
02
003FE
46
003FD
F0
003FC
00
00003
00
00002
C9
00001
0F
00000
9E
Description Segment address Interrupt #FF Offset address
Segment address Interrupt #00 Offset address
}
}
}
Lompat ke alamat routine XX Melompat ke instruksi awal dari routine XX dgn melakukan lompatan JMP SSSS:OOOO dimana SSSS adalah alamat Segment dan OOOO adalah alamat Offset. Mengerjakan routine XX 8088 akan mengerjakan semua instruksi yg ada sampai ditemukan instruksi IRET (Interrupt Return) Kembali ke program semula Jika instruksi IRET dikerjakan, maka semua isi regiter yg tadi disimpan, akan dikembalikan. Yang dilakukan : (1) Pop IP, (2) Pop CS, (3) Set Trap Flag, (4) Set Interrupt Flag, (5) Pop Flag
}
Adanya sinyal +5V pada pin 18 pada 8088 akan menyebabkan 8088 meninggalkan program yg sedang dikerjakan, dan mengerjakan routine khusus untuk nomor interupsi tersebut. Setelah routine tersebut selesai dikerjakan, maka 8088 akan kembali ke program semula yg tadinya ditinggalkan.
Urutan kerja 8088 saat mendapatkan sinyal aktif pada pin 18 (INTR) : 1. Menyimpan isi register ke Stack 2. Mengaktifkan sinyal INTA (Interrupt Acknowledged) di pin 24 3. Membaca nomor interupsi di Address Bus (A0 – A7) 4. Mencari alamat routine untuk nomor interupsi tersebut 5. Lompat ke alamat routine tersebut 6. Mengerjakan routine tersebut 7. Kembali ke program semula dgn cara mengembalikan semua isi register dari Stack }
}
}
}
Menyimpan isi register ke Stack Langkah ini ditujukan untuk mengembalikan kembali isi register setelah routine selesai dijalankan. Yang dilakukan : (1) Push Flag, (2) Clear Interrupt Flag, (3) Clear Trap Flag, (4) Push CS, (5) Push IP Mengaktifkan sinyal INTA Langkah ini ditujukan agar Interrupt Controller (ex: 8259) memberitahukan 8088 nomor interupsinya Membaca nomor interupsi Membaca kondisi Address Bus A0 – A7 untuk mengetahui siapa yg menginterupsinya
}
}
}
}
Mencari alamat routine yg sesuai Sebelum dapat menjalankan routine yg sesuai, 8088 harus mencari terlebih dahulu dimana routine tersebut berada. Untuk mendapatkan alamat routine tsb, 8088 akan mencarinya di Interrupt Vector Table yg sama dgn tabel untuk Software Generated Ineterrupt. Lompat ke alamat routine tersebut Melompat ke instruksi awal dari routine dgn melakukan lompatan JMP SSSS:OOOO dimana SSSS adalah alamat Segment dan OOOO adalah alamat Offset. Mengerjakan routine tersebut 8088 akan mengerjakan semua instruksi yg ada sampai ditemukan instruksi IRET (Interrupt Return) Kembali ke program semula Jika instruksi IRET dikerjakan, maka semua isi regiter yg tadi disimpan, akan dikembalikan. Yang dilakukan : (1) Pop IP, (2) Pop CS, (3) Set Trap Flag, (4) Set Interrupt Flag, (5) Pop Flag
} } } } } } } } } }
PUSHF à simpan flag STI à I = 1 PUSH IP PUSH CS PUSH AX atau PUSH BX atau dll Program Interupt dll atau POP BX atau POP AX POP CS POP IP POPF à mengambil isi flag asal
}
Mengisi IP dan CS
◦ instruksi ◦ ….. ◦ instruksi ◦ IRET à interupt return
Masalah : kaki INT di uP 8088/8086 hanya 1 (satu) padahal devais yang minta pelayanan >1 } Solusi : ditambahkan IC interrupt controller }
IR0 uP
Int Cont INTR
IR7
5. Send Interrupt Type
3. INTA 4. INTA (Timer untuk kesempatan Master mengirim ID ke slave
1. Interrupt dari divais
2. PIC mengirim INT ke uP
IRQ-0
IRQ-1
IRQ-2
IRQ-3
IRQ-4
IRQ-5
IRQ-6
IRQ-7
IR-0
IR-1
IR-2
IR-3
IR-4
IR-5
IR-6
IR-7
INT-8
INT-9
INT-A
INT-B
INT-C
INT-D INT-E
INT-F
Prioritas IRQ: 0,1,8,9,10,11,12,13,14,15,3,4,5,6,7
IRQ7
IRQ15
IRQ0
IRQ8
IRQ0
IRQ1
IRQ3
IRQ4
IRQ5
IRQ6
IRQ7
IRQ8
IRQ9
IRQ1 0
IRQ1 1
IRQ1 2
IRQ1 3
IRQ1 4
IRQ1 5
INT8
INT9
INTB
INTC
INTD
INTE
INTF
INT7 0
INT7 1
INT7 2
INT7 3
INT7 4
INT7 5
INT7 6
INT7 7
Alamat fisik FFFF0 à tabel vector bootup F000:284E } Alamat fisik 00000 sd 003FFà table vector intterupt }
INT number
Physical Address
Logical Address
lNT00
00000
0000:0000
INT01
00004
0000:0004
INT02
00008
0000:0008
. . . . IINTFF
. . . . 003FC
. . . . 0000:03FC
Interrupt Number
Vector Address
Content (My Comp)
Content (Toshiba 1415-S)
INT 0 (div 0)
0000:0000 0000:0001 0000:0002 0000:0003
IP low (68) IP high (10) CS low (A7) CS high (00)
INT 1 (single step)
0000:0004
INT 2 (NMI)
0000:0008
INT 3 (One Byte Interrupt)
0000:000C
0070:018B
0070:018B
INT 4 (Overflow)
0000:0010
0070:018B
0070:018B
...
...
...
INT 255
0000:03FC
0246:F000
0070:018B
0070:018B 038F:0016
}
Dari IVT didapatkan 256 vector ISR (Interrupt Service Routine) ◦ Interrupt hardware à PIC ◦ Interrupt software à OS (contoh : INT 21H)
}
Interrupt hardware mempunyai prioritas lebih tinggi dari interrupt software kecuali interrupt dari system (INT 0,1,2,3,4)
} } }
p
p
Divide by Zero Menangani hasil operasi aritmetik pembagian yang hasilnya 0 Umumnya : menghasilkan pesan kesalahan ke OS à pesan ke program aplikasi MOV SUB DIV
AL,92 CL,CL CL
;AL=92 ;CL=0 ;92/0=undefined result
MOV AX,0FFFFH ;AX=FFFFH MOV BL,2 ;BL=2 DIV BL 65535/2 =32767 larger than 255 .maximum capacity of AL
IRQ0
IRQ1
IRQ3
IRQ4
IRQ5
IRQ6
IRQ7
IRQ8
IRQ9
IRQ1 0
IRQ1 1
IRQ1 2
IRQ1 3
IRQ1 4
IRQ1 5
INT8
INT9
INTB
INTC
INTD
INTE
INTF
INT7 0
INT7 1
INT7 2
INT7 3
INT7 4
INT7 5
INT7 6
INT7 7
IRQ pada dasarnya bisa dihalangi oleh software à memprogram OCW1 } Fungsinya menghalangi divais-divais tertentu yang meminta IRQ } Disediakan kaki NMI sebagai masukan interrupt yang mau tidak mau harus dilayani }
}
ICW1
◦ A0 = 0 dan D4 = 1
A0 0
D4 0
0
0
1
LTIM
0
SNGL IC4
1= ICW4 needed 0= no ICW4 needed 1= single 0= cascade Always 0 for the x86 1= level trigger input 0= edge trigger input Always 0 for x86
A0 1
T7
T6
T5
T4
T3
T2
T1
T0
ICW2 cirinya A0 = 1 } ICW2 menentukan IRx à INTy ; 3 bit LSB ICW2 ditentukan oleh PIC sesuai dengan IRnya } Contoh: }
◦ IR0 à INT 70H ; program ICW2 = 01110000 Maka: IR0 à INT70H IR1 à INT71H dst
A0
D7
D6
D5
D4
D3
D2
D1
D0
1
IR7
IR6
IR5
IR4
IR3
IR2
IR1
IR0
Di PIC master diprogram sesuai dengan IRx yang dihubungkan dengan PIC slave } Misal : di IMB PC/AT slave melalui IR2 PIC master à ICW3 = 00000100 ; A0 = 1 }
Di PIC slave ICW3 menentukan alamat dari slave (CAS0, CAS1, CAS2 dari master)
Setelah diprogram dengan ICW1, ICW2, ICW3, ICW4, pada dasarnya PIC telah siap untuk menerima Interrupt dari divais. } Program aplikasi bisa memask interrupt tertentu, à program aplikasi tidak ingin diganggu oleh INT tertentu, misal : tidak ingin diganggu KYB, maka interrupt untuk keyboard di mask } Caranya dengan memprogram OCW }
OCW1 langsung untuk memask IR tertentu, misal IR6 ingin di mask à OCW1 = 01000000 ; A0 = 1 } Karena status mask pada saat PIC dimulai tidak diketahui maka, OCW1 harus di set segera setelah ICW-ICW diprogram }
Untuk menentukan urutan priotitas IR0 sd IR7 } Ada 3 mode }
◦ Fully Nested
Sedang menjalankan IR3, datang IR2 dan IR4 pada saat yang bersamaan à IR3 ditunda ke stack, IR2 dilayani sampai selesai, IR3 dilanjutkan sampai selesai, baru IR4 dilayani
}
}
Urutan prioritas bisa digeser dengan mengisi OCW2 Misal :
◦ paling tinggi IR5 à OCW2 = 00100101 ◦ Melayani IR4, datang IR5 dan IR0 à IR4 ditunda ke stack, IR5 dilayani, IR0 dilayani, IR4 dilanjutkan
IR yang sudah dilayani menjadi IR dengan prioritas terendah } Misal }
◦ IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR7 ◦ Dilayani IR5, maka urutan : IR6,IR7,IR0,IR1,IR2,IR3,IR4,IR5 ◦ Dilayani IR2, maka urutan : IR3,IR4,IR5,IR6,IR7,IR0,IR1,IR2
}
Agar semua intterupt bisa kebagian dilayani
Program : IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR7 } } } } } } } }
IR5 selesai dilayani, maka :
}
IR2 selesai dilayani, maka :
}
IR6,IR7,IR0,IR1,IR2,IR3,IR4,IR5 IR3,IR4,IR6,IR7,IR0,IR1,IR5,IR2
IR4 selesai dilayani, maka : IR6,IR7,IR0,IR1,IR3,IR5,IR2,IR4 IR7 IR1 IR3 IR0 IR6
} } } } } }
IR5 selesai dilayani, maka :
IR0,IR1,IR2,IR3,IR4,IR6,IR7,IR5
IR2 selesai dilayani, maka :
IR0,IR1,IR3,IR4,IR6,IR7,IR5,IR2
IR4 selesai dilayani, maka :
IR0,IR1,IR3,IR6,IR7,IR5,IR2,IR4
IR7 selesai dilayani, maka :
IR0,IR1,IR3,IR6,IR5,IR2,IR4,IR7
IR1 selesai dilayani, maka :
IR0,IR3,IR6,IR5,IR2,IR4,IR7,IR1
IR3 selesai dilayani, maka :
IR0,IR6,IR5,IR2,IR4,IR7,IR1,IR3
IR0 selesai dilayani, maka :
IR6,IR5,IR2,IR4,IR7,IR1,IR3,IR0
IR6 selesai dilayani, maka :
IR5,IR2,IR4,IR7,IR1,IR3,IR0,IR6
Reset • Menghentikan aktifitas mp saat itu • masukan • Aktif ‘high’ • Kondisi register di dalam mikroprosesor setelah reset: register
Contents
CS
FFFFH
DS
0000H
SS
0000H
ES
0000H
IP
0000H
FLAG
0000H
QUEUE
Kosong
GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK GND
8086
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE/S7 MN/MX RD HOLD HLDA WR M/IO DT/R DEN ALE INTA TEST READY RESET
• • • • • • • } } }
Q : Alamat (IO / Memori) berapa yang diakses oleh uP pada saat pertama kali bootup (sesudah reset) ? A : Memori Q : Tahu dari mana yang diakses memori? A : Register CS di isi FFFF Q : Memangnya di peta I/O tidak ada segmen? A : Tidak ada karena peta I/O hanya 64 kB Q : Apa yang anda tahu tentang segmen? Ukuran? Jenis? A : Ukuran segmen 64kB, Jenis 4 : Code, Data, Stack, Extra Q : Alamat (IO / Memori) berapa yang diakses oleh uP pada saat pertama kali bootup (sesudah reset) ? A : Alamat Memori FFFF0 yang diakses oleh uP pada saat pertama kali bootup (sesudah reset) Back è