Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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