Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2529 mario79 1
;------------------------------------------------------------------------------
2
;   @SS - screensaver
3
;------------------------------------------------------------------------------
4
; last update:  30/03/2012
5
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
6
; changes:      The program uses only 4 Kb memory is now.
7
;               Code refactoring. Using transparent cursor.
8
;               Fix bug - using lots of buttons from f.8.
9
;---------------------------------------------------------------------
1747 mario79 10
;   SCREENSAVER APPLICATION by lisovin@26.ru
11
;
12
;   Compile with FASM for Menuet
13
;
2529 mario79 14
;------------------------------------------------------------------------------
15
	use32
16
	org 0x0
1747 mario79 17
 
2529 mario79 18
	db 'MENUET01'	; 8 byte id
19
	dd 0x01		; header version
20
	dd START	; start of code
21
	dd IM_END	; size of image
22
	dd I_END	; memory for app
23
	dd stack_top	; esp
24
	dd 0x0		; I_Param
25
	dd 0x0		; path
26
;------------------------------------------------------------------------------
27
include 'lang.inc'
28
include '..\..\..\macros.inc'
1747 mario79 29
;include   'debug.inc'
2529 mario79 30
;------------------------------------------------------------------------------
31
align 4
1747 mario79 32
START:
2529 mario79 33
	mcall	68,11
34
	mcall	40,110010b
35
;------------------------------------------------------------------------------
36
align 4
1747 mario79 37
bgr_changed:
38
 
2529 mario79 39
	mcall	14
40
	mov	[y_max],ax
41
	shr	eax,16
42
	mov	[x_max],ax
43
	shl	eax,16
44
	mov	[top_right_corner],eax
45
;------------------------------------------------------------------------------
46
align 4
1747 mario79 47
still:
2529 mario79 48
	movzx	ebx,[time]
49
	imul	ebx,60*100
50
	mcall	23		; ждём события в течение [time] минут
51
	test	eax,eax
52
	jz	create_ss_thread
53
 
54
	cmp	al,2		; key in buffer?
55
	jz	key
56
 
57
	cmp	al,5		; background redraw?
58
	jz	bgr_changed
1747 mario79 59
; mouse event
2529 mario79 60
	mcall	37,2		; проверим кнопки
61
	and	al,3
62
	cmp	al,3		; нажаты обе кнопки мыши?
63
	jnz	still
64
 
65
	mcall	37,0		; проверим координаты
66
	cmp	[top_right_corner],eax
67
	jnz	still
68
;------------------------------------------------------------------------------
69
align 4
1747 mario79 70
create_setup:
2529 mario79 71
	test	[params],2
72
	jnz	still           ; окно настроек уже создано
73
	mcall	51,1,sthread,sthread_stack_top
74
	or	[params],2
75
	jmp	still
76
;------------------------------------------------------------------------------
77
align 4
1747 mario79 78
key:
2529 mario79 79
	mcall                   ; eax = 2
80
	jmp	still
81
;------------------------------------------------------------------------------
82
align 4
1747 mario79 83
create_ss_thread:
2529 mario79 84
	test	[params],3
85
	jnz	still
86
	call	create_ss
87
	jmp	still
88
;------------------------------------------------------------------------------
89
align 4
1747 mario79 90
create_ss:
2529 mario79 91
	mcall	51,1,thread,thread_stack_top
92
	or	[params],1
93
	ret
94
;------------------------------------------------------------------------------
95
align 4
96
thread:
97
	mcall	40,100010b
98
;set_new_cursor_skin - transparent cursor
99
	mcall	68,12,32*32*4	; get memory for own cursor area
1747 mario79 100
 
2529 mario79 101
	push	eax
102
	mov	ecx,eax
103
	mcall	37,4,,2		; load own cursor
1747 mario79 104
 
2529 mario79 105
	mov	ecx,eax
106
	mcall	37,5		; set own cursor
1747 mario79 107
 
2529 mario79 108
	pop	ecx
109
	mcall	68,13	; free own cursor area
1747 mario79 110
 
2529 mario79 111
	cmp	[type],dword 0
112
	je	drawsswin
1747 mario79 113
 
2529 mario79 114
	cmp	[type],dword 24
115
	je	asminit
1747 mario79 116
 
2529 mario79 117
	mov	dword [delay],1
118
	mov	[lx1],10         ; for "draw line"
119
	mov	[lx2],40
120
	mov	[ly1],50
121
	mov	[ly2],100
122
	mov	[addx1],1
123
	mov	[addx2],1
124
	mov	[addy1],1
125
	mov	[addy2],1
126
	jmp	drawsswin
127
;--------------------------------------
128
align 4
129
asminit:	; for "assembler" - assembler sources demo
130
; get size of file
131
	mov	[fileinfo],dword 5
132
	mov	[fileinfo.point],dword fileinfo_buffer
133
	mcall	70,fileinfo
134
	test	eax,eax
135
	jnz	.no_file
136
; get memory for file
137
	mov	ecx,[fileinfo_buffer+32]
138
	mov	[fileinfo.size],ecx
139
	mcall	68,12
140
	mov	[fileinfo.point],eax
141
; load file
142
	mov	[fileinfo],dword 0
143
	mcall	70,fileinfo
144
	test	eax,eax
145
	jz	@f
146
	mcall	68,13,[fileinfo.point]
147
;--------------------------------------
148
align 4
149
.no_file:
150
	mov	[type],dword 0
151
	jmp	drawsswin
152
;--------------------------------------
153
align 4
154
@@:
155
	mov	dword [delay],1	;25 - old value
156
;--------------------------------------
157
align 4
158
asminit1:
159
	mov	eax,[fileinfo.point]
160
	mov	[stringstart],eax
161
	mov	dword [stringlen],1
162
;--------------------------------------
163
align 4
164
newpage:
165
	mov	word [stringpos],10
166
;--------------------------------------
167
align 4
168
drawsswin:
169
	xor	eax,eax
170
	movzx	ebx,[x_max]
171
	movzx	ecx,[y_max]
172
	inc	ebx
173
	inc	ecx
174
	mcall	,,,0x01000000
1747 mario79 175
 
2529 mario79 176
	xor	edx,edx
177
	mcall	13
178
;--------------------------------------
179
align 4
180
tstill:
181
	mcall	23,[delay]
182
	test	eax,eax
183
	jnz	thr_end
1747 mario79 184
 
2529 mario79 185
	cmp	[type],dword 0
186
	je	tstill
1747 mario79 187
 
2529 mario79 188
	cmp	[type],dword 24
189
	je	drawssasm
1747 mario79 190
 
2529 mario79 191
	call	draw_line
192
	jmp	tstill
193
;--------------------------------------
194
align 4
195
thr_end:
196
	cmp	[type],dword 24
197
	jne	@f
198
	mcall	68,13,[fileinfo.point]
199
;--------------------------------------
200
align 4
201
@@:
202
	and	[params], not 1
203
	or	eax,-1
204
	mcall
205
;------------------------------------------------------------------------------
206
align 4
207
drawssasm:
208
	mov	edi,[stringstart]
209
	add	edi,[stringlen]
210
	dec	edi
1747 mario79 211
 
2529 mario79 212
	mov	eax,edi
213
	sub	eax,[fileinfo.point]
1747 mario79 214
 
2529 mario79 215
	cmp	eax,[fileinfo.size]
216
	ja	asminit1
1747 mario79 217
 
2529 mario79 218
	cmp	word [edi],0x0a0d
219
	je	addstring
1747 mario79 220
 
2529 mario79 221
	cmp	byte [edi],0x0a
222
	jne	noaddstring
1747 mario79 223
 
2529 mario79 224
	dec	edi
225
;--------------------------------------
226
align 4
227
addstring:
228
	add	word [stringpos],10
229
	add	edi,2
230
	mov	[stringstart],edi
231
	mov	dword [stringlen],1
232
	mov	ax,[stringpos]
233
	cmp	ax,[y_max]
234
	jb	tstill
235
	jmp	newpage
236
;--------------------------------------
237
align 4
238
noaddstring:
239
	mov	ebx,10*65536
240
	mov	bx,[stringpos]
241
	mcall	4,,0x104ba010,[stringstart],[stringlen]
242
	inc	dword [stringlen]
243
	cmp	[edi],byte ' '
244
	je	drawssasm
245
	jmp	tstill
246
;------------------------------------------------------------------------------
247
align 4
248
draw_line:
249
	movzx	esi,[x_max]
250
	movzx	edi,[y_max]
1747 mario79 251
 
2529 mario79 252
	mov	eax,[addx1]
253
	add	[lx1],eax
254
	mov	eax,[addy1]
255
	add	[ly1],eax
1747 mario79 256
 
2529 mario79 257
	mov	eax,[addx2]
258
	add	[lx2],eax
259
	mov	eax,[addy2]
260
	add	[ly2],eax
261
 
262
	cmp	[lx1],1
263
	jge	dl1
264
	mov	[addx1],1
265
;--------------------------------------
266
align 4
267
dl1:
268
	cmp	[lx2],1
269
	jge	dl2
1747 mario79 270
 
2529 mario79 271
	mov	[addx2],1
272
;--------------------------------------
273
align 4
274
dl2:
275
	cmp	[lx1],esi
276
	jbe	dl3
277
 
278
	mov	[addx1],0xffffffff
279
;--------------------------------------
280
align 4
281
dl3:
282
	cmp	[lx2],esi
283
	jbe	dl4
284
 
285
	mov	[addx2],0xffffffff
286
;--------------------------------------
287
align 4
288
dl4:
289
	cmp	[ly1],1
290
	jge	dl5
291
	mov	[addy1],1
292
;--------------------------------------
293
align 4
294
dl5:
295
	cmp	[ly2],2
296
	jge	dl6
297
 
298
	mov	[addy2],1
299
;--------------------------------------
300
align 4
301
dl6:
302
	cmp	[ly1],edi
303
	jbe	dl7
304
 
305
	mov	[addy1],-1
306
;--------------------------------------
307
align 4
308
dl7:
309
	cmp	[ly2],edi
310
	jbe	dl8
311
 
312
	mov	[addy2],-1
313
;--------------------------------------
314
align 4
315
dl8:
316
	mov	eax,[lx2]
317
	cmp	[lx1],eax
318
	jz	dnol
319
 
320
	mov	bx,word [lx1]
321
	shl	ebx,16
322
	mov	bx,word [lx2]
323
 
324
	mov	cx,word [ly1]
325
	shl	ecx,16
326
	mov	cx,word [ly2]
327
 
328
	mov	edx,[lcolor]
329
	and	edx,0xffffff
330
	mcall	38
331
;--------------------------------------
332
align 4
333
dnol:
334
	add	[lcolor],0x010201
335
	ret
336
;------------------------------------------------------------------------------
337
align 4
338
sthread:		; start of execution
1747 mario79 339
     call sdraw_window
2529 mario79 340
;--------------------------------------
341
align 4
1747 mario79 342
sstill:
2529 mario79 343
	mcall	10	; wait here for event
344
	dec	eax	; redraw request ?
345
	je	sthread
1747 mario79 346
 
2529 mario79 347
	dec	eax	; key in buffer ?
348
	jne	sbutton
1747 mario79 349
 
2529 mario79 350
	mcall	2
351
	jmp	snoclose	;sstill
352
;------------------------------------------------------------------------------
353
align 4
354
sbutton:		; button
355
	mcall	17	; get id
1747 mario79 356
 
2529 mario79 357
	cmp	ah,1	; button id=1 ?
358
	jne	snoclose
1747 mario79 359
 
2529 mario79 360
	and	[params],not 2
361
	mov	eax,-1	; close this program
362
	mcall
363
;--------------------------------------
364
align 4
365
snoclose:
366
	cmp	ah,7
367
	jne	nosetfl
1747 mario79 368
 
2529 mario79 369
	xor	[params],1
370
	call	drawflag
371
	call	drawtype
372
	call	drawtime
373
	jmp	sstill
374
;--------------------------------------
375
align 4
376
nosetfl:
377
	test	[params],1
378
	jnz	sstill
1747 mario79 379
 
2529 mario79 380
	cmp	ah,2
381
	jne	notypedown
1747 mario79 382
 
2529 mario79 383
	mov	eax,[type]
384
	test	eax,eax
385
	je	sstill
386
 
387
	sub	eax,12
388
	jmp	typeupdn
389
;--------------------------------------
390
align 4
391
notypedown:
392
	cmp	ah,3
393
	jne	notypeup
394
 
395
	mov	eax,[type]
396
	cmp	eax,24
397
	jae	sstill
398
 
399
	add	eax,12
400
	jmp	typeupdn
401
;--------------------------------------
402
align 4
403
notypeup:
404
	cmp	ah,4
405
	jne	notimedown
406
 
407
	mov	al,[time]
408
	cmp	al,1
409
	jbe	sstill
410
 
411
	dec	eax
412
;	das
413
	jmp	timeupdn
414
;--------------------------------------
415
align 4
416
notimedown:
417
	cmp	ah,5
418
	jne	notimeup
419
 
420
	mov	al,[time]
421
	cmp	al,59	; 0x59
422
	jae	sstill
423
 
424
	inc	eax
425
;	daa
426
	jmp	timeupdn
427
;--------------------------------------
428
align 4
429
notimeup:
430
	cmp	ah,6
431
	jne	noshow
432
 
433
	mcall	5,10
434
	call	create_ss
435
;--------------------------------------
436
align 4
437
noshow:
438
	jmp	sstill
439
;--------------------------------------
440
align 4
441
timeupdn:
442
	mov	[time],al
443
	call	drawtime
444
	jmp	sstill
445
;--------------------------------------
446
align 4
447
typeupdn:
448
	mov	[type],eax
449
	call	drawtype
450
	jmp	sstill
451
;------------------------------------------------------------------------------
1747 mario79 452
;   *********************************************
453
;   *******  WINDOW DEFINITIONS AND DRAW ********
454
;   *********************************************
2529 mario79 455
align 4
1747 mario79 456
sdraw_window:
2529 mario79 457
	mcall	12,1
1747 mario79 458
 
2529 mario79 459
	xor	eax,eax		; function 0 : define and draw window
460
	xor	esi,esi
461
	mcall	,<100,215>,<100,70>,0x13400088,,title
1747 mario79 462
 
2529 mario79 463
	mcall	8,<47,10>,<31,10>,2,0x702050
464
 
465
	push	ebx
466
	add	ebx,13*65536
467
	mov	edi,ebx
468
	inc	edx
469
	mcall
470
	pop	ebx
471
 
472
	add	ecx,15*65536
473
	inc	edx
474
	mcall
1747 mario79 475
 
2529 mario79 476
	mov	ebx,edi
477
	inc	edx
478
	mcall
1747 mario79 479
 
2529 mario79 480
	inc	edx
481
	mcall	,<160,40>,<28,14>
1747 mario79 482
 
2529 mario79 483
	mcall	4,<15,33>,0x80ffffff,setuptext	; write text to window
1747 mario79 484
 
2529 mario79 485
	add	ebx,15
486
	add	edx,10
487
	mcall
1747 mario79 488
 
2529 mario79 489
	mcall	,<169,32>,,buttext
1747 mario79 490
 
2529 mario79 491
	call	drawtype
492
	call	drawtime
493
	call	drawflag
1747 mario79 494
 
2529 mario79 495
	mcall	12,2
496
	ret
497
;------------------------------------------------------------------------------
498
align 4
1747 mario79 499
drawtype:
2529 mario79 500
	mov	edx,0xffffff
501
	test	[params], 1
502
	jz	noblue
1747 mario79 503
 
2529 mario79 504
	mov	edx,0x4e00e7
505
;--------------------------------------
506
align 4
507
noblue:
508
	mcall	13,<80,75>,<30,12>
509
	xor	ecx,ecx
510
	mov	edx,typetext
511
	add	edx,[type]
512
	mcall	4,<82,32>,,,12
513
	ret
514
;------------------------------------------------------------------------------
515
align 4
1747 mario79 516
drawtime:
2529 mario79 517
	mov	edx,0xffffff
518
	test	[params], 1
519
	jz	noblue1
1747 mario79 520
 
2529 mario79 521
	mov	edx,0x4e00e7
522
;--------------------------------------
523
align 4
524
noblue1:
525
	mcall	13,<80,15>,<45,12>
526
	xor	esi,esi
527
	movzx	ecx,byte [time]
528
	mcall	47,0x00020000,,<82,47>
529
	ret
530
;------------------------------------------------------------------------------
531
align 4
1747 mario79 532
drawflag:
2529 mario79 533
	mcall	8,,,0x80000007	; before we need delete button
534
; otherwise, a few hours later the application will spend all buttons of system
535
	mcall	,<150,10>,<45,10>,7,0xe0e0e0	; then create button
536
 
537
	mov	edx,flag
538
	bt	dword [params],0
539
	jc	setf
1747 mario79 540
 
2529 mario79 541
	inc	edx
542
;--------------------------------------
543
align 4
544
setf:
545
	xor	ecx,ecx
546
	mcall	4,<153,47>,,,1
547
	ret
548
;------------------------------------------------------------------------------
549
align 4
1747 mario79 550
; DATA AREA
2529 mario79 551
buttext		db 'SHOW',0
552
flag		db 'V '
553
title		db 'SCREENSAVER SETUP',0
554
setuptext	db 'TYPE: < >',0
555
		db 'TIME: < >     MINUTES    NEVER',0
556
typetext	db 'BLACK SCREENCOLOR LINES ASSEMBLER   '
557
type	dd 12
558
time	db 15	; время до запуска заставки в минутах
559
delay	dd 100
1747 mario79 560
 
2529 mario79 561
lx1	dd 10
562
lx2	dd 40
1747 mario79 563
 
2529 mario79 564
ly1	dd 50
565
ly2	dd 100
1747 mario79 566
 
2529 mario79 567
addx1	dd 1
568
addx2	dd 1
1747 mario79 569
 
2529 mario79 570
addy1	dd 1
571
addy2	dd 1
1747 mario79 572
 
2529 mario79 573
stringlen	dd 1
574
stringstart	dd 0
575
stringpos	dw 10
1747 mario79 576
 
2529 mario79 577
params	db 0	;if bit 0 set-ssaver works if bit 1 set-setup works
1747 mario79 578
 
579
fileinfo:
2529 mario79 580
	dd 0
581
	dd 0
582
	dd 0
583
.size:	dd 0
584
.point:	dd 0
585
	db '/sys/macros.inc',0
586
;------------------------------------------------------------------------------
587
align 4
588
IM_END:
1747 mario79 589
; UNINITIALIZED DATA:
590
 
2529 mario79 591
lcolor	dd ?
592
x_max	dw ?	; размеры экрана
593
y_max	dw ?
1747 mario79 594
 
2529 mario79 595
top_right_corner	rd 1
596
;------------------------------------------------------------------------------
597
align 4
598
fileinfo_buffer:
599
	rb 40
600
;------------------------------------------------------------------------------
601
align 4
602
	rb 512
603
sthread_stack_top:
604
;------------------------------------------------------------------------------
605
align 4
606
	rb 512
607
thread_stack_top:
608
;------------------------------------------------------------------------------
609
align 4
610
	rb 512
611
stack_top:
612
I_END:
613
;------------------------------------------------------------------------------