Subversion Repositories Kolibri OS

Rev

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: