Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1535 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 0x0
10
	dd sys_path
11
 
12
include '../../../macros.inc'
13
include '../../../proc32.inc'
14
include '../../../develop/libraries/box_lib/load_lib.mac'
15
include 'mem.inc'
16
include 'dll.inc'
17
 
18
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
19
 
20
;флаги, для функции обрезания буфера
21
BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху
22
BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева
23
BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу
24
BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа
25
BUF2D_BIT_OPT_CROP_TOP equ 0
26
BUF2D_BIT_OPT_CROP_LEFT equ 1
27
BUF2D_BIT_OPT_CROP_BOTTOM equ 2
28
BUF2D_BIT_OPT_CROP_RIGHT equ 3
29
 
30
BUF_STRUCT_SIZE equ 21
31
buf2d_data equ dword[edi] ;данные буфера изображения
32
buf2d_w equ dword[edi+8] ;ширина буфера
33
buf2d_h equ dword[edi+12] ;высота буфера
1538 IgorA 34
buf2d_l equ word[edi+4] ;отступ слева
1535 IgorA 35
buf2d_t equ word[edi+6] ;отступ сверху
36
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
37
buf2d_color equ dword[edi+16] ;цвет фона буфера
38
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
39
 
40
struct FileInfoBlock
41
	Function dd ?
42
	Position dd ?
43
	Flags	 dd ?
44
	Count	 dd ?
45
	Buffer	 dd ?
46
		db ?
47
	FileName dd ?
48
ends
49
 
1552 IgorA 50
displ_w dd ? ;ширина поля
51
displ_h dd ? ;высота поля
52
displ_bytes dd ? ;размер 1-го файла с изображением
53
;displ_bytes equ 315*210*3 ;размер 1-го файла с изображением
54
 
1535 IgorA 55
OFFS_SHADOW_X equ 2 ;сдвиг теней по оси 'x'
56
OFFS_SHADOW_Y equ 2 ;сдвиг теней по оси 'y'
57
IMAGE_FONT_SIZE equ 128*144*3
58
 
1538 IgorA 59
use_but equ 1
60
 
61
if use_but eq 1
62
BUT1_T equ 10 ;отступ сверху
63
BUT1_L equ 15 ;отступ слева
64
BUT1_W equ 50 ;ширина
65
BUT1_H equ 20 ;высота
66
BUT1_NEXT_TOP equ (BUT1_T+BUT1_H)*65536
67
end if
68
 
1555 IgorA 69
FILE_NAME_MAX equ 20 ;максимальная длинна имени файла (без папок, относительно текущей)
70
;значения имен по умолчанию
71
ini_def_unit_file db 'wolf.png',0
72
;имена файлов
1535 IgorA 73
fn_icon0 db 'curici.png',0 ;имя файла с декорациями
1555 IgorA 74
fn_icon1 rb FILE_NAME_MAX ;имя файла с волком и зайцем
1535 IgorA 75
fn_icon2 db 'eggs.png',0 ;имя файла с яйцами
76
fn_icon3 db 'chi.png',0 ;имя файла с циплятами
77
fn_font db 'font8x9.bmp',0
78
 
1552 IgorA 79
ini_name db 'nu_pogod.ini',0
80
ini_sec_files db 'Files',0
1555 IgorA 81
key_file_unit db 'file_unit',0
1552 IgorA 82
key_displ_w db 'displ_w',0
83
key_displ_h db 'displ_h',0
1555 IgorA 84
 
1552 IgorA 85
ini_sec_color db 'Colors',0
86
key_color_unit db 'unit',0
87
 
1538 IgorA 88
;цвета в игре
1535 IgorA 89
color_fon dd 0xffffff
90
color_shadows dd 0xd0d0d0 ;цвет теней
91
color_trees dd 0x008000 ;цвет травы
92
color_wolf dd 0x800000 ;цвет волка и зайца
93
color_egg dd 0x404080 ;цвет яйца
94
color_chick dd 0x00d0d0 ;цвет ципленка
95
color_curici dd 0x8080d0 ;цвет курицы
96
color_perilo dd 0x000080 ;цвет перила (гребня)
1538 IgorA 97
;цвета интерфейса
98
color_but_sm dd 0x808080 ;цвет маленьких кнопок
1552 IgorA 99
color_but_te dd 0xffffff ;цвет текста на кнопках
1535 IgorA 100
 
101
macro load_image_file path,buf,size { ;макрос для загрузки изображений
1552 IgorA 102
	copy_path path,sys_path,file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
103
 
1535 IgorA 104
	stdcall mem.Alloc, dword size ;выделяем память для изображения
105
	mov [buf],eax
106
 
107
	mov eax,70 ;70-я функция работа с файлами
108
	mov [run_file_70.Function], 0
109
	mov [run_file_70.Position], 0
110
	mov [run_file_70.Flags], 0
111
	mov [run_file_70.Count], dword size
112
	m2m [run_file_70.Buffer], [buf]
113
	mov byte[run_file_70+20], 0
114
	mov [run_file_70.FileName], file_name
115
	mov ebx,run_file_70
116
	int 0x40 ;загружаем файл изображения
117
	cmp ebx,0xffffffff
118
	je @f
119
		;определяем вид изображения и переводим его во временный буфер image_data
120
		stdcall dword[img_decode], dword[buf],ebx,0
121
		mov dword[image_data],eax
122
		;преобразуем изображение к формату rgb
123
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
124
		;удаляем временный буфер image_data
125
		stdcall dword[img_destroy], dword[image_data]
126
	@@:
127
}
128
 
129
;данные игры
130
bit_zaac equ 2 ;бит зайца
131
val_zaac equ 4 ;цифра отвечающая за бит зайца
132
bit_mig equ 3 ;бит мигания
133
val_mig equ 8 ;цифра отвечающая за бит мигания
134
mask_lot_lu    equ 1b ;маска для левого верхнего лотка
135
mask_lot_ld    equ 100000b ;маска для левого нижнего лотка
136
mask_lot_ru    equ 10000000000b ;маска для правого верхнего лотка
137
mask_lot_rd    equ 1000000000000000b ;маска для правого нижнего лотка
138
mask_clear_all equ 11111011111011110111101111011110b ;маска для очистки падающих яиц и прибежавших циплят
139
mask_fail_eggs equ 100001000010000100000b ;маска падающих яиц
140
mask_chi_left  equ 11111000000000000000000000b ;маска левых циплят
141
mask_chi_right equ 11111000000000000000000000000000b ;маска правых циплят
142
mask_chi_cr_l  equ 1000000000000000000000b ;маска для создания левого
143
mask_chi_cr_r  equ 1000000000000000000000000000b ;маска для создания правого
144
bit_chi_left  equ 21 ;1-й бит который отвечает за бегущего слева
145
bit_chi_right equ 27 ;1-й бит который отвечает за бегущего права
1538 IgorA 146
val_zaac_time_y equ 5 ;колличество тактов, которое обязательно должен провисеть заяц
147
val_zaac_time_n equ 7 ;колличество тактов, которое обязательно должен быть спрятанным заяц
1535 IgorA 148
 
1552 IgorA 149
txt_game_a db 'Игра А',0
150
txt_game_b db 'Игра Б',0
151
 
1538 IgorA 152
zaac_status db 0
1535 IgorA 153
pos_wolf db 0 ;позиция волка 0-й бит слева/справа, 1-й бит сверху/вниз
154
;rb 1
155
pos_eggs dd 0 ;позиции расположения яиц и циплят
156
eggs_count dw 0 ;колличество пойманых яиц
157
game_text db 'Игра _',13
158
some_text db '0'
159
	rb 8 ;текст с числом пойманных яиц
160
count_last db 0 ;счетчик пропущенных яиц
161
game_spd dd 0 ;задержка игры
162
 
163
;для генерации случайных чисел
164
rand_x dd 0
165
 
166
align 4
167
rand_next:
168
;x(k+1) = (a*x(k)+c) mod m
169
; a=22695477, c=1, m=2^32
170
push eax
171
	mov eax,dword[rand_x]
172
	imul eax,22695477
173
	inc eax
174
	mov dword[rand_x],eax
175
pop eax
176
	ret
177
 
178
;создаем прозрачные буфера по 8 бит (трафареты), для рисования
179
;где buf - буфер на основе которого будет создан трафарет
180
;фоновый цвет буфера должен быть 0xffffff, иначе не произойдет обрезка
181
;по фоновому цвету и трафарет будет занимат ьмного места в памяти
182
align 4
183
proc CreateTrapharetBuffer, buf:dword, img_data:dword
1552 IgorA 184
	push eax edi
1535 IgorA 185
	mov edi,dword[buf]
1552 IgorA 186
 
187
	;заполнение данных буфера
188
	mov buf2d_size_lt,0
189
	mov eax,dword[displ_w]
190
	mov buf2d_w,eax
191
	mov eax,dword[displ_h]
192
	mov buf2d_h,eax
193
	mov buf2d_color,0xffffff
194
	mov buf2d_bits,24
195
 
1535 IgorA 196
	stdcall [buf2d_create_f_img], edi,[img_data] ;создаем буфер
197
	stdcall [buf2d_conv_24_to_8], edi,1 ;делаем буфер прозрачности 8бит
1538 IgorA 198
	;обрезаем лишние края буфера, для более быстрого рисования
199
	stdcall [buf2d_crop_color], edi,buf2d_color,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM+BUF2D_OPT_CROP_RIGHT+BUF2D_OPT_CROP_LEFT
1552 IgorA 200
	pop edi eax
1535 IgorA 201
	ret
202
endp
203
 
204
align 4
205
InitBackgroundBuffer: ;создание фонового изображения
206
	pushad
207
	mov edi,buf_fon
208
	mov eax,[color_fon]
209
	mov buf2d_color,eax
210
	stdcall [buf2d_clear], edi,eax
211
	mov esi,edi
212
 
213
	xor eax,eax
214
	xor ebx,ebx
215
 
1552 IgorA 216
	mov edi,buf_decor
1535 IgorA 217
	mov ax,buf2d_t
218
	add eax,OFFS_SHADOW_Y
219
	mov bx,buf2d_l
220
	add ebx,OFFS_SHADOW_X
221
	stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени домиков
1552 IgorA 222
	add edi,BUF_STRUCT_SIZE
1535 IgorA 223
	mov ax,buf2d_t
224
	add eax,OFFS_SHADOW_Y
225
	mov bx,buf2d_l
226
	add ebx,OFFS_SHADOW_X
227
	stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени куриц
1552 IgorA 228
	add edi,BUF_STRUCT_SIZE
1535 IgorA 229
	mov ax,buf2d_t
230
	add eax,OFFS_SHADOW_Y
231
	mov bx,buf2d_l
232
	add ebx,OFFS_SHADOW_X
233
	stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени деревьев
234
 
1552 IgorA 235
	mov edi,buf_decor
1535 IgorA 236
	mov ax,buf2d_t
237
	stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_perilo] ;рисуем домики
1552 IgorA 238
	add edi,BUF_STRUCT_SIZE
1535 IgorA 239
	mov ax,buf2d_t
240
	stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_curici] ;рисуем курицы
1552 IgorA 241
	add edi,BUF_STRUCT_SIZE
1535 IgorA 242
	mov ax,buf2d_t
243
	stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_trees] ;рисуем деревья
244
	popad
245
	ret
246
 
247
;рисует картинку в буфере buf из массива буферов buf_img с индексом ind
248
;т. е. buf <- buf_img[ind]
249
align 4
250
proc DrawArrayImg, buf:dword, buf_img:dword, ind:dword, color:dword
251
	pushad
252
		mov edi,dword[ind]
253
		imul edi,BUF_STRUCT_SIZE
254
		add edi,dword[buf_img]
255
 
256
		mov esi,dword[buf]
257
		xor eax,eax
258
		mov ax,buf2d_t
259
		xor ebx,ebx
260
		mov bx,buf2d_l
261
		stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color]
262
	popad
263
	ret
264
endp
265
 
266
align 4
267
DrawZaac: ;рисование зайца
268
	push eax
269
	bt word[pos_wolf],bit_zaac
270
	jae .end_mig
271
 
272
	stdcall DrawArrayImg, buf_displ,buf_wolf,6,[color_wolf] ;рисуем тело зайца
273
	mov eax,dword[pos_eggs]
274
	and eax,mask_chi_right+mask_chi_left
275
	cmp eax,0
276
	je .end_mig ;если нет бегающих циплят, то заяц рукой не машет
277
	bt word[pos_wolf],bit_mig
278
	jc @f
279
		stdcall DrawArrayImg, buf_displ,buf_wolf,7,[color_wolf] ;рисуем руку зайца вверху
280
		jmp .end_mig
281
	@@:
282
		stdcall DrawArrayImg, buf_displ,buf_wolf,8,[color_wolf] ;рисуем руку зайца внизу
283
	.end_mig:
284
	pop eax
285
	ret
286
 
287
align 4
288
DrawWolf: ;рисует волка с корзинами
289
	bt word[pos_wolf],0
290
	jc @f
291
		stdcall DrawArrayImg, buf_displ,buf_wolf,0,[color_wolf]
292
		bt word[pos_wolf],1
293
		jc .corz_ldn
294
			stdcall DrawArrayImg, buf_displ,buf_wolf,1,[color_wolf]
295
			jmp .corz_lend
296
		.corz_ldn:
297
			stdcall DrawArrayImg, buf_displ,buf_wolf,2,[color_wolf]
298
		.corz_lend:
299
		jmp .wolf_b
300
	@@:
301
		stdcall DrawArrayImg, buf_displ,buf_wolf,3,[color_wolf]
302
		bt word[pos_wolf],1
303
		jc .corz_rdn
304
			stdcall DrawArrayImg, buf_displ,buf_wolf,4,[color_wolf]
305
			jmp .corz_rend
306
		.corz_rdn:
307
			stdcall DrawArrayImg, buf_displ,buf_wolf,5,[color_wolf]
308
		.corz_rend:
309
	.wolf_b:
310
	ret
311
 
312
align 4
313
DrawEggs: ;рисует яйца
314
	pushad
315
	cld
316
 
317
	mov eax,dword[pos_eggs]
318
	xor ebx,ebx
319
	mov ecx,20 ;цикл для рисования котящихся яиц
320
	@@:
321
		bt eax,ebx
322
		jae .draw_egg
323
			stdcall DrawArrayImg, buf_displ,buf_egg,ebx,[color_egg]
324
		.draw_egg:
325
		inc ebx
326
		loop @b
327
 
328
	;mov eax,dword[pos_eggs]
329
	and eax,mask_chi_left
330
	cmp eax,0
331
	je @f
332
		stdcall DrawArrayImg, buf_displ,buf_egg,20,[color_egg] ;разбитое яйцо слева
333
	@@:
334
	mov eax,dword[pos_eggs]
335
	and eax,mask_chi_right
336
	cmp eax,0
337
	je @f
338
		stdcall DrawArrayImg, buf_displ,buf_egg,21,[color_egg] ;разбитое яйцо справа
339
	@@:
340
 
341
	mov eax,dword[pos_eggs]
342
	xor edx,edx
343
	mov ebx,bit_chi_left
344
	mov ecx,5 ;цикл для рисования левых циплят
345
	@@:
346
		bt eax,ebx
347
		jae .draw_chick_l
348
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
349
		.draw_chick_l:
350
		inc ebx
351
		inc edx
352
		loop @b
353
	mov ebx,bit_chi_right
354
	mov ecx,5 ;цикл для рисования правых циплят
355
	@@:
356
		bt eax,ebx
357
		jae .draw_chick_r
358
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
359
		.draw_chick_r:
360
		inc ebx
361
		inc edx
362
		loop @b
363
 
364
	xor eax,eax
365
	mov al,byte[count_last]
366
	mov ecx,eax ;цикл для рисования штрафных очков
367
	shr ecx,1
368
	mov edx,10 ;индекс начала штрафных иконок в буфере buf_chi
369
	cmp ecx,0
370
	je .no_unit_last
371
	@@:
372
		stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
373
		inc edx
374
		loop @b
375
	.no_unit_last:
376
 
377
	bt ax,0 ;проверяем мигающее не четное очко
378
	jae @f
379
		bt word[pos_wolf],bit_mig
380
		jc @f
381
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] ;мигающее штрафное очко
382
	@@:
383
 
384
	popad
385
	ret
386
 
387
align 4
388
CountEggsInc: ;увеличиваем счетчик яиц на 1
389
	push eax edi
390
		xor eax,eax
391
		inc word[eggs_count] ;увеличиваем счетчик яиц
392
		cmp word[eggs_count],200 ;бонусные очки
393
		je @f
394
		cmp word[eggs_count],500 ;бонусные очки
395
		je @f
396
			jmp .no_bonus
397
		@@:
398
			mov byte[count_last],0
399
		.no_bonus:
400
 
401
		mov ax,word[eggs_count]
402
		mov edi,some_text
403
		call convert_to_str ;обновляем текстовую строку
404
		and ax,0xf ;через каждые 16 яиц уменьшаем время
405
		cmp ax,0
406
		jne @f
407
			cmp dword[game_spd],15 ;минимальная задержка
408
			jle @f
409
				dec dword[game_spd]
410
		@@:
411
	pop edi eax
412
	ret
413
 
414
;input:
415
; eax - маска, указывающая с какой строны упало яйцо
416
align 4
417
CountLastInc: ;начисление штрафных очков
418
	inc byte[count_last] ;половинао штрафного очка
419
	bt word[pos_wolf],bit_zaac
420
	jc @f
421
		inc byte[count_last] ;если нет зайца то еще 1-на половина штрафного очка
422
	@@:
423
	cmp byte[count_last],6
424
	jle @f
425
		mov byte[count_last],6 ;ставим ограничени на число штрафных очков
426
	@@:
427
	or dword[pos_eggs],eax ;создаем бегущего ципленка
428
	ret
429
 
430
align 4
431
MoveEggs:
432
	pushad
433
	xor byte[pos_wolf],val_mig ;бит для мигания
434
 
435
	cmp byte[count_last],6 ;максимальное число штрафных очков
436
	je .end_fun
437
 
438
	rol dword[pos_eggs],1
439
	mov ecx,dword[pos_eggs]
440
	and ecx,mask_fail_eggs
441
	cmp ecx,0
442
	je .no_fail ;нет падающих яиц
443
		;начисление яиц попавших в корзину
444
		;или начисление штрафных очков
445
		xor ebx,ebx
446
		mov bl,byte[pos_wolf] ;берем параметры (позицию) волка
447
		and bl,3 ;на всякий случай
448
 
449
		bt ecx,5 ;проверяем верхнее левое перило
450
		jae .perilo_lu
451
			cmp bx,0 ;проверяем наличие корзины
452
			jne @f
453
				call CountEggsInc
454
				jmp .perilo_lu
455
			@@:
456
				mov eax,mask_chi_cr_l
457
				call CountLastInc
458
			.perilo_lu:
459
		bt ecx,10 ;проверяем нижнее левое перило
460
		jae .perilo_ld
461
			cmp bx,2 ;проверяем наличие корзины
462
			jne @f
463
				call CountEggsInc
464
				jmp .perilo_ld
465
			@@:
466
				mov eax,mask_chi_cr_l
467
				call CountLastInc
468
		.perilo_ld:
469
		bt ecx,15 ;проверяем верхнее правое перило
470
		jae .perilo_ru
471
			cmp bx,1 ;проверяем наличие корзины
472
			jne @f
473
				call CountEggsInc
474
				jmp .perilo_ru
475
			@@:
476
				mov eax,mask_chi_cr_r
477
				call CountLastInc
478
		.perilo_ru:
479
		bt ecx,20 ;проверяем нижнее правое перило
480
		jae .perilo_rd
481
			cmp bx,3 ;проверяем наличие корзины
482
			jne @f
483
				call CountEggsInc
484
				jmp .perilo_rd
485
			@@:
486
				mov eax,mask_chi_cr_r
487
				call CountLastInc
488
		.perilo_rd:
489
	.no_fail:
490
 
491
	and dword[pos_eggs],mask_clear_all ;очистка упавших яиц и добежавших курей
492
 
493
	call rand_next
1538 IgorA 494
	cmp byte[zaac_status],0
495
	jle @f
496
		dec byte[zaac_status]
497
		jmp .no_zaac_move ;заяц пока не двигается
498
	@@:
499
 
500
	bt dword[rand_x],6 ;заяц от фонаря меняет статус
1535 IgorA 501
	jc @f
502
		xor byte[pos_wolf],val_zaac ;высовываем/засовываем зайца
1538 IgorA 503
		bt word[pos_wolf],val_zaac
504
		jc .zaac_n
505
			mov byte[zaac_status],val_zaac_time_y ;ставим минимальное время для смены статуса
506
			jmp @f
507
		.zaac_n:
508
			mov byte[zaac_status],val_zaac_time_n ;ставим минимальное время для смены статуса
1535 IgorA 509
	@@:
1538 IgorA 510
	.no_zaac_move:
1535 IgorA 511
 
512
	;создание новых яиц
513
	bt dword[rand_x],4 ;проверяем будем ли создавать новое яйцо
514
	jc .end_creat
515
	bt dword[rand_x],5 ;проверяем с какой стороны будем создавать новое яйцо
516
	jc .creat_r
517
		bt dword[rand_x],7
518
		jc @f
519
			or dword[pos_eggs],mask_lot_lu
520
			jmp .end_creat
521
		@@:
522
			or dword[pos_eggs],mask_lot_ld
523
			jmp .end_creat
524
	.creat_r:
525
		bt dword[rand_x],7
526
		jc @f
527
			or dword[pos_eggs],mask_lot_ru
528
			jmp .end_creat
529
		@@:
530
			or dword[pos_eggs],mask_lot_rd
531
			;jmp .end_creat
532
	.end_creat:
533
 
534
	.end_fun:
535
	popad
536
	ret
537
 
538
align 4
539
proc InitGame, b:dword ;первоначальные настройки игры
540
	mov word[eggs_count],0 ;колличество пойманых яиц
541
	mov byte[some_text],'0'
542
	mov byte[some_text+1],0 ;текст с числом пойманных яиц
543
	mov byte[count_last],0
544
	mov dword[pos_eggs],0
1538 IgorA 545
	mov byte[zaac_status],0
1535 IgorA 546
 
547
	cmp dword[b],0
548
	jne @f
549
		mov byte[game_text+5],'А'
550
		mov dword[game_spd],65 ;задержка игры
551
		jmp .end_init
552
	@@:
553
		mov byte[game_text+5],'Б'
554
		mov dword[game_spd],35 ;задержка игры
555
	.end_init:
556
 
557
	push eax ebx
558
		mcall 26,9
559
		mov dword[rand_x],eax ;заполняем 1-е случайное число
560
	pop ebx eax
561
 
562
	ret
563
endp
564
 
565
align 4
1552 IgorA 566
proc LoadArrayBuffer, f_name:dword, buf_start:dword, count:dword
567
	pushad
568
	mov edx,dword[displ_bytes]
569
	mov ecx,edx
570
	imul ecx,dword[count]
571
	mov eax,dword[f_name]
572
	load_image_file eax,image_data_gray,ecx
573
		mov edx,dword[displ_bytes]
574
		mov eax,[image_data_gray]
575
		mov edi,dword[buf_start]
576
		mov ecx,dword[count]
577
		cld
578
		@@: ;считываем 3 буфера с декорациями
579
			stdcall CreateTrapharetBuffer,edi,eax
580
			add eax,edx
581
			add edi,BUF_STRUCT_SIZE
582
			loop @b
583
	stdcall mem.Free,[image_data_gray] ;освобождаем память
584
	popad
585
	ret
586
endp
587
 
588
align 4
1535 IgorA 589
start:
590
	load_libraries l_libs_start,load_lib_end
591
 
592
	;проверка на сколько удачно загузилась наша либа
593
	mov	ebp,lib0
594
	cmp	dword [ebp+ll_struc_size-4],0
595
	jz	@f
596
		mcall -1 ;exit not correct
597
	@@:
598
	mov	ebp,lib1
599
	cmp	dword [ebp+ll_struc_size-4],0
600
	jz	@f
601
		mcall -1 ;exit not correct
602
	@@:
603
 
604
	mcall 40,0x27
605
	mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета
606
 
1552 IgorA 607
	;работа с файлом настроек
608
	copy_path ini_name,sys_path,file_name,0x0
609
	stdcall dword[ini_get_int],file_name,ini_sec_files,key_displ_w,210
610
	mov	dword[displ_w],eax
611
	stdcall dword[ini_get_int],file_name,ini_sec_files,key_displ_h,140
612
	mov	dword[displ_h],eax
613
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_unit,0
614
	mov	dword[color_wolf],eax
1555 IgorA 615
	stdcall dword[ini_get_str],file_name,ini_sec_files,key_file_unit,fn_icon1,FILE_NAME_MAX,ini_def_unit_file
1535 IgorA 616
 
1555 IgorA 617
 
1552 IgorA 618
	mov edx,dword[displ_w]
619
	imul edx,dword[displ_h]
620
	lea edx,[edx+edx*2]
621
	mov dword[displ_bytes],edx ;вычисляем размер игрового поля
1535 IgorA 622
 
1552 IgorA 623
	stdcall LoadArrayBuffer, fn_icon0, buf_decor,3 ;считываем 3 буфера с декорациями
624
	stdcall LoadArrayBuffer, fn_icon1, buf_wolf,9 ;считываем 9 буферов с волком и зайцем
625
	stdcall LoadArrayBuffer, fn_icon2, buf_egg,22 ;считываем 22 буферов с яйцами
626
	stdcall LoadArrayBuffer, fn_icon3, buf_chi,13 ;считываем 13 буферов с циплятами
1535 IgorA 627
 
628
	load_image_file fn_font, image_data_gray,IMAGE_FONT_SIZE
629
	stdcall [buf2d_create_f_img], buf_font,[image_data_gray] ;создаем буфер
630
	stdcall mem.Free,[image_data_gray] ;освобождаем память
631
 
632
	stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит
633
	stdcall [buf2d_convert_text_matrix], buf_font
634
 
635
;проверка занимаемого буфером места
636
;mov edi,buf_wolf
637
;add edi,BUF_STRUCT_SIZE ;переходим на буфер корзины
638
;stdcall [buf2d_clear],edi,0x808080 ;заливаем его серым цветом
639
 
1552 IgorA 640
	mov ebx,dword[displ_w]
641
	mov edx,dword[displ_h]
642
 
643
	mov edi,buf_displ
644
	mov buf2d_w,ebx
645
	mov buf2d_h,edx
1535 IgorA 646
	stdcall [buf2d_create], buf_displ ;создаем буфер для вывода на экран
1552 IgorA 647
 
648
	mov edi,buf_fon
649
	mov buf2d_w,ebx
650
	mov buf2d_h,edx
651
	stdcall [buf2d_create], buf_fon ;создаем буфер с фоновыми декорациями
652
 
1535 IgorA 653
	call InitBackgroundBuffer ;заполняем буфер с фоновыми декорациями
654
	stdcall InitGame,0
655
	mcall 26,9
656
	mov [last_time],ebx
657
 
658
 
659
 
660
align 4
661
red_win:
662
	call draw_window
663
 
664
align 4
665
still: ;главный цикл
666
	mcall 26,9
667
	mov ebx,[last_time]
668
	add ebx,dword[game_spd] ;delay
669
	sub ebx,eax
670
	cmp ebx,dword[game_spd] ;delay
671
	ja it_is_time_now
672
	test ebx,ebx
673
	jz it_is_time_now
674
	mcall 23
675
 
676
	cmp eax,0
677
	je it_is_time_now
678
 
679
	;mcall 10
680
 
681
	cmp al,0x1 ;изменилось положение окна
682
	jz red_win
683
	cmp al,0x2
684
	jz key
685
	cmp al,0x3
686
	jz button
687
 
688
	jmp still
689
 
690
align 4
691
it_is_time_now:
692
	mcall 26,9
693
	mov [last_time],eax
694
 
695
	;...здесь идут действия, вызываемые каждые delay сотых долей секунд...
696
	call MoveEggs
697
	call draw_display
698
	jmp still
699
 
700
align 4
701
key:
702
	push eax ebx
703
	mcall 2
704
 
705
	cmp ah,176 ;Left
706
	jne @f
707
		and byte[pos_wolf],0xfe
708
	@@:
709
	cmp ah,179 ;Right
710
	jne @f
711
		or byte[pos_wolf],1
712
	@@:
713
	cmp ah,178 ;Up
714
	jne @f
715
		and byte[pos_wolf],0xff-2
716
	@@:
717
	cmp ah,177 ;Down
718
	jne @f
719
		or byte[pos_wolf],2
720
	@@:
721
 
722
	cmp ah,97 ;a
723
	jne @f
724
		and byte[pos_wolf],0xff-3 ;00
725
	@@:
726
	cmp ah,122 ;z
727
	jne @f
728
		and byte[pos_wolf],0xff-1
729
		or byte[pos_wolf],2 ;10
730
	@@:
731
	cmp ah,39 ;'
732
	jne @f
733
		and byte[pos_wolf],0xff-2
734
		or byte[pos_wolf],1 ;01
735
	@@:
736
	cmp ah,47 ;/
737
	jne @f
738
		or byte[pos_wolf],3 ;11
739
	@@:
740
 
741
	pop ebx eax
742
	jmp still
743
 
744
 
745
align 4
746
draw_window:
747
	pushad
748
	mcall 12,1
749
 
750
	xor eax,eax
1538 IgorA 751
	mov ebx,20*65536+480
752
	mov ecx,20*65536+270
1535 IgorA 753
	mov edx,[sc.work]
754
	;or edx,0x33000000
755
	or edx,0x73000000
756
	mov edi,hed
757
	mcall ;создание окна
758
 
759
	mcall 9,procinfo,-1
760
	mov edi,buf_displ
761
	mov eax,dword[procinfo.client_box.width]
1552 IgorA 762
	cmp eax,dword[displ_w]
1535 IgorA 763
	jle @f
1552 IgorA 764
		sub eax,dword[displ_w]
1535 IgorA 765
		shr eax,1
766
		mov buf2d_l,ax ;выправниваем буфер по центру окна
767
	@@:
768
 
769
	call draw_display
770
 
771
	mov eax,13 ;рисование прямоугольника
772
	mov edx,[sc.work]
773
	xor esi,esi
774
	mov si,buf2d_l
1552 IgorA 775
	add esi,dword[displ_w]
1535 IgorA 776
	mov ebx,dword[procinfo.client_box.width]
777
	inc ebx
778
	cmp esi,ebx
779
	jge @f
780
		sub ebx,esi
781
		rol ebx,16
782
		mov bx,si
783
		rol ebx,16
784
		mov ecx,dword[procinfo.client_box.height]
785
		inc ecx
786
		int 0x40 ;рисование правого бокового поля
787
		jmp .draw_s
788
	@@:
789
		mov esi,dword[procinfo.client_box.width] ;когда по ширине не влазит
790
		inc esi
791
	.draw_s:
792
 
1538 IgorA 793
if use_but eq 1
794
	; *** рисование кнопок ***
795
push esi
796
	mov eax,8
797
	xor ebx,ebx
798
	mov bx,buf2d_l
799
	add ebx,buf2d_w
800
	add ebx,BUT1_L
801
	shl ebx,16
802
	mov bx,BUT1_W
803
	mov ecx,BUT1_T*65536+BUT1_H
804
	mov edx,5
805
	;or edx,0x40000000
806
	mov esi,dword[color_but_sm]
807
	int 0x40
808
 
809
	inc edx
810
	add ecx,BUT1_NEXT_TOP
811
	int 0x40
812
pop esi
813
 
1552 IgorA 814
	mov eax,4 ;аЁбRў -Ё? в?Єбв 
815
	mov bx,BUT1_H
816
	add ebx,3*65536;+3
817
	mov ecx,dword[color_but_te]
818
	or  ecx,0x80000000
819
	mov edx,txt_game_a
820
	int 0x40
821
 
822
	ror ebx,16
823
	add ebx,BUT1_NEXT_TOP
824
	ror ebx,16
825
	mov edx,txt_game_b
826
	int 0x40
827
 
1538 IgorA 828
	; *** восстановление параметров ***
829
	mov eax,13 ;рисование прямоугольника
830
	mov edx,[sc.work]
831
end if
832
 
1535 IgorA 833
	mov ebx,esi
834
	mov ecx,dword[procinfo.client_box.height]
835
	inc ecx
1552 IgorA 836
	mov esi,dword[displ_h]
1535 IgorA 837
	cmp esi,ebx
838
	jge @f
839
		sub ecx,esi
840
		rol ecx,16
841
		mov cx,si
842
		rol ecx,16
843
		int 0x40 ;рисование нижнего поля
844
	@@:
845
 
846
	xor ebx,ebx
847
	mov bx,buf2d_l
1552 IgorA 848
	mov ecx,dword[displ_h]
1535 IgorA 849
	int 0x40 ;рисование левого бокового поля
850
 
851
	mcall 12,2
852
	popad
853
	ret
854
 
855
align 4
856
draw_display:
857
 
1552 IgorA 858
	stdcall mem_copy, dword[buf_fon],dword[buf_displ],315*210*3;dword[displ_bytes] ;копирование изображения из фонового буфера
859
	call DrawZaac ;рисуем зайца
1535 IgorA 860
	call DrawWolf ;рисуем волка
1552 IgorA 861
	call DrawEggs ;рисуем яйца
1535 IgorA 862
 
1552 IgorA 863
push eax
864
	mov eax,dword[displ_w]
865
	shr eax,1
866
	stdcall [buf2d_draw_text], buf_displ, buf_font,game_text,eax,OFFS_SHADOW_X,[color_curici] ;рисуем строку с текстом
867
pop eax
1535 IgorA 868
	stdcall [buf2d_draw], buf_displ
869
	ret
870
 
871
align 4
872
button:
873
	mcall 17 ;получить код нажатой кнопки
1538 IgorA 874
	if use_but eq 1
875
	cmp ah,5
876
	jne @f
877
		stdcall InitGame,0
878
	@@:
879
	cmp ah,6
880
	jne @f
881
		stdcall InitGame,1
882
	@@:	end if
1535 IgorA 883
	cmp ah,1
884
	jne still
885
.exit:
886
	stdcall [buf2d_delete],buf_fon ;удаляем буфер
887
	stdcall [buf2d_delete],buf_displ ;удаляем буфер
888
 
889
	stdcall [buf2d_delete],buf_font
890
 
891
	cld
1552 IgorA 892
	mov ecx,3
893
	mov edi,buf_decor
894
	@@: ;удаляем 3 буфера
895
		stdcall [buf2d_delete],edi
896
		add edi,BUF_STRUCT_SIZE
897
		loop @b
1535 IgorA 898
	mov ecx,9
899
	mov edi,buf_wolf
900
	@@: ;удаляем 9 буферов с волком и зайцем
901
		stdcall [buf2d_delete],edi
902
		add edi,BUF_STRUCT_SIZE
903
		loop @b
904
	mov ecx,13
905
	mov edi,buf_chi
906
	@@: ;удаляем 13 буферов
907
		stdcall [buf2d_delete],edi
908
		add edi,BUF_STRUCT_SIZE
909
		loop @b
910
	mov ecx,22
911
	mov edi,buf_egg
912
	@@: ;удаляем 22 буфера
913
		stdcall [buf2d_delete],edi
914
		add edi,BUF_STRUCT_SIZE
915
		loop @b
916
 
917
	mcall -1 ;выход из программы
918
 
919
head_f_i:
920
head_f_l  db 'Системная ошибка',0
921
 
922
system_dir0 db '/sys/lib/'
923
name_buf2d db 'buf2d.obj',0
924
err_message_found_lib0 db 'Не удалось найти библиотеку buf2d.obj',0
925
err_message_import0 db 'Ошибка при импорте библиотеки buf2d.obj',0
926
 
927
system_dir1 db '/sys/lib/'
928
name_libimg db 'libimg.obj',0
929
err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0
930
err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0
931
 
1552 IgorA 932
system_dir2 db '/sys/lib/'
933
libini_name db 'libini.obj',0
934
err_message_found_lib2 db 'Не удалось найти библиотеку libini.obj',0
935
err_message_import2 db 'Ошибка при импорте библиотеки libini.obj',0
936
 
1535 IgorA 937
;library structures
938
l_libs_start:
939
	lib0 l_libs name_buf2d,  sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, import_buf2d_lib, err_message_import0, head_f_i
940
	lib1 l_libs name_libimg, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, import_libimg, err_message_import1, head_f_i
1552 IgorA 941
	lib2 l_libs libini_name, sys_path, file_name, system_dir2, err_message_found_lib2, head_f_l, libini_import, err_message_import2, head_f_i
1535 IgorA 942
load_lib_end:
943
 
944
align 4
945
proc mem_copy, source:dword, destination:dword, len:dword
946
  push ecx esi edi
947
    cld
948
    mov esi, dword[source]
949
    mov edi, dword[destination]
950
    mov ecx, dword[len]
951
    rep movsb
952
  pop edi esi ecx
953
  ret
954
endp
955
 
956
align 4
957
convert_to_str:
958
	pushad
959
	;mov eax,dword[value]
960
	;mov edi,dword[text]
961
	mov dword[edi+1],0
962
	cld
963
	call .str
964
	popad
965
	ret
966
 
967
 
968
align 4
969
.str:
970
  mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
971
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
972
  cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
973
  jb @f
974
  xor edx,edx  ;очистить edx
975
  div ecx      ;разделить - остаток в edx
976
  push edx     ;положить в стек
977
  ;dec edi             ;смещение необходимое для записи с конца строки
978
  call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
979
  pop eax
980
  @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
981
  ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
982
  ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
983
  or al,0x30  ;данная команда короче  чем две выше
984
  stosb       ;записать элемент из регистра al в ячеку памяти es:edi
985
  ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
986
 
987
 
988
last_time dd ?
989
image_data dd 0 ;память для преобразования картинки функциями libimg
990
image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты
991
 
992
run_file_70 FileInfoBlock
1552 IgorA 993
hed db 'Nu pogodi 03.08.10',0 ;подпись окна
1535 IgorA 994
sc system_colors  ;системные цвета
995
 
996
align 4
997
buf_font: ;буфер со шрифтом
998
	dd 0 ;указатель на буфер изображения
999
	dw 25 ;+4 left
1000
	dw 25 ;+6 top
1001
	dd 128 ;+8 w
1002
	dd 144 ;+12 h
1003
	dd 0 ;+16 color
1004
	db 24 ;+20 bit in pixel
1005
 
1006
align 4
1552 IgorA 1007
buf_displ:
1535 IgorA 1008
	dd 0 ;указатель на буфер изображения
1552 IgorA 1009
	dw 25,0
1010
	dd ? ;+8 w
1011
	dd ? ;+12 h
1012
	dd 0 ;+16 color
1535 IgorA 1013
	db 24 ;+20 bit in pixel
1552 IgorA 1014
 
1535 IgorA 1015
align 4
1552 IgorA 1016
buf_fon: ;фоновый буфер
1535 IgorA 1017
	dd 0 ;указатель на буфер изображения
1018
	dw 0 ;+4 left
1019
	dw 0 ;+6 top
1552 IgorA 1020
	dd ? ;+8 w
1021
	dd ? ;+12 h
1535 IgorA 1022
	dd 0xffffff ;+16 color
1023
	db 24 ;+20 bit in pixel
1024
 
1025
align 4
1552 IgorA 1026
buf_decor: ;буфера с декорациями: домиками и рейками; с курицами; с растениями
1027
	rb 3*BUF_STRUCT_SIZE
1535 IgorA 1028
 
1029
align 4
1030
buf_wolf:
1031
	rb 9*BUF_STRUCT_SIZE
1032
 
1033
align 4
1034
buf_egg:
1035
	rb 22*BUF_STRUCT_SIZE
1036
 
1037
align 4
1038
buf_chi:
1039
	rb 13*BUF_STRUCT_SIZE
1040
 
1552 IgorA 1041
 
1042
 
1535 IgorA 1043
align 4
1552 IgorA 1044
libini_import:
1045
	dd alib_init0
1046
	ini_get_str   dd aini_get_str
1047
	ini_get_int   dd aini_get_int
1048
	ini_get_color dd aini_get_color
1049
dd 0,0
1050
	alib_init0     db 'lib_init',0
1051
	aini_get_str   db 'ini_get_str',0
1052
	aini_get_int   db 'ini_get_int',0
1053
	aini_get_color db 'ini_get_color',0
1054
 
1055
align 4
1535 IgorA 1056
import_libimg:
1057
  dd alib_init1
1058
  img_is_img  dd aimg_is_img
1059
  img_info    dd aimg_info
1060
  img_from_file dd aimg_from_file
1061
  img_to_file dd aimg_to_file
1062
  img_from_rgb dd aimg_from_rgb
1063
  img_to_rgb  dd aimg_to_rgb
1064
  img_to_rgb2 dd aimg_to_rgb2
1065
  img_decode  dd aimg_decode
1066
  img_encode  dd aimg_encode
1067
  img_create  dd aimg_create
1068
  img_destroy dd aimg_destroy
1069
  img_destroy_layer dd aimg_destroy_layer
1070
  img_count   dd aimg_count
1071
  img_lock_bits dd aimg_lock_bits
1072
  img_unlock_bits dd aimg_unlock_bits
1073
  img_flip    dd aimg_flip
1074
  img_flip_layer dd aimg_flip_layer
1075
  img_rotate  dd aimg_rotate
1076
  img_rotate_layer dd aimg_rotate_layer
1077
  img_draw    dd aimg_draw
1078
 
1079
  dd 0,0
1080
  alib_init1   db 'lib_init',0
1081
  aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1082
  aimg_info    db 'img_info',0
1083
  aimg_from_file db 'img_from_file',0
1084
  aimg_to_file db 'img_to_file',0
1085
  aimg_from_rgb db 'img_from_rgb',0
1086
  aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1087
  aimg_to_rgb2 db 'img_to_rgb2',0
1088
  aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1089
  aimg_encode  db 'img_encode',0
1090
  aimg_create  db 'img_create',0
1091
  aimg_destroy db 'img_destroy',0
1092
  aimg_destroy_layer db 'img_destroy_layer',0
1093
  aimg_count   db 'img_count',0
1094
  aimg_lock_bits db 'img_lock_bits',0
1095
  aimg_unlock_bits db 'img_unlock_bits',0
1096
  aimg_flip    db 'img_flip',0
1097
  aimg_flip_layer db 'img_flip_layer',0
1098
  aimg_rotate  db 'img_rotate',0
1099
  aimg_rotate_layer db 'img_rotate_layer',0
1100
  aimg_draw    db 'img_draw',0
1101
 
1102
align 4
1103
import_buf2d_lib:
1104
	dd sz_lib_init
1105
	buf2d_create dd sz_buf2d_create
1106
	buf2d_create_f_img dd sz_buf2d_create_f_img
1107
	buf2d_clear dd sz_buf2d_clear
1108
	buf2d_draw dd sz_buf2d_draw
1109
	buf2d_delete dd sz_buf2d_delete
1110
	buf2d_line dd sz_buf2d_line
1111
	buf2d_circle dd sz_buf2d_circle
1112
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1113
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1114
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1115
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1116
	buf2d_bit_blt dd sz_buf2d_bit_blt
1117
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1118
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1119
	buf2d_cruve_bezier dd sz_buf2d_cruve_bezier
1120
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1121
	buf2d_draw_text dd sz_buf2d_draw_text
1122
	buf2d_crop_color dd sz_buf2d_crop_color
1123
	buf2d_offset_h dd sz_buf2d_offset_h
1124
	dd 0,0
1125
	sz_lib_init db 'lib_init',0
1126
	sz_buf2d_create db 'buf2d_create',0
1127
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1128
	sz_buf2d_clear db 'buf2d_clear',0
1129
	sz_buf2d_draw db 'buf2d_draw',0
1130
	sz_buf2d_delete db 'buf2d_delete',0
1131
	sz_buf2d_line db 'buf2d_line',0
1132
	sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности
1133
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1134
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1135
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1136
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1137
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1138
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1139
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1140
	sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0
1141
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1142
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1143
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1144
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1145
 
1146
i_end:
1147
	rb 1024
1148
	align 16
1149
	procinfo process_information
1150
stacktop:
1151
	sys_path rb 4096
1152
	file_name:
1153
		rb 4096
1154
	plugin_path:
1155
		rb 4096
1156
	openfile_path:
1157
		rb 4096
1158
	filename_area:
1159
		rb 256
1160
mem: