Rev 539 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; SCREENSAVER APPLICATION by lisovin@26.ru |
2 | ; |
||
3 | ; Compile with FASM for Menuet |
||
4 | ; |
||
5 | use32 |
||
6 | org 0x0 |
||
7 | |||
532 | diamond | 8 | used_memory = 0x10000 |
9 | |||
31 | halyavin | 10 | db 'MENUET01' ; 8 byte id |
11 | dd 0x01 ; header version |
||
12 | dd START ; start of code |
||
13 | dd I_END ; size of image |
||
532 | diamond | 14 | dd used_memory ; memory for app |
15 | dd used_memory ; esp |
||
31 | halyavin | 16 | dd 0x0 , 0x0 ; I_Param , I_Icon |
17 | |||
18 | include 'lang.inc' |
||
485 | heavyiron | 19 | include '..\..\..\macros.inc' |
532 | diamond | 20 | purge mov ; decrease kpack'ed size |
31 | halyavin | 21 | |
22 | ;include 'debug.inc' |
||
23 | |||
24 | START: |
||
25 | mov eax,40 ; установить маску событий |
||
26 | mov ebx,110010b ; реагируем на клавиатуру, мышь, отрисовку фона |
||
485 | heavyiron | 27 | mcall |
31 | halyavin | 28 | |
532 | diamond | 29 | bgr_changed: |
31 | halyavin | 30 | |
532 | diamond | 31 | mov eax,14 |
32 | mcall |
||
33 | mov [y_max], ax |
||
34 | shr eax, 16 |
||
35 | mov [x_max], ax |
||
36 | shl eax, 16 |
||
37 | mov [top_right_corner], eax |
||
31 | halyavin | 38 | |
1647 | Nasarus | 39 | mcall 66, 4, 57, 0 ; hot key for {Space} |
40 | mcall 66, 4, 28, 0 ; hot key for {Enter} |
||
532 | diamond | 41 | still: |
42 | movzx ebx, [time] |
||
43 | imul ebx, 60*100 |
||
44 | mcall 23 ; ждём события в течение [time] минут |
||
45 | test eax, eax |
||
46 | jz create_ss_thread |
||
47 | cmp al, 2 ; key in buffer? |
||
48 | jz key |
||
49 | cmp al, 5 ; background redraw? |
||
50 | jz bgr_changed |
||
51 | ; mouse event |
||
52 | mcall 37,2 ; проверим кнопки |
||
53 | and al, 3 |
||
54 | cmp al, 3 ; нажаты обе кнопки мыши? |
||
55 | jnz still |
||
56 | mcall 37,0 ; проверим координаты |
||
57 | cmp [top_right_corner], eax |
||
58 | jnz still |
||
59 | create_setup: |
||
60 | test [params], 2 |
||
61 | jnz still ; окно настроек уже создано |
||
62 | mcall 51,1,sthread,used_memory-0x1000 |
||
63 | or [params], 2 |
||
64 | jmp still |
||
65 | key: |
||
66 | mcall ; eax = 2 |
||
1647 | Nasarus | 67 | cmp al, 2 ; hot key? |
68 | jne still ; no hotkey, evenets handling go on |
||
69 | xor edx, edx |
||
70 | mov dl, ah |
||
71 | mov eax, 72 |
||
72 | mov ebx, 1 |
||
73 | mov ecx, 2 |
||
74 | mcall ; transfer key code to active window after interception |
||
532 | diamond | 75 | jmp still |
31 | halyavin | 76 | |
532 | diamond | 77 | create_ss_thread: |
78 | test [params], 3 |
||
79 | jnz still |
||
80 | call create_ss |
||
81 | jmp still |
||
31 | halyavin | 82 | |
532 | diamond | 83 | create_ss: |
84 | mcall 51,1,thread,used_memory-0x2000 |
||
85 | or [params], 1 |
||
86 | ret |
||
31 | halyavin | 87 | |
88 | thread: |
||
532 | diamond | 89 | ; mov eax,5 |
90 | ; mov ebx,eax |
||
91 | ; mcall |
||
31 | halyavin | 92 | mov eax,40 |
93 | mov ebx,100010b |
||
485 | heavyiron | 94 | mcall |
31 | halyavin | 95 | cmp dword [type],0 |
96 | je drawsswin |
||
97 | cmp dword [type],24 |
||
98 | je asminit |
||
99 | mov dword [delay],1 |
||
100 | mov [lx1],10 ; for "draw line" |
||
101 | mov [lx2],40 |
||
102 | mov [ly1],50 |
||
103 | mov [ly2],100 |
||
104 | mov [addx1],1 |
||
105 | mov [addx2],1 |
||
106 | mov [addy1],1 |
||
107 | mov [addy2],1 |
||
108 | jmp drawsswin |
||
109 | asminit: ; for "assembler" |
||
110 | mov dword [delay],25 |
||
532 | diamond | 111 | mov eax,70 |
31 | halyavin | 112 | mov ebx,fileinfo |
485 | heavyiron | 113 | mcall |
532 | diamond | 114 | mov [filesize], ebx |
31 | halyavin | 115 | asminit1: |
532 | diamond | 116 | mov [stringstart],data_from_file |
31 | halyavin | 117 | mov dword [stringlen],1 |
118 | newpage: |
||
119 | mov word [stringpos],10 |
||
120 | |||
121 | drawsswin: |
||
122 | xor eax,eax |
||
532 | diamond | 123 | movzx ebx,[x_max] |
124 | movzx ecx,[y_max] |
||
31 | halyavin | 125 | inc ebx |
126 | inc ecx |
||
127 | mov edx,0x01000000 |
||
485 | heavyiron | 128 | mcall |
31 | halyavin | 129 | mov eax,13 |
130 | xor edx,edx |
||
485 | heavyiron | 131 | mcall |
31 | halyavin | 132 | tstill: |
133 | mov eax,23 |
||
134 | mov ebx,[delay] |
||
485 | heavyiron | 135 | mcall |
532 | diamond | 136 | test eax,eax |
137 | jnz thr_end |
||
31 | halyavin | 138 | cmp dword [type],0 |
139 | je tstill |
||
140 | cmp dword [type],24 |
||
141 | je drawssasm |
||
142 | call draw_line |
||
143 | jmp tstill |
||
144 | thr_end: |
||
532 | diamond | 145 | and [params], not 1 |
31 | halyavin | 146 | or eax,-1 |
485 | heavyiron | 147 | mcall |
31 | halyavin | 148 | |
149 | drawssasm: |
||
150 | mov edi,[stringstart] |
||
151 | add edi,[stringlen] |
||
152 | dec edi |
||
532 | diamond | 153 | lea eax,[edi-data_from_file] |
154 | cmp eax,[filesize] |
||
31 | halyavin | 155 | ja asminit1 |
532 | diamond | 156 | cmp word [edi],0x0a0d |
157 | je addstring |
||
158 | cmp byte [edi],0x0a |
||
31 | halyavin | 159 | jne noaddstring |
532 | diamond | 160 | dec edi |
161 | addstring: |
||
31 | halyavin | 162 | add word [stringpos],10 |
163 | add edi,2 |
||
164 | mov [stringstart],edi |
||
165 | mov dword [stringlen],1 |
||
166 | mov ax,[stringpos] |
||
167 | cmp ax,[y_max] |
||
168 | jb tstill |
||
169 | jmp newpage |
||
170 | noaddstring: |
||
171 | mov eax,4 |
||
172 | mov ebx,10*65536 |
||
173 | mov bx,[stringpos] |
||
174 | mov ecx,0x104ba010 |
||
175 | mov edx,[stringstart] |
||
176 | mov esi,[stringlen] |
||
485 | heavyiron | 177 | mcall |
31 | halyavin | 178 | inc dword [stringlen] |
179 | cmp byte [edi],byte ' ' |
||
180 | je drawssasm |
||
181 | jmp tstill |
||
182 | |||
183 | draw_line: |
||
532 | diamond | 184 | movzx esi,[x_max] |
185 | movzx edi,[y_max] |
||
31 | halyavin | 186 | |
187 | mov eax,[addx1] |
||
188 | add [lx1],eax |
||
189 | mov eax,[addy1] |
||
190 | add [ly1],eax |
||
191 | |||
192 | mov eax,[addx2] |
||
193 | add [lx2],eax |
||
194 | mov eax,[addy2] |
||
195 | add [ly2],eax |
||
196 | |||
197 | cmp [lx1],1 |
||
198 | jge dl1 |
||
199 | mov [addx1],1 |
||
200 | dl1: |
||
201 | cmp [lx2],1 |
||
202 | jge dl2 |
||
203 | mov [addx2],1 |
||
204 | dl2: |
||
205 | cmp [lx1],esi |
||
206 | jbe dl3 |
||
207 | mov [addx1],0xffffffff |
||
208 | dl3: |
||
209 | cmp [lx2],esi |
||
210 | jbe dl4 |
||
211 | mov [addx2],0xffffffff |
||
212 | dl4: |
||
213 | |||
214 | cmp [ly1],1 |
||
215 | jge dl5 |
||
216 | mov [addy1],1 |
||
217 | dl5: |
||
218 | cmp [ly2],2 |
||
219 | jge dl6 |
||
220 | mov [addy2],1 |
||
221 | dl6: |
||
222 | cmp [ly1],edi |
||
223 | jbe dl7 |
||
224 | mov [addy1],-1 |
||
225 | dl7: |
||
226 | cmp [ly2],edi |
||
227 | jbe dl8 |
||
228 | mov [addy2],-1 |
||
229 | dl8: |
||
230 | |||
231 | mov eax,[lx2] |
||
232 | cmp [lx1],eax |
||
233 | jz dnol |
||
234 | |||
235 | mov bx,word [lx1] |
||
236 | shl ebx,16 |
||
237 | mov bx,word [lx2] |
||
238 | |||
239 | mov cx,word [ly1] |
||
240 | shl ecx,16 |
||
241 | mov cx,word [ly2] |
||
242 | |||
243 | mov eax,38 |
||
244 | mov edx,[lcolor] |
||
245 | and edx,0xffffff |
||
485 | heavyiron | 246 | mcall |
31 | halyavin | 247 | |
248 | dnol: |
||
249 | |||
250 | add [lcolor],0x010201 |
||
251 | |||
252 | ret |
||
253 | |||
254 | |||
255 | sthread: ; start of execution |
||
256 | |||
257 | call sdraw_window |
||
258 | |||
259 | sstill: |
||
260 | |||
261 | mov eax,10 ; wait here for event |
||
485 | heavyiron | 262 | mcall |
31 | halyavin | 263 | |
532 | diamond | 264 | dec eax ; redraw request ? |
31 | halyavin | 265 | je sthread |
532 | diamond | 266 | dec eax ; key in buffer ? |
267 | jne sbutton |
||
268 | mov al,2 |
||
269 | mcall |
||
31 | halyavin | 270 | jmp sstill |
271 | |||
272 | sbutton: ; button |
||
273 | mov eax,17 ; get id |
||
485 | heavyiron | 274 | mcall |
31 | halyavin | 275 | |
276 | cmp ah,1 ; button id=1 ? |
||
277 | jne snoclose |
||
278 | |||
532 | diamond | 279 | and [params], not 2 |
31 | halyavin | 280 | mov eax,-1 ; close this program |
485 | heavyiron | 281 | mcall |
31 | halyavin | 282 | snoclose: |
283 | cmp ah,7 |
||
284 | jne nosetfl |
||
532 | diamond | 285 | xor [params], 1 |
31 | halyavin | 286 | call drawflag |
287 | call drawtype |
||
288 | call drawtime |
||
289 | jmp sstill |
||
290 | nosetfl: |
||
532 | diamond | 291 | test [params], 1 |
292 | jnz sstill |
||
31 | halyavin | 293 | cmp ah,2 |
294 | jne notypedown |
||
295 | mov eax,[type] |
||
296 | test eax,eax |
||
297 | je sstill |
||
298 | sub eax,12 |
||
299 | jmp typeupdn |
||
300 | notypedown: |
||
301 | cmp ah,3 |
||
302 | jne notypeup |
||
303 | mov eax,[type] |
||
304 | cmp eax,24 |
||
305 | jae sstill |
||
306 | add eax,12 |
||
307 | jmp typeupdn |
||
308 | notypeup: |
||
309 | cmp ah,4 |
||
310 | jne notimedown |
||
311 | mov al,[time] |
||
312 | cmp al,1 |
||
313 | jbe sstill |
||
532 | diamond | 314 | dec eax |
31 | halyavin | 315 | ; das |
316 | jmp timeupdn |
||
317 | notimedown: |
||
318 | cmp ah,5 |
||
319 | jne notimeup |
||
320 | mov al,[time] |
||
321 | cmp al,59 ; 0x59 |
||
322 | jae sstill |
||
532 | diamond | 323 | inc eax |
31 | halyavin | 324 | ; daa |
325 | jmp timeupdn |
||
326 | notimeup: |
||
327 | cmp ah,6 |
||
328 | jne noshow |
||
329 | mov eax,5 |
||
532 | diamond | 330 | mov ebx,10;150 |
485 | heavyiron | 331 | mcall |
31 | halyavin | 332 | call create_ss |
333 | noshow: |
||
334 | jmp sstill |
||
335 | |||
336 | timeupdn: |
||
337 | mov [time],al |
||
338 | call drawtime |
||
339 | jmp sstill |
||
340 | typeupdn: |
||
341 | mov [type],eax |
||
342 | call drawtype |
||
343 | jmp sstill |
||
344 | |||
345 | ; ********************************************* |
||
346 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
347 | ; ********************************************* |
||
348 | |||
349 | |||
350 | sdraw_window: |
||
351 | |||
352 | |||
353 | mov eax,12 ; function 12:tell os about windowdraw |
||
354 | mov ebx,1 ; 1, start of draw |
||
485 | heavyiron | 355 | mcall |
31 | halyavin | 356 | |
357 | ; DRAW WINDOW |
||
358 | xor eax,eax ; function 0 : define and draw window |
||
359 | mov ebx,100*65536+215 ; [x start] *65536 + [x size] |
||
360 | mov ecx,100*65536+70 ; [y start] *65536 + [y size] |
||
502 | heavyiron | 361 | mov edx,0x13400088 ; color of work area RRGGBB,8->color gl |
485 | heavyiron | 362 | mov edi,title |
363 | mcall |
||
31 | halyavin | 364 | |
532 | diamond | 365 | mov al,8 |
31 | halyavin | 366 | mov ebx,47*65536+10 |
367 | mov ecx,31*65536+10 |
||
368 | mov edx,2 |
||
369 | mov esi,0x702050 |
||
485 | heavyiron | 370 | mcall |
31 | halyavin | 371 | push ebx |
372 | add ebx,13*65536 |
||
373 | mov edi,ebx |
||
374 | inc edx |
||
485 | heavyiron | 375 | mcall |
31 | halyavin | 376 | pop ebx |
377 | add ecx,15*65536 |
||
378 | inc edx |
||
485 | heavyiron | 379 | mcall |
31 | halyavin | 380 | mov ebx,edi |
381 | inc edx |
||
485 | heavyiron | 382 | mcall |
31 | halyavin | 383 | mov ebx,160*65536+40 |
384 | mov ecx,28*65536+14 |
||
385 | inc edx |
||
485 | heavyiron | 386 | mcall |
387 | |||
532 | diamond | 388 | mov al,4 ; function 4 : write text to window |
485 | heavyiron | 389 | mov ebx,15*65536+33 ; [x start] *65536 + [y start] |
532 | diamond | 390 | mov ecx,0x80ffffff |
31 | halyavin | 391 | mov edx,setuptext |
485 | heavyiron | 392 | mcall |
31 | halyavin | 393 | add ebx,15 |
532 | diamond | 394 | add edx,10 |
485 | heavyiron | 395 | mcall |
31 | halyavin | 396 | mov ebx,169*65536+32 |
397 | mov edx,buttext |
||
485 | heavyiron | 398 | mcall |
31 | halyavin | 399 | |
400 | call drawtype |
||
401 | call drawtime |
||
402 | call drawflag |
||
403 | |||
404 | mov eax,12 ; function 12:tell os about windowdraw |
||
405 | mov ebx,2 ; 2, end of draw |
||
485 | heavyiron | 406 | mcall |
31 | halyavin | 407 | |
408 | ret |
||
409 | |||
410 | drawtype: |
||
411 | mov eax,13 |
||
412 | mov ebx,80*65536+75 |
||
413 | mov ecx,30*65536+12 |
||
414 | mov edx,0xffffff |
||
532 | diamond | 415 | test [params], 1 |
416 | jz noblue |
||
31 | halyavin | 417 | mov edx,0x4e00e7 |
418 | noblue: |
||
485 | heavyiron | 419 | mcall |
532 | diamond | 420 | mov al,4 |
31 | halyavin | 421 | mov ebx,82*65536+32 |
422 | xor ecx,ecx |
||
423 | mov edx,typetext |
||
424 | add edx,[type] |
||
425 | mov esi,12 |
||
485 | heavyiron | 426 | mcall |
31 | halyavin | 427 | ret |
428 | |||
429 | drawtime: |
||
430 | mov eax,13 |
||
431 | mov ebx,80*65536+15 |
||
432 | mov ecx,45*65536+12 |
||
433 | mov edx,0xffffff |
||
532 | diamond | 434 | test [params], 1 |
435 | jz noblue1 |
||
31 | halyavin | 436 | mov edx,0x4e00e7 |
437 | noblue1: |
||
485 | heavyiron | 438 | mcall |
532 | diamond | 439 | mov al,47 |
31 | halyavin | 440 | mov edx,82*65536+47 |
441 | xor esi,esi |
||
442 | movzx ecx,byte [time] |
||
443 | mov ebx,0x00020000 |
||
485 | heavyiron | 444 | mcall |
31 | halyavin | 445 | ret |
446 | |||
447 | drawflag: |
||
448 | mov eax,8 |
||
449 | mov ebx,150*65536+10 |
||
450 | mov ecx,45*65536+10 |
||
451 | mov edx,7 |
||
452 | mov esi,0xe0e0e0 |
||
485 | heavyiron | 453 | mcall |
532 | diamond | 454 | mov al,4 |
31 | halyavin | 455 | mov ebx,153*65536+47 |
456 | xor ecx,ecx |
||
457 | mov esi,1 |
||
458 | mov edx,flag |
||
459 | bt dword [params],0 |
||
460 | jc setf |
||
461 | inc edx |
||
462 | setf: |
||
485 | heavyiron | 463 | mcall |
31 | halyavin | 464 | ret |
465 | |||
466 | ; DATA AREA |
||
532 | diamond | 467 | buttext db 'SHOW',0 |
31 | halyavin | 468 | flag db 'V ' |
502 | heavyiron | 469 | title db 'SCREENSAVER SETUP',0 |
532 | diamond | 470 | setuptext db 'TYPE: < >',0 |
471 | db 'TIME: < > MINUTES NEVER',0 |
||
31 | halyavin | 472 | typetext db 'BLACK SCREENCOLOR LINES ASSEMBLER ' |
473 | type dd 12 |
||
474 | time db 15 ; время до запуска заставки в минутах |
||
475 | delay dd 100 |
||
476 | |||
477 | lx1 dd 10 |
||
478 | lx2 dd 40 |
||
479 | |||
480 | ly1 dd 50 |
||
481 | ly2 dd 100 |
||
482 | |||
483 | addx1 dd 1 |
||
484 | addx2 dd 1 |
||
485 | |||
486 | addy1 dd 1 |
||
487 | addy2 dd 1 |
||
488 | |||
489 | stringlen dd 1 |
||
490 | stringstart dd 0 |
||
491 | stringpos dw 10 |
||
492 | |||
532 | diamond | 493 | params db 0 ;if bit 0 set-ssaver works if bit 1 set-setup works |
31 | halyavin | 494 | |
495 | fileinfo: |
||
532 | diamond | 496 | ; used_memory-0x3000-data_from_file = ~50 Kb with current settings |
497 | dd 0,0,0,used_memory-0x3000-data_from_file,data_from_file |
||
539 | spraid | 498 | db '/sys/NETWORK/PPP.ASM',0 |
31 | halyavin | 499 | |
500 | I_END: |
||
501 | |||
502 | |||
503 | ; UNINITIALIZED DATA: |
||
504 | |||
505 | lcolor dd ? |
||
506 | x_max dw ? ; размеры экрана |
||
507 | y_max dw ? |
||
508 | |||
509 | top_right_corner dd ? |
||
532 | diamond | 510 | filesize dd ? |
511 | data_from_file:>> |