Subversion Repositories Kolibri OS

Rev

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