Memanggil Interupsi BIOS atau DOS Menggunakan Fungsi int86
Borland C++ 5.02 menyediakan sebuah fungsi untuk menjalankan interupsi BIOS atau
DOS, yaitu fungsi int86. Nama fungsi ini dideklarasikan di file header dos.h, berikut ini adalah
sintaks dari fungsi int86:
int int86(int nomor, union REGS *inregs,
union REGS *outregs)
Keterangan:
- int nomor, nomor interupsi yang akan dijalankan.
- union REGS *inregs, representasi register pada mikroprosesor yang berisi nilai yang akan
digunakan untuk menjalankan interupsi.
- union REGS *outregs, representasi register pada mikroprosesor setelah interupsi
dijalankan.
Pada fungsi int86, parameter nomor bertipe integer dan dikirimkan secara nilai (by value),
sedangkan parameter inregs dan outregs merupakan tipe data union REGS yang telah didefinisikan pada header dos.h dan dikirimkan secara acuan (by reference). Diharapkan
pembaca telah memahami tipe data union dan struktur serta pengiriman parameter secara
acuan atau secara nilai. Fungsi int86 mengembalikan nilai bertipe integer dari register AX
setelah interupsi dijalankan. Tipe data union REGS yang didefinisikan pada file header dos.h
merupakan union yang terdiri dari struktur WORDREGS dan BYTEREGS. Berikut ini adalah
deklarasi union REGS pada file header dos.h:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Sedangkan deklarasi struktur WORDREGS dan BYTEREGS adalah sebagai berikut:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
Dari perincian diatas, dapat disimpulkan bahwa struktur BYTEREGS merepresentasikan
register-register pada General Purpose Register yang berukuran 8 bit (1 byte), yaitu AL, AH, BL,
BH, CL, CH, DL dan DH. Sedangkan struktur WORDREGS merepresentasikan register-register
pada General Purpose Register yang berukuran 16 bit (2 byte) ditambah register SI, DI dan Flag
Register. Struktur WORDREGS maupun BYTEREGS menempati lokasi memori yang sama
dalam union REGS.
Berikut ini adalah contoh sederhana penggunaan int86 untuk mencetak karakter
menggunakan interupsi BIOS 10 heksadesimal servis 09 heksadesimal. Simpan contoh
dibawah ini dengan nama project contoh01.ide dan kode program contoh01.cpp.
#include <conio.h>
DOS, yaitu fungsi int86. Nama fungsi ini dideklarasikan di file header dos.h, berikut ini adalah
sintaks dari fungsi int86:
int int86(int nomor, union REGS *inregs,
union REGS *outregs)
Keterangan:
- int nomor, nomor interupsi yang akan dijalankan.
- union REGS *inregs, representasi register pada mikroprosesor yang berisi nilai yang akan
digunakan untuk menjalankan interupsi.
- union REGS *outregs, representasi register pada mikroprosesor setelah interupsi
dijalankan.
Pada fungsi int86, parameter nomor bertipe integer dan dikirimkan secara nilai (by value),
sedangkan parameter inregs dan outregs merupakan tipe data union REGS yang telah didefinisikan pada header dos.h dan dikirimkan secara acuan (by reference). Diharapkan
pembaca telah memahami tipe data union dan struktur serta pengiriman parameter secara
acuan atau secara nilai. Fungsi int86 mengembalikan nilai bertipe integer dari register AX
setelah interupsi dijalankan. Tipe data union REGS yang didefinisikan pada file header dos.h
merupakan union yang terdiri dari struktur WORDREGS dan BYTEREGS. Berikut ini adalah
deklarasi union REGS pada file header dos.h:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Sedangkan deklarasi struktur WORDREGS dan BYTEREGS adalah sebagai berikut:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
Dari perincian diatas, dapat disimpulkan bahwa struktur BYTEREGS merepresentasikan
register-register pada General Purpose Register yang berukuran 8 bit (1 byte), yaitu AL, AH, BL,
BH, CL, CH, DL dan DH. Sedangkan struktur WORDREGS merepresentasikan register-register
pada General Purpose Register yang berukuran 16 bit (2 byte) ditambah register SI, DI dan Flag
Register. Struktur WORDREGS maupun BYTEREGS menempati lokasi memori yang sama
dalam union REGS.
Berikut ini adalah contoh sederhana penggunaan int86 untuk mencetak karakter
menggunakan interupsi BIOS 10 heksadesimal servis 09 heksadesimal. Simpan contoh
dibawah ini dengan nama project contoh01.ide dan kode program contoh01.cpp.
#include <dos.h>
#include <stdlib.h>
#define VIDEO_INT 0x10 // BIOS Video Interrupt
int main(void)
{
union REGS in, out; // Deklarasi variabel
in.h.ah = 0x09; // AH = 9 heksadesimal
in.h.al = 'D'; // AL = 41 heksadesimal, huruf D
in.h.bh = 0x00; // BH = 0, halaman video
in.h.bl = 0x09; // BL = 7, warna huruf biru dan dasar
in.h.ch = 0x00; // CH dan CL menentukan banyak
in.h.cl = 0x01; // huruf yang akan dicetak
clrscr();
int86(VIDEO_INT, &in, &out);
getch();
return EXIT_SUCCESS;
}Baris 1 sampai baris 3 pada program diatas merupakan penentuan header yang akan
digunakan, yaitu conio.h, dos.h dan stdlib.h. Header conio.h digunakan karena pada baris 18
7
kita akan menggunakan fungsi clrscr dan pada baris 20 kita akan menggunakan fungsi getch.
Header dos.h digunakan karena pada baris 9 kita mendeklarasikan variabel in dan out
menggunakan tipe union REGS serta pada baris 19 kita akan memanggil fungsi int86. Header
stdlib.h digunakan karena pada baris 22 kita akan menggunakan nilai konstanta
EXIT_SUCCESS.
HASIL:
Pada baris 5 kita mendeklarasikan konstanta dengan nama VIDEO_INT yang bernilai
10 heksadesimal. Konstanta ini digunakan saat memanggil fungsi video int86 untuk
menjalankan interupsi 10 heksadesimal servis 9 heksadesimal. Cobalah untuk mengganti nilai
pada in.h.bl dari yang semula 0x07 menjadi nilai lain, misalnya 0x0a, 0x09 atau 0x04 kemudian
jalankan program. Apa yang terjadi?
Pada contoh diatas variabel yang digunakan bernama in dan out. Perhatikanlah cara
memberikan nilai pada variabel in yang merupakan union REGS pada baris 11 sampai baris 16.
Pada contoh diatas in.h.ah, atau in.h.al dan sebagainya berarti memberikan nilai union REGS
pada struktur BYTEREGS dengan nama h dan field ah atau al yang bertipe unsigned character.
10 heksadesimal. Konstanta ini digunakan saat memanggil fungsi video int86 untuk
menjalankan interupsi 10 heksadesimal servis 9 heksadesimal. Cobalah untuk mengganti nilai
pada in.h.bl dari yang semula 0x07 menjadi nilai lain, misalnya 0x0a, 0x09 atau 0x04 kemudian
jalankan program. Apa yang terjadi?
Pada contoh diatas variabel yang digunakan bernama in dan out. Perhatikanlah cara
memberikan nilai pada variabel in yang merupakan union REGS pada baris 11 sampai baris 16.
Pada contoh diatas in.h.ah, atau in.h.al dan sebagainya berarti memberikan nilai union REGS
pada struktur BYTEREGS dengan nama h dan field ah atau al yang bertipe unsigned character.
Komentar
Posting Komentar