Jumat, 02 Januari 2009

VGA Card Programming bagian 2 : Fungsi Grafis


Pada tutorial kali ini saya menganggap anda sudah memahami Protect Mode untuk prosesor. Mode yang saya bahas kali ini adalah mode 0x118. Membuat Garis Dengan VESA mode 0x118. Saya harap komputer anda tidak terlalu kuno, sehingga komputer anda tersebut tidak bisa menjalankan Mode ini. Kilas Balik. Mode ini bisa diaktifkan hanya dengan baris perintah berikut ini : Mov ax,4f02 Mov bx,118 Int 10 Perintah tersebut berhubung menggunakan perintah interupt, mau tidak mau anda harus menjalankannya pada RealMode sebelum anda memasuki Protect Mode. Memory address dari mode ini ada di 0xd0000000, dengan GDT ber-basis Nol ( Pelajari saja sendiri ). Rumus1:DeltaXY. Mudah sekali, ini hanyalah hitungan anak SD kelas3 saja. ó DX=X2-X ó DY=Y2-Y Dan kode assembly nya adalah sebagai berikut: GetDeltaXY proc ; x,y,x2,y2 pop [ebp+#16] pop [ebp+#12] ; y2 pop [ebp+#8] ; x2 pop [ebp+#4] ; y pop [ebp] ; x push [ebp+#16] ; mov edx,[ebp+#8] ; x2-x sub edx,[ebp] ; dx mov eax,[ebp+#12] ; y2-y sub eax,[ebp+#4] ; dy ; dx:dy := edx:eax ret GetDeltaXY endp ; ret value is [dx:=edx,dy:=eax] Shell Code nya mau? ( gak usah lah, capek ngetiknya). Rumus2:Gradien. Ini adalah yang harus anda cari setelah anda mendapatkan Nilai Delta X dan Y. Rumus ini pun tergolong Cukup mudah: M:= Sqrt(dx^2 + dy^2). Ini dia Assembly Code-nya: GetHypotenusa proc ; dx,dy pop [ebp+#8] pop [ebp+#4] ; dy pop [ebp] ; dx push [ebp+#8] mov eax,[ebp] mul eax mov ecx,eax mov eax,[ebp+#4] mul eax add ecx,eax push ecx finit fild fd.[esp] fsqrt fistp fd.[esp] pop eax ; Hypotenusa at eax ret GetHypotenusa endp ; ret value is [hyp:=eax] Demikianlah, anda sudah mendapatkan sebagian besar dari fungsi-fungsi tersebut di atas. Silahkan anda utak-atik sendiri supaya anda bisa membuat sebuah Garis sempurna. Sekarang Kita melangkah membuat garis tersebut. Rumus3:Posisi Garis. Mudah saja: Untuk X:=X+ (dx/hyp)*hitungan Y:=Y+ (Dy/hyp)*hitungan Semisal Diketahui: X :0 Y :0 X2:3 Y2:4 Ditanya: Buat Garisnya? Maka yang harus anda lakukan adalah, mencari delta X dan Y sekaligus, kemudian pangkatkan dengan 2 tambahkan dan akarkan dengan pangkat 2. Diketahui2: DX : 3 DY : 4 M : 5 Hitungan: 0> hitungan <=m Tabel Hitungan adalah sebagai berikut: 1 2 3 4 5 x 0,6 1,2 1,8 2,4 3 y 0,8 1,6 2,4 3,2 4 “ Tabel dengan Rumus x atau y +=x atau y*hit “ Hitungan adalah nilai dari gradien yang diperkecil satu-persatu. Mendapatkan Besar sudut. Ini sangatlah penting bagi anda yang menginginkan untuk melakukan sebuah putaran secara 2 Dimensi. Fungsi ini sering digunakan oleh para pengembang Industri Game ( dan ini tentu saja benar ). Adapun Fungsi pendukungnya yaitu Atan2 dan Rad2Deg. Rumus4:Atan2 Hampir sebulan lamanya saya kebingungan memahami bagaimana kegunaan dari fungsi ini, biarpun pada akhirnya saya membuatnya. Sebuah sudut bisa didapat dengan membagi delta x dan y-nya. Fungsi ini akan menyimpan hasil pembagian pada FPU stack Nol, yang terletak berlainan dengan stack Memory yang ditunjuk oleh ESP. aTan2 proc ; dy,dx pop [ebp+#8] pop [ebp+#4] ; Y pop [ebp] ; X push [ebp+#8] fild fd.[ebp+#4] ; Y fild fd.[ebp] ; X fpatan ret aTan2 endp Rumus5:Rad2Deg Rumus ini digunakan untuk mendapatkan nilai yang sudah di –Fpatan – kan oleh fungsi diatas untuk mendapatkan nilai hasil dalam derajat. Nilai hasil akan dikalikan 10, sehingga jika anda mendapatkan nilai hasil 30, akan menjadi 300 dst. Rad2DegP proc ; Radian at FPU st(0) ; Rad * 180/PI ; Radian to degree Partial ; 57,295779513087679 ; st(0) are FPatan(dx/dy) fldpi ; PI push d.#1800 fidivr fd.[esp] fmul st,st(1) fistp fd.[esp] pop eax ;test eax,80000000 ; Check for Minus Sign ;jz r2d_brs ; add eax,#3600 ; r2d_brs data ret Rad2DegP endp ; Result at eax Rumus6:FastGetDegree Rumus ini adalah pemudahan dari 2 rumus diatas, digunakan untuk mendapatkan sebuah sudut hanya dengan memasukan nilai sebanyak 2 parameter saja (8-byte). FastGetDegree proc ; dX,dY ; Get Degree from Position pop [ebp+#16] ; EIP pop [ebp+#4] ; dy pop [ebp] ; dx push [ebp+#16] ; EIP ; Atan2(dy,dx) ; degrees=(angle/PI)*180 ; angle =(degrees/180)*PI push [ebp] push [ebp+#4] call aTan2 call Rad2DegP mov edx,eax xor eax,eax inc eax ret FastGetDegree endp ; eax=Status, edx=Rotasi/10 Rumus7:Rotate2D Rumus ini digunakan untuk melakukan Hitungan secara lengkap sebuah Putaran 2 Dimensi. Nilai baliknya adalah sebuah posisi x dan y yang disimpan di edx:eax. Mudah sekali. Rotate2D proc ; xc,yc,x,y,Rot pop [ebp+#20] ; EIP pop [ebp+#16] ; Rot pop [ebp+#12] ; y pop [ebp+#8] ; x pop [ebp+#4] ; yc pop [ebp] ; xc push [ebp+#20] ; EIP push ebp push [ebp] ; x push [ebp+#4] ; y push [ebp+#8] ; x2 push [ebp+#12] ; y2 add ebp,#128 call GetDeltaXYnHyp pop ebp mov [ebp+#20],edx ; dx mov [ebp+#24],eax ; dy mov [ebp+#28],ecx ; Hypotenusa push ebp push [ebp+#20] ; x2 push [ebp+#24] ; y2 add ebp,#128 ; call FastGetDegree ; pop ebp add edx,[ebp+#16] mov [ebp+#32],edx push ebp push [ebp] ; x push [ebp+#28] ; hyp push [ebp+#32] ; Rot add ebp,#128 call HitX ; pop ebp mov [ebp+#36],eax push ebp push [ebp+#4] push [ebp+#28] push [ebp+#32] add ebp,#128 ; call HitY pop ebp mov edx,[ebp+#36] ret Rotate2D endp ; edx:=x,eax:=y Onan Farabi

Tidak ada komentar:

Posting Komentar