Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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