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. H/W : Devais mengirim INT 2. 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 T = Trap A = Auxiliary carry D = Direction S = Sign P = Parity I = interrupt Z = Zero C = Carry X = tidak terpakai 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 Description 003FF 02 003FE 46 003FD F0 003FC 00 Segment address Offset address Interrupt #FF 00003 00 00002 C9 00001 0F 00000 9E Segment address Offset address Interrupt #00
} 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 INTR Int Cont 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
IRQ7 IRQ15 IRQ0 IRQ8 Prioritas IRQ: 0,1,8,9,10,11,12,13,14,15,3,4,5,6,7
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) INT 0 (div 0) 0000:0000 0000:0001 0000:0002 0000:0003 Content (Toshiba 1415-S) IP low (68) IP high (10) CS low (A7) CS high (00) INT 1 (single step) 0000:0004 0070:018B 0070:018B INT 2 (NMI) 0000:0008 038F:0016 INT 3 (One Byte Interrupt) INT 4 (Overflow) 0000:000C 0070:018B 0070:018B 0000:0010 0070:018B 0070:018B......... INT 255 0000:03FC 0246:F000
} 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)
} Divide by Zero } Menangani hasil operasi aritmetik pembagian yang hasilnya 0 } Umumnya : menghasilkan pesan kesalahan ke OS à pesan ke program aplikasi p MOV AL,92 ;AL=92 SUB CL,CL ;CL=0 DIV CL ;92/0=undefined result p 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 D4 0 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 : IR6,IR7,IR0,IR1,IR2,IR3,IR4,IR5 } IR2 selesai dilayani, maka : 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 CS DS SS ES IP FLAG QUEUE Contents FFFFH 0000H 0000H 0000H 0000H 0000H Kosong GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK GND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 36 37 35 34 33 31 30 29 28 26 27 25 24 23 22 21 8086 32 VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE/S7 MN/MX RD HOLD HLDA WR M/IO DT/R ALE DEN INTA READY TEST 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 è