C++ Interfacing
Bloodshed Dev C++ Compiler C GNU(GPL) dengan library MingW (porting dari GCC) Dapat dikombinasikan dengan Cygwin maupun kompiler lain yang dasarnya dari GCC Fitur : - Support GCC-based compilers - Integrated debugging (using GDB) - Project Manager - Customizable syntax highlighting editor - Class Browser - Code Completion - Function listing - Profiling support - Quickly create Windows, console, static libraries and DLLs - Support of templates for creating your own project types - Makefile creation - Edit and compile Resource files - Tool Manager - Print support - Find and replace facilities - CVS support
Struktur program C++ Program yang baik : Kepala program : mendeskripsikan sekilas info tentang programnya Deklarasi library, header file, konstanta, prototipe fungsi/prosedur dengan jelas Pisahkan fungsi/prosedur tambahan sebagai file terpisah -> program utama lebih pendek Berikan komentar yang jelas dan deskriptif untuk setiap bagian program
/* titel : tes c++ untuk interface author : xxx tgl : ... deskripsi : bla...bla..bla... */ //lib #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h> //global var - const #define Port_data 0x378 #define Port_ctrl Port_data++ #define Port_status Port_ctrl++ //proto func/sub /* ----Prototypes of Inp and Outp--- */ typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); //main program int main() { //var library HINSTANCE hLib; oupfuncPtr Out32; inpfuncPtr Inp32; //Load the library hLib = LoadLibrary("inpout32.dll"); //get the address of the function Out32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); Inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); //use the function Out32(Port_data, 1); _sleep(1000); Out32(Port_data, 0); getch(); return 0; }
Mengakses Port Metode : Direct : Indirect Mengakses port secara langsung dengan mengakses alamat registernya (sederhana) Terbatas pada WIN98, WIN NT melarang akses langsung sebuah port Linux hanya membutuhkan privilege access dari admin Indirect Mengakses port sebagai sebuah file (kompleks) Windows => membutuhkan bantuan DLL eksternal Linux => secara default semua hardware pada Linux diakses sebagai sebuah file
Akses Port C++ Dengan Inpout32.dll Inpout32.dll merupakan library yang diperuntukkan untuk akses port secara bebas Untuk semua versi Windows Bisa dipakai oleh semua bahasa pemrograman yang mengenal akses librari eksternal Prototipe fungsi : void _stdcall Out32(short PortAddress, short data); short _stdcall Inp32(short PortAddress);
Mengakses Inpout32.dll Deklarasikan pointer fungsinya : /* ----Prototypes of Inp and Outp--- */ typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); Deklarasi variabel pointer fungsinya : HINSTANCE hLib; oupfuncPtr Out32; inpfuncPtr Inp32; Load library inpout32.dll hLib = LoadLibrary("inpout32.dll"); Ambil alamat fungsinya Out32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); Inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); Free DLL dari memori FreeLibrary(hLib);
Mengakses Port Paralel Mendefinisikan alamat port yang dipakai #define Port_data 0x378 // port data #define Port_status 0x379 // port status #define Port_ctrl 0x37a // port control Mengeluarkan data ke Port Data Out32(Port_data, 1); //mengeluarkan data 1 ke port data Out32(Port_data, 0x3a); //mengeluarkan data 3AH ke port data Membaca Port Status sebagai input int ReadPortStatus(); //read port status int ReadPortStatus() { int dt1; dt1 = Inp32(Port_status); //ambil data dr port status dt1 ^= 128; //invert bit ke-7(s7 inverted) dt1 >>= 3; //shift 3bit kekiri, port status hardwired s3-s7 return dt1; }
Mengeluarkan data ke Port Control void WritePortControl(int adata); void WritePortControl(int adata) { Out32(Port_ctrl, adata ^ 0x0b); //bit 0,1,3 inverted } Membaca Port Data sebagai input Hanya pada mode ECP atau EPP Langkah : Set port data dengan 0xFF Set bit ke-5 port control menjadi 1 untuk mengaktifkan port data sebagai input Set bit ke-5 port control menjadi 0 untuk menghentikan pembacaan port data
void StartReadPortData(); void StopReadPortData(); int ReadPortData(); //start baca dari port data void StartReadPortData() { Out32(Port_data, 0xff); //set port data = 0xff Out32(Port_ctrl, 0x20); //set port ctrl.5 = 1 } //stop baca dari port data void StopReadPortData() Out32(Port_ctrl, 0); //set port ctrl.5 = 0 //baca dari port data int ReadPortData() return Inp32(Port_data); //read port data
Inpout32.dll Dengan Delphi Inpout32.dll dapat dipakai pada pemrograman lain, contohnya Delphi Kelebihan dibanding C++ : Inisialisasi DLL lebih mudah Bahasa mudah dimengerti daripada C GUI based -> lebih mudah menambahkan kontrol apapun -> lebih menarik Penggunaan memori seefisien C
Mengakses Port Paralel Inisialisasi fungsi : procedure Out32(wAddr:word;bOut:byte); stdcall; external 'inpout32.dll' function Inp32(wAddr:word):integer; stdcall; external 'inpout32.dll' Mendefinisikan alamat port yang dipakai Const Port_data = $378; //port data Port_status = Port_data + 1; // port status Port_control = port_status + 1; // port control Mengeluarkan data ke Port Data Out32(Port_data, 1); //mengeluarkan data 1 ke port data Out32(Port_data, $3a); //mengeluarkan data 3AH ke port data Membaca Port Status sebagai input Function ReadPortStatus: integer; Var integer : dt1; begin dt1 = Inp32(Port_status); //ambil data dr port status dt1 := dt1 xor 128; //invert bit ke-7(s7 inverted) dt1 := dt1 shr 3; //shift 3bit ke kanan, port status hardwired s3-s7 result dt1; end;
Mengeluarkan data ke Port Control Procedure WritePortControl(adata: integer) begin Out32(Port_ctrl, adata xor $0b); //bit 0,1,3 inverted end; Membaca Port Data sebagai input //start baca dari port data Procedure StartReadPortData Out32(Port_data, $ff); //set port data = 0xff Out32(Port_ctrl, $20); //set port ctrl.5 = 1 //stop baca dari port data Procedure StopReadPortData Out32(Port_ctrl, 0); //set port ctrl.5 = 0 //baca dari port data Function ReadPortData: integer result Inp32(Port_data); //read port data