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