Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2529 | mario79 | 1 | ;------------------------------------------------------------------------------ |
2 | ; @SS - screensaver |
||
3 | ;------------------------------------------------------------------------------ |
||
4 | ; last update: 30/03/2012 |
||
5 | ; changed by: Marat Zakiyanov aka Mario79, aka Mario |
||
6 | ; changes: The program uses only 4 Kb memory is now. |
||
7 | ; Code refactoring. Using transparent cursor. |
||
8 | ; Fix bug - using lots of buttons from f.8. |
||
9 | ;--------------------------------------------------------------------- |
||
1747 | mario79 | 10 | ; SCREENSAVER APPLICATION by lisovin@26.ru |
11 | ; |
||
12 | ; Compile with FASM for Menuet |
||
13 | ; |
||
2529 | mario79 | 14 | ;------------------------------------------------------------------------------ |
15 | use32 |
||
16 | org 0x0 |
||
1747 | mario79 | 17 | |
2529 | mario79 | 18 | db 'MENUET01' ; 8 byte id |
19 | dd 0x01 ; header version |
||
20 | dd START ; start of code |
||
21 | dd IM_END ; size of image |
||
22 | dd I_END ; memory for app |
||
23 | dd stack_top ; esp |
||
24 | dd 0x0 ; I_Param |
||
25 | dd 0x0 ; path |
||
26 | ;------------------------------------------------------------------------------ |
||
27 | include 'lang.inc' |
||
28 | include '..\..\..\macros.inc' |
||
1747 | mario79 | 29 | ;include 'debug.inc' |
2529 | mario79 | 30 | ;------------------------------------------------------------------------------ |
31 | align 4 |
||
1747 | mario79 | 32 | START: |
2529 | mario79 | 33 | mcall 68,11 |
34 | mcall 40,110010b |
||
35 | ;------------------------------------------------------------------------------ |
||
36 | align 4 |
||
1747 | mario79 | 37 | bgr_changed: |
38 | |||
2529 | mario79 | 39 | mcall 14 |
40 | mov [y_max],ax |
||
41 | shr eax,16 |
||
42 | mov [x_max],ax |
||
43 | shl eax,16 |
||
44 | mov [top_right_corner],eax |
||
45 | ;------------------------------------------------------------------------------ |
||
46 | align 4 |
||
1747 | mario79 | 47 | still: |
2529 | mario79 | 48 | movzx ebx,[time] |
49 | imul ebx,60*100 |
||
50 | mcall 23 ; ждём события в течение [time] минут |
||
51 | test eax,eax |
||
52 | jz create_ss_thread |
||
53 | |||
54 | cmp al,2 ; key in buffer? |
||
55 | jz key |
||
56 | |||
57 | cmp al,5 ; background redraw? |
||
58 | jz bgr_changed |
||
1747 | mario79 | 59 | ; mouse event |
2529 | mario79 | 60 | mcall 37,2 ; проверим кнопки |
61 | and al,3 |
||
62 | cmp al,3 ; нажаты обе кнопки мыши? |
||
63 | jnz still |
||
64 | |||
65 | mcall 37,0 ; проверим координаты |
||
66 | cmp [top_right_corner],eax |
||
67 | jnz still |
||
68 | ;------------------------------------------------------------------------------ |
||
69 | align 4 |
||
1747 | mario79 | 70 | create_setup: |
2529 | mario79 | 71 | test [params],2 |
72 | jnz still ; окно настроек уже создано |
||
73 | mcall 51,1,sthread,sthread_stack_top |
||
74 | or [params],2 |
||
75 | jmp still |
||
76 | ;------------------------------------------------------------------------------ |
||
77 | align 4 |
||
1747 | mario79 | 78 | key: |
2529 | mario79 | 79 | mcall ; eax = 2 |
80 | jmp still |
||
81 | ;------------------------------------------------------------------------------ |
||
82 | align 4 |
||
1747 | mario79 | 83 | create_ss_thread: |
2529 | mario79 | 84 | test [params],3 |
85 | jnz still |
||
86 | call create_ss |
||
87 | jmp still |
||
88 | ;------------------------------------------------------------------------------ |
||
89 | align 4 |
||
1747 | mario79 | 90 | create_ss: |
2529 | mario79 | 91 | mcall 51,1,thread,thread_stack_top |
92 | or [params],1 |
||
93 | ret |
||
94 | ;------------------------------------------------------------------------------ |
||
95 | align 4 |
||
96 | thread: |
||
97 | mcall 40,100010b |
||
98 | ;set_new_cursor_skin - transparent cursor |
||
99 | mcall 68,12,32*32*4 ; get memory for own cursor area |
||
1747 | mario79 | 100 | |
2529 | mario79 | 101 | push eax |
102 | mov ecx,eax |
||
103 | mcall 37,4,,2 ; load own cursor |
||
1747 | mario79 | 104 | |
2529 | mario79 | 105 | mov ecx,eax |
106 | mcall 37,5 ; set own cursor |
||
1747 | mario79 | 107 | |
2529 | mario79 | 108 | pop ecx |
109 | mcall 68,13 ; free own cursor area |
||
1747 | mario79 | 110 | |
2529 | mario79 | 111 | cmp [type],dword 0 |
112 | je drawsswin |
||
1747 | mario79 | 113 | |
2529 | mario79 | 114 | cmp [type],dword 24 |
115 | je asminit |
||
1747 | mario79 | 116 | |
2529 | mario79 | 117 | mov dword [delay],1 |
118 | mov [lx1],10 ; for "draw line" |
||
119 | mov [lx2],40 |
||
120 | mov [ly1],50 |
||
121 | mov [ly2],100 |
||
122 | mov [addx1],1 |
||
123 | mov [addx2],1 |
||
124 | mov [addy1],1 |
||
125 | mov [addy2],1 |
||
126 | jmp drawsswin |
||
127 | ;-------------------------------------- |
||
128 | align 4 |
||
129 | asminit: ; for "assembler" - assembler sources demo |
||
130 | ; get size of file |
||
131 | mov [fileinfo],dword 5 |
||
132 | mov [fileinfo.point],dword fileinfo_buffer |
||
133 | mcall 70,fileinfo |
||
134 | test eax,eax |
||
135 | jnz .no_file |
||
136 | ; get memory for file |
||
137 | mov ecx,[fileinfo_buffer+32] |
||
138 | mov [fileinfo.size],ecx |
||
139 | mcall 68,12 |
||
140 | mov [fileinfo.point],eax |
||
141 | ; load file |
||
142 | mov [fileinfo],dword 0 |
||
143 | mcall 70,fileinfo |
||
144 | test eax,eax |
||
145 | jz @f |
||
146 | mcall 68,13,[fileinfo.point] |
||
147 | ;-------------------------------------- |
||
148 | align 4 |
||
149 | .no_file: |
||
150 | mov [type],dword 0 |
||
151 | jmp drawsswin |
||
152 | ;-------------------------------------- |
||
153 | align 4 |
||
154 | @@: |
||
155 | mov dword [delay],1 ;25 - old value |
||
156 | ;-------------------------------------- |
||
157 | align 4 |
||
158 | asminit1: |
||
159 | mov eax,[fileinfo.point] |
||
160 | mov [stringstart],eax |
||
161 | mov dword [stringlen],1 |
||
162 | ;-------------------------------------- |
||
163 | align 4 |
||
164 | newpage: |
||
165 | mov word [stringpos],10 |
||
166 | ;-------------------------------------- |
||
167 | align 4 |
||
168 | drawsswin: |
||
169 | xor eax,eax |
||
170 | movzx ebx,[x_max] |
||
171 | movzx ecx,[y_max] |
||
172 | inc ebx |
||
173 | inc ecx |
||
174 | mcall ,,,0x01000000 |
||
1747 | mario79 | 175 | |
2529 | mario79 | 176 | xor edx,edx |
177 | mcall 13 |
||
178 | ;-------------------------------------- |
||
179 | align 4 |
||
180 | tstill: |
||
181 | mcall 23,[delay] |
||
182 | test eax,eax |
||
183 | jnz thr_end |
||
1747 | mario79 | 184 | |
2529 | mario79 | 185 | cmp [type],dword 0 |
186 | je tstill |
||
1747 | mario79 | 187 | |
2529 | mario79 | 188 | cmp [type],dword 24 |
189 | je drawssasm |
||
1747 | mario79 | 190 | |
2529 | mario79 | 191 | call draw_line |
192 | jmp tstill |
||
193 | ;-------------------------------------- |
||
194 | align 4 |
||
195 | thr_end: |
||
196 | cmp [type],dword 24 |
||
197 | jne @f |
||
198 | mcall 68,13,[fileinfo.point] |
||
199 | ;-------------------------------------- |
||
200 | align 4 |
||
201 | @@: |
||
202 | and [params], not 1 |
||
203 | or eax,-1 |
||
204 | mcall |
||
205 | ;------------------------------------------------------------------------------ |
||
206 | align 4 |
||
207 | drawssasm: |
||
208 | mov edi,[stringstart] |
||
209 | add edi,[stringlen] |
||
210 | dec edi |
||
1747 | mario79 | 211 | |
2529 | mario79 | 212 | mov eax,edi |
213 | sub eax,[fileinfo.point] |
||
1747 | mario79 | 214 | |
2529 | mario79 | 215 | cmp eax,[fileinfo.size] |
216 | ja asminit1 |
||
1747 | mario79 | 217 | |
2529 | mario79 | 218 | cmp word [edi],0x0a0d |
219 | je addstring |
||
1747 | mario79 | 220 | |
2529 | mario79 | 221 | cmp byte [edi],0x0a |
222 | jne noaddstring |
||
1747 | mario79 | 223 | |
2529 | mario79 | 224 | dec edi |
225 | ;-------------------------------------- |
||
226 | align 4 |
||
227 | addstring: |
||
228 | add word [stringpos],10 |
||
229 | add edi,2 |
||
230 | mov [stringstart],edi |
||
231 | mov dword [stringlen],1 |
||
232 | mov ax,[stringpos] |
||
233 | cmp ax,[y_max] |
||
234 | jb tstill |
||
235 | jmp newpage |
||
236 | ;-------------------------------------- |
||
237 | align 4 |
||
238 | noaddstring: |
||
239 | mov ebx,10*65536 |
||
240 | mov bx,[stringpos] |
||
241 | mcall 4,,0x104ba010,[stringstart],[stringlen] |
||
242 | inc dword [stringlen] |
||
243 | cmp [edi],byte ' ' |
||
244 | je drawssasm |
||
245 | jmp tstill |
||
246 | ;------------------------------------------------------------------------------ |
||
247 | align 4 |
||
248 | draw_line: |
||
249 | movzx esi,[x_max] |
||
250 | movzx edi,[y_max] |
||
1747 | mario79 | 251 | |
2529 | mario79 | 252 | mov eax,[addx1] |
253 | add [lx1],eax |
||
254 | mov eax,[addy1] |
||
255 | add [ly1],eax |
||
1747 | mario79 | 256 | |
2529 | mario79 | 257 | mov eax,[addx2] |
258 | add [lx2],eax |
||
259 | mov eax,[addy2] |
||
260 | add [ly2],eax |
||
261 | |||
262 | cmp [lx1],1 |
||
263 | jge dl1 |
||
264 | mov [addx1],1 |
||
265 | ;-------------------------------------- |
||
266 | align 4 |
||
267 | dl1: |
||
268 | cmp [lx2],1 |
||
269 | jge dl2 |
||
1747 | mario79 | 270 | |
2529 | mario79 | 271 | mov [addx2],1 |
272 | ;-------------------------------------- |
||
273 | align 4 |
||
274 | dl2: |
||
275 | cmp [lx1],esi |
||
276 | jbe dl3 |
||
277 | |||
278 | mov [addx1],0xffffffff |
||
279 | ;-------------------------------------- |
||
280 | align 4 |
||
281 | dl3: |
||
282 | cmp [lx2],esi |
||
283 | jbe dl4 |
||
284 | |||
285 | mov [addx2],0xffffffff |
||
286 | ;-------------------------------------- |
||
287 | align 4 |
||
288 | dl4: |
||
289 | cmp [ly1],1 |
||
290 | jge dl5 |
||
291 | mov [addy1],1 |
||
292 | ;-------------------------------------- |
||
293 | align 4 |
||
294 | dl5: |
||
295 | cmp [ly2],2 |
||
296 | jge dl6 |
||
297 | |||
298 | mov [addy2],1 |
||
299 | ;-------------------------------------- |
||
300 | align 4 |
||
301 | dl6: |
||
302 | cmp [ly1],edi |
||
303 | jbe dl7 |
||
304 | |||
305 | mov [addy1],-1 |
||
306 | ;-------------------------------------- |
||
307 | align 4 |
||
308 | dl7: |
||
309 | cmp [ly2],edi |
||
310 | jbe dl8 |
||
311 | |||
312 | mov [addy2],-1 |
||
313 | ;-------------------------------------- |
||
314 | align 4 |
||
315 | dl8: |
||
316 | mov eax,[lx2] |
||
317 | cmp [lx1],eax |
||
318 | jz dnol |
||
319 | |||
320 | mov bx,word [lx1] |
||
321 | shl ebx,16 |
||
322 | mov bx,word [lx2] |
||
323 | |||
324 | mov cx,word [ly1] |
||
325 | shl ecx,16 |
||
326 | mov cx,word [ly2] |
||
327 | |||
328 | mov edx,[lcolor] |
||
329 | and edx,0xffffff |
||
330 | mcall 38 |
||
331 | ;-------------------------------------- |
||
332 | align 4 |
||
333 | dnol: |
||
334 | add [lcolor],0x010201 |
||
335 | ret |
||
336 | ;------------------------------------------------------------------------------ |
||
337 | align 4 |
||
338 | sthread: ; start of execution |
||
1747 | mario79 | 339 | call sdraw_window |
2529 | mario79 | 340 | ;-------------------------------------- |
341 | align 4 |
||
1747 | mario79 | 342 | sstill: |
2529 | mario79 | 343 | mcall 10 ; wait here for event |
344 | dec eax ; redraw request ? |
||
345 | je sthread |
||
1747 | mario79 | 346 | |
2529 | mario79 | 347 | dec eax ; key in buffer ? |
348 | jne sbutton |
||
1747 | mario79 | 349 | |
2529 | mario79 | 350 | mcall 2 |
351 | jmp snoclose ;sstill |
||
352 | ;------------------------------------------------------------------------------ |
||
353 | align 4 |
||
354 | sbutton: ; button |
||
355 | mcall 17 ; get id |
||
1747 | mario79 | 356 | |
2529 | mario79 | 357 | cmp ah,1 ; button id=1 ? |
358 | jne snoclose |
||
1747 | mario79 | 359 | |
2529 | mario79 | 360 | and [params],not 2 |
361 | mov eax,-1 ; close this program |
||
362 | mcall |
||
363 | ;-------------------------------------- |
||
364 | align 4 |
||
365 | snoclose: |
||
366 | cmp ah,7 |
||
367 | jne nosetfl |
||
1747 | mario79 | 368 | |
2529 | mario79 | 369 | xor [params],1 |
370 | call drawflag |
||
371 | call drawtype |
||
372 | call drawtime |
||
373 | jmp sstill |
||
374 | ;-------------------------------------- |
||
375 | align 4 |
||
376 | nosetfl: |
||
377 | test [params],1 |
||
378 | jnz sstill |
||
1747 | mario79 | 379 | |
2529 | mario79 | 380 | cmp ah,2 |
381 | jne notypedown |
||
1747 | mario79 | 382 | |
2529 | mario79 | 383 | mov eax,[type] |
384 | test eax,eax |
||
385 | je sstill |
||
386 | |||
387 | sub eax,12 |
||
388 | jmp typeupdn |
||
389 | ;-------------------------------------- |
||
390 | align 4 |
||
391 | notypedown: |
||
392 | cmp ah,3 |
||
393 | jne notypeup |
||
394 | |||
395 | mov eax,[type] |
||
396 | cmp eax,24 |
||
397 | jae sstill |
||
398 | |||
399 | add eax,12 |
||
400 | jmp typeupdn |
||
401 | ;-------------------------------------- |
||
402 | align 4 |
||
403 | notypeup: |
||
404 | cmp ah,4 |
||
405 | jne notimedown |
||
406 | |||
407 | mov al,[time] |
||
408 | cmp al,1 |
||
409 | jbe sstill |
||
410 | |||
411 | dec eax |
||
412 | ; das |
||
413 | jmp timeupdn |
||
414 | ;-------------------------------------- |
||
415 | align 4 |
||
416 | notimedown: |
||
417 | cmp ah,5 |
||
418 | jne notimeup |
||
419 | |||
420 | mov al,[time] |
||
421 | cmp al,59 ; 0x59 |
||
422 | jae sstill |
||
423 | |||
424 | inc eax |
||
425 | ; daa |
||
426 | jmp timeupdn |
||
427 | ;-------------------------------------- |
||
428 | align 4 |
||
429 | notimeup: |
||
430 | cmp ah,6 |
||
431 | jne noshow |
||
432 | |||
433 | mcall 5,10 |
||
434 | call create_ss |
||
435 | ;-------------------------------------- |
||
436 | align 4 |
||
437 | noshow: |
||
438 | jmp sstill |
||
439 | ;-------------------------------------- |
||
440 | align 4 |
||
441 | timeupdn: |
||
442 | mov [time],al |
||
443 | call drawtime |
||
444 | jmp sstill |
||
445 | ;-------------------------------------- |
||
446 | align 4 |
||
447 | typeupdn: |
||
448 | mov [type],eax |
||
449 | call drawtype |
||
450 | jmp sstill |
||
451 | ;------------------------------------------------------------------------------ |
||
1747 | mario79 | 452 | ; ********************************************* |
453 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
454 | ; ********************************************* |
||
2529 | mario79 | 455 | align 4 |
1747 | mario79 | 456 | sdraw_window: |
2529 | mario79 | 457 | mcall 12,1 |
1747 | mario79 | 458 | |
2529 | mario79 | 459 | xor eax,eax ; function 0 : define and draw window |
460 | xor esi,esi |
||
461 | mcall ,<100,215>,<100,70>,0x13400088,,title |
||
1747 | mario79 | 462 | |
2529 | mario79 | 463 | mcall 8,<47,10>,<31,10>,2,0x702050 |
464 | |||
465 | push ebx |
||
466 | add ebx,13*65536 |
||
467 | mov edi,ebx |
||
468 | inc edx |
||
469 | mcall |
||
470 | pop ebx |
||
471 | |||
472 | add ecx,15*65536 |
||
473 | inc edx |
||
474 | mcall |
||
1747 | mario79 | 475 | |
2529 | mario79 | 476 | mov ebx,edi |
477 | inc edx |
||
478 | mcall |
||
1747 | mario79 | 479 | |
2529 | mario79 | 480 | inc edx |
481 | mcall ,<160,40>,<28,14> |
||
1747 | mario79 | 482 | |
2529 | mario79 | 483 | mcall 4,<15,33>,0x80ffffff,setuptext ; write text to window |
1747 | mario79 | 484 | |
2529 | mario79 | 485 | add ebx,15 |
486 | add edx,10 |
||
487 | mcall |
||
1747 | mario79 | 488 | |
2529 | mario79 | 489 | mcall ,<169,32>,,buttext |
1747 | mario79 | 490 | |
2529 | mario79 | 491 | call drawtype |
492 | call drawtime |
||
493 | call drawflag |
||
1747 | mario79 | 494 | |
2529 | mario79 | 495 | mcall 12,2 |
496 | ret |
||
497 | ;------------------------------------------------------------------------------ |
||
498 | align 4 |
||
1747 | mario79 | 499 | drawtype: |
2529 | mario79 | 500 | mov edx,0xffffff |
501 | test [params], 1 |
||
502 | jz noblue |
||
1747 | mario79 | 503 | |
2529 | mario79 | 504 | mov edx,0x4e00e7 |
505 | ;-------------------------------------- |
||
506 | align 4 |
||
507 | noblue: |
||
508 | mcall 13,<80,75>,<30,12> |
||
509 | xor ecx,ecx |
||
510 | mov edx,typetext |
||
511 | add edx,[type] |
||
512 | mcall 4,<82,32>,,,12 |
||
513 | ret |
||
514 | ;------------------------------------------------------------------------------ |
||
515 | align 4 |
||
1747 | mario79 | 516 | drawtime: |
2529 | mario79 | 517 | mov edx,0xffffff |
518 | test [params], 1 |
||
519 | jz noblue1 |
||
1747 | mario79 | 520 | |
2529 | mario79 | 521 | mov edx,0x4e00e7 |
522 | ;-------------------------------------- |
||
523 | align 4 |
||
524 | noblue1: |
||
525 | mcall 13,<80,15>,<45,12> |
||
526 | xor esi,esi |
||
527 | movzx ecx,byte [time] |
||
528 | mcall 47,0x00020000,,<82,47> |
||
529 | ret |
||
530 | ;------------------------------------------------------------------------------ |
||
531 | align 4 |
||
1747 | mario79 | 532 | drawflag: |
2529 | mario79 | 533 | mcall 8,,,0x80000007 ; before we need delete button |
534 | ; otherwise, a few hours later the application will spend all buttons of system |
||
535 | mcall ,<150,10>,<45,10>,7,0xe0e0e0 ; then create button |
||
536 | |||
537 | mov edx,flag |
||
538 | bt dword [params],0 |
||
539 | jc setf |
||
1747 | mario79 | 540 | |
2529 | mario79 | 541 | inc edx |
542 | ;-------------------------------------- |
||
543 | align 4 |
||
544 | setf: |
||
545 | xor ecx,ecx |
||
546 | mcall 4,<153,47>,,,1 |
||
547 | ret |
||
548 | ;------------------------------------------------------------------------------ |
||
549 | align 4 |
||
1747 | mario79 | 550 | ; DATA AREA |
2529 | mario79 | 551 | buttext db 'SHOW',0 |
552 | flag db 'V ' |
||
553 | title db 'SCREENSAVER SETUP',0 |
||
554 | setuptext db 'TYPE: < >',0 |
||
555 | db 'TIME: < > MINUTES NEVER',0 |
||
556 | typetext db 'BLACK SCREENCOLOR LINES ASSEMBLER ' |
||
557 | type dd 12 |
||
558 | time db 15 ; время до запуска заставки в минутах |
||
559 | delay dd 100 |
||
1747 | mario79 | 560 | |
2529 | mario79 | 561 | lx1 dd 10 |
562 | lx2 dd 40 |
||
1747 | mario79 | 563 | |
2529 | mario79 | 564 | ly1 dd 50 |
565 | ly2 dd 100 |
||
1747 | mario79 | 566 | |
2529 | mario79 | 567 | addx1 dd 1 |
568 | addx2 dd 1 |
||
1747 | mario79 | 569 | |
2529 | mario79 | 570 | addy1 dd 1 |
571 | addy2 dd 1 |
||
1747 | mario79 | 572 | |
2529 | mario79 | 573 | stringlen dd 1 |
574 | stringstart dd 0 |
||
575 | stringpos dw 10 |
||
1747 | mario79 | 576 | |
2529 | mario79 | 577 | params db 0 ;if bit 0 set-ssaver works if bit 1 set-setup works |
1747 | mario79 | 578 | |
579 | fileinfo: |
||
2529 | mario79 | 580 | dd 0 |
581 | dd 0 |
||
582 | dd 0 |
||
583 | .size: dd 0 |
||
584 | .point: dd 0 |
||
585 | db '/sys/macros.inc',0 |
||
586 | ;------------------------------------------------------------------------------ |
||
587 | align 4 |
||
588 | IM_END: |
||
1747 | mario79 | 589 | ; UNINITIALIZED DATA: |
590 | |||
2529 | mario79 | 591 | lcolor dd ? |
592 | x_max dw ? ; размеры экрана |
||
593 | y_max dw ? |
||
1747 | mario79 | 594 | |
2529 | mario79 | 595 | top_right_corner rd 1 |
596 | ;------------------------------------------------------------------------------ |
||
597 | align 4 |
||
598 | fileinfo_buffer: |
||
599 | rb 40 |
||
600 | ;------------------------------------------------------------------------------ |
||
601 | align 4 |
||
602 | rb 512 |
||
603 | sthread_stack_top: |
||
604 | ;------------------------------------------------------------------------------ |
||
605 | align 4 |
||
606 | rb 512 |
||
607 | thread_stack_top: |
||
608 | ;------------------------------------------------------------------------------ |
||
609 | align 4 |
||
610 | rb 512 |
||
611 | stack_top: |
||
612 | I_END: |
||
613 | ;------------------------------------------------------------------------------>>153,47>45,10>150,10>82,47>45,12>80,15>82,32>30,12>80,75>169,32>15,33>28,14>160,40>31,10>47,10>100,70>100,215> |