Subversion Repositories Kolibri OS

Rev

Rev 502 | 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
488
  db '/RD/1/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: