FUNGSI / MAKRO SISTEM INTERUPSI DOS & AKSES PORT
system() Fungsi system() memungkinkan untuk menjalankan perintah DOS dari program C. Fungsi ini akan melibatkan file DOS bernama COMMAND.COM, ketika melaksanakan perintah DOS. Untuk menunjukkan lokasi COMMAND.COM, kita bisa mengaturnya melalui variabel COMSPEC dalam DOS. Bentuk deklarasi Prototipe pada file header
int system(const char *perintah) stdlib.h atau process.h
Contoh 13.1: Menggambarkan cara melaksanakan berbagai perintah DOS (seperti TYPE, DIR) dari program C. /*----------------------------------------------------------*/ /* contoh pemakaian fungsi system() */ /*---------------------------------------------------------*/ #include <stdio.h> /* prototipe gets() #include /* prototipe cprintf(), getch() & clrscr() #include <stdlib.h> /* prototipe exit(), system() #include <string.h> /* prototipe strchr(), strcpy() & strcat() void dir(void); void type(void); void del(void); void ke_dos(void);
*/ */ */ */
main() { char pilihan; do { clrscr(); cprintf(“ MENGAKSES PERINTAH DOS MELALUI C”); cprintf(“1. Melihat isi direktori\r\n”); cprintf(“2. Melihat isi file\r\n”); cprintf(“3. Menghapus file\r\n”); cprintf(“4. ke DOS sementara\r\n”); cprintf(“5. selesai\r\n\r\n”); cprintf(“pilihan ( 1. . 5 )? : ”); do pilihan = getch(); while (strchr(“12345”, pilihan) ==0); switch (pilihan) {
1
case ‘1’ : dir(); break; case ‘2’ : type(); break; case ‘3’ : del(); break; case ‘4’ : ke_dos(); break;
}
} } while (pilihan != ‘5’);
void dir(void) { clrscr(); system(“dir”); cprintf(“\r\nTekan sembarang tombol”); getch(); } void type(void) { char perintah[80]; char namafile[80]; clrscr(); cprintf(“File yang akan dilihat isinya? : “); gets(namafile); strcpy(perintah, “TYPE ”); strcat(perintah, namafile); system(perintah); cprintf(\r\nTekan sembarang tombol”); getch(); } void del(void) { char perintah[80]; char namafile[80]; clrscr(); cprintf(“File yang akan dihapus? : “); gets(namafile); strcpy(perintah, “DEL ”); strcat(perintah, namafile); system(perintah); cprintf(\r\nTekan sembarang tombol”); getch(); } void ke_dos(void) { system(“”); }
/* di sistem dos, hingga perintah EXIT diberikan */
2
int86() Fungsi int86() bermanfaat untuk melakukan interupsi secara software terhadap prosesor komputer. Dalam hal ini : Nmrintr *inregs *outregs
Nomor interupsi yang akan dilakukan Berisi data masukan bagi register dari prosessor Berisi data keluaran dari register, setelah interupsi dilaksanakan
Keluaran fungsi int86() berupa nilai register AX (nilai dari AX, setelah interupsi dilaksanakan). Namun, jika carry flag (outregs Æ x.cflag) tidak bernilai sama dengan nol, berarti ada suatu kesalahan. Bentuk deklarasi Prototipe pada file header
int int86 (int nmrintr, union REGS *inregs, union REGS *outregs ); dos.h
Catatan: REGS merupakan tipe union yang definisinya ada pada file judul dos.h. Definisinya adalah sebagai berikut : Struct WORDREGS { unsigned int ax, bx, cx, dx, si, di, cflag; } Struct BYTEREGS { unsigned char al, ah, bl, bh, cl, ch, dl, dh; } union REGS { struct WORDREGS x; struct BYTEREGS h; }
Tampak bahwa pada union REGS : 1. h.al adalah byte orde terendah dari x.ax (register AL byte terendah dari register AX). 2. h.ah adalah byte orde tertinggi dari x.ax (register AH byte tertinggi dari register AX). 3. h.bl adalah byte orde rendah dari x.bx. 4. dll. Contoh pemakaian int86(), yaitu untuk mengatur bentuk kursor. Bentuk kursor sesungguhnya dapat diatur dengan menjalankan interupsi nomor 0x10, fungsi nomor 0x01. Caranya, sebelum interupsi, register-register yang perlu diisi adalah : AH, «--- nomor fungsi 0x01 CH, «--- posisi garis awal kursor CL, «--- posisi garis akhir kursor 3
Adapun data untuk pengaturan bentuk kursor adalah sebagai berikut : Untuk Adapter CGA • Posisi garis awal • Posisi garis akhir Monochrome • Posisi garis awal • Posisi garis akhir
Bentuk Kursor Normal
Tersembunyi
Besar
0x06 0x07
0x20 0x20
0x00 0x07
0x0C 0x0D
0x20 0x20
0x00 0x0D
Contoh 13.2: Program berikut ini dapat digunakan untuk mengatur bentuk kursor baik yang menggunakan adapter CGA maupun monochrome. Untuk mendeteksi mode layar yang sedang aktif, program memanfaatkan fasilitas interupsi nomor 0x10, nomor fungsi 0x0F. Caranya mulamula register AH diisi dengan 0x0F. Setelah interupsi dijalankan, mode layar dapat diperiksa pada register AL. Jika register AL bernilai 7, berarti bahwa mode yang aktif adalah mode monochrome. /*--------------------------------------------------------------------------------*/ /* contoh pemakaian fungsi Int86() */ /* untuk mengatur bentuk kursor */ /*--------------------------------------------------------------------------------*/ #include #include <dos.h> void kursor_besar(void); void kursor_sembunyi(void); void kursor_normal(void); void mode_video(void); main() { clrscr() cputs(“ DEMO KURSOR\r\n\r\n”); kursor_besar(); cputs(“ KURSOR BESAR (Tekanlah sembarang tombol)”); getch(); clrscr() kursor_sembunyi(); cputs(“ KURSOR SEMBUNYI (Tekanlah sembarang tombol)”); getch(); clrscr() kursor_normal(); cputs(“ KURSOR NORMAL (Tekanlah sembarang tombol)”); getch(); }
4
void kursor_besar(void) /* Fungsi untuk membuat kursor berukuran besar */ { union REGS inregs, outregs; inregs.h.ah = 0x01; inregs.h.ch = 0x00; if (mode_video() == MONO) inregs.h.cl = 0x0D; else inregs.h.cl = 0x07; }
int86(0x10, &inregs, &outregs);
void kursor_sembunyi(void) /* Fungsi untuk menyembunyikan kursor */ { union REGS inregs, outregs; inregs.h.ah = 0x01; inregs.h.ch = 0x20; inregs.h.cl = 0x20; int86(0x10, &inregs, &outregs); } void kursor_normal(void) /* Fungsi untuk menormalkan bentuk kursor */ { union REGS inregs, outregs; inregs.h.ah = 0x01; if (mode_video() == MONO) { inregs.h.ch = 0x0C; inregs.h.cl = 0x0D; } else { inregs.h.ch = 0x06; inregs.h.cl = 0x07; }
int86(0x10, &inregs, &outregs);
void mode_video(void) /* Fungsi untuk memperoleh mode video */ { union REGS inregs, outregs; inregs.h.ah = 0x0F; int86(0x10, &inregs, &outregs); return (outregs.h.al); }
Catatan : MONO adalah konstanta yang didefinisikan pada file judul conio.h. konstanta ini bernilai 7.
5
intdos() Fungsi intdos() bermanfaat untuk menjalankan interupsi 0x21, yang melibatkan suatu fungsi DOS. Dalam hal ini, fungsi DOS yang dilaksanakan ditentukan melalui register AH (inregs → h.ah). Bentuk deklarasi Prototipe pada file header
int intdos ( union REGS *inregs, union REGS *outregs ); dos.h
Hasil fungsi intdos() berupa isi register AX. Namun, jika carry flag (inregs → x.cflag) tidak bernilai sama dengan nol, berarti ada suatu kesalahan. Contoh 13.3: Contoh berikut ini digunakan untuk mencetak string ke printer dengan menggunakan fasilitas fungsi DOS nomor 0x05. /*--------------------------------------------------------------------------------*/ /* contoh pemakaian fungsi Intdos */ /* untuk mencetak string ke printer */ /*--------------------------------------------------------------------------------*/ #include <dos.h> void cetak_string(char *str); main() { char *str = “MENCETAK STRING MENGGUNAKAN FUNGSI DOS 0x05” ; cetak_string(str); } void cetak_string(char *str) { int indeks; union REGS inregs, outregs; inregs.h.ah = 0x05; while (str[indeks]) { inregs.h.dl = str[indeks++]; intdos(&inregs, &outregs); } }
/* karakter yang akan dicetak */ /* Cetak karakter */
6
inportb() inportb() berfungsi untuk mendapatkan data sebuah byte dari port bernomor nmrport. Bentuk deklarasi Prototipe pada file header
Unsigned char inportb( int nmrport ); dos.h
inportb() dapat berupa fungsi atau makro. Jika file dos.h disertakan, inport() diperlakukan sebagai makro. Inportb() diperlakukan sebagai fungsi, jika file dos.h tidak dilibatkan dalam program, atau bila file dos.h disertakan, tetapi sesudah #include <dos.h> terdapat pengarah preposessor berupa : # undef inportb.
outportb() outportb() berfungsi untuk menempatkan nilai (berukuran 1 byte) ke port bernomor nmrport. Bentuk deklarasi Prototipe pada file header
void outportb( int nmrport, unsigned char nilai ); dos.h
Catatan : outportb() dapat berupa fungsi atau makro. Contoh 13.4 Contoh berikut ini memberikan gambaran pemakaian outportb(). Dalam hal ini, fungsi outportb() dipakai untuk mengatur warna pinggir layar. /*--------------------------------------------------------------------------------*/ /* contoh pemakaian fungsi outportb() */ /* untuk mengatur warna pinggir layar. */ /* khusus adapter CGA. */ /*--------------------------------------------------------------------------------*/ #include <dos.h> main() { int warna; for (warna=15; warna>=0; warna--) { outportb(0x3D9, warna); /* Ubah warna pinggir layar */ delay(2000); /* Tunda sebentar */ } }
7
inport() inport() berfungsi untuk mendapatkan data berukuran dua byte dari port bernomor nmrport. Bentuk deklarasi Prototipe pada file header
Unsigned char inport( int nmrport ); dos.h
Catatan : Inport() dapat berupa fungsi atau makro.
outport() outport() berfungsi untuk menempatkan nilai (berukuran 2 byte) ke port bernomor nmrport. Bentuk deklarasi Prototipe pada file header
void outport( int nmrport, unsigned char nilai ); dos.h
Catatan : outport() dapat berupa fungsi atau makro.
8