;ПРОЦЕДУРА ПРОВЕРКИ СУЩЕСТВОВАНИЯ ПУТИ ДО КНОПКИ [dest] из EAX test_path: pushad mov cx, [lineCoord + eax*2 - 4] mov edx, eax cmp eax, [current] je .recurs_call cmp eax, [dest] je .end_yes cmp byte [eax + lineBall - 2], 0 jne .end_no or byte [eax + lineBall - 2], 0x8 ;4-й бит - 1 (cheked) .recurs_call: ;тупой вызов для соседних клеток test cl, cl jz @F sub eax, 9 call test_path jc .end_yes @@: test cl, 8 jnz @F mov eax, edx add eax, 9 call test_path jc .end_yes @@: test ch, ch jz @F mov eax, edx dec eax call test_path jc .end_yes @@: test ch, 8 jnz .end_no mov eax, edx inc eax call test_path jc .end_yes .end_no: clc popad ret .end_yes: stc popad ret ;ПРОЦЕДУРА ПОИСКА СБИТЫХ ЛИНИЙ ([dest] - ID кнопки для поиска) find_line: mov dword [findRightLeft], 0 ;обнуляем начальные значения mov eax, [dest] add eax, lineBall - 2 mov dh, [eax] mov [baseAddr], eax or byte [eax], 0xF0 mov ecx, 8 ;в ecx - счетчик .cycle_find: lea eax, [ecx*4 + ecx] shl eax, 1 ;eax = ecx*10 mov edi, [eax + findTable - 4] ;edi - куды записывать рез-ты mov ebp, [eax + findTable - 8] ;ebp - прибавление адреса mov bx, [eax + findTable - 10] ;bx - прибавление координат mov dl, cl shl dl, 4 mov esi, [baseAddr] mov eax, [dest] mov ax, [eax*2 + lineCoord - 4] .small_cycle_find: add al, bh cmp al, 8 ;в [0..8] ? ja @F add ah, bl cmp ah, 8 ja @F add esi, ebp cmp byte [esi], dh jne @F or byte [esi], dl inc byte [edi] jmp .small_cycle_find @@: loop .cycle_find ret findRightLeft db ? findUpRight_DownLeft db ? findUpDown db ? findUpLeft_DownRight db ? findTable: Up: db -1, 0 dd -1, findUpDown Down: db +1, 0 dd +1, findUpDown Left: db 0, -1 dd -9, findRightLeft Right: db 0, +1 dd +9, findRightLeft UpLeft: db -1, -1 dd -10, findUpLeft_DownRight DownRight: db +1, +1 dd +10, findUpLeft_DownRight UpRight: db -1, +1 dd +8, findUpRight_DownLeft DownLeft: db +1, -1 dd -8, findUpRight_DownLeft