Subversion Repositories Kolibri OS

Rev

Rev 2359 | Rev 5092 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2359 IgorA 1
use32
2
	org 0x0
3
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
4
	dd 0x1
5
	dd start
6
	dd i_end ;размер приложения
7
	dd mem
8
	dd stacktop
9
	dd 0
10
	dd sys_path
11
 
12
include '../../../macros.inc'
13
include '../../../proc32.inc'
14
include '../../../develop/libraries/box_lib/load_lib.mac'
15
include '../../nu_pogodi/trunk/mem.inc'
16
include '../../nu_pogodi/trunk/dll.inc'
17
 
18
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
2501 IgorA 19
hed db 'Life 23.03.12',0 ;подпись окна
2359 IgorA 20
 
21
struct FileInfoBlock
22
	Function dd ?
23
	Position dd ?
24
	Flags	 dd ?
25
	Count	 dd ?
26
	Buffer	 dd ?
27
		db ?
28
	FileName dd ?
29
ends
30
 
31
run_file_70 FileInfoBlock
32
image_data dd 0 ;указатель на временную память. для нужен преобразования изображения
33
 
34
fn_toolbar db 'toolbar.png',0
35
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
36
IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*9
37
image_data_toolbar dd 0
38
 
39
macro load_image_file path,buf,size { ;макрос для загрузки изображений
40
	;path - может быть переменной или строковым параметром
41
	if path eqtype '' ;проверяем задан ли строкой параметр path
42
		jmp @f
43
			local .path_str
44
			.path_str db path ;формируем локальную переменную
45
			db 0
46
		@@:
47
		;32 - стандартный адрес по которому должен быть буфер с системным путем
48
		copy_path .path_str,[32],file_name,0x0
49
	else
50
		copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
51
	end if
52
 
53
	stdcall mem.Alloc, dword size ;выделяем память для изображения
54
	mov [buf],eax
55
 
56
	mov eax,70 ;70-я функция работа с файлами
57
	mov [run_file_70.Function], 0
58
	mov [run_file_70.Position], 0
59
	mov [run_file_70.Flags], 0
60
	mov [run_file_70.Count], dword size
61
	m2m [run_file_70.Buffer], [buf]
62
	mov byte[run_file_70+20], 0
63
	mov [run_file_70.FileName], file_name
64
	mov ebx,run_file_70
65
	int 0x40 ;загружаем файл изображения
66
	cmp ebx,0xffffffff
67
	je @f
68
		;определяем вид изображения и переводим его во временный буфер image_data
69
		stdcall dword[img_decode], dword[buf],ebx,0
70
		mov dword[image_data],eax
71
		;преобразуем изображение к формату rgb
72
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
73
		;удаляем временный буфер image_data
74
		stdcall dword[img_destroy], dword[image_data]
75
	@@:
76
}
77
 
78
;--------------------------------------
79
struct Cell
80
	x dd ? ;+0
81
	y dd ? ;+4
82
	tc dd ? ;+8
83
	liv db ? ;+12
84
	so db ? ;+13
85
ends
86
 
87
MAX_CELL equ 90000
88
COL_MEM equ 64 ;число цветов
89
 
90
cell dd 0 ;указатель на память со структурами ячеек
91
memCell dd 0
92
CellColors dd 0
93
 
94
macro get_cell_offset reg,ind
95
{
96
	mov reg,ind
97
	imul reg,sizeof.Cell
98
	add reg,dword[cell]
99
}
100
 
101
capt rb 50
102
er_oom db 0 ;на случай исчерпания памяти
103
tim_ch db 0 ;автоматически просчитывать поколения
104
poc_stop dd 1 ;просчет на число поколений
105
Cor_x dd 0
106
Cor_y dd 0
107
tim dd 0 ;время (поколение)
108
b_sort dd 0 ;граница для сортированных ячеек
109
osob dd 0 ;число особей
110
zoom db 3 ;масштаб поля
111
txt_zoom db 'Масштаб:',0
112
txt_gen db 'Поколение:',0
113
txt_osob db 'Особей:',0
114
 
115
;настройка массива с цветами
116
; col_pole - цвет поля
117
; col_cell_n - цвет новой ячейки
118
; col_cell_o - цвет старой ячейки
119
align 4
120
proc pole_init_colors uses eax ebx ecx edx esi edi, col_pole:dword, col_cell_n:dword, col_cell_o:dword
121
	mov esi,dword[CellColors]
122
	mov ebx,dword[col_pole]
123
	mov dword[esi],ebx
124
 
125
	add esi,4
126
	mov edi,COL_MEM
127
	dec edi
128
	shl edi,2
129
	add edi,esi
130
	; esi - указатель на 1-й градиентный цвет
131
	; edi - указатель на последний градиентный цвет
132
	mov eax,dword[col_cell_n]
133
	mov ebx,dword[col_cell_o]
134
 
135
	mov dword[esi],eax
136
	mov dword[edi],ebx
137
	;need save ecx edx
138
	stdcall middle_colors, esi,edi
139
 
140
	ret
141
endp
142
 
143
;вспомогательная функция для находжения среднего цвета и записи его в массив
144
;input:
145
; eax - цвет начальный
146
; ebx - цвет конечный
147
;зазрушаються: ecx, edx
148
align 4
149
proc middle_colors uses edi esi, i0:dword, i1:dword
150
	mov esi,dword[i0]
151
	mov edi,dword[i1]
152
	;перед вызовом функции
153
	;dword[esi]=eax
154
	;dword[edi]=ebx
155
	sub edi,esi
156
	shr edi,1
157
	btr edi,1 ;округляем до 4-х, т. к. нужно получить адрес (округление хитрое - убираем один бит вместо предполагаемых 2-х)
158
	add edi,esi
159
	cmp edi,esi
160
	je @f
161
		push eax ebx
162
 
163
		mov ecx,eax
164
		mov edx,ebx
165
 
166
		;находим средний цвет между eax и ebx
167
		and ebx,111111101111111011111110b ;убираем последние биты в цветах r, g, b
168
		and eax,111111101111111011111110b
169
		add eax,ebx ;сумируем цвета из r, g, b
170
		shr eax,1   ;делим на 2
171
		mov dword[edi],eax
172
 
173
		;рекурсивный вызов для дробления верхней половины
174
		mov ebx,eax
175
		mov eax,ecx
176
		stdcall middle_colors, [i0],edi
177
 
178
		;рекурсивный вызов для дробления нижней половины
179
		mov eax,ebx
180
		mov ebx,edx
181
		stdcall middle_colors, edi,[i1]
182
 
183
		pop ebx eax
184
	@@:
185
	ret
186
endp
187
 
188
align 4
189
pole_clear:
190
	push eax ecx edi
191
	xor eax,eax
192
	mov dword[tim],eax
193
	mov dword[osob],eax
194
	mov  byte[tim_ch],al
195
	mov dword[Cor_x],eax
196
	mov dword[Cor_y],eax
197
	mov dword[b_sort],eax
198
	mov  byte[er_oom],al
199
	cld
200
	mov ecx,MAX_CELL
201
	imul ecx,sizeof.Cell
202
	mov edi,dword[cell]
203
	repne stosb ;memset(cell,0,sizeof(Cell)*MAX_CELL);
204
	mov edi,dword[memCell]
205
	mov ecx,MAX_CELL
206
	@@:
207
		stosd ;for(i=0;i
208
		;mov dword[edi],eax
209
		;add edi,4
210
		inc eax
211
		loop @b
212
	pop edi ecx eax
213
	ret
214
 
215
align 4
216
proc pole_cell_creat, x:dword, y:dword, li:dword
217
	pushad ;eax ebx ecx edx edi
218
 
219
	; *** если клетка уже была создана
220
	stdcall pole_cell_find, [x],[y]
221
	cmp eax,0
222
	je @f ;if(i){
223
		get_cell_offset ebx,eax
224
		cmp dword[li],0
225
		jne .else_if ;if(!li)
226
			; если создается пустая клетка
227
			inc byte[ebx+13] ;+13 = .so
228
			jmp .fun_e
229
		.else_if: ;else if(!(cell[i].liv&1) ){
230
		bt word[ebx+12],0 ;+12 = .liv
231
			; если создается живая клетка
232
			; и раньше клетка была создана но оказалась пустой
233
			jae .creat_border_cells
234
		jmp .fun_e
235
	@@:
236
 
237
	; *** создание новой ячейки
238
	; находим номер свободной ячейки (i) для добавления новой
239
	mov edi,dword[memCell]
240
	inc dword[edi]
241
	cmp dword[edi],MAX_CELL
242
	jne @f
243
		dec dword[edi]
244
		mov byte[tim_ch],0
245
		;... need call message: "eror out of memory" ...
246
		;... вывод сообщения переполнения надо добавить  ...
247
		mov byte[er_oom],0
248
		jmp .fun_e ;return;
249
	@@:
250
	mov eax,dword[edi]
251
	shl eax,2
252
	add eax,dword[memCell] ;eax -> memCell[firstC]
253
	get_cell_offset ebx,dword[eax]
254
 
255
	mov ecx,dword[x]
256
	mov dword[ebx],ecx ;+0 = .x
257
	mov edx,dword[y]
258
	mov dword[ebx+4],edx ;+4 = .y
259
	mov eax,dword[tim]
260
	mov dword[ebx+8],eax ;+8 = .tc
261
	mov byte[ebx+12],0 ;+12 = .liv
262
 
263
	cmp dword[li],0
264
	jne @f
265
		mov byte[ebx+13],1 ;+13 = .so
266
		jmp .fun_e
267
	@@:
268
	mov byte[ebx+13],0 ;+13 = .so
269
 
270
	.creat_border_cells:
271
		inc dword[osob]
272
		or byte[ebx+12],1 ;+12 = .liv
273
		mov ecx,dword[x]
274
		dec ecx
275
		mov edx,dword[y]
276
		dec edx
277
		stdcall pole_cell_creat,ecx,edx,0
278
		inc edx
279
		stdcall pole_cell_creat,ecx,edx,0
280
		inc edx
281
		stdcall pole_cell_creat,ecx,edx,0
282
		inc ecx
283
		stdcall pole_cell_creat,ecx,edx,0
284
		sub edx,2
285
		stdcall pole_cell_creat,ecx,edx,0
286
		inc ecx
287
		stdcall pole_cell_creat,ecx,edx,0
288
		inc edx
289
		stdcall pole_cell_creat,ecx,edx,0
290
		inc edx
291
		stdcall pole_cell_creat,ecx,edx,0
292
	.fun_e:
293
	popad ;edi edx ecx ebx eax
294
	ret
295
endp
296
 
297
;output:
298
; eax - index
299
align 4
300
proc pole_cell_find, x:dword, y:dword
301
	mov eax,dword[memCell]
302
	cmp dword[eax],0
303
	jne @f
304
		xor eax,eax ;if(!fristC) return 0;
305
		jmp .fun_e
306
	@@:
307
 
308
	xor eax,eax ;fnd=0;
309
	cmp dword[b_sort],0
310
	je @f
311
		stdcall pole_bin_find, [memCell], [x],[y], [b_sort] ;i=BinFind(memCell, x,y, b_sort);
312
		cmp eax,0
313
		je @f
314
			shl eax,2
315
			add eax,dword[memCell]
316
			mov eax,dword[eax] ;if(i) fnd=memCell[i];
317
			jmp .fun_e
318
	@@:
319
 
320
	cmp eax,0
321
	jne @f ;if(!fnd){ // поиск ячейки за бинарным деревом
322
		push ebx ecx edx edi esi
323
		;ebx -> i
324
		;ecx -> firstC
325
		;edx -> &memCell[i]
326
		;edi -> cell[memCell[i]]
327
		mov ecx,dword[memCell]
328
		mov ebx,dword[b_sort]
329
		mov edx,ebx
330
		shl edx,2
331
		add edx,ecx
332
		mov ecx,dword[ecx]
333
		.cycle_b: ;for(i=b_sort+1;i<=fristC;i++)
2501 IgorA 334
			inc ebx
335
			cmp ebx,ecx
336
			jg .cycle_e
2359 IgorA 337
			add edx,4
338
			get_cell_offset edi,dword[edx]
339
			mov esi,dword[x]
340
			cmp dword[edi],esi ;+0 = .x
341
			jne .if_e
342
			mov esi,dword[y]
343
			cmp dword[edi+4],esi ;+4 = .y
344
			jne .if_e
345
				;if(cell[memCell[i]].x==x && cell[memCell[i]].y==y){
346
				mov eax,dword[edx] ;fnd=memCell[i];
347
				jmp .cycle_e ;break;
348
			.if_e:
2501 IgorA 349
			jmp .cycle_b
2359 IgorA 350
		.cycle_e:
351
		pop esi edi edx ecx ebx
352
	@@:
353
	.fun_e:
354
	ret
355
endp
356
 
357
;output:
358
; eax - index
359
align 4
360
proc pole_bin_find, mas:dword, fx:dword, fy:dword, k:dword
361
	push ebx ecx edx edi
362
	xor eax,eax
363
	mov ebx,1 ;ebx - максимальный порядок для дерева
364
	@@:
365
	cmp dword[k],ebx
366
	jle @f ;while(k>por)
367
		shl ebx,1 ;por<<=1;
368
		jmp @b
369
	@@:
370
	cmp dword[k],ebx
371
	jge @f ;if(k
372
		shr ebx,1 ;por>>=1;
373
	@@:
374
	mov ecx,ebx ;i=por;
375
 
376
	;ecx -> i
377
	;edi -> mas[i]
378
	.cycle_b: ;do{
379
		shr ebx,1 ;por>>=1;
380
 
381
		mov edi,ecx
382
		shl edi,2
383
		add edi,dword[mas]
384
		;if(compare_cells_mb(mas[i],fx,fy)){
385
		stdcall pole_compare_cells_mb_coords, dword[edi],[fx],[fy]
386
		cmp dl,0
387
		je .if_u0_e
388
			@@: ;while(i+por>k)
389
			mov edx,ecx
390
			add edx,ebx
391
			cmp edx,dword[k] ;i+por>k
392
			jle @f
393
				shr ebx,1 ;por>>=1;
394
				jmp @b
395
			@@:
396
			add ecx,ebx ;i+=por;
397
			jmp .if_e
398
		.if_u0_e:
399
		;else if(compare_cells_bm(mas[i],fx,fy))i-=por;
400
		stdcall pole_compare_cells_bm_coords, dword[edi],[fx],[fy]
401
		cmp dl,0
402
		je .if_u1_e
403
			sub ecx,ebx
404
			jmp .if_e
405
		.if_u1_e:
406
		;else { m=i; por=0; }
407
			mov eax,ecx
408
			xor ebx,ebx
409
		.if_e:
410
	cmp ebx,0
411
	jne .cycle_b ;}while(por);
412
 
413
	pop edi edx ecx ebx
414
	ret
415
endp
416
 
417
;output:
418
; dl
419
align 4
420
proc pole_compare_cells_bm_coords, i0:dword, fx:dword, fy:dword
421
	push eax ebx ecx
422
	get_cell_offset eax,[i0]
423
	;eax -> cell[i0]
424
	mov ebx,dword[fx]
425
	cmp dword[eax],ebx
426
	jle @f
427
		mov dl,1
428
		jmp .fun_e
429
	@@:
430
	mov ecx,dword[fy]
431
	cmp dword[eax+4],ecx
432
	jle @f
433
	cmp dword[eax],ebx
434
	jne @f
435
		mov dl,1
436
		jmp .fun_e
437
	@@:
438
	xor dl,dl
439
	.fun_e:
440
	pop ecx ebx eax
441
	ret
442
endp
443
 
444
;output:
445
; dl
446
align 4
447
proc pole_compare_cells_mb_coords, i0:dword, fx:dword, fy:dword
448
	push eax ebx ecx
449
	get_cell_offset eax,[i0]
450
	;eax -> cell[i0]
451
	mov ebx,dword[fx]
452
	cmp dword[eax],ebx
453
	jge @f
454
		mov dl,1
455
		jmp .fun_e
456
	@@:
457
	mov ecx,dword[fy]
458
	cmp dword[eax+4],ecx
459
	jge @f
460
	cmp dword[eax],ebx
461
	jne @f
462
		mov dl,1
463
		jmp .fun_e
464
	@@:
465
	xor dl,dl
466
	.fun_e:
467
	pop ecx ebx eax
468
	ret
469
endp
470
 
471
;output:
472
; dl
473
align 4
474
proc pole_compare_cells_bm, i0:dword, i1:dword
475
	push eax ebx ecx
476
	get_cell_offset eax,[i0] ;eax -> cell[i0]
477
	get_cell_offset ebx,[i1] ;ebx -> cell[i1]
478
	mov ecx,dword[ebx] ;+0 = .x
479
	cmp dword[eax],ecx
480
	jle @f ;x0>x1
481
		mov dl,1
482
		jmp .fun_e
483
	@@:
484
	jne @f ;x0==x1
485
	mov ecx,dword[ebx+4] ;+4 = .y
486
	cmp dword[eax+4],ecx
487
	jle @f ;y0>y1
488
		mov dl,1
489
		jmp .fun_e
490
	@@:
491
	xor dl,dl
492
	.fun_e:
493
	pop ecx ebx eax
494
	ret
495
endp
496
 
497
align 4
498
pole_paint:
499
	pushad
500
	;eax -> firstC
501
	;ebx -> i
502
	;ecx -> cell[memCell[i]]
503
	;edx -> color
504
	;edi -> coord_x
505
	;esi -> coord_y
506
	mov eax,dword[memCell]
507
	cmp dword[eax],0
508
	je .no_draw
509
 
510
	mov eax,dword[eax]
511
	mov ebx,1
512
 
513
;---
514
	@@: ;while(i
515
		cmp ebx,dword[b_sort]
516
		jge @f ;переходим на начало нижнего цикла
517
		mov ecx,ebx
518
		shl ecx,2
519
		add ecx,dword[memCell]
520
		get_cell_offset ecx,dword[ecx]
521
		mov edx,dword[ecx] ;+0 = .x
522
		add edx,dword[Cor_x]
523
		cmp edx,0
524
		jge @f ;переходим на начало нижнего цикла
525
			inc ebx ;i++; // для пропуска ячеек за окном слева
526
		jmp @b
527
	@@:
528
 
529
	cmp byte[zoom],2
530
	jge .zoom2
531
	@@: ;for(;i<=fristC;i++){
532
		mov ecx,ebx
533
		shl ecx,2
534
		add ecx,dword[memCell]
535
		get_cell_offset ecx,dword[ecx]
536
;...
537
		mov edi,dword[Cor_x]
538
		add edi,dword[ecx] ;+0 = .x
539
		mov esi,dword[Cor_y]
540
		add esi,dword[ecx+4] ;+4 = .y
541
		bt word[ecx+12],0 ;+12 = .liv
542
		jc .cell_1
543
			;не живая ячейка
544
			mov edx,dword[CellColors]
545
			mov edx,dword[edx]
546
			jmp .cell_0
547
		.cell_1:
548
			;живая ячейка
549
			mov edx,dword[tim]
550
			inc edx
551
			sub edx,dword[ecx+8] ;+8 = .tc
552
			cmp edx,COL_MEM
553
			jle .in_color
554
				mov edx,COL_MEM
555
			.in_color:
556
			shl edx,2
557
			add edx,dword[CellColors]
558
			mov edx,dword[edx]
559
		.cell_0:
560
		stdcall [buf2d_set_pixel], buf_0, edi, esi, edx
561
;...
562
		inc ebx
563
		cmp ebx,eax
564
		jle @b
565
 
566
	jmp .no_draw
567
	.zoom2:
568
 
569
	@@: ;for(;i<=fristC;i++){
570
		mov ecx,ebx
571
		shl ecx,2
572
		add ecx,dword[memCell]
573
		get_cell_offset ecx,dword[ecx]
574
 
575
		xor edx,edx
576
		mov dl,byte[zoom] ;edx используется для внесения zoom в 4 байтное число
577
		mov edi,dword[ecx] ;+0 = .x
578
		add edi,dword[Cor_x]
579
		imul edi,edx
580
		mov esi,dword[ecx+4] ;+4 = .y
581
		add esi,dword[Cor_y]
582
		imul esi,edx
583
		bt word[ecx+12],0 ;+12 = .liv
584
		jc .z2_cell_1
585
			;не живая ячейка
586
			mov edx,dword[CellColors]
587
			mov edx,dword[edx]
588
			jmp .z2_cell_0
589
		.z2_cell_1:
590
			;живая ячейка
591
			mov edx,dword[tim]
592
			inc edx
593
			sub edx,dword[ecx+8] ;+8 = .tc
594
			cmp edx,COL_MEM
595
			jle .z2_in_color
596
				mov edx,COL_MEM
597
			.z2_in_color:
598
			shl edx,2
599
			add edx,dword[CellColors]
600
			mov edx,dword[edx]
601
		.z2_cell_0:
602
		xor ecx,ecx
603
		mov cl,byte[zoom] ;ecx используется для внесения zoom в 4 байтное число
604
		;;;dec ecx
605
		stdcall [buf2d_filled_rect_by_size], buf_0, edi, esi, ecx, ecx, edx
606
		inc ebx
607
		cmp ebx,eax
608
		jle @b
609
 
610
	.no_draw:
611
	popad
612
	ret
613
 
614
align 4
615
pole_next_gen:
616
	pushad
617
	;eax -> firstC
618
	;ebx -> i
619
	;ecx -> &memCell[i]
620
	;edx -> cell[memCell[i]]
621
 
622
	mov eax,dword[memCell]
623
	mov ecx,eax
624
	mov eax,dword[eax]
625
	cmp eax,1
626
	jl .fun_e
627
	inc dword[tim]
628
	mov ebx,1
629
	@@: ;for(i=1;i<=firstC;i++)
630
		add ecx,4
631
		get_cell_offset edx,dword[ecx]
632
		bt word[edx+12],0 ;+12 = .liv
633
		jae .if_0_e
634
			; сохранение ячейки (соседей 2 или 3)
635
			cmp byte[edx+13],2 ;+13 = .so
636
			je .if_2_e
637
			cmp byte[edx+13],3 ;+13 = .so
638
			je .if_2_e
639
			jmp .change
640
		.if_0_e:
641
			; создание ячейки (соседей 3)
642
			cmp byte[edx+13],3 ;+13 = .so
643
			jne .if_1_e
644
			.change:
645
				or byte[edx+12],2 ;+12 = .liv
646
				jmp .if_2_e
647
		.if_1_e:
648
			; удаление пустой ячейки для освобождения памяти
649
			cmp byte[edx+13],0 ;+13 = .so
650
			jne .if_2_e
651
			mov edi,dword[edx+8] ;+8 = .tc
652
			add edi,5 ; 5 - время сохранения пустой ячейки, до её удаления
653
			cmp edi,dword[tim]
654
			jge .if_2_e
655
				mov edi,eax
656
				shl edi,2
657
				add edi,dword[memCell] ;edi -> &memCell[fristC]
658
				mov esi,dword[edi] ;swp=memCell[fristC];
659
				mov edx,dword[ecx] ;edx - уже не используем, потому можем портить
660
				mov dword[edi],edx ;memCell[fristC]=memCell[i];
661
				mov dword[ecx],esi ;memCell[i]=swp;
662
				dec eax
663
				dec ebx
664
				sub ecx,4
665
		.if_2_e:
666
 
667
		inc ebx
668
		cmp ebx,eax
669
		jle @b
670
	mov ebx,dword[memCell]
671
	mov dword[ebx],eax ;firstC <- eax
672
 
673
	mov dword[b_sort],eax
674
	stdcall pole_fl_sort, dword[memCell],eax
675
 
676
	mov ecx,dword[memCell]
677
	mov ebx,1
678
	@@: ;for(i=1;i<=firstC;i++)
679
		add ecx,4
680
		get_cell_offset edx,dword[ecx]
681
		bt word[edx+12],1 ;+12 = .liv
682
		jae .no_change
683
			xor byte[edx+12],3 ;+12 = .liv
684
			mov edi,dword[tim]
685
			mov dword[edx+8],edi ;+8 = .tc
686
			bt word[edx+12],0 ;+12 = .liv
687
			jc .new_cell
688
				push eax
689
				mov edi,dword[edx]
690
				dec edi
691
				mov esi,dword[edx+4]
692
				dec esi
693
				dec dword[osob]
694
				;дальше значение edx портится
695
				stdcall pole_cell_find,edi,esi
696
				get_cell_offset edx,eax
697
				dec byte[edx+13] ;+13 = .so
698
				inc esi
699
				stdcall pole_cell_find,edi,esi
700
				get_cell_offset edx,eax
701
				dec byte[edx+13] ;+13 = .so
702
				inc esi
703
				stdcall pole_cell_find,edi,esi
704
				get_cell_offset edx,eax
705
				dec byte[edx+13] ;+13 = .so
706
				inc edi
707
				stdcall pole_cell_find,edi,esi
708
				get_cell_offset edx,eax
709
				dec byte[edx+13] ;+13 = .so
710
				sub esi,2
711
				stdcall pole_cell_find,edi,esi
712
				get_cell_offset edx,eax
713
				dec byte[edx+13] ;+13 = .so
714
				inc edi
715
				stdcall pole_cell_find,edi,esi
716
				get_cell_offset edx,eax
717
				dec byte[edx+13] ;+13 = .so
718
				inc esi
719
				stdcall pole_cell_find,edi,esi
720
				get_cell_offset edx,eax
721
				dec byte[edx+13] ;+13 = .so
722
				inc esi
723
				stdcall pole_cell_find,edi,esi
724
				get_cell_offset edx,eax
725
				dec byte[edx+13] ;+13 = .so
726
				pop eax
727
				jmp .no_change
728
			.new_cell: ; появилась новая ячейка
729
				inc dword[osob]
730
				mov edi,dword[edx]
731
				dec edi
732
				mov esi,dword[edx+4]
733
				dec esi
734
				stdcall pole_cell_creat,edi,esi,0
735
				inc esi
736
				stdcall pole_cell_creat,edi,esi,0
737
				inc esi
738
				stdcall pole_cell_creat,edi,esi,0
739
				inc edi
740
				stdcall pole_cell_creat,edi,esi,0
741
				sub esi,2
742
				stdcall pole_cell_creat,edi,esi,0
743
				inc edi
744
				stdcall pole_cell_creat,edi,esi,0
745
				inc esi
746
				stdcall pole_cell_creat,edi,esi,0
747
				inc esi
748
				stdcall pole_cell_creat,edi,esi,0
749
		.no_change:
750
		inc ebx
751
		cmp ebx,eax
752
		jle @b
753
	.fun_e:
754
	popad
755
	ret
756
 
757
;Сортировка вектора a[1..n] методом Флойда
758
align 4
759
proc pole_fl_sort, a:dword, n:dword
760
	pushad
761
	mov ecx,dword[a]
762
	;Формировать исходное частично упорядоченное дерево
763
	mov eax,dword[n]
764
	shr eax,1
765
	@@: ;for(i=n>>1; i>=2; i--)
766
		stdcall pole_fl_surface, ecx,eax,[n] ;(a,i,n)
767
		dec eax
768
		cmp eax,2
769
		jge @b
770
	;Выполнить процедуру всплытия Флойда для каждого поддерева
771
	mov eax,dword[n]
772
	@@: ;for(i=n; i>=2; i--){
773
		stdcall pole_fl_surface, ecx,1,eax ;(a,1,i)
774
		;Поместить найденный максимальный элемент в конец списка
775
		mov edi,eax
776
		shl edi,2
777
		add edi,ecx ;edi -> &a[i]
778
		mov esi,dword[edi] ;w=a[i];
779
		mov edx,dword[ecx+4]
780
		mov dword[edi],edx ;a[i]=a[1];
781
		mov dword[ecx+4],esi ;a[1]=w;
782
 
783
		dec eax
784
		cmp eax,2
785
		jge @b
786
	popad
787
	ret
788
endp
789
 
790
;Процедура всплытия Флойда по дереву a[1..k]
791
align 4
792
proc pole_fl_surface, a:dword, i:dword, k:dword
793
locals
794
	copy dd ?
795
endl
796
	pushad
797
	;edx -> ...
798
	;edi -> m
799
	;esi -> j
800
	mov eax,dword[a]
801
	mov ebx,dword[i]
802
	mov ecx,dword[k]
803
 
804
	mov edx,ebx
805
	shl edx,2
806
	add edx,eax
807
	mov edx,dword[edx]
808
	mov dword[copy],edx ;copy=a[i];
809
	mov edi,ebx
810
	shl edi,1 ;m=i<<1;
811
	.cycle_b: ;while (m<=k) {
812
		cmp edi,ecx
813
		jg .cycle_e
814
		jne @f ;if (m==k) j=m;
815
			mov esi,edi
816
			jmp .else_e
817
		@@: ;else if (pole_compare_cells_bm(a[m],a[m+1])) j=m;
818
		mov edx,edi
819
		shl edx,2
820
		add edx,eax
821
		stdcall pole_compare_cells_bm, dword[edx],dword[edx+4]
822
		cmp dl,0
823
		je @f
824
			mov esi,edi
825
			jmp .else_e
826
		@@: ;else j=m+1;
827
			mov esi,edi
828
			inc esi
829
		.else_e:
830
 
831
		;if (pole_compare_cells_bm(a[j],copy)) {
832
		mov edx,esi
833
		shl edx,2
834
		add edx,eax
835
		stdcall pole_compare_cells_bm, dword[edx],dword[copy]
836
		cmp dl,0
837
		je .cycle_e ;} else break; //выход из цикла
838
 
839
		mov edx,esi
840
		shl edx,2
841
		add edx,eax
842
		push dword[edx] ;push a[j];
843
		mov edx,ebx
844
		shl edx,2
845
		add edx,eax
846
		pop dword[edx] ;a[i]=a[j];
847
		mov ebx,esi ;i=j;
848
		mov edi,ebx
849
		shl edi,1 ;m=i<<1;
850
 
851
		jmp .cycle_b
852
	.cycle_e:
853
 
854
	;значения многих регистров уже не важны т. к. конец функции
855
	shl ebx,2
856
	add eax,ebx
857
	mov edx,dword[copy]
858
	mov dword[eax],edx ;a[i]=copy;
859
 
860
	popad
861
	ret
862
endp
863
;--------------------------------------
864
 
865
 
866
align 4
867
start:
868
	load_libraries l_libs_start,l_libs_end
869
	;проверка на сколько удачно загузилась наша либа
870
	mov	ebp,lib_7
871
	cmp	dword [ebp+ll_struc_size-4],0
872
	jz	@f
873
		mcall -1 ;exit not correct
874
	@@:
875
	mcall 48,3,sc,sizeof.system_colors
876
	mcall 40,0x27
877
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
878
 
879
	stdcall [buf2d_create], buf_0 ;создание буфера
880
 
881
	stdcall mem.Alloc,MAX_CELL*sizeof.Cell
882
	mov [cell],eax
883
	stdcall mem.Alloc,MAX_CELL*4
884
	mov [memCell],eax
885
	stdcall mem.Alloc,(COL_MEM+1)*4
886
	mov [CellColors],eax
887
	load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE
888
 
2501 IgorA 889
	;настройка цветов ячеек
890
	stdcall pole_init_colors, 0xffffd0,0xff0000,0x0000ff
2359 IgorA 891
	call pole_clear
892
	call pole_paint ;рисование поля в буфере (не на экране)
893
 
894
	;xor eax,eax
895
	;mov edi,txt_zoom.zi
896
	;mov al,byte[zoom]
897
	;call tl_convert_to_str
898
 
899
	mcall 26,9
900
	mov [last_time],eax
901
 
902
align 4
903
red_win:
904
	call draw_window
905
 
906
align 4
907
still:
908
	mcall 26,9
909
	mov ebx,[last_time]
910
	add ebx,10 ;задержка
911
	cmp ebx,eax
912
	jge @f
913
		mov ebx,eax
914
	@@:
915
	sub ebx,eax
916
	;cmp ebx,10 ;задержка
917
	;ja timer_funct
918
	;test ebx,ebx
919
	;jz timer_funct
920
	mcall 23
921
	cmp eax,0
922
	je timer_funct
923
 
924
	cmp al,1
925
	jz red_win
926
	cmp al,2
927
	jz key
928
	cmp al,3
929
	jz button
930
 
931
	jmp still
932
 
933
align 4
934
timer_funct:
935
	pushad
936
	mcall 26,9
937
	mov [last_time],eax
938
 
939
	cmp byte[tim_ch],0
940
	je @f
941
		;call but_next_gen
942
		cld
943
		mov ecx,dword[poc_stop]
944
		cmp ecx,1
945
		jg .clear
946
			mov ecx,1 ;исправление ecx на случай чисел меньших 1
947
			jmp .cycle
948
		.clear: ;чистим поле если есть просчет на несколько поколений за 1 такт таймера
949
			stdcall [buf2d_clear], buf_0, [buf_0.color]
950
		.cycle:
951
			call pole_next_gen
952
			loop .cycle
953
		call pole_paint
954
		stdcall [buf2d_draw], buf_0
955
		call draw_pok
956
	@@:
957
	popad
958
	jmp still
959
 
960
align 4
961
draw_window:
962
pushad
963
	mcall 12,1
964
	xor eax,eax
965
	mov ebx,(20 shl 16)+485
966
	mov ecx,(20 shl 16)+415
967
	mov edx,[sc.work]
968
	or  edx,(3 shl 24)+0x10000000+0x20000000
969
	mov edi,hed
970
	int 0x40
971
 
972
	mov eax,8
973
	mov ebx,(5 shl 16)+20
974
	mov ecx,(5 shl 16)+20
975
	mov edx,3
976
	mov esi,[sc.work_button]
977
	int 0x40
978
 
979
	mov ebx,(30 shl 16)+20
980
	mov ecx,(5 shl 16)+20
981
	mov edx,4
982
	int 0x40
983
 
984
	mov ebx,(55 shl 16)+20
985
	mov ecx,(5 shl 16)+20
986
	mov edx,5
987
	int 0x40
988
 
989
	mov ebx,(85 shl 16)+20
990
	mov ecx,(5 shl 16)+20
991
	mov edx,6
992
	int 0x40
993
 
994
	mov ebx,(110 shl 16)+20
995
	mov ecx,(5 shl 16)+20
996
	mov edx,7
997
	int 0x40
998
 
999
	mov ebx,(135 shl 16)+20
1000
	mov ecx,(5 shl 16)+20
1001
	mov edx,8
1002
	int 0x40
1003
 
1004
	mov ebx,(165 shl 16)+20
1005
	mov ecx,(5 shl 16)+20
1006
	mov edx,9
1007
	int 0x40
1008
 
1009
	mov ebx,(190 shl 16)+20
1010
	mov ecx,(5 shl 16)+20
1011
	mov edx,10
1012
	int 0x40
1013
 
1014
	mov ebx,(220 shl 16)+20
1015
	mov ecx,(5 shl 16)+20
1016
	mov edx,11
1017
	int 0x40
1018
 
1019
	mov ebx,(245 shl 16)+20
1020
	mov ecx,(5 shl 16)+20
1021
	mov edx,12
1022
	int 0x40
1023
 
1024
	mov ebx,(270 shl 16)+20
1025
	mov ecx,(5 shl 16)+20
1026
	mov edx,13
1027
	int 0x40
1028
 
1029
	mov ebx,(295 shl 16)+20
1030
	mov ecx,(5 shl 16)+20
1031
	mov edx,14
1032
	int 0x40
1033
 
1034
	mov eax,7
1035
	mov ebx,[image_data_toolbar]
1036
	mov ecx,(16 shl 16)+16
1037
	mov edx,(32 shl 16)+7
1038
	int 0x40
1039
 
1040
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1041
	mov edx,(87 shl 16)+7 ;run once
1042
	int 0x40
1043
 
1044
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1045
	mov edx,(112 shl 16)+7 ;run auto
1046
	int 0x40
1047
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1048
	mov edx,(137 shl 16)+7 ;stop
1049
	int 0x40
1050
 
1051
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1052
	mov edx,(167 shl 16)+7 ;-
1053
	int 0x40
1054
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1055
	mov edx,(192 shl 16)+7 ;+
1056
	int 0x40
1057
 
1058
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1059
	mov edx,(222 shl 16)+7 ;move up
1060
	int 0x40
1061
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1062
	mov edx,(247 shl 16)+7 ;move doun
1063
	int 0x40
1064
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1065
	mov edx,(272 shl 16)+7 ;move left
1066
	int 0x40
1067
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
1068
	mov edx,(297 shl 16)+7 ;move up
1069
	int 0x40
1070
 
1071
	call draw_pok
1072
 
1073
	stdcall [buf2d_draw], buf_0
1074
 
1075
	mcall 12,2
1076
popad
1077
	ret
1078
 
1079
align 4
1080
draw_pok:
1081
	mov eax,4 ;рисование текста
1082
	mov ebx,325*65536+5
1083
	mov ecx,[sc.work_text]
1084
	or  ecx,0x80000000 ;or (1 shl 30)
1085
	mov edx,txt_zoom
1086
	;mov edi,[sc.work]
1087
	int 0x40
1088
	add bx,9
1089
	mov edx,txt_gen
1090
	int 0x40
1091
	add bx,9
1092
	mov edx,txt_osob
1093
	int 0x40
1094
 
1095
	mov eax,47
1096
	xor ecx,ecx
1097
	mov cl,byte[zoom]
1098
	mov ebx,(2 shl 16)
1099
	mov edx,(325+6*9)*65536+5
1100
	mov esi,[sc.work_button_text]
1101
	or  esi,(1 shl 30)
1102
	mov edi,[sc.work_button]
1103
	int 0x40 ;масштаб
1104
	mov ebx,(5 shl 16)
1105
	mov ecx,[tim]
1106
	add edx,(6*2)*65536+9
1107
	int 0x40 ;время
1108
	mov ebx,(5 shl 16)
1109
	mov ecx,[osob]
1110
	add edx,(6*0)*65536+9
1111
	int 0x40 ;популяция
1112
	ret
1113
 
1114
align 4
1115
key:
1116
	mcall 2
1117
	jmp still
1118
 
1119
 
1120
align 4
1121
button:
1122
	mcall 17
1123
	cmp ah,3
1124
	jne @f
1125
		call but_new_file
1126
	@@:
1127
	cmp ah,4
1128
	jne @f
1129
		call but_open_file
1130
	@@:
1131
	cmp ah,5
1132
	jne @f
1133
		call but_save_file
1134
	@@:
1135
	cmp ah,6
1136
	jne @f
1137
		call but_next_gen
1138
	@@:
1139
	cmp ah,7
1140
	jne @f
1141
		call but_run
1142
	@@:
1143
	cmp ah,8
1144
	jne @f
1145
		call but_stop
1146
	@@:
1147
	cmp ah,9
1148
	jne @f
1149
		call but_zoom_p
1150
	@@:
1151
	cmp ah,10
1152
	jne @f
1153
		call but_zoom_m
1154
	@@:
1155
	cmp ah,11
1156
	jne @f
1157
		call but_pole_up
1158
	@@:
1159
	cmp ah,12
1160
	jne @f
1161
		call but_pole_dn
1162
	@@:
1163
	cmp ah,13
1164
	jne @f
1165
		call but_pole_left
1166
	@@:
1167
	cmp ah,14
1168
	jne @f
1169
		call but_pole_right
1170
	@@:
1171
	cmp ah,1
1172
	jne still
1173
.exit:
1174
	stdcall [buf2d_delete],buf_0
1175
	stdcall mem.Free,[cell]
1176
	stdcall mem.Free,[memCell]
1177
	stdcall mem.Free,[CellColors]
1178
	stdcall mem.Free,[image_data_toolbar]
1179
	mcall -1
1180
 
1181
 
1182
align 4
1183
but_new_file:
1184
	ret
1185
 
1186
align 4
1187
open_file_lif:
1188
	rb 4096 ;область для открытия файлов
1189
.end:
1190
 
1191
align 4
1192
but_open_file:
1193
	pushad
1194
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1195
	mov [OpenDialog_data.type],0
1196
	stdcall [OpenDialog_Start],OpenDialog_data
1197
	cmp [OpenDialog_data.status],2
1198
	je .end_open_file
1199
	;код при удачном открытии диалога
1200
 
1201
	mov eax,70 ;70-я функция работа с файлами
1202
	mov [run_file_70.Function], 0
1203
	mov [run_file_70.Position], 0
1204
	mov [run_file_70.Flags], 0
1205
	mov dword[run_file_70.Count], open_file_lif.end-open_file_lif
1206
	m2m [run_file_70.Buffer], open_file_lif
1207
	mov byte[run_file_70+20], 0
1208
	mov dword[run_file_70.FileName], openfile_path
1209
	mov ebx,run_file_70
1210
	int 0x40 ;загружаем файл изображения
1211
	cmp ebx,0xffffffff
1212
	je .end_open_file
1213
 
1214
	add ebx,open_file_lif
1215
	mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом
1216
	mcall 71,1,openfile_path
1217
 
1218
	call pole_clear
1219
	mov eax,dword[buf_0.w]
1220
	shr eax,1
1221
	xor ecx,ecx
1222
	mov cl,byte[zoom]
1223
	cmp cx,2
1224
	jl @f ;деление на величину zoom
1225
		xor edx,edx
1226
		div ecx
1227
	@@:
1228
	add dword[Cor_x],eax
1229
	mov eax,dword[buf_0.h]
1230
	shr eax,1
1231
	cmp cx,2
1232
	jl @f ;деление на величину zoom
1233
		xor edx,edx
1234
		div ecx
1235
	@@:
1236
	add dword[Cor_y],eax
1237
 
1238
	;eax - first x position
1239
	;ebx - x position
1240
	;ecx - y position
1241
	mov edi,open_file_lif
1242
	xor ebx,ebx
1243
	xor ecx,ecx
1244
	mov eax,ebx
1245
	@@:
1246
		cmp byte[edi],'*'
1247
		jne .no_cell
1248
			stdcall pole_cell_creat, ebx,ecx,1
1249
			inc ebx
1250
		.no_cell:
1251
		cmp byte[edi],'.'
1252
		jne .cell_move
1253
			inc ebx
1254
		.cell_move:
1255
		cmp byte[edi],13
1256
		jne .cell_nl
1257
			mov ebx,eax
1258
			inc ecx
1259
		.cell_nl:
1260
		cmp word[edi],'#P' ;смена позиции
1261
		jne .pos
1262
			inc edi ;пропуск '#'
1263
			.space:
1264
				inc edi ;пропуск 'P' и ' '
1265
				cmp byte[edi],' '
1266
				je .space
1267
			stdcall conv_str_to_int,edi
1268
			mov ebx,eax
1269
			cmp byte[edi],'-'
1270
			jne .digit
1271
				inc edi
1272
			.digit:
1273
				cmp byte[edi],'0'
1274
				jl .digit_no
1275
				cmp byte[edi],'9'
1276
				jg .digit_no
1277
				inc edi
1278
				jmp .digit
1279
			.digit_no:
1280
			;.space_1:
1281
				inc edi ;пропуск 'P' и ' '
1282
				cmp byte[edi],' '
1283
				je .digit_no ;.space_1
1284
			stdcall conv_str_to_int,edi
1285
			mov ecx,eax
1286
			mov eax,ebx ;восстановление левого отступа в eax
1287
		.pos:
1288
		inc edi
1289
		cmp byte[edi],0
1290
		jne @b
1291
	;---
1292
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
1293
	call pole_paint ;рисуем поле (на случай если есть сетка или текстовые подписи)
1294
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
1295
	.end_open_file:
1296
	popad
1297
	ret
1298
 
1299
align 4
1300
but_save_file:
1301
	ret
1302
 
1303
align 4
1304
but_next_gen:
1305
	call pole_next_gen
1306
	call pole_paint
1307
	stdcall [buf2d_draw], buf_0
1308
	pushad
1309
		call draw_pok
1310
	popad
1311
	ret
1312
 
1313
align 4
1314
but_run:
1315
	mov byte[tim_ch],1
1316
	ret
1317
 
1318
align 4
1319
but_stop:
1320
	mov byte[tim_ch],0
1321
	;cld
1322
	;mov ecx,100
1323
	;@@:
1324
	;       call pole_next_gen
1325
	;loop @b
1326
	;stdcall [buf2d_clear], buf_0, [buf_0.color]
1327
	;call pole_paint
1328
	;stdcall [buf2d_draw], buf_0
1329
	ret
1330
 
1331
align 4
1332
but_zoom_p:
1333
	cmp byte[zoom],16
1334
	jge @f
1335
		pushad
1336
		;вычисление сдвигов для поля, которые обеспечат центровку поля при увеличении масштаба
1337
		xor ecx,ecx
1338
		mov cl,byte[zoom]
1339
		xor edx,edx
1340
		mov eax,dword[buf_0.w]
1341
		shr eax,1 ;в eax половина ширины поля
1342
		mov ebx,eax ;делаем резервную копию eax
1343
		div ecx ;делим eax на текущий масштаб
1344
		xchg eax,ebx
1345
		xor edx,edx
1346
		inc ecx
1347
		div ecx ;делим eax на новый масштаб
1348
		sub ebx,eax ;вычисляется сдвиг поля который обеспечит центровку поля
1349
		sub dword[Cor_x],ebx ;сдвигаем поле зрения по оси x
1350
		xor ecx,ecx
1351
		mov cl,byte[zoom]
1352
		xor edx,edx
1353
		mov eax,dword[buf_0.h]
1354
		shr eax,1
1355
		mov ebx,eax
1356
		div ecx
1357
		xchg eax,ebx
1358
		xor edx,edx
1359
		inc ecx
1360
		div ecx
1361
		sub ebx,eax
1362
		sub dword[Cor_y],ebx ;сдвигаем поле зрения по оси y
1363
 
1364
		inc byte[zoom]
1365
		;xor eax,eax
1366
		;mov edi,txt_zoom.zi
1367
		;mov al,byte[zoom]
1368
		;call tl_convert_to_str
1369
		call draw_pok
1370
		popad
1371
 
1372
		cmp dword[poc_stop],1
1373
		jle .buf_clear
1374
		cmp byte[tim_ch],0
1375
		jne @f
1376
			.buf_clear:
1377
			stdcall [buf2d_clear], buf_0, [buf_0.color]
1378
			call pole_paint
1379
			stdcall [buf2d_draw], buf_0
1380
	@@:
1381
	ret
1382
 
1383
align 4
1384
but_zoom_m:
1385
	cmp byte[zoom],1
1386
	jle @f
1387
		pushad
1388
		;вычисление сдвигов для поля, которые обеспечат центровку поля при уменьшении масштаба
1389
		xor ecx,ecx
1390
		mov cl,byte[zoom]
1391
		xor edx,edx
1392
		mov eax,dword[buf_0.w]
1393
		shr eax,1 ;в eax половина ширины поля
1394
		mov ebx,eax ;делаем резервную копию eax
1395
		div ecx ;делим eax на текущий масштаб
1396
		xchg eax,ebx
1397
		xor edx,edx
1398
		dec ecx
1399
		div ecx ;делим eax на новый масштаб
1400
		sub ebx,eax ;вычисляется сдвиг поля который обеспечит центровку поля
1401
		sub dword[Cor_x],ebx ;сдвигаем поле зрения по оси x
1402
		xor ecx,ecx
1403
		mov cl,byte[zoom]
1404
		xor edx,edx
1405
		mov eax,dword[buf_0.h]
1406
		shr eax,1
1407
		mov ebx,eax
1408
		div ecx
1409
		xchg eax,ebx
1410
		xor edx,edx
1411
		dec ecx
1412
		div ecx
1413
		sub ebx,eax
1414
		sub dword[Cor_y],ebx ;сдвигаем поле зрения по оси y
1415
 
1416
		dec byte[zoom]
1417
		;xor eax,eax
1418
		;mov edi,txt_zoom.zi
1419
		;mov al,byte[zoom]
1420
		;call tl_convert_to_str
1421
		call draw_pok
1422
		popad
1423
 
1424
		cmp dword[poc_stop],1
1425
		jle .buf_clear
1426
		cmp byte[tim_ch],0
1427
		jne @f
1428
			.buf_clear:
1429
			stdcall [buf2d_clear], buf_0, [buf_0.color]
1430
			call pole_paint
1431
			stdcall [buf2d_draw], buf_0
1432
	@@:
1433
	ret
1434
 
1435
align 4
1436
but_pole_up:
1437
	push eax ecx edx
1438
	mov eax,dword[buf_0.h]
1439
	shr eax,2
1440
	xor ecx,ecx
1441
	mov cl,byte[zoom]
1442
	cmp cx,2
1443
	jl @f ;деление на величину zoom
1444
		xor edx,edx
1445
		div ecx
1446
	@@:
1447
	add dword[Cor_y],eax
1448
	pop edx ecx eax
1449
	stdcall [buf2d_clear], buf_0, [buf_0.color]
1450
	call pole_paint
1451
	stdcall [buf2d_draw], buf_0
1452
	ret
1453
 
1454
align 4
1455
but_pole_dn:
1456
	push eax ecx edx
1457
	mov eax,dword[buf_0.h]
1458
	shr eax,2
1459
	xor ecx,ecx
1460
	mov cl,byte[zoom]
1461
	cmp cx,2
1462
	jl @f ;деление на величину zoom
1463
		xor edx,edx
1464
		div ecx
1465
	@@:
1466
	sub dword[Cor_y],eax
1467
	pop edx ecx eax
1468
	stdcall [buf2d_clear], buf_0, [buf_0.color]
1469
	call pole_paint
1470
	stdcall [buf2d_draw], buf_0
1471
	ret
1472
 
1473
align 4
1474
but_pole_left:
1475
	push eax ecx edx
1476
	mov eax,dword[buf_0.w]
1477
	shr eax,2
1478
	xor ecx,ecx
1479
	mov cl,byte[zoom]
1480
	cmp cx,2
1481
	jl @f ;деление на величину zoom
1482
		xor edx,edx
1483
		div ecx
1484
	@@:
1485
	add dword[Cor_x],eax
1486
	pop edx ecx eax
1487
	stdcall [buf2d_clear], buf_0, [buf_0.color]
1488
	call pole_paint
1489
	stdcall [buf2d_draw], buf_0
1490
	ret
1491
 
1492
align 4
1493
but_pole_right:
1494
	push eax ecx edx
1495
	mov eax,dword[buf_0.w]
1496
	shr eax,2
1497
	xor ecx,ecx
1498
	mov cl,byte[zoom]
1499
	cmp cx,2
1500
	jl @f ;деление на величину zoom
1501
		xor edx,edx
1502
		div ecx
1503
	@@:
1504
	sub dword[Cor_x],eax
1505
	pop edx ecx eax
1506
	stdcall [buf2d_clear], buf_0, [buf_0.color]
1507
	call pole_paint
1508
	stdcall [buf2d_draw], buf_0
1509
	ret
1510
 
1511
;align 4
1512
;but_bru_clear:
1513
;        ret
1514
 
1515
;input:
1516
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
1517
;output:
1518
; eax - число
1519
align 4
1520
proc conv_str_to_int, buf:dword
1521
	xor eax,eax
1522
	push ebx ecx esi
1523
	xor ebx,ebx
1524
	mov esi,[buf]
1525
	;определение отрицательных чисел
1526
	xor ecx,ecx
1527
	inc ecx
1528
	cmp byte[esi],'-'
1529
	jne @f
1530
		dec ecx
1531
		inc esi
1532
	@@:
1533
 
1534
	cmp word[esi],'0x'
1535
	je .load_digit_16
1536
 
1537
	.load_digit_10: ;считывание 10-тичных цифр
1538
		mov bl,byte[esi]
1539
		cmp bl,'0'
1540
		jl @f
1541
		cmp bl,'9'
1542
		jg @f
1543
			sub bl,'0'
1544
			imul eax,10
1545
			add eax,ebx
1546
			inc esi
1547
			jmp .load_digit_10
1548
	jmp @f
1549
 
1550
	.load_digit_16: ;считывание 16-ричных цифр
1551
		add esi,2
1552
	.cycle_16:
1553
		mov bl,byte[esi]
1554
		cmp bl,'0'
1555
		jl @f
1556
		cmp bl,'f'
1557
		jg @f
1558
		cmp bl,'9'
1559
		jle .us1
1560
			cmp bl,'A'
1561
			jl @f ;отсеиваем символы >'9' и <'A'
1562
		.us1: ;составное условие
1563
		cmp bl,'F'
1564
		jle .us2
1565
			cmp bl,'a'
1566
			jl @f ;отсеиваем символы >'F' и <'a'
1567
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
1568
		.us2: ;составное условие
1569
			sub bl,'0'
1570
			cmp bl,9
1571
			jle .cor1
1572
				sub bl,7 ;convert 'A' to '10'
1573
			.cor1:
1574
			shl eax,4
1575
			add eax,ebx
1576
			inc esi
1577
			jmp .cycle_16
1578
	@@:
1579
	cmp ecx,0 ;если число отрицательное
1580
	jne @f
1581
		sub ecx,eax
1582
		mov eax,ecx
1583
	@@:
1584
	pop esi ecx ebx
1585
	ret
1586
endp
1587
 
1588
;данные для диалога открытия файлов
1589
align 4
1590
OpenDialog_data:
1591
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
1592
.procinfo		dd procinfo	;+4
1593
.com_area_name		dd communication_area_name	;+8
1594
.com_area		dd 0	;+12
1595
.opendir_path		dd plugin_path	;+16
1596
.dir_default_path	dd default_dir ;+20
1597
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
1598
.draw_window		dd draw_window	;+28
1599
.status 		dd 0	;+32
1600
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
1601
.filename_area		dd filename_area	;+40
1602
.filter_area		dd Filter
1603
.x:
1604
.x_size 		dw 420 ;+48 ; Window X size
1605
.x_start		dw 10 ;+50 ; Window X position
1606
.y:
1607
.y_size 		dw 320 ;+52 ; Window y size
1608
.y_start		dw 10 ;+54 ; Window Y position
1609
 
1610
default_dir db '/rd/1',0
1611
 
1612
communication_area_name:
1613
	db 'FFFFFFFF_open_dialog',0
1614
open_dialog_name:
1615
	db 'opendial',0
1616
communication_area_default_path:
1617
	db '/rd/1/File managers/',0
1618
 
1619
Filter:
1620
dd Filter.end - Filter ;.1
1621
.1:
1622
db 'LIF',0
1623
db 'RLE',0
1624
.end:
1625
db 0
1626
 
1627
 
1628
 
1629
head_f_i:
1630
head_f_l db 'Системная ошибка',0
1631
 
1632
system_dir_0 db '/sys/lib/'
1633
lib_name_0 db 'proc_lib.obj',0
1634
err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
1635
err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
1636
 
1637
system_dir_1 db '/sys/lib/'
1638
lib_name_1 db 'libimg.obj',0
1639
err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
1640
err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
1641
 
1642
system_dir_7 db '/sys/lib/'
1643
lib_name_7 db 'buf2d.obj',0
1644
err_msg_found_lib_7 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
1645
err_msg_import_7 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
1646
 
1647
l_libs_start:
1648
	lib0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
1649
		err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
1650
	lib1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
1651
		err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
1652
	lib_7 l_libs lib_name_7, sys_path, library_path, system_dir_7,\
1653
		err_msg_found_lib_7,head_f_l,import_buf2d,err_msg_import_7,head_f_i
1654
l_libs_end:
1655
 
1656
align 4
1657
import_libimg:
1658
	dd alib_init1
1659
	img_is_img  dd aimg_is_img
1660
	img_info    dd aimg_info
1661
	img_from_file dd aimg_from_file
1662
	img_to_file dd aimg_to_file
1663
	img_from_rgb dd aimg_from_rgb
1664
	img_to_rgb  dd aimg_to_rgb
1665
	img_to_rgb2 dd aimg_to_rgb2
1666
	img_decode  dd aimg_decode
1667
	img_encode  dd aimg_encode
1668
	img_create  dd aimg_create
1669
	img_destroy dd aimg_destroy
1670
	img_destroy_layer dd aimg_destroy_layer
1671
	img_count   dd aimg_count
1672
	img_lock_bits dd aimg_lock_bits
1673
	img_unlock_bits dd aimg_unlock_bits
1674
	img_flip    dd aimg_flip
1675
	img_flip_layer dd aimg_flip_layer
1676
	img_rotate  dd aimg_rotate
1677
	img_rotate_layer dd aimg_rotate_layer
1678
	img_draw    dd aimg_draw
1679
 
1680
	dd 0,0
1681
	alib_init1   db 'lib_init',0
1682
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1683
	aimg_info    db 'img_info',0
1684
	aimg_from_file db 'img_from_file',0
1685
	aimg_to_file db 'img_to_file',0
1686
	aimg_from_rgb db 'img_from_rgb',0
1687
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1688
	aimg_to_rgb2 db 'img_to_rgb2',0
1689
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1690
	aimg_encode  db 'img_encode',0
1691
	aimg_create  db 'img_create',0
1692
	aimg_destroy db 'img_destroy',0
1693
	aimg_destroy_layer db 'img_destroy_layer',0
1694
	aimg_count   db 'img_count',0
1695
	aimg_lock_bits db 'img_lock_bits',0
1696
	aimg_unlock_bits db 'img_unlock_bits',0
1697
	aimg_flip    db 'img_flip',0
1698
	aimg_flip_layer db 'img_flip_layer',0
1699
	aimg_rotate  db 'img_rotate',0
1700
	aimg_rotate_layer db 'img_rotate_layer',0
1701
	aimg_draw    db 'img_draw',0
1702
 
1703
align 4
1704
proclib_import: ;описание экспортируемых функций
1705
	OpenDialog_Init dd aOpenDialog_Init
1706
	OpenDialog_Start dd aOpenDialog_Start
1707
dd 0,0
1708
	aOpenDialog_Init db 'OpenDialog_init',0
1709
	aOpenDialog_Start db 'OpenDialog_start',0
1710
 
1711
align 4
1712
import_buf2d:
1713
	init dd sz_init
1714
	buf2d_create dd sz_buf2d_create
1715
	buf2d_create_f_img dd sz_buf2d_create_f_img
1716
	buf2d_clear dd sz_buf2d_clear
1717
	buf2d_draw dd sz_buf2d_draw
1718
	buf2d_delete dd sz_buf2d_delete
1719
	buf2d_line dd sz_buf2d_line
1720
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1721
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1722
	buf2d_circle dd sz_buf2d_circle
1723
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1724
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1725
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1726
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1727
	buf2d_bit_blt dd sz_buf2d_bit_blt
1728
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1729
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1730
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
1731
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1732
	buf2d_draw_text dd sz_buf2d_draw_text
1733
	buf2d_crop_color dd sz_buf2d_crop_color
1734
	buf2d_offset_h dd sz_buf2d_offset_h
1735
	buf2d_flood_fill dd sz_buf2d_flood_fill
1736
	buf2d_set_pixel dd sz_buf2d_set_pixel
1737
	dd 0,0
1738
	sz_init db 'lib_init',0
1739
	sz_buf2d_create db 'buf2d_create',0
1740
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1741
	sz_buf2d_clear db 'buf2d_clear',0
1742
	sz_buf2d_draw db 'buf2d_draw',0
1743
	sz_buf2d_delete db 'buf2d_delete',0
1744
	sz_buf2d_line db 'buf2d_line',0
1745
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1746
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1747
	sz_buf2d_circle db 'buf2d_circle',0
1748
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1749
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1750
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1751
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1752
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1753
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1754
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1755
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1756
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1757
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1758
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1759
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1760
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1761
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1762
 
1763
mouse_dd dd 0x0
1764
sc system_colors
1765
last_time dd 0
1766
 
1767
align 16
1768
procinfo process_information
1769
 
1770
align 4
1771
buf_0: dd 0 ;a?азаa?лi на ?aa?a ?зо?aаж?н?i
1772
	dw 5 ;+4 left
1773
	dw 35 ;+6 top
1774
.w: dd 460 ;+8 w
1775
.h: dd 340 ;+12 h
1776
.color: dd 0xffffd0 ;+16 color
1777
	db 24 ;+20 bit in pixel
1778
 
1779
;этот код не мой, он преобразует число в строку
1780
;input:
1781
; eax = value
1782
; edi = string buffer
1783
;output:
1784
align 4
1785
tl_convert_to_str:
1786
	pushad
1787
		mov dword[edi+1],0
1788
		call .str
1789
	popad
1790
	ret
1791
 
1792
align 4
1793
.str:
1794
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1795
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1796
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1797
	jb @f
1798
		xor edx,edx  ;очистить edx
1799
		div ecx      ;разделить - остаток в edx
1800
		push edx     ;положить в стек
1801
		;dec edi             ;смещение необходимое для записи с конца строки
1802
		call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1803
		pop eax
1804
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1805
	or al,0x30  ;данная команда короче  чем две выше
1806
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
1807
	ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1808
 
1809
i_end:
1810
	rb 1024
1811
stacktop:
1812
	sys_path rb 1024
1813
	file_name:
1814
		rb 1024 ;4096
1815
	library_path rb 1024
1816
	plugin_path rb 4096
1817
	openfile_path rb 4096
1818
	filename_area rb 256
1819
mem: