;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; DIALOGS1.INC ; ; ; ; COMPILE WITH FASM for MENUET ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; menus dd 3 ; number of menus m_x dd 0x5 ; x start m_y dd 20 ; y start m_xs dd 290 ; x size m_ys dd 14 ; y size g_stack dd 0xf000 ; thread stack - required menu:; AB C D E F G db '*D FILE +Save File +Load File +- +Quit ' db '*B EDIT +Copy +Paste ' db '*B HELP +Setup +About.. ' db '@' ; end mark ; A : Data type '*' -> New menu , '+' -> menu selection ; B : Number of selections in menu (A+) ; C : Menu header text ; D-G : Menu selection text ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DATA BELOW IS FOR DIALOGS1.INC INTERNALS menu_action dd '----' window_on db 0 g_n dd -1 g_x dd 0x0 g_t dd 0x0 g_1 dd 0x0 g_l dd 0x0 closet db 0 table: times 1024 db 0 last_mouse dd 0x0 mo_x dd 0x0 mo_y dd 0x0 check_mouse: pusha cmp [window_on],1 je no_open mov eax,37 mov ebx,2 mcall cmp [window_on],0 jne openw2 cmp eax,0 je no_open openw2: waitformouse: mov eax,23 mov ebx,2 mcall cmp eax,0 jne no_open mov eax,37 mov ebx,2 mcall cmp eax,0 jne waitformouse mov eax,37 mov ebx,1 mcall mov esi,eax shr eax,16 xor edx,edx mov ebx,50 div ebx mov edx,eax cmp edx,[g_n] je no_open cmp edx,[menus] jge no_open mov eax,esi and eax,0xffff mov ebx,[m_y] cmp eax,ebx jbe no_open add ebx,[m_ys] cmp eax,ebx jge no_open cmp [window_on],0 je noww mov [closet],1 mov ecx,100 waitm: mov eax,5 mov ebx,1 mcall dec ecx jz no_open cmp [window_on],0 jne waitm noww: mov eax,edx jmp cll no_open: mov [last_mouse],esi popa ret cll: mov [window_on],2 mov [g_n],eax mov [g_x],96 mov [g_t],0 mov [g_1],1 mov eax,9 mov ebx,table mov ecx,-1 mcall mov eax,[table+34] mov [mo_x],eax mov eax,[table+38] mov [mo_y],eax mov eax,51 mov ebx,1 mov ecx,alert_entry mov edx,[g_stack] mcall mov [esp+28],dword 0 ; clear button entry mov [menu_action],'MD ' check_gr: popa ret draw_menu: mov eax,9 mov ebx,table mov ecx,-1 mcall cmp [table+46],dword 30 jb drmr mov eax,13 ; white background mov ebx,[m_x] shl ebx,16 add ebx,[m_xs] inc ebx mov ecx,[m_y] shl ecx,16 add ecx,[m_ys] mov edx,0xf0f8ff mcall mov eax,38 ; egde lines mov ebx,[m_x] shl ebx,16 add ebx,[m_x] add ebx,[m_xs] mov ecx,[m_y] shl ecx,16 add ecx,[m_y] mov edx,0x000000 mcall mov eax,38 mov ecx,[m_y] add ecx,[m_ys] shl ecx,16 add ecx,[m_y] add ecx,[m_ys] mcall mov esi,menu-1 mov edi,[m_x] mov ebp,1 new_menu: inc esi cmp [esi],byte '*' jne drmnl1 push esi mov eax,4 mov ebx,edi shl ebx,16 add ebx,[m_y] add ebx,0x00050004 mov ecx,0x000000 mov edx,esi add edx,3 mov esi,12 mcall ; draw text pop esi add esi,2 add edi,50 inc ebp drmnl1: cmp [esi],byte '@' jne new_menu drmr: ret alert_box: ; eax : x size - min 200 ; ebx : pointer to ASCIIZ - max 128 character text ; ecx : button 1 id ( OK or YES ) ; edx : button 2 id or zero ( NO ) cmp [window_on],0 jne alert_box_return mov [window_on],1 cmp eax,100 jg size_ok mov eax,100 size_ok: mov [g_x],eax mov [g_t],ebx mov [g_1],ecx mov ecx,0 new_search: cmp [ebx],byte 0 je found_len inc ebx inc ecx cmp ecx,128 jbe new_search found_len: mov [g_l],ecx mov eax,51 mov ebx,1 mov ecx,alert_entry mov edx,[g_stack] mcall mov [menu_action],'MA ' alert_box_return: ret alert_entry: call alert_draw_window alert_still: mov eax,23 ; wait here for event mov ebx,1 mcall cmp eax,1 ; redraw request ? je alert_red cmp eax,2 ; key in buffer ? je alert_key cmp eax,3 ; button in buffer ? je alert_button cmp [closet],0 jne ccc mov eax,9 mov ebx,table mov ecx,-1 mcall cmp ax,[table+4] je no_close ccc: mov [closet],0 mov [g_n],-1 mov [menu_action],'----' mov [window_on],0 mov eax,-1 mcall no_close: jmp alert_still alert_red: ; redraw call alert_draw_window jmp alert_still alert_key: ; key mov eax,2 ; just read it and ignore mcall jmp alert_still alert_button: ; button mov eax,17 ; get id mcall shr eax,8 cmp eax,3 jg no_action1 dec eax shl eax,2 mov eax,dword [eax+rtext] mov [menu_action],eax jmp action_done no_action1: sub eax,16 add eax,65 shl eax,8 mov ebx,[g_n] add ebx,65 add eax,ebx mov [menu_action],eax action_done: mov [closet],0 mov [g_n],-1 mov [window_on],0 mov eax,-1 ; close this program mcall rtext db 'NO YES OK ' jmp alert_still ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* alert_draw_window: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall cmp [window_on],2 jne no_win_type_2 mov edx,menu-1 mov ecx,[g_n] add ecx,1 find_menu: inc edx cmp [edx],byte '*' je menu_loop jmp find_menu menu_loop: loop find_menu movzx ebp,byte [edx+1] sub ebp,64 push edx ; DRAW WINDOW mov eax,0 ; function 0 : define and draw window mov ebx,[g_n] imul ebx,50 add ebx,[mo_x] add ebx,[m_x] shl ebx,16 add ebx,[g_x] mov ecx,[mo_y] add ecx,[m_y] add ecx,[m_ys] shl ecx,16 mov edx,14 imul edx,ebp add edx,7 add ecx,edx mov edx,0x00ffffff ; color of work area RRGGBB,8->color gl mov esi,0x00ffffff ; color of grab bar RRGGBB,8->color gl mov edi,0x000000cc ; color of frames RRGGBB mcall pop edx mov ebx,5*65536+7 ; draw info text with function 4 mov ecx,0x10000000 mov esi,12 mov ebp,16 no_d_found: inc edx cmp [edx],byte '*' je d_drawed cmp [edx],byte '@' je d_drawed cmp [edx],byte '+' jne no_d_found inc edx pusha ; draw button mov eax,8 mov ecx,ebx mov ebx,[g_x] add ebx,0x0000fffe shl ecx,16 add ecx,0xfffc0000+14 mov edx,0x40000000 add edx,ebp mov esi,0 mcall popa mov eax,4 ; draw text mcall inc ebp add ebx,14 jmp no_d_found d_drawed: no_win_type_2: cmp [window_on],1 jne no_win_1 mov eax,14 ; to middle of screen mcall mov ecx,eax and ecx,0xffff shr ecx,1 shr eax,1 mov ebx,[g_x] shr ebx,1 shl ebx,16 sub eax,ebx mov ebx,eax mov eax,0 ; function 0 : define and draw window mov bx,word [g_x] sub ecx,80 shl ecx,16 mov cx,110 ; [y start] *65536 + [y size] mov edx,0x02ffffff ; color of work area RRGGBB,8->color gl mov esi,0x80d05050 ; color of grab bar RRGGBB,8->color gl mov edi,0x00d05050 ; color of frames RRGGBB mcall mov eax,4 ; label mov ebx,8*65536+8 mov ecx,0x10ddeeff mov edx,alert_labelt1 mov esi,alert_label1len-alert_labelt1 mcall mov eax,4 mov ebx,10*65536+43 mov ecx,0x10000000 mov edx,[g_t] mov esi,[g_l] mcall cmp [g_1],1 jne gadgets_no_1 mov eax,8 mov ebx,[g_x] sub ebx,100 shr ebx,1 shl ebx,16 add ebx,30*65536+40 mov ecx,75*65536+16 mov edx,3 mov esi,0x446688 mcall mov eax,4 mov ebx,[g_x] sub ebx,100 shr ebx,1 shl ebx,16 add ebx,31*65536+80 mov ecx,0x10ffffff mov edx,alert_t2 mov esi,alert_t2len-alert_t2 mcall gadgets_no_1: cmp [g_1],2 jne gadgets_no_2 mov eax,8 mov ebx,[g_x] sub ebx,100 shr ebx,1 shl ebx,16 add ebx,0*65536+40 mov ecx,75*65536+16 mov edx,1 mov esi,0x446688 mcall mov eax,8 mov ebx,[g_x] sub ebx,100 shr ebx,1 shl ebx,16 add ebx,57*65536+40 mov ecx,75*65536+16 mov edx,2 mov esi,0x446688 mcall mov eax,4 mov ebx,[g_x] sub ebx,100 shr ebx,1 shl ebx,16 add ebx,1*65536+80 mov ecx,0x10ffffff mov edx,alert_t1 mov esi,alert_t1len-alert_t1 mcall gadgets_no_2: no_win_1: mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall ret ; DATA AREA alert_t1: db ' No Yes' alert_t1len: alert_t2: db ' OK' alert_t2len: alert_labelt1: db 'ALERT' alert_label1len: