;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Color Slider Control Demonstration ; ; ; ; Compile with FASM for Menuet ; ; ; ; Author: Jason Delozier ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd I_END ; size of image dd 0x1000 ; memory for app dd 0x1000 ; esp dd 0x0 , 0x0 ; I_Param , I_Icon include 'lang.inc' START: ; start of execution call draw_window ; at first, draw the window still: call mouse_info mov eax,23 mov ebx,2 int 0x40 cmp eax,1 ; redraw request ? je red cmp eax,2 ; key in buffer ? je key cmp eax,3 ; button in buffer ? je button jmp still red: ; redraw call draw_window jmp still key: ; key mov eax,2 ; just read it and ignore int 0x40 jmp still button: ; button mov eax,17 ; get id int 0x40 shr eax,8 cmp eax,1 ; button id=1 ? jne noclose mov eax,-1 ; close this program int 0x40 noclose: nofind: jmp still ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw int 0x40 ; DRAW WINDOW mov eax,0 ; function 0 : define and draw window mov ebx,100*65536+200 ; [x start] *65536 + [x size] mov ecx,100*65536+200 ; [y start] *65536 + [y size] mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl mov esi,0x806688cc mov edi,0x006688cc int 0x40 ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] mov ecx,0x00ddeeff ; color of text RRGGBB mov edx,labelt ; pointer to text beginning mov esi,labellen-labelt ; text length int 0x40 call draw_slider_info xor ecx,ecx Draw_Controls_Loop: mov ebp, [App_Controls+ecx] ;get controls data location or ebp,ebp jz Draw_Controls_Done call dword [App_Controls+ecx+4] ;call controls draw function add ecx, 12 jmp Draw_Controls_Loop Draw_Controls_Done: mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw int 0x40 ret ;*********************************************** ;* Mouse Stuff ;*********************************************** mousey dw 0 mousex dw 0 mouseb dd 0 mouse_info: mov eax, 37 ;get mouse cordinates mov ebx, 1 ; int 0x40 ; mov ecx, eax ; push ecx ; mov eax, 37 ;get mouse buttons mov ebx, 2 ; int 0x40 ; cmp [mouseb], eax ;compare old mouse states to new states jne redraw_mouse_info ; cmp [mousey], cx ; jne redraw_mouse_info ; shr ecx, 16 ; cmp [mousex], cx ; jne redraw_mouse_info ; pop ecx ; ret ;return if no change in states redraw_mouse_info: pop ecx mov [mouseb], eax ;save new mouse states mov dword [mousey], ecx xor ecx, ecx Check_Mouse_Over_Controls_Loop: mov ebp, [App_Controls+ecx] or ebp,ebp jz Check_Mouse_Over_Controls_Loop_done movzx eax,word [ebp+2] cmp ax, [mousex] ja mouse_not_on_control movzx eax,word [ebp+6] cmp ax, [mousey] ja mouse_not_on_control movzx eax,word [ebp] add ax, [ebp+2] cmp ax, [mousex] jb mouse_not_on_control movzx eax,word [ebp+4] add ax, [ebp+6] cmp ax, [mousey] jb mouse_not_on_control call dword [App_Controls+ecx+8] mouse_not_on_control: add ecx, 12 jmp Check_Mouse_Over_Controls_Loop Check_Mouse_Over_Controls_Loop_done: ret ;*********************************************** draw_slider_info: ;Repaint value background mov eax, 13 mov ebx, 0x00960028 mov ecx, 0x00240010 mov edx, 0x00ffffff int 0x40 ;Draw Color Box xor edx, edx movzx ecx,word [slider_1+12] mov dh, cl movzx ecx,word [slider_2+12] mov dl, cl shl edx, 8 movzx ecx,word [slider_3+12] mov dl,cl mov ebx, 0x00860035 mov ecx, 0x00590040 mov eax, 13 int 0x40 ;draw current value of slider mov ecx, edx mov eax, 47 mov ebx, 0x00060100 mov esi, 0 mov edx, 0x009A0029 int 0x40 ret ;************************************** ;* ;* App Controls ;* ;************************************** App_Controls: dd slider_1 , draw_slider, slider_mouse_over ; dd slider_2 , draw_slider, slider_mouse_over ; dd slider_3 , draw_slider, slider_mouse_over ; dd 0 , 0 ; denotes last control do not delete ;************************************** ;* ;* Slider data ;* ;************************************** slider_1: dw 25 ;width +0 dw 10 ;x +2 dw 150 ;height +4 dw 30 ;y +6 dw 0 ;min +8 dw 255 ;max +10 dw 128 ;current +12 dw 1 ;small change +14 dw 5 ;big change +16 slider_2: dw 25 ;width +0 dw 55 ;x +2 dw 150 ;height +4 dw 30 ;y +6 dw 0 ;min +8 dw 255 ;max +10 dw 128 ;current +12 dw 1 ;small change +14 dw 5 ;big change +16 slider_3: dw 25 ;width +0 dw 100 ;x +2 dw 150 ;height +4 dw 30 ;y +6 dw 0 ;min +8 dw 255 ;max +10 dw 128 ;current +12 dw 1 ;small change +14 dw 5 ;big change +16 ;************************************** ;* ;* Slider Code ;* ;************************************** box_h dw 10 ;static slider box height draw_slider: push eax push ebx push ecx push edx ;Draw slider background mov eax, 13 ;slider background mov ebx, [ebp] ;x start/width mov ecx, [ebp+4] ;y start/height mov edx, 0x002288DD ;color int 0x40 ;draw bar ;Draw line for slide rail mov eax, 38 ;draw vertical slide line movzx ebx,word [ebp] ;x shr ebx, 1 ; add bx,word [ebp+2]; push bx ; shl ebx, 16 ; pop bx ; mov ecx, [ebp+4] ;y start / height add ecx, 0x000A0000 ; add ecx, [ebp+6] ;y start sub ecx, 10 ; mov edx, 0x00 ;color int 0x40 ; ;Draw slider box movzx eax,word [ebp+4] ;height sub eax, 20 ; movzx ebx,word [ebp+10] ;max value sub bx,word [ebp+8] ;min value movzx ecx,word [ebp+12] ; call slider_fpu_calc ;EAX = ((EAX/EBX)*ECX) mov ebx, [ebp] ;x start / width movzx ecx,word [ebp+4] ;height add cx, [ebp+6] ;y sub ecx, 10 ; movzx edx, [box_h] ; shr edx, 1 ; sub ecx, edx ; sub ecx, eax ;*slide box y position shl ecx, 16 ; mov cx, [box_h] ;height mov eax, 13 ;draw bar sys function mov edx, 0x00 ;color int 0x40 ;draw slider box pop edx pop ecx pop ebx pop eax ret slider_mouse_over: push eax push ebx push ecx push edx cmp [mouseb], 1 jne slider_mouse_over_done movzx eax,word [ebp+4] add ax, [ebp+6] sub eax, 10 cmp [mousey], ax ja slider_mouse_min movzx eax,word [ebp+6] add eax, 10 cmp [mousey], ax jb slider_mouse_max ;determine new current value movzx eax,word [ebp+10] ;slider max value sub ax,word [ebp+8] ;slider min value movzx ebx,word [ebp+4] ;slider height sub ebx,20 ;rail size movzx ecx,word [mousey] ;current mouse y pixel sub cx,word [ebp+6] ;minus y start of slider sub ecx, 10 ;minus pixels to top of rail call slider_fpu_calc ;EAX = ((EAX/EBX)*ECX) movzx ebx,word [ebp+10] ;slider max sub ebx,eax ;*current calculated position jmp slider_mouse_change; slider_mouse_max: ; movzx ebx,word [ebp+10] ;get maximum value jmp slider_mouse_change ; slider_mouse_min: ; movzx ebx,word [ebp+8] ;get minimum value slider_mouse_change: ; mov [ebp+12],bx ;new slider current position call draw_slider ; call draw_slider_info ; slider_mouse_over_done: ; pop edx pop ecx pop ebx pop eax ret temp dd 0 ;temp varibles used in fpu computations temp2 dd 0 temp3 dd 0 slider_fpu_calc: mov [temp], eax mov [temp2], ebx mov [temp3], ecx finit ;initilize FPU fld dword [temp] ;load value fdiv dword [temp2] ;divide fmul dword [temp3] ;multiply fst dword [temp] ;store computed value mov eax, [temp] ret ;************************************************** ;* End Slider Code ;************************************************** ; DATA AREA labelt: db 'Color Slider' labellen: I_END: