Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; |
2 | ; ICON APPLICATION |
||
3 | ; |
||
4 | ; Compile with FASM for Menuet |
||
5 | ; |
||
6 | ; 22.02.05 Mario79 |
||
7 | ; 1) multi-threading |
||
8 | ; 2)dinamic load BMP files |
||
9 | ; 3)type on desktop with function 7 |
||
10 | ; 4)Image in memory only 8000h (32Kb) for all 48 icons. |
||
11 | ; Old version ICON 5000h*48(decimal)=960Kb. |
||
12 | ; |
||
13 | |||
14 | use32 |
||
15 | |||
16 | org 0x0 |
||
17 | |||
18 | db 'MENUET01' |
||
19 | dd 0x01 |
||
20 | dd START |
||
21 | dd I_END |
||
22 | dd 0x8000 |
||
23 | dd 0x8000 |
||
24 | dd I_Param , 0x0 |
||
25 | |||
26 | include 'lang.inc' |
||
27 | include 'macros.inc' |
||
28 | |||
29 | get_bg_info: |
||
30 | mov eax,39 |
||
31 | mov ebx,4 |
||
32 | int 0x40 |
||
33 | mov [bgrdrawtype],eax |
||
34 | |||
35 | mov eax,39 ; get background size |
||
36 | mov ebx,1 |
||
37 | int 0x40 |
||
38 | mov [bgrxy],eax |
||
39 | |||
40 | mov ebx,eax |
||
41 | shr eax,16 |
||
42 | and ebx,0xffff |
||
43 | mov [bgrx],eax |
||
44 | mov [bgry],ebx |
||
45 | ret |
||
46 | |||
47 | START: |
||
48 | load_icon_list: |
||
49 | mov eax,6 |
||
50 | mov ebx,icon_lst |
||
51 | xor ecx,ecx |
||
52 | mov edx,-1 |
||
53 | mov esi,icon_data |
||
54 | int 0x40 |
||
55 | |||
56 | add eax,10 |
||
57 | xor edx,edx |
||
58 | mov ebx,52 |
||
59 | div ebx |
||
60 | mov [icons],eax |
||
61 | |||
62 | call get_bg_info |
||
63 | |||
64 | mov eax,14 |
||
65 | int 0x40 |
||
66 | add eax,0x00010001 |
||
67 | mov [scrxy],eax |
||
68 | |||
69 | apply_changes: |
||
70 | |||
71 | mov edi,[icons] |
||
72 | mov esi,icon_data |
||
73 | mov ebp,0x5000 ; threads stack starting point |
||
74 | |||
75 | start_new: |
||
76 | movzx eax,byte [esi] ; x position |
||
77 | sub eax,'A' ;eax - number of letter |
||
78 | cmp eax,4 |
||
79 | jg no_left |
||
80 | shl eax,6 ;imul eax,64 |
||
81 | add eax,24 |
||
82 | jmp x_done |
||
83 | no_left: |
||
84 | sub eax,9 |
||
85 | shl eax,6 ;imul eax,64 |
||
86 | sub eax,24+32-1 |
||
87 | movzx ebx,word [scrxy+2] |
||
88 | add eax,ebx |
||
89 | x_done: |
||
90 | ; mov [xpos],eax |
||
91 | mov [ebp-12],eax |
||
92 | |||
93 | movzx eax,byte [esi+1] ; y position |
||
94 | sub eax,'A' ; eax - number of letter |
||
95 | cmp eax,4 |
||
96 | jg no_up |
||
97 | lea eax,[eax+4*eax] |
||
98 | shl eax,4 ;imul eax,80 |
||
99 | add eax,34 |
||
100 | jmp y_done |
||
101 | no_up: |
||
102 | sub eax,9 |
||
103 | lea eax,[eax+4*eax] |
||
104 | shl eax,4 ;imul eax,80 |
||
105 | movzx ebx,word [scrxy] |
||
106 | sub eax,32-1 |
||
107 | add eax,ebx |
||
108 | y_done: |
||
109 | ; mov [ypos],eax |
||
110 | mov [ebp-8],eax |
||
111 | |||
112 | mov eax,51 |
||
113 | mov ebx,1 |
||
114 | mov ecx,thread |
||
115 | ; mov edx,[thread_stack] |
||
116 | mov edx,ebp |
||
117 | ; sub edx,4 |
||
118 | ; mov [edx],esi |
||
119 | mov [ebp-4],esi |
||
120 | int 0x40 |
||
121 | ; add [thread_stack],0x100 |
||
122 | add ebp,0x100 |
||
123 | |||
124 | mov eax,5 |
||
125 | mov ebx,1 |
||
126 | wait_thread_start: ;wait until thread draw itself first time |
||
127 | cmp [create_thread_event],bl |
||
128 | jz wait_thread_end |
||
129 | int 0x40 |
||
130 | jmp wait_thread_start |
||
131 | wait_thread_end: |
||
132 | dec [create_thread_event] ;reset event |
||
133 | |||
134 | |||
135 | add esi,50+2 |
||
136 | dec edi |
||
137 | jnz start_new |
||
138 | or eax,-1 |
||
139 | int 0x40 |
||
140 | |||
141 | thread: |
||
142 | ; pop ebp ;ebp - address of our icon |
||
143 | sub esp,12 |
||
144 | mov ebp,esp |
||
145 | call draw_window |
||
146 | mov [create_thread_event],1 |
||
147 | mov eax,40 |
||
148 | mov ebx,010101b |
||
149 | int 0x40 |
||
150 | jmp still |
||
151 | red: |
||
152 | call draw_window |
||
153 | |||
154 | still: |
||
155 | |||
156 | mov eax,10 |
||
157 | int 0x40 |
||
158 | |||
159 | cmp eax,1 |
||
160 | je red |
||
161 | cmp eax,3 |
||
162 | je button |
||
163 | cmp eax,5 |
||
164 | jne still |
||
165 | |||
166 | call get_bg_info |
||
167 | mov eax,5 |
||
168 | mov ebx,1 |
||
169 | call draw_icon |
||
170 | |||
171 | jmp still |
||
172 | |||
173 | key: |
||
174 | mov eax,2 |
||
175 | int 0x40 |
||
176 | |||
177 | jmp still |
||
178 | |||
179 | button: |
||
180 | mov eax,17 |
||
181 | int 0x40 |
||
182 | |||
183 | ; mcall 55,eax, , ,klick_music |
||
184 | |||
185 | mov ebx,[ebp+8] |
||
186 | add ebx,19 |
||
187 | ; lea ebx,[ebp+19] |
||
188 | mov eax,19 |
||
189 | xor ecx,ecx |
||
190 | int 0x40 |
||
191 | mcall 55,eax, , ,klick_music |
||
192 | jmp still |
||
193 | |||
194 | klick_music db 0x85,0x60,0x85,0x70,0x85,0x65,0 |
||
195 | |||
196 | draw_picture: |
||
197 | mov [image],0x3000 |
||
198 | xor ebx,ebx |
||
199 | xor ecx,ecx |
||
200 | mov esi,data_from_file+54+32*3*33-96 |
||
201 | mov [pixpos],0 |
||
202 | mov [pixpos2],32 |
||
203 | newb: |
||
204 | push ebx |
||
205 | push ecx |
||
206 | |||
207 | cmp ebx,10 |
||
208 | jb yesbpix |
||
209 | cmp ebx,42 |
||
210 | jge yesbpix |
||
211 | cmp ecx,32 |
||
212 | jg yesbpix |
||
213 | |||
214 | push esi |
||
215 | mov esi,data_from_file+54+32*3*33-96 |
||
216 | sub esi,[pixpos] |
||
217 | |||
218 | dec [pixpos2] |
||
219 | cmp [pixpos2],0 |
||
220 | jne no_correction_pixpos |
||
221 | add [pixpos],192 |
||
222 | mov [pixpos2],32 |
||
223 | no_correction_pixpos: |
||
224 | sub [pixpos],3 |
||
225 | mov eax,[esi] |
||
226 | and eax,0xffffff |
||
227 | |||
228 | pop esi |
||
229 | |||
230 | cmp eax,0 |
||
231 | je yesbpix |
||
232 | cmp eax,0xf5f5f5 |
||
233 | je yesbpix |
||
234 | jmp nobpix |
||
235 | |||
236 | yesbpix: |
||
237 | |||
238 | stretch: |
||
239 | cmp [bgrdrawtype],dword 2 |
||
240 | jne nostretch |
||
241 | ; mov eax,[ypos] |
||
242 | mov eax,[ebp+4] |
||
243 | add eax,ecx |
||
244 | imul eax,[bgry] |
||
245 | cdq |
||
246 | movzx ebx,word [scrxy] |
||
247 | div ebx |
||
248 | imul eax,[bgrx] |
||
249 | push eax |
||
250 | ; mov eax,[xpos] |
||
251 | mov eax,[ebp+0] |
||
252 | add eax,[esp+8] |
||
253 | imul eax,[bgrx] |
||
254 | cdq |
||
255 | movzx ebx,word [scrxy+2] |
||
256 | div ebx |
||
257 | add eax,[esp] |
||
258 | add esp,4 |
||
259 | |||
260 | jmp notiled |
||
261 | |||
262 | nostretch: |
||
263 | |||
264 | cmp [bgrdrawtype],dword 1 |
||
265 | jne notiled |
||
266 | ; mov eax,[ypos] |
||
267 | mov eax,[ebp+4] |
||
268 | add eax,ecx |
||
269 | cdq |
||
270 | movzx ebx,word [bgrxy] |
||
271 | div ebx |
||
272 | mov eax,edx |
||
273 | imul eax,[bgrx] |
||
274 | push eax |
||
275 | ; mov eax,[xpos] |
||
276 | mov eax,[ebp+0] |
||
277 | add eax,[esp+8] |
||
278 | movzx ebx,word [bgrxy+2] |
||
279 | cdq |
||
280 | div ebx |
||
281 | mov eax,edx |
||
282 | add eax,[esp] |
||
283 | add esp,4 |
||
284 | |||
285 | notiled: |
||
286 | |||
287 | lea ecx,[eax+eax*2] |
||
288 | mov eax,39 |
||
289 | mov ebx,2 |
||
290 | int 0x40 |
||
291 | |||
292 | nobpix: |
||
293 | |||
294 | pop ecx |
||
295 | pop ebx |
||
296 | |||
297 | mov edx,eax |
||
298 | mov eax,[image] |
||
299 | mov [eax],dl |
||
300 | inc eax |
||
301 | ror edx,8 |
||
302 | mov [eax],dl |
||
303 | inc eax |
||
304 | ror edx,8 |
||
305 | mov [eax],dl |
||
306 | inc eax |
||
307 | mov [image],eax |
||
308 | |||
309 | inc ebx |
||
310 | mov eax,[yw] |
||
311 | inc eax |
||
312 | cmp ebx,eax |
||
313 | jnz newb |
||
314 | xor ebx,ebx |
||
315 | |||
316 | inc ecx |
||
317 | |||
318 | mov eax,[ya] |
||
319 | add [pixpos],eax |
||
320 | |||
321 | cmp [top],1 |
||
322 | jne notop |
||
323 | cmp ecx,38 |
||
324 | je toponly |
||
325 | |||
326 | notop: |
||
327 | |||
328 | cmp ecx,52 |
||
329 | jnz newb |
||
330 | |||
331 | toponly: |
||
332 | |||
333 | mov eax,7 |
||
334 | mov ebx,0x3000 |
||
335 | mov ecx,52 shl 16 + 52 |
||
336 | xor edx,edx |
||
337 | int 0x40 |
||
338 | mov [load_pic],0 |
||
339 | ret |
||
340 | |||
341 | draw_text: |
||
342 | |||
343 | mov esi,[ebp+8] |
||
344 | add esi,33 |
||
345 | ; lea esi,[ebp+33] |
||
346 | push edi |
||
347 | mov edi,labelt |
||
348 | mov ecx,8 |
||
349 | cld |
||
350 | rep movsb |
||
351 | pop edi |
||
352 | mov eax,labelt |
||
353 | news: |
||
354 | cmp [eax],byte 33 |
||
355 | jb founde |
||
356 | inc eax |
||
357 | cmp eax,labelt+11 |
||
358 | jb news |
||
359 | founde: |
||
360 | sub eax,labelt |
||
361 | mov [tl],eax |
||
362 | |||
363 | mov eax,[tl] |
||
364 | lea eax,[eax+eax*2] ; eax *= char_width/2 |
||
365 | shl eax,16 |
||
366 | |||
367 | mov ebx,27*65536+42 |
||
368 | sub ebx,eax |
||
369 | |||
370 | mov eax,4 |
||
371 | xor ecx,ecx ; black shade of text |
||
372 | mov edx,labelt |
||
373 | mov esi,[tl] |
||
374 | add ebx,1 shl 16 ;*65536+1 |
||
375 | int 0x40 |
||
376 | inc ebx |
||
377 | int 0x40 |
||
378 | add ebx,1 shl 16 |
||
379 | int 0x40 |
||
380 | inc ebx |
||
381 | int 0x40 |
||
382 | sub ebx,1 shl 16 |
||
383 | int 0x40 |
||
384 | dec ebx |
||
385 | sub ebx,1 shl 16 |
||
386 | int 0x40 |
||
387 | sub ebx,1 shl 16 |
||
388 | dec ebx |
||
389 | int 0x40 |
||
390 | dec ebx |
||
391 | add ebx,1 shl 16 |
||
392 | int 0x40 |
||
393 | inc ebx |
||
394 | mov ecx,0xffffff |
||
395 | |||
396 | int 0x40 |
||
397 | mov [draw_pic],0 |
||
398 | ret |
||
399 | |||
400 | load_icon_file: |
||
401 | mov ebx,[ebp+8] |
||
402 | add ebx,5 |
||
403 | ; lea ebx,[ebp+5] |
||
404 | |||
405 | mov eax,6 |
||
406 | xor ecx,ecx |
||
407 | mov edx,-1 |
||
408 | mov esi,data_from_file |
||
409 | int 0x40 |
||
410 | |||
411 | ret |
||
412 | |||
413 | ; for y = 32 to 0 |
||
414 | ; for x = 0 to 32 |
||
415 | ; if (pix[y][x]==0) then |
||
416 | ; pix[y][x]=background(x,y); |
||
417 | |||
418 | ; ********************************************* |
||
419 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
420 | ; ********************************************* |
||
421 | |||
422 | |||
423 | draw_window: |
||
424 | |||
425 | mov eax,12 ; function 12:tell os about windowdraw |
||
426 | mov ebx,1 ; 1, start of draw |
||
427 | int 0x40 |
||
428 | |||
429 | ; DRAW WINDOW |
||
430 | xor eax,eax ; function 0 : define and draw window |
||
431 | ; mov ebx,[xpos-2] |
||
432 | mov ebx,[ebp+0-2] |
||
433 | ; mov ecx,[ypos-2] |
||
434 | mov ecx,[ebp+4-2] |
||
435 | add ebx,[yw] ; [x start] *65536 + [x size] |
||
436 | add ecx,51 ; [y start] *65536 + [y size] |
||
437 | mov edx,0x01000000 ; color of work area RRGGBB,8->color gl |
||
438 | int 0x40 |
||
439 | |||
440 | mov eax,8 ; button |
||
441 | mov ebx,51 |
||
442 | mov ecx,50 |
||
443 | mov edx,1+20000000 ; or 0x40000000 |
||
444 | int 0x40 |
||
445 | |||
446 | mov eax,5 |
||
447 | mov ebx,1 |
||
448 | draw_icon: |
||
449 | xchg [load_pic],bl |
||
450 | test bl,bl |
||
451 | je draw_icon_end |
||
452 | int 0x40 |
||
453 | jmp draw_icon |
||
454 | draw_icon_end: |
||
455 | |||
456 | call load_icon_file |
||
457 | |||
458 | mov eax,5 |
||
459 | mov ebx,1 |
||
460 | draw_icon_2: |
||
461 | xchg [draw_pic],bl |
||
462 | test bl,bl |
||
463 | je draw_icon_end_2 |
||
464 | int 0x40 |
||
465 | jmp draw_icon_2 |
||
466 | draw_icon_end_2: |
||
467 | |||
468 | mov eax,9 |
||
469 | mov ebx,process_table |
||
470 | mov ecx,-1 |
||
471 | int 0x40 |
||
472 | ; mov eax,process_table |
||
473 | ; add eax,34 |
||
474 | ; mov ebx,[eax] |
||
475 | ; mov [xpos],ebx |
||
476 | ; add eax,4 |
||
477 | ; mov ebx,[eax] |
||
478 | ; mov [ypos],ebx |
||
479 | |||
480 | call draw_picture |
||
481 | call draw_text |
||
482 | |||
483 | mov eax,12 |
||
484 | mov ebx,2 |
||
485 | int 0x40 |
||
486 | |||
487 | ret |
||
488 | |||
489 | |||
490 | |||
491 | icon_lst db 'ICON LST' |
||
492 | |||
493 | tl dd 8 |
||
494 | yw dd 51 |
||
495 | ya dd 0 |
||
496 | |||
497 | ;xpos dd 15 |
||
498 | ;ypos dd 185 |
||
499 | draw_pic db 0 |
||
500 | load_pic db 0 |
||
501 | create_thread_event db 0 |
||
502 | |||
503 | labelt: |
||
504 | db 'SETUP ' |
||
505 | labellen: |
||
506 | |||
507 | bgrxy dd 0x0 |
||
508 | scrxy dd 0x0 |
||
509 | bgrdrawtype dd 0x0 |
||
510 | |||
511 | pixpos dd 0 |
||
512 | pixpos2 db 0 |
||
513 | |||
514 | top dd 0 |
||
515 | |||
516 | image dd 0x3000 |
||
517 | ;thread_stack dd 0x5000 |
||
518 | |||
519 | icons dd 0 |
||
520 | |||
521 | |||
522 | I_Param: |
||
523 | |||
524 | icon_data = I_END+0x1400 |
||
525 | process_table = I_END+0x2400 |
||
526 | |||
527 | I_END: |
||
528 | |||
529 | bgrx dd ? |
||
530 | bgry dd ? |
||
531 | data_from_file: |
||
532 | rb 54 ;header |
||
533 | raw_data: |
||
534 | rb 32*32 |