; ; ICON APPLICATION ; ; Compile with FASM for Menuet ; ; 22.02.05 Mario79 ; 1) multi-threading ; 2)dinamic load BMP files ; 3)type on desktop with function 7 ; 4)Image in memory only 8000h (32Kb) for all 48 icons. ; Old version ICON 5000h*48(decimal)=960Kb. ; use32 org 0x0 db 'MENUET01' dd 0x01 dd START dd I_END dd 0x8000 dd 0x8000 dd I_Param , 0x0 include 'lang.inc' include 'macros.inc' get_bg_info: mov eax,39 mov ebx,4 int 0x40 mov [bgrdrawtype],eax mov eax,39 ; get background size mov ebx,1 int 0x40 mov [bgrxy],eax mov ebx,eax shr eax,16 and ebx,0xffff mov [bgrx],eax mov [bgry],ebx ret START: load_icon_list: mov eax,6 mov ebx,icon_lst xor ecx,ecx mov edx,-1 mov esi,icon_data int 0x40 add eax,10 xor edx,edx mov ebx,52 div ebx mov [icons],eax call get_bg_info mov eax,14 int 0x40 add eax,0x00010001 mov [scrxy],eax apply_changes: mov edi,[icons] mov esi,icon_data mov ebp,0x5000 ; threads stack starting point start_new: movzx eax,byte [esi] ; x position sub eax,'A' ;eax - number of letter cmp eax,4 jg no_left shl eax,6 ;imul eax,64 add eax,24 jmp x_done no_left: sub eax,9 shl eax,6 ;imul eax,64 sub eax,24+32-1 movzx ebx,word [scrxy+2] add eax,ebx x_done: ; mov [xpos],eax mov [ebp-12],eax movzx eax,byte [esi+1] ; y position sub eax,'A' ; eax - number of letter cmp eax,4 jg no_up lea eax,[eax+4*eax] shl eax,4 ;imul eax,80 add eax,34 jmp y_done no_up: sub eax,9 lea eax,[eax+4*eax] shl eax,4 ;imul eax,80 movzx ebx,word [scrxy] sub eax,32-1 add eax,ebx y_done: ; mov [ypos],eax mov [ebp-8],eax mov eax,51 mov ebx,1 mov ecx,thread ; mov edx,[thread_stack] mov edx,ebp ; sub edx,4 ; mov [edx],esi mov [ebp-4],esi int 0x40 ; add [thread_stack],0x100 add ebp,0x100 mov eax,5 mov ebx,1 wait_thread_start: ;wait until thread draw itself first time cmp [create_thread_event],bl jz wait_thread_end int 0x40 jmp wait_thread_start wait_thread_end: dec [create_thread_event] ;reset event add esi,50+2 dec edi jnz start_new or eax,-1 int 0x40 thread: ; pop ebp ;ebp - address of our icon sub esp,12 mov ebp,esp call draw_window mov [create_thread_event],1 mov eax,40 mov ebx,010101b int 0x40 jmp still red: call draw_window still: mov eax,10 int 0x40 cmp eax,1 je red cmp eax,3 je button cmp eax,5 jne still call get_bg_info mov eax,5 mov ebx,1 call draw_icon jmp still key: mov eax,2 int 0x40 jmp still button: mov eax,17 int 0x40 ; mcall 55,eax, , ,klick_music mov ebx,[ebp+8] add ebx,19 ; lea ebx,[ebp+19] mov eax,19 xor ecx,ecx int 0x40 mcall 55,eax, , ,klick_music jmp still klick_music db 0x85,0x60,0x85,0x70,0x85,0x65,0 draw_picture: mov [image],0x3000 xor ebx,ebx xor ecx,ecx mov esi,data_from_file+54+32*3*33-96 mov [pixpos],0 mov [pixpos2],32 newb: push ebx push ecx cmp ebx,10 jb yesbpix cmp ebx,42 jge yesbpix cmp ecx,32 jg yesbpix push esi mov esi,data_from_file+54+32*3*33-96 sub esi,[pixpos] dec [pixpos2] cmp [pixpos2],0 jne no_correction_pixpos add [pixpos],192 mov [pixpos2],32 no_correction_pixpos: sub [pixpos],3 mov eax,[esi] and eax,0xffffff pop esi cmp eax,0 je yesbpix cmp eax,0xf5f5f5 je yesbpix jmp nobpix yesbpix: stretch: cmp [bgrdrawtype],dword 2 jne nostretch ; mov eax,[ypos] mov eax,[ebp+4] add eax,ecx imul eax,[bgry] cdq movzx ebx,word [scrxy] div ebx imul eax,[bgrx] push eax ; mov eax,[xpos] mov eax,[ebp+0] add eax,[esp+8] imul eax,[bgrx] cdq movzx ebx,word [scrxy+2] div ebx add eax,[esp] add esp,4 jmp notiled nostretch: cmp [bgrdrawtype],dword 1 jne notiled ; mov eax,[ypos] mov eax,[ebp+4] add eax,ecx cdq movzx ebx,word [bgrxy] div ebx mov eax,edx imul eax,[bgrx] push eax ; mov eax,[xpos] mov eax,[ebp+0] add eax,[esp+8] movzx ebx,word [bgrxy+2] cdq div ebx mov eax,edx add eax,[esp] add esp,4 notiled: lea ecx,[eax+eax*2] mov eax,39 mov ebx,2 int 0x40 nobpix: pop ecx pop ebx mov edx,eax mov eax,[image] mov [eax],dl inc eax ror edx,8 mov [eax],dl inc eax ror edx,8 mov [eax],dl inc eax mov [image],eax inc ebx mov eax,[yw] inc eax cmp ebx,eax jnz newb xor ebx,ebx inc ecx mov eax,[ya] add [pixpos],eax cmp [top],1 jne notop cmp ecx,38 je toponly notop: cmp ecx,52 jnz newb toponly: mov eax,7 mov ebx,0x3000 mov ecx,52 shl 16 + 52 xor edx,edx int 0x40 mov [load_pic],0 ret draw_text: mov esi,[ebp+8] add esi,33 ; lea esi,[ebp+33] push edi mov edi,labelt mov ecx,8 cld rep movsb pop edi mov eax,labelt news: cmp [eax],byte 33 jb founde inc eax cmp eax,labelt+11 jb news founde: sub eax,labelt mov [tl],eax mov eax,[tl] lea eax,[eax+eax*2] ; eax *= char_width/2 shl eax,16 mov ebx,27*65536+42 sub ebx,eax mov eax,4 xor ecx,ecx ; black shade of text mov edx,labelt mov esi,[tl] add ebx,1 shl 16 ;*65536+1 int 0x40 inc ebx int 0x40 add ebx,1 shl 16 int 0x40 inc ebx int 0x40 sub ebx,1 shl 16 int 0x40 dec ebx sub ebx,1 shl 16 int 0x40 sub ebx,1 shl 16 dec ebx int 0x40 dec ebx add ebx,1 shl 16 int 0x40 inc ebx mov ecx,0xffffff int 0x40 mov [draw_pic],0 ret load_icon_file: mov ebx,[ebp+8] add ebx,5 ; lea ebx,[ebp+5] mov eax,6 xor ecx,ecx mov edx,-1 mov esi,data_from_file int 0x40 ret ; for y = 32 to 0 ; for x = 0 to 32 ; if (pix[y][x]==0) then ; pix[y][x]=background(x,y); ; ********************************************* ; ******* 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 xor eax,eax ; function 0 : define and draw window ; mov ebx,[xpos-2] mov ebx,[ebp+0-2] ; mov ecx,[ypos-2] mov ecx,[ebp+4-2] add ebx,[yw] ; [x start] *65536 + [x size] add ecx,51 ; [y start] *65536 + [y size] mov edx,0x01000000 ; color of work area RRGGBB,8->color gl int 0x40 mov eax,8 ; button mov ebx,51 mov ecx,50 mov edx,1+20000000 ; or 0x40000000 int 0x40 mov eax,5 mov ebx,1 draw_icon: xchg [load_pic],bl test bl,bl je draw_icon_end int 0x40 jmp draw_icon draw_icon_end: call load_icon_file mov eax,5 mov ebx,1 draw_icon_2: xchg [draw_pic],bl test bl,bl je draw_icon_end_2 int 0x40 jmp draw_icon_2 draw_icon_end_2: mov eax,9 mov ebx,process_table mov ecx,-1 int 0x40 ; mov eax,process_table ; add eax,34 ; mov ebx,[eax] ; mov [xpos],ebx ; add eax,4 ; mov ebx,[eax] ; mov [ypos],ebx call draw_picture call draw_text mov eax,12 mov ebx,2 int 0x40 ret icon_lst db 'ICON LST' tl dd 8 yw dd 51 ya dd 0 ;xpos dd 15 ;ypos dd 185 draw_pic db 0 load_pic db 0 create_thread_event db 0 labelt: db 'SETUP ' labellen: bgrxy dd 0x0 scrxy dd 0x0 bgrdrawtype dd 0x0 pixpos dd 0 pixpos2 db 0 top dd 0 image dd 0x3000 ;thread_stack dd 0x5000 icons dd 0 I_Param: icon_data = I_END+0x1400 process_table = I_END+0x2400 I_END: bgrx dd ? bgry dd ? data_from_file: rb 54 ;header raw_data: rb 32*32