0,0 → 1,128 |
;
[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 |