Subversion Repositories Kolibri OS

Rev

Rev 2089 | Rev 2384 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
  5. ;; Distributed under terms of the GNU General Public License    ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 2288 $
  9.  
  10. WINDOW_MOVE_AND_RESIZE_FLAGS = \
  11.   mouse.WINDOW_RESIZE_N_FLAG + \
  12.   mouse.WINDOW_RESIZE_W_FLAG + \
  13.   mouse.WINDOW_RESIZE_S_FLAG + \
  14.   mouse.WINDOW_RESIZE_E_FLAG + \
  15.   mouse.WINDOW_MOVE_FLAG
  16.  
  17. uglobal
  18. align 4
  19.   event_start   dd ?
  20.   event_end     dd ?
  21.   event_uid     dd 0
  22. endg
  23. EV_SPACE   = 512
  24. FreeEvents = event_start-EVENT.fd    ; "âèðòóàëüíûé" event, èñïîëüçóþòñÿ òîëüêî ïîëÿ:
  25.                                      ;  FreeEvents.fd=event_start è FreeEvents.bk=event_end
  26. align 4
  27. init_events:                                       ;; used from kernel.asm
  28.         stdcall kernel_alloc, EV_SPACE*EVENT.size
  29.         or      eax, eax
  30.         jz      .fail
  31.       ; eax - current event, ebx - previos event below
  32.         mov     ecx, EV_SPACE        ; current - in allocated space
  33.         mov     ebx, FreeEvents      ; previos - íà÷àëî ñïèñêà
  34.         push    ebx                  ; îíî æå è êîíåö ïîòîì áóäåò
  35.   @@:
  36.         mov     [ebx+EVENT.fd], eax
  37.         mov     [eax+EVENT.bk], ebx
  38.         mov     ebx, eax             ; previos <- current
  39.         add     eax, EVENT.size      ; new current
  40.         loop    @b
  41.         pop     eax                  ; âîò îíî êîíöîì è ñòàëî
  42.         mov     [ebx+EVENT.fd], eax
  43.         mov     [eax+EVENT.bk], ebx
  44. .fail:
  45.         ret
  46.  
  47. EVENT_WATCHED    equ 0x10000000 ;áèò 28
  48. EVENT_SIGNALED   equ 0x20000000 ;áèò 29
  49. MANUAL_RESET     equ 0x40000000 ;áèò 30
  50. MANUAL_DESTROY   equ 0x80000000 ;áèò 31
  51.  
  52. align 4
  53. create_event:                                      ;; EXPORT use
  54. ;info:
  55. ;   Ïåðåíîñèì EVENT èç ñïèñêà FreeEvents â ñïèñîê ObjList òåêóùåãî ñëîòà
  56. ;   EVENT.state óñòàíàâëèâàåì èç ecx, EVENT.code êîñâåííî èç esi (åñëè esi<>0)
  57. ;param:
  58. ;   esi - event data
  59. ;   ecx - flags
  60. ;retval:
  61. ;   eax - event (=0 => fail)
  62. ;   edx - uid
  63. ;scratched: ebx,ecx,esi,edi
  64.         mov     ebx, [current_slot]
  65.         add     ebx, APP_OBJ_OFFSET
  66.         mov     edx, [TASK_BASE]
  67.         mov     edx, [edx+TASKDATA.pid]
  68.         pushfd
  69.         cli
  70.  
  71. set_event:                                         ;; INTERNAL use !!! don't use for Call
  72. ;info:
  73. ;   Áåðåì íîâûé event èç FreeEvents, çàïîëíÿåì åãî ïîëÿ, êàê óêàçàíî â ecx,edx,esi
  74. ;   è óñòàíàâëèâàåì â ñïèñîê, óêàçàííûé â ebx.
  75. ;   Âîçâðàùàåì ñàì event (â eax), è åãî uid (â edx)
  76. ;param:
  77. ;   ebx - start-chain "virtual" event for entry new event Right of him
  78. ;   ecx - flags      (copied to EVENT.state)
  79. ;   edx - pid        (copied to EVENT.pid)
  80. ;   esi - event data (copied to EVENT.code indirect, =0 => skip)
  81. ;retval:
  82. ;   eax - event (=0 => fail)
  83. ;   edx - uid
  84. ;scratched: ebx,ecx,esi,edi
  85.         mov     eax, FreeEvents
  86.         cmp     eax, [eax+EVENT.fd]
  87.         jne     @f  ; not empty ???
  88.         pushad
  89.         call    init_events
  90.         popad
  91.         jz      RemoveEventTo.break ; POPF+RET
  92.   @@:
  93.         mov     eax, [eax+EVENT.fd]
  94.         mov     [eax+EVENT.magic], 'EVNT'
  95.         mov     [eax+EVENT.destroy], destroy_event.internal
  96.         mov     [eax+EVENT.state], ecx
  97.         mov     [eax+EVENT.pid], edx
  98.         inc     [event_uid]
  99.         Mov     [eax+EVENT.id],edx,[event_uid]
  100.         or      esi, esi
  101.         jz      RemoveEventTo
  102.         lea     edi, [eax+EVENT.code]
  103.         mov     ecx, EVENT.codesize/4
  104.         cld
  105.         rep movsd
  106.  
  107. RemoveEventTo:                                     ;; INTERNAL use !!! don't use for Call
  108. ;param:
  109. ;   eax - óêàçàòåëü íà event, ÊÎÒÎÐÛÉ âñòàâëÿåì
  110. ;   ebx - óêàçàòåëü íà event, ÏÎÑËÅ êîòîðîãî âñòàâëÿåì
  111. ;scratched: ebx,ecx
  112.         mov     ecx, eax             ; ecx=eax=Self,      ebx=NewLeft
  113.         xchg    ecx, [ebx+EVENT.fd]  ; NewLeft.fd=Self,   ecx=NewRight
  114.         cmp     eax, ecx             ; ñòîï, ñåáå äóìàþ...
  115.         je      .break               ; - à íå äóðàê ëè ÿ?
  116.         mov     [ecx+EVENT.bk], eax  ; NewRight.bk=Self
  117.         xchg    ebx, [eax+EVENT.bk]  ; Self.bk=NewLeft,   ebx=OldLeft
  118.         xchg    ecx, [eax+EVENT.fd]  ; Self.fd=NewRight,  ecx=OldRight
  119.         mov     [ebx+EVENT.fd], ecx  ; OldLeft.fd=OldRight
  120.         mov     [ecx+EVENT.bk], ebx  ; OldRight.bk=OldLeft
  121. .break:
  122.         popfd
  123.         ret
  124.  
  125. align 4
  126. NotDummyTest:                                      ;; INTERNAL use (not returned for fail !!!)
  127.         pop     edi
  128.         call    DummyTest ; not returned for fail !!!
  129.         mov     ebx, eax
  130.         mov     eax, [ebx+EVENT.pid]
  131.         push    edi
  132. .small: ; êðèâî êàê-òî...
  133.         pop     edi
  134.         pushfd
  135.         cli
  136.         call    pid_to_slot ; saved all registers (eax - retval)
  137.         shl     eax, 8
  138.         jz      RemoveEventTo.break ; POPF+RET
  139.         jmp     edi ; øòàòíûé âîçâðàò
  140.  
  141. align 4
  142. raise_event:                                       ;; EXPORT use
  143. ;info:
  144. ;   Óñòàíàâëèâàåì äàííûå EVENT.code
  145. ;   Åñëè òàì ôëàã EVENT_SIGNALED óæå àêòèâåí - áîëüøå íè÷åãî
  146. ;   Èíà÷å: ýòîò ôëàã âçâîäèòñÿ, çà èñêëþ÷åíèåì ñëó÷àÿ íàëè÷èÿ ôëàãà EVENT_WATCHED â edx
  147. ;    ýòîì ñëó÷àå EVENT_SIGNALED âçâîäèòñÿ ëèøü ïðè íàëè÷èå EVENT_WATCHED â ñàìîì ñîáûòèè
  148. ;param:
  149. ;   eax - event
  150. ;   ebx - uid (for Dummy testing)
  151. ;   edx - flags
  152. ;   esi - event data (=0 => skip)
  153. ;scratched: ebx,ecx,esi,edi
  154.         call    NotDummyTest ; not returned for fail !!!
  155.         or      esi, esi
  156.         jz      @f
  157.         lea     edi, [ebx+EVENT.code]
  158.         mov     ecx, EVENT.codesize/4
  159.         cld
  160.         rep movsd
  161.   @@:
  162.         test    byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
  163.         jnz     RemoveEventTo.break  ; POPF+RET
  164.         bt      edx, 28 ;EVENT_WATCHED
  165.         jnc     @f
  166.         test    byte[ebx+EVENT.state+3], EVENT_WATCHED shr 24
  167.         jz      RemoveEventTo.break  ; POPF+RET
  168.   @@:
  169.         or      byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
  170.         add     eax, SLOT_BASE+APP_EV_OFFSET
  171.         xchg    eax, ebx
  172.         jmp     RemoveEventTo
  173.  
  174. align 4
  175. clear_event:                                       ;; EXPORT use
  176. ;info:
  177. ;
  178. ;param:
  179. ;   eax - event
  180. ;   ebx - uid (for Dummy testing)
  181. ;scratched: ebx,ecx
  182.         call    NotDummyTest ; not returned for fail !!!
  183.         add     eax, SLOT_BASE+APP_OBJ_OFFSET
  184.         and     byte[ebx+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
  185.         xchg    eax, ebx
  186.         jmp     RemoveEventTo
  187.  
  188. align 4
  189. send_event:                                        ;; EXPORT use
  190. ;info:
  191. ;   Ñîçäàåò íîâûé EVENT (âûòàñêèâàåò èç ñïèñêà FreeEvents) â ñïèñêå EventList
  192. ;   öåëåâîãî ñëîòà (eax=pid), ñ äàííûìè èç esi êîñâåííî, è state=EVENT_SIGNALED
  193. ;param:
  194. ;   eax - slots pid, to sending new event
  195. ;   esi - pointer to sending data (in code field of new event)
  196. ;retval:
  197. ;   eax - event (=0 => fail)
  198. ;   edx - uid
  199. ;warning:
  200. ;   may be used as CDECL with such prefix...
  201. ;       mov     esi,[esp+8]
  202. ;       mov     eax,[esp+4]
  203. ;   but not as STDCALL :(
  204. ;scratched: ebx,ecx,esi,edi
  205.         mov     edx, eax
  206.         call    NotDummyTest.small ; not returned for fail !!!
  207.         lea     ebx, [eax+SLOT_BASE+APP_EV_OFFSET]
  208.         mov     ecx, EVENT_SIGNALED
  209.         jmp     set_event
  210.  
  211. align 4
  212. DummyTest:                                         ;; INTERNAL use (not returned for fail !!!)
  213. ;param:
  214. ;   eax - event
  215. ;   ebx - uid (for Dummy testing)
  216.         cmp     [eax+EVENT.magic], 'EVNT'
  217.         jne     @f
  218.         cmp     [eax+EVENT.id], ebx
  219.         je      .ret
  220.   @@:
  221.         pop     eax
  222.         xor     eax, eax
  223. .ret:
  224.         ret
  225.  
  226.  
  227. align 4
  228. Wait_events:
  229.         or      ebx, -1; infinite timeout
  230. Wait_events_ex:
  231. ;info:
  232. ;   Îæèäàíèå "àáñòðàêòíîãî" ñîáûòèÿ ÷åðåç ïåðåâîä ñëîòà â 5-þ ïîçèöèþ.
  233. ;   Àáñòðàêòíîñòü çàêëþ÷åíà â òîì, ÷òî ôàêò ñîáûòèÿ îïðåäåëÿåòñÿ ôóíêöèåé APPDATA.wait_test,
  234. ;   êîòîðàÿ çàäàåòñÿ êëèåíòîì è ìîæåò áûòü ôàêòè÷åñêè ëþáîé.
  235. ;   Ýòî ïîçâîëÿåò shed-ó íàäåæíî îïðåäåëèòü ôàêò ñîáûòèÿ, è íå ñîâåðøàòü "õîëîñòûõ" ïåðåêëþ÷åíèé,
  236. ;   ïðåäíàçíà÷åííûõ äëÿ ðàçáîðîê òèïà "ñâîé/÷óæîé" âíóòðè çàäà÷è.
  237. ;param:
  238. ;   edx - wait_test, êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ (àäðåñ êîäà)
  239. ;   ecx - wait_param, äîïîëíèòåëüíûé ïàðàìåòð, âîçìîæíî íåîáõîäèìûé äëÿ [wait_test]
  240. ;   ebx - wait_timeout
  241. ;retval:
  242. ;   eax - ðåçóëüòàò âûçîâà [wait_test] (=0 => timeout)
  243. ;scratched: esi
  244.         mov     esi, [current_slot]
  245.         mov     [esi+APPDATA.wait_param], ecx
  246.         pushad
  247.         mov     ebx, esi;ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
  248.         pushfd  ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò
  249.         cli     ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed
  250.         call    edx
  251.         popfd
  252.         mov     [esp+28], eax
  253.         popad
  254.         or      eax, eax
  255.         jnz     @f   ;RET
  256.         mov     [esi+APPDATA.wait_test], edx
  257.         mov     [esi+APPDATA.wait_timeout], ebx
  258.         Mov     [esi+APPDATA.wait_begin],eax,[timer_ticks]
  259.         mov     eax, [TASK_BASE]
  260.         mov     [eax+TASKDATA.state], 5
  261.         call    change_task
  262.         mov     eax, [esi+APPDATA.wait_param]
  263.   @@:
  264.         ret
  265.  
  266. align 4
  267. wait_event:                                        ;; EXPORT use
  268. ;info:
  269. ;   Îæèäàíèå ôëàãà EVENT_SIGNALED â ñîâåðøåííî êîíêðåòíîì Event
  270. ;   (óñòàíàâëèâàåìîãî, íàäî ïîëàãàòü, ÷åðåç raise_event)
  271. ;   Ïðè àêòèâíîì ôëàãå MANUAL_RESET - áîëüøå íè÷åãî
  272. ;   Èíà÷å: ôëàãè EVENT_SIGNALED è EVENT_WATCHED ó ïîëó÷åííîãî ñîáûòèÿ ñáðàñûâàþòñÿ,
  273. ;   è, ïðè àêòèâíîì MANUAL_DESTROY - ïåðåìåùàåòñÿ â ñïèñîê ObjList òåêóùåãî ñëîòà,
  274. ;   à ïðè íå àêòèâíîì - óíè÷òîæàåòñÿ øòàòíî (destroy_event.internal)
  275. ;param:
  276. ;   eax - event
  277. ;   ebx - uid (for Dummy testing)
  278. ;scratched: ecx,edx,esi
  279.         call    DummyTest
  280.         mov     ecx, eax             ; wait_param
  281.         mov     edx, get_event_alone ; wait_test
  282.         call    Wait_events          ; timeout ignored
  283.         jmp     wait_finish
  284.  
  285. align 4
  286. get_event_ex:                                      ;; f68:14
  287. ;info:
  288. ;   Îæèäàíèå ëþáîãî ñîáûòèÿ â î÷åðåäè EventList òåêóùåãî ñëîòà
  289. ;   Äàííûå ñîáûòèÿ code - êîïèðóþòñÿ â ïàìÿòü ïðèëîæåíèÿ (êîñâåííî ïî edi)
  290. ;   Ïðè àêòèâíîì ôëàãå MANUAL_RESET - áîëüøå íè÷åãî
  291. ;   Èíà÷å: ôëàãè EVENT_SIGNALED è EVENT_WATCHED ó ïîëó÷åííîãî ñîáûòèÿ ñáðàñûâàþòñÿ,
  292. ;   è, ïðè àêòèâíîì MANUAL_DESTROY - ïåðåìåùàåòñÿ â ñïèñîê ObjList òåêóùåãî ñëîòà,
  293. ;   à ïðè íå àêòèâíîì - óíè÷òîæàåòñÿ øòàòíî (destroy_event.internal)
  294. ;param:
  295. ;   edi - àäðåñ â êîäå ïðèëîæåíèÿ äëÿ êîïèðîâàíèÿ äàííûõ èç EVENT.code
  296. ;retval:
  297. ;   eax - ñîáñòâåííî EVENT (áóäåì íàçûâàòü ýòî åãî õýíäëîì)
  298. ;scratched: ebx,ecx,edx,esi,edi
  299.         mov     edx, get_event_queue ; wait_test
  300.         call    Wait_events          ; timeout ignored
  301.         lea     esi, [eax+EVENT.code]
  302.         mov     ecx, EVENT.codesize/4
  303.         cld
  304.         rep movsd
  305.         mov     [edi-EVENT.codesize+2], cl;clear priority field
  306. wait_finish:
  307.         test    byte[eax+EVENT.state+3], MANUAL_RESET shr 24
  308.         jnz     get_event_queue.ret  ; RET
  309.         and     byte[eax+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
  310.         test    byte[eax+EVENT.state+3], MANUAL_DESTROY shr 24
  311.         jz      destroy_event.internal
  312.         mov     ebx, [current_slot]
  313.         add     ebx, APP_OBJ_OFFSET
  314.         pushfd
  315.         cli
  316.         jmp     RemoveEventTo
  317.  
  318. align 4
  319. destroy_event:                                     ;; EXPORT use
  320. ;info:
  321. ;   Ïåðåíîñèì EVENT â ñïèñîê FreeEvents, ÷èñòèì ïîëÿ magic,destroy,pid,id
  322. ;param:
  323. ;   eax - event
  324. ;   ebx - uid (for Dummy testing)
  325. ;retval:
  326. ;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
  327. ;scratched: ebx,ecx
  328.         call    DummyTest ; not returned for fail !!!
  329. .internal:
  330.         xor     ecx, ecx  ; clear common header
  331.         pushfd
  332.         cli
  333.         mov     [eax+EVENT.magic], ecx
  334.         mov     [eax+EVENT.destroy], ecx
  335.         mov     [eax+EVENT.pid], ecx
  336.         mov     [eax+EVENT.id], ecx
  337.         mov     ebx, FreeEvents
  338.         jmp     RemoveEventTo
  339.  
  340. align 4
  341. get_event_queue:
  342. ;info:
  343. ;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ get_event_ex
  344. ;warning:
  345. ;  -don't use [TASK_BASE],[current_slot],[CURRENT_TASK] - it is not for your slot
  346. ;  -may be assumed, that interrupt are disabled
  347. ;  -it is not restriction for scratched registers
  348. ;param:
  349. ;   ebx - àäðåñ APPDATA ñëîòà òåñòèðîâàíèÿ
  350. ;retval:
  351. ;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
  352.         add     ebx, APP_EV_OFFSET
  353.         mov     eax, [ebx+APPOBJ.bk] ; âûáèðàåì ñ êîíöà, ïî ïðèíöèïó FIFO
  354.         cmp     eax, ebx ; empty ???
  355.         je      get_event_alone.ret0
  356. .ret:
  357.         ret
  358.  
  359. align 4
  360. get_event_alone:
  361. ;info:
  362. ;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ wait_event
  363. ;warning:
  364. ;  -don't use [TASK_BASE],[current_slot],[CURRENT_TASK] - it is not for your slot
  365. ;  -may be assumed, that interrupt are disabled
  366. ;  -it is not restriction for scratched registers
  367. ;param:
  368. ;   ebx - àäðåñ APPDATA ñëîòà òåñòèðîâàíèÿ
  369. ;retval:
  370. ;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
  371.         mov     eax, [ebx+APPDATA.wait_param]
  372.         test    byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24
  373.         jnz     .ret
  374.         or      byte[eax+EVENT.state+3], EVENT_WATCHED shr 24
  375. .ret0:
  376.         xor     eax, eax; NO event!!!
  377. .ret:
  378.         ret
  379.  
  380. align 4
  381. sys_sendwindowmsg:                                 ;; f72
  382.         dec     ebx
  383.         jnz     .ret ;subfunction==1 ?
  384.        ;pushfd  ;à íàôèãà?
  385.         cli
  386.         sub     ecx, 2
  387.         je      .sendkey
  388.         dec     ecx
  389.         jnz     .retf
  390. .sendbtn:
  391.         cmp     byte[BTN_COUNT], 1
  392.         jae     .result ;overflow
  393.         inc     byte[BTN_COUNT]
  394.         shl     edx, 8
  395.         mov     [BTN_BUFF], edx
  396.         jmp     .result
  397. .sendkey:
  398.         movzx   eax, byte[KEY_COUNT]
  399.         cmp     al, 120
  400.         jae     .result ;overflow
  401.         inc     byte[KEY_COUNT]
  402.         mov     [KEY_COUNT+1+eax], dl
  403. .result:
  404.         setae   byte[esp+32] ;ñ÷èòàåì, ÷òî èñõîäíî: dword[esp+32]==72
  405. .retf: ;popfd
  406. .ret:
  407.         ret
  408.  
  409. align 4
  410. sys_getevent:                                      ;; f11
  411.         mov     ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
  412.         pushfd  ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò
  413.         cli     ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed
  414.         call    get_event_for_app
  415.         popfd
  416.         mov     [esp+32], eax
  417.         ret
  418.  
  419. align 4
  420. sys_waitforevent:                                  ;; f10
  421.         or      ebx, -1; infinite timeout
  422. sys_wait_event_timeout:                            ;; f23
  423.         mov     edx, get_event_for_app; wait_test
  424.         call    Wait_events_ex        ; ebx - timeout
  425.         mov     [esp+32], eax
  426.         ret
  427.  
  428. align 4
  429. get_event_for_app:                                 ;; used from f10,f11,f23
  430. ;info:
  431. ;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ ïðèëîæåíèé (f10,f23)
  432. ;warning:
  433. ;  -don't use [TASK_BASE],[current_slot],[CURRENT_TASK] - it is not for your slot
  434. ;  -may be assumed, that interrupt are disabled
  435. ;  -it is not restriction for scratched registers
  436. ;param:
  437. ;   ebx - àäðåñ APPDATA ñëîòà òåñòèðîâàíèÿ
  438. ;retval:
  439. ;   eax - íîìåð ñîáûòèÿ (=0 => no events)
  440.         movzx   edi, bh               ; bh  is assumed as [CURRENT_TASK]
  441.         shl     edi, 5
  442.         add     edi, CURRENT_TASK     ; edi is assumed as [TASK_BASE]
  443.         mov     ecx, [edi+TASKDATA.event_mask]
  444. .loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè
  445.         bsr     eax, ecx       ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0)
  446.         jz      .no_events     ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ???
  447.         btr     ecx, eax       ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè
  448.        ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà
  449.         cmp     eax, 9
  450.         jae     .loop          ; eax=[9..31], ignored
  451.         cmp     eax, 3
  452.         je      .loop          ; eax=3, ignored
  453.         ja      .FlagAutoReset ; eax=[4..8], retvals=eax+1
  454.         cmp     eax, 1
  455.         jae     .BtKy          ; eax=[1,2],  retvals=eax+1
  456. .WndRedraw:                    ; eax=0, retval WndRedraw=1
  457.         cmp     [edi-twdw+WDATA.fl_redraw], al;al==0
  458.         jne     .result
  459.         jmp     .loop
  460.   .no_events:
  461.         xor     eax, eax
  462.         ret
  463.  
  464. .FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9
  465.         cmp     eax, 5; Mouse 5+1=6
  466.         jne     @f
  467.         push    eax
  468. ; If the window is captured and moved by the user, then no mouse events!!!
  469.         mov     al, [mouse.active_sys_window.action]
  470.         and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
  471.         test    al, al
  472.         pop     eax
  473.         jnz     .loop
  474. @@:
  475.         btr     [ebx+APPDATA.event_mask], eax
  476.         jnc     .loop
  477.   .result:      ; retval = eax+1
  478.         inc     eax
  479.         ret
  480.   .BtKy:
  481.         movzx   edx, bh
  482.         movzx   edx, word[WIN_STACK+edx*2]
  483.         je      .Keys          ; eax=1, retval Keys=2
  484. .Buttons:                      ; eax=2, retval Buttons=3
  485.         cmp     byte[BTN_COUNT], 0
  486.         je      .loop          ; empty ???
  487.         cmp     edx, [TASK_COUNT]
  488.         jne     .loop          ; not Top ???
  489.         mov     edx, [BTN_BUFF]
  490.         shr     edx, 8
  491.         cmp     edx, 0xFFFF    ;-ID for Minimize-Button of Form
  492.         jne     .result
  493.         mov     [window_minimize], 1
  494.         dec     byte[BTN_COUNT]
  495.         jmp     .loop
  496. .Keys:    ; eax==1
  497.         cmp     edx, [TASK_COUNT]
  498.         jne     @f             ; not Top ???
  499.         cmp     [KEY_COUNT], al; al==1
  500.         jae     .result        ; not empty ???
  501.   @@:
  502.         mov     edx, hotkey_buffer
  503.   @@:
  504.         cmp     [edx], bh      ; bh - slot for testing
  505.         je      .result
  506.         add     edx, 8
  507.         cmp     edx, hotkey_buffer+120*8
  508.         jb      @b
  509.         jmp     .loop
  510. ;end.
  511.