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 int system(const char *perintah) Prototipe pada file header 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 <conio.h> /* 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();
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 */ }
int86()
Fungsi int86() bermanfaat untuk melakukan interupsi secara software terhadap prosesor
komputer. Dalam hal ini :
Nmrintr
Nomor interupsi yang akan dilakukan
*inregs
Berisi data masukan bagi register dari prosessor
*outregs
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 int int86 (int nmrintr, union REGS *inregs,
union REGS *outregs ); Prototipe pada file header 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 :
Adapun data untuk pengaturan bentuk kursor adalah sebagai berikut :
Bentuk Kursor
Untuk Adapter
Normal Tersembunyi Besar
CGA
• Posisi garis awal
0x06 0x20 0x00• Posisi garis akhir
0x07 0x20 0x07Monochrome
• Posisi garis awal
0x0C 0x20 0x00• Posisi garis akhir
0x0D 0x20 0x0DContoh 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
mula-mula 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 <conio.h> #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();
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);
}
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 int intdos ( union REGS *inregs,
union REGS *outregs ); Prototipe pada file header 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++]; /* karakter yang akan dicetak */ intdos(&inregs, &outregs); /* Cetak karakter */
} }
inportb()
inportb() berfungsi untuk mendapatkan data sebuah byte dari port bernomor nmrport.
Bentuk deklarasi Unsigned char inportb( int nmrport );
Prototipe pada file header 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 void outportb( int nmrport, unsigned char nilai );
Prototipe pada file header 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 */
} }
inport()
inport() berfungsi untuk mendapatkan data berukuran dua byte dari port bernomor nmrport.
Bentuk deklarasi Unsigned char inport( int nmrport );
Prototipe pada file header dos.h
Catatan :
Inport() dapat berupa fungsi atau makro.
outport()
outport() berfungsi untuk menempatkan nilai (berukuran 2 byte) ke port bernomor nmrport.
Bentuk deklarasi void outport( int nmrport, unsigned char nilai );
Prototipe pada file header dos.h