Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
950 leency 1
;ПРОЦЕДУРА ПРОВЕРКИ СУЩЕСТВОВАНИЯ ПУТИ ДО КНОПКИ [dest] из EAX
2
test_path:
3
	pushad
4
	mov	cx, [lineCoord + eax*2 - 4]
5
	mov	edx, eax
6
	cmp	eax, [current]
7
	je	.recurs_call
8
 
9
	cmp	eax, [dest]
10
	je	.end_yes
11
 
12
	cmp	byte [eax + lineBall - 2], 0
13
	jne	.end_no
14
 
15
	or	byte [eax + lineBall - 2], 0x8	;4-й бит - 1 (cheked)
16
 
17
	.recurs_call:
18
	;тупой вызов для соседних клеток
19
	test	cl, cl
20
	jz	@F
21
	sub	eax, 9
22
	call	test_path
23
	jc	.end_yes
24
 
25
	@@:
26
	test	cl, 8
27
	jnz	@F
28
	mov	eax, edx
29
	add	eax, 9
30
	call	test_path
31
	jc	.end_yes
32
 
33
	@@:
34
	test	ch, ch
35
	jz	@F
36
	mov	eax, edx
37
	dec	eax
38
	call	test_path
39
	jc	.end_yes
40
 
41
	@@:
42
	test	ch, 8
43
	jnz	.end_no
44
	mov	eax, edx
45
	inc	eax
46
	call	test_path
47
	jc	.end_yes
48
 
49
	.end_no:
50
	clc
51
	popad
52
	ret
53
	.end_yes:
54
	stc
55
	popad
56
	ret
57
 
58
;ПРОЦЕДУРА ПОИСКА СБИТЫХ ЛИНИЙ ([dest] - ID кнопки для поиска)
59
find_line:
60
	mov	dword [findRightLeft], 0	;обнуляем начальные значения
61
 
62
	mov	eax, [dest]
63
	add	eax, lineBall - 2
64
	mov	dh, [eax]
65
	mov	[baseAddr], eax
66
	or	byte [eax], 0xF0
67
 
68
	mov	ecx, 8		;в ecx - счетчик
69
	.cycle_find:
70
	   lea	eax, [ecx*4 + ecx]
71
	   shl	eax, 1				;eax = ecx*10
72
	   mov	edi, [eax + findTable - 4]	;edi - куды записывать рез-ты
73
	   mov	ebp, [eax + findTable - 8]	;ebp - прибавление адреса
74
	   mov	bx, [eax + findTable - 10]	;bx - прибавление координат
75
	   mov	dl, cl
76
	   shl	dl, 4
77
	   mov	esi, [baseAddr]
78
	   mov	eax, [dest]
79
	   mov	ax, [eax*2 + lineCoord - 4]
80
	   .small_cycle_find:
81
		add	al, bh
82
		cmp	al, 8		;в [0..8] ?
83
		ja	@F
84
		add	ah, bl
85
		cmp	ah, 8
86
		ja	@F
87
 
88
		add	esi, ebp
89
		cmp	byte [esi], dh
90
		jne	@F
91
 
92
		or	byte [esi], dl
93
		inc	byte [edi]
94
		jmp	.small_cycle_find
95
	   @@:
96
	   loop	.cycle_find
97
	ret
98
 
99
findRightLeft		db ?
100
findUpRight_DownLeft	db ?
101
findUpDown		db ?
102
findUpLeft_DownRight	db ?
103
 
104
findTable:
105
   Up:
106
	db	 -1, 0
107
	dd	-1, findUpDown
108
   Down:
109
	db	 +1, 0
110
	dd	+1, findUpDown
111
   Left:
112
	db	0, -1
113
	dd	-9, findRightLeft
114
   Right:
115
	db	0, +1
116
	dd	+9, findRightLeft
117
   UpLeft:
118
	db	-1, -1
119
	dd	-10, findUpLeft_DownRight
120
   DownRight:
121
	db	+1, +1
122
	dd	+10, findUpLeft_DownRight
123
   UpRight:
124
	db	-1, +1
125
	dd	+8, findUpRight_DownLeft
126
   DownLeft:
127
	db	+1, -1
128
	dd	-8, findUpRight_DownLeft