Subversion Repositories Kolibri OS

Rev

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

  1. ;******************************************************************************
  2. ;   MAIN MENU
  3. ;******************************************************************************
  4. ; last update:  22/03/2012
  5. ; changed by:   Marat Zakiyanov aka Mario79, aka Mario
  6. ; changes:      Global optimization! The program uses
  7. ;               only 32 KB of memory instead of 128 kb is now.
  8. ;------------------------------------------------------------------------------
  9. ; last update:  19/09/2011
  10. ; changed by:   Marat Zakiyanov aka Mario79, aka Mario
  11. ; changes:      Checking for program exist to memory
  12. ;               Added processing of keys: left and right arrow
  13. ;------------------------------------------------------------------------------
  14. ;   MAIN MENU by lisovin@26.ru
  15. ;   Some parts of code rewritten by Ivan Poddubny <ivan-yar@bk.ru>
  16. ;
  17. ;   Compile with FASM for Menuet
  18. ;******************************************************************************
  19.   include "lang.inc"
  20.   include "..\..\..\macros.inc"
  21.  
  22.   BTN_HEIGHT  = 22
  23.   TXT_Y       = (BTN_HEIGHT)/2-5
  24.  
  25.   PANEL_HEIGHT  = 20
  26.   MENU_BOTTON_X_POS     = 10
  27.   MENU_BOTTON_X_SIZE    = 60
  28. ;------------------------------------------------------------------------------
  29.         use32
  30.         org 0x0
  31.  
  32.         db 'MENUET01'   ; 8 byte id
  33.         dd 0x01         ; header version
  34.         dd START        ; start of code
  35.         dd IM_END       ; size of image
  36.         dd mem_end      ; memory for app
  37.         dd stack_area   ; esp
  38.         dd 0x0          ; boot parameters
  39.         dd 0x0          ; path
  40. ;------------------------------------------------------------------------------
  41. ;include "DEBUG.INC"             ; debug macros
  42. ;------------------------------------------------------------------------------
  43. align 4
  44. START:                 ; start of execution
  45.         mcall   68,11
  46.         call    program_exist
  47.         mcall   14
  48.         mov     [screen_size],eax
  49.        
  50.         mcall   48,3,sc,sizeof.system_colors    ; load system colors
  51.        
  52. ; get size of file MENU.DAT
  53.         mcall   70,fileinfo
  54.         test    eax,eax
  55.         jnz     close
  56. ; get memory for MENU.DAT
  57.         mov     ecx,[procinfo+32]
  58.         mov     [fileinfo.size],ecx
  59.         mcall   68,12
  60.         mov     [fileinfo.return],eax
  61.         mcall   68
  62.         mov     [menu_data],eax
  63. ; load MENU.DAT
  64.         mov     [fileinfo],dword 0
  65.         mcall   70,fileinfo
  66.         test    eax,eax
  67.         jnz     close
  68.  
  69.         test    ebx,ebx    ; length = 0 ?
  70.         jz      close
  71.         mov     ecx,ebx
  72.         mov     edi,[fileinfo.return]   ;mem_end
  73. ;--------------------------------------
  74. align 4
  75. newsearch:
  76.         mov     al,'#'
  77.         cld
  78.         repne   scasb
  79.         test    ecx,ecx    ; if not found
  80.         jz      close
  81.         call    get_number
  82.         test    ebx,ebx
  83.         jnz     .number
  84.         cmp     al,'#'
  85.         je      search_end
  86. ;--------------------------------------
  87. align 4
  88. .number:
  89.         shl     ebx,4
  90.         add     ebx,[menu_data]     ; pointer to process table
  91.         mov     [ebx],edi
  92.         inc     [processes]
  93.         jmp     newsearch
  94. ;--------------------------------------
  95. align 4
  96. search_end:
  97.         mov     [end_pointer],edi
  98.         mov     ebx,[processes]
  99.         dec     ebx
  100.         shl     ebx,4
  101.         add     ebx,[menu_data]
  102. ;--------------------------------------
  103. align 4
  104. newprocess:
  105.         xor     edx,edx
  106.         mov     ecx,edi
  107.         sub     ecx,[ebx]
  108.         mov     al,10
  109. ;--------------------------------------
  110. align 4
  111. newsearch1:
  112.         std
  113.         repne   scasb
  114.         test    ecx,ecx
  115.         je      endprocess
  116.         cmp     [edi],byte 13
  117.         jne     newsearch1
  118.         inc     edx
  119.         jmp     newsearch1
  120. ;--------------------------------------
  121. align 4
  122. endprocess:
  123.         mov     esi,ebx
  124.         add     esi,4
  125.         dec     edx
  126.         mov     [esi],dl
  127.         cmp     ebx,[menu_data]
  128.         jbe     search_end1
  129.         sub     ebx,16
  130.         jmp     newprocess
  131. ;--------------------------------------
  132. align 4
  133. search_end1:
  134.         mcall   14
  135.         sub     ax,20
  136.         mov     ebx,[menu_data]
  137.         mov     [ebx + y_end],ax
  138.         mov     [ebx + x_start],5
  139.         mov     al,[ebx + rows]
  140.         mov     [ebx + cur_sel],al       ; clear selection
  141.         mov     [ebx + prev_sel],al
  142.         mov     [buffer],0
  143. ;------------------------------------------------------------------------------
  144. align 4
  145. thread:
  146.         mov     ebp,esp
  147.         sub     ebp,0x1000
  148.         cmp     ebp,0x2000 ; if this is first started thread
  149.         ja      @f
  150.         xor     ebp,ebp ; not free area
  151. ;--------------------------------------
  152. align 4
  153. @@:
  154.         mov     eax,[buffer]      ; identifier
  155.         shl     eax,4
  156.         add     eax,[menu_data]
  157.         mov     edi,eax
  158.         mcall   40,100111b      ; mouse + button + key + redraw
  159. ;------------------------------------------------------------------------------
  160. align 4
  161. red:   
  162.         call    draw_window     ; redraw
  163. ;------------------------------------------------------------------------------
  164. align 4
  165. still:
  166.         call    free_area_if_set_mutex
  167.  
  168.         mcall   23,5    ; wait here for event
  169.         test    [close_now],1      ; is close flag set?
  170.         jnz     close
  171.        
  172.         cmp     eax,1   ; redraw request ?
  173.         je      red
  174.         cmp     eax,2   ; key pressed ?
  175.         je      key
  176.         cmp     eax,3   ; button in buffer ?
  177.         je      button
  178.         cmp     eax,6   ; mouse event ?
  179.         je      mouse
  180.         cmp     edi,[menu_data]
  181.         je      still        ; if main process-ignored
  182.        
  183.         movzx   ebx,[edi + parent]       ; parent id
  184.         shl     ebx,4
  185.         add     ebx,[menu_data]      ; ebx = base of parent info
  186.         call    backconvert          ; get my id in al
  187.         cmp     al,[ebx + child]    ; if I'm not child of my parent, I shall die :)
  188.         jne     close
  189.        
  190.         jmp     still
  191. ;------------------------------------------------------------------------------
  192. align 4
  193. key:
  194.         mcall   2
  195.         mov     [last_key],ah
  196.         mov     al,[edi + rows]     ; number of buttons
  197.         cmp     ah,178    ; KEY_UP
  198.         jne     .noup
  199.        
  200.         mov     ah,[edi+cur_sel]
  201.         mov     [edi+prev_sel],ah
  202.         dec     byte [edi+cur_sel]
  203.         jnz     redrawbut
  204.         mov     [edi+cur_sel],al
  205.         jmp     redrawbut
  206. ;--------------------------------------
  207. align 4
  208. .noup:
  209.         cmp     ah,177   ; KEY_DOWN
  210.         jne     .nodn
  211.        
  212.         mov     ah,[edi + cur_sel]
  213.         mov     [edi + prev_sel],ah
  214.         inc     [edi + cur_sel]
  215.         cmp     [edi + cur_sel],al
  216.         jna     redrawbut
  217.         mov     [edi + cur_sel],1
  218.         jmp     redrawbut
  219. ;--------------------------------------
  220. align 4
  221. .nodn:
  222.         cmp     ah,179   ; KEY_LEFT
  223.         je      @f
  224.         cmp     ah,13    ; ENTER
  225.         jne     .noenter
  226. @@:
  227.         mov     ah,[edi + cur_sel]
  228.         jmp     button1
  229. ;--------------------------------------
  230. align 4
  231. .noenter:
  232.         cmp     ah,176   ; KEY_RIGHT
  233.         je      @f
  234.         cmp     ah,27    ; ESC
  235.         jne     still
  236.         jmp     close
  237. ;--------------------------------------
  238. align 4
  239. @@:
  240.         call    get_process_ID
  241.         cmp     [main_process_ID],ecx
  242.         jne     close
  243.         jmp     still
  244. ;------------------------------------------------------------------------------
  245. align 4
  246. button: ; BUTTON HANDLER
  247.         mcall   17      ; get id
  248.                                 ; dunkaist[
  249.         test    eax,0xfffffe00  ; is it system close button? (close signal from @panel)
  250.         setz    byte[close_now] ; set (or not set) close_recursive flag
  251.         jz      close           ; if so,close all menus
  252.                                 ; dunkaist]
  253. ;--------------------------------------
  254. align 4
  255. button1:
  256.         mov     esi,edi
  257.         push    edi
  258.         mov     edi,[edi + pointer]
  259. ; print "hello"
  260.         mov     al,[esi + cur_sel]
  261.         mov     [esi + prev_sel],al
  262.         mov     [esi + cur_sel],ah
  263.        
  264.         pushad
  265.         mov     edi,esi
  266. ; dph eax
  267.         call    draw_only_needed_buttons
  268.         popad
  269. ; look for the next line <ah> times; <ah> = button_id
  270.         push    eax
  271. ;--------------------------------------
  272. align 4
  273. .next_string:
  274.         call    searchstartstring
  275.         dec     ah
  276.         jnz     .next_string
  277.         pop     eax
  278.        
  279.         mov     ecx,40
  280.         mov     al,'/'
  281.         cld
  282.         repne   scasb
  283.         test    ecx,ecx   ; if '/' not found
  284.         je      searchexit
  285.        
  286.         cmp     [edi],byte '@'     ; check for submenu
  287.         je      runthread
  288.        
  289.         cmp     [last_key],179
  290.         je      searchexit
  291.        
  292.         dec     edi
  293.         push    edi                     ; pointer to start of filename
  294.         call    searchstartstring       ; search for next string
  295.         sub     edi,2           ; to last byte of string
  296.        
  297.         mov     ecx,edi
  298.         pop     esi
  299.         sub     ecx,esi
  300.         inc     ecx              ; length of filename
  301.         mov     edi, fileinfo_start.name
  302.         rep     movsb              ; copy string
  303.         mov     [edi],byte 0           ; store terminator
  304.         mcall   70,fileinfo_start       ; start program
  305.         or      [close_now],1      ; set close flag
  306.         pop     edi
  307.         mov     [mousemask],0
  308.         jmp     close
  309. ;--------------------------------------
  310. align 4
  311. searchexit:
  312.         pop     edi
  313.         jmp     still
  314. ;------------------------------------------------------------------------------
  315. align 4
  316. runthread:
  317.         inc     edi
  318.        
  319.         push    eax
  320.         call    get_number           ; get number of this process
  321.         pop     eax
  322.        
  323.         test    ebx,ebx    ; returned zero - main menu or not number
  324.         jz      searchexit
  325.        
  326.         mov     al,bl
  327.        
  328.         mov     ebx,[processes]
  329.         dec     bl
  330.         cmp     al,bl
  331.         ja      searchexit             ; such process doesnt exist
  332.         cmp     al,[esi + child]
  333.         je      searchexit             ; such process already exists
  334.        
  335.         mov     [esi + child],al    ; this is my child
  336.         mov     cx,[esi + x_start]
  337.         add     cx,141    ; new x_start in cx
  338.         movzx   edx,al
  339.         shl     edx,4
  340.         add     edx,[menu_data]       ; edx points to child's base address
  341.         mov     [edx + x_start],cx  ; xstart for new thread
  342.         mov     cx,[esi + y_end]   ; y_end in cx
  343.         mov     bl,[esi + rows]    ; number of buttons in bl
  344.         sub     bl,ah     ; number of btn from bottom
  345.         movzx   eax,al
  346.         mov     [buffer],eax            ; thread id in buffer
  347.         movzx   ebx,bl
  348.         push    edx
  349.         mov     eax,BTN_HEIGHT
  350.         mul     ebx
  351.         sub     cx,ax     ; new y_end for new thread
  352.         pop     edx
  353.         mov     [edx + y_end],cx    ; store y_end
  354.         mov     edi,esi
  355.         call    backconvert           ; get number of this process (al)
  356.         mov     [edx + parent],al   ; store number of parent process
  357.         mov     al,[edx + rows]
  358.         mov     [edx + cur_sel],al  ; clear current selected element
  359.         mov     [edx + prev_sel],al ; clear previous selected element
  360.         mov     [edx + child],0
  361.        
  362.         mcall   68,12,0x1000    ; stack of each thread is allocated 4 KB
  363.         add     eax,0x1000      ; set the stack pointer to the desired position
  364.         mov     edx,eax
  365.         mcall   51,1,thread     ; Go ahead!
  366.         jmp     searchexit
  367. ;------------------------------------------------------------------------------
  368. align 4
  369. mouse:        ; MOUSE EVENT HANDLER
  370.         mcall   37,0
  371.         mov     [screen_mouse_position],eax ; eax = [ Y | X ] relative to screen
  372.  
  373.         mcall   37,2
  374.         test    eax,eax    ; check buttons state
  375.         jnz     click
  376.         mcall   37,1
  377.         ror     eax,16    ; eax = [ Y | X ] relative to window
  378.         cmp     ax,140     ; pointer in window?
  379.         ja      noinwindow
  380. ; *** in window ***
  381.         shr     eax,16    ; eax = [ 0 | Y ]
  382.         xor     edx,edx
  383.         mov     ebx,BTN_HEIGHT
  384.         div     ebx
  385.         inc     eax               ; number of "button" in eax
  386.         movzx   ebx,[edi + rows]    ; total strings in ebx
  387.         cmp     eax,ebx
  388.         ja      noinwindow
  389.         cmp     [edi + cur_sel],al
  390.         je      noredrawbut
  391.         mov     bl,[edi + cur_sel]
  392. ;;;;;;
  393.         cmp     [edi + child],0
  394.         jne     noredrawbut
  395. ;;;;;;
  396.         mov     [edi + cur_sel],al
  397.         mov     [edi + prev_sel],bl
  398. ;--------------------------------------
  399. align 4
  400. redrawbut:
  401.         call    draw_only_needed_buttons
  402. ;--------------------------------------
  403. align 4
  404. noredrawbut:
  405.         call    backconvert
  406.         bts     [mousemask],eax
  407.         jmp     still
  408. ;--------------------------------------
  409. align 4
  410. noinwindow:
  411.         call    backconvert
  412.         btr     [mousemask],eax
  413.         jmp     still
  414. ;------------------------------------------------------------------------------
  415. align 4
  416. click:
  417.         cmp     [mousemask],0  ; not in a window (i.e. menu)
  418.         jne     still
  419. ; checking for pressing 'MENU' on the taskbar  
  420.         mov     eax,[screen_mouse_position]
  421.         mov     ebx,[screen_size]
  422.         sub     bx,PANEL_HEIGHT
  423.         cmp     bx,ax
  424.         ja      close
  425.         shr     eax,16
  426.         cmp     ax,MENU_BOTTON_X_SIZE
  427.         ja      close
  428.         cmp     ax,MENU_BOTTON_X_POS
  429.         ja      still
  430. ;------------------------------------------------------------------------------
  431. align 4
  432. close:
  433.        
  434.         movzx   ebx,[edi+parent]       ; parent id
  435.         shl     ebx,4
  436.         add     ebx,[menu_data]          ; ebx = base of parent info
  437.         call    backconvert
  438.         cmp     [ebx + child],al       ; if i am the child of my parent...
  439.         jnz     @f
  440.         mov     [ebx + child],-1       ; ...my parent now has no children
  441. ;--------------------------------------
  442. align 4
  443. @@:
  444.         or      eax,-1                 ; close this thread
  445.         mov     [edi + child],al       ; my child is not mine
  446.        
  447.         call    free_area_if_set_mutex
  448.         call    set_mutex_for_free_area
  449.        
  450.         mcall
  451. ;--------------------------------------
  452. align 4
  453. backconvert:              ; convert from pointer to process id
  454.         mov     eax,edi
  455.         sub     eax,[menu_data]
  456.         shr     eax,4
  457.         ret
  458. ;------------------------------------------------------------------------------
  459. align 4
  460. set_mutex_for_free_area:
  461. ; set mutex for free thread stack area 
  462.         push    eax ebx
  463. ;--------------------------------------
  464. align 4
  465. .wait_lock:
  466.         cmp     [free_my_area_lock], 0
  467.         je      .get_lock
  468.         mcall   68,1
  469.         jmp     .wait_lock
  470. ;--------------------------------------
  471. align 4
  472. .get_lock:
  473.         mov     eax, 1
  474.         xchg    eax, [free_my_area_lock]
  475.         test    eax, eax
  476.         jnz     .wait_lock
  477.         mov     [free_my_area],ebp
  478.         pop     ebx eax
  479.         ret
  480. ;------------------------------------------------------------------------------
  481. align 4
  482. free_area_if_set_mutex:
  483.         cmp     [free_my_area_lock],0
  484.         je      .end
  485.  
  486.         push    eax ebx ecx
  487.         mov     ecx,[free_my_area]
  488.  
  489.         test    ecx,ecx
  490.         jz      @f
  491.         mcall   68,13
  492. ;--------------------------------------
  493. align 4
  494. @@:
  495.         xor     eax,eax
  496.         mov     [free_my_area_lock],eax
  497.         pop     ecx ebx eax
  498. ;--------------------------------------
  499. align 4
  500. .end:  
  501.         ret
  502. ;------------------------------------------------------------------------------
  503. ;==================================
  504. ; get_number
  505. ;    load number from [edi] to ebx
  506. ;==================================
  507. align 4
  508. get_number:
  509.         push    edi
  510.         xor     eax,eax
  511.         xor     ebx,ebx
  512. ;--------------------------------------
  513. align 4
  514. .get_next_char:
  515.         mov     al,[edi]
  516.         inc     edi
  517.         cmp     al, '0'
  518.         jb      .finish
  519.         cmp     al, '9'
  520.         ja      .finish
  521.         sub     al, '0'
  522.         imul    ebx,10
  523.         add     ebx,eax
  524.         jmp     .get_next_char
  525. ;-------------------------------------
  526. align 4
  527. .finish:
  528.         pop     edi
  529.         ret
  530. ;------------------------------------------------------------------------------
  531. align 4
  532. get_process_ID:
  533.         mcall   9,procinfo,-1
  534.         mov     edx,eax
  535.         mov     ecx,[ebx+30]    ; PID
  536.         ret
  537. ;------------------------------------------------------------------------------
  538. align 4
  539. program_exist:
  540.         call    get_process_ID
  541.         mov     [main_process_ID],ecx
  542.         mcall   18,21
  543.         mov     [active_process],eax    ; WINDOW SLOT
  544.         mov     ecx,edx
  545.         xor     edx,edx
  546. ;-----------------------------------------
  547. align 4
  548. .loop:
  549.         push    ecx
  550.         mcall   9,procinfo
  551.         mov     eax,[menu_mame]
  552.         cmp     [ebx+10],eax
  553.         jne     @f
  554.         mov     ax,[menu_mame+4]
  555.         cmp     [ebx+14],ax
  556.         jne     @f
  557.         cmp     ecx,[active_process]
  558.         je      @f
  559. ; dph ecx
  560.         mcall   18,2
  561.         mov     edx,1
  562. ;--------------------------------------
  563. align 4
  564. @@:
  565.         pop     ecx
  566.         loop    .loop
  567.  
  568.         test    edx,edx
  569.         jz      @f
  570.         mcall   -1
  571. ;--------------------------------------
  572. align 4
  573. @@:
  574.         ret
  575. ;------------------------------------------------------------------------------
  576. ;   *********************************************
  577. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  578. ;   *********************************************
  579. align 4
  580. draw_window:
  581.         mcall   12,1    ; 1,start of draw
  582.         movzx   ebx,[edi + rows]
  583.         imul    eax,ebx,BTN_HEIGHT          ; eax = height of window
  584.         movzx   ecx,[edi + y_end]
  585.         sub     ecx,eax     ; ecx = Y_START
  586.         shl     ecx,16
  587.         add     ecx,eax     ; ecx = [ Y_START | Y_SIZE ]
  588.         dec     ecx
  589.         movzx   ebx,[edi + x_start]
  590.         shl     ebx,16
  591.         mov     bx,140      ; ebx = [ X_START | X_SIZE ]
  592.         mov     edx,0x01000000       ; color of work area RRGGBB,8->color gl
  593.         mov     esi,edx     ; unmovable window
  594.         xor     eax,eax     ; function 0 : define and draw window
  595.         mcall
  596.        
  597.         call    draw_all_buttons
  598.         mcall   12,2
  599.         ret
  600. ;------------------------------------------------------------------------------
  601. align 4
  602. draw_all_buttons:
  603.         xor     edx,edx
  604. ;--------------------------------------
  605. align 4
  606. .new_button:
  607.         call    draw_one_button
  608.         inc     edx
  609.         cmp     dl,[edi + rows]
  610.         jb      .new_button
  611.         ret
  612. ;------------------------------------------------------------------------------
  613. align 4
  614. draw_only_needed_buttons:
  615.         xor     edx,edx
  616.         mov     dl,[edi + cur_sel]
  617.         dec     dl
  618.         call    draw_one_button
  619.         mov     dl,[edi + prev_sel]
  620.         dec     dl
  621.         call    draw_one_button
  622.         ret
  623. ;------------------------------------------------------------------------------
  624. align 4
  625. draw_one_button:
  626. ; receives number of button in dl
  627.         push    edx
  628.         mov     eax,8
  629.         mov     ebx,140
  630.         movzx   ecx,dl
  631.         imul    ecx,BTN_HEIGHT
  632.         shl     ecx,16
  633.         add     ecx,BTN_HEIGHT-1
  634. ; edx = button identifier
  635.         mov     esi,[sc.work]
  636.         cmp     esi,0xdfdfdf
  637.         jb      nocorrect
  638.         sub     esi,0x1b1b1b
  639. ;--------------------------------------
  640. align 4
  641. nocorrect:
  642.         inc     dl
  643.         cmp     [edi + cur_sel],dl
  644.         jne     .nohighlight
  645.         add     esi,0x1a1a1a
  646. ;--------------------------------------
  647. align 4
  648. .nohighlight:
  649.         or      edx,0x20000000
  650.                                 ; dunkaist[
  651.         add     edx,0xd1ff00    ; This makes first menu buttons differ
  652.                                 ; from system close button with 0x000001 id
  653.                                 ; dunkaist]
  654.         mcall
  655.         movzx   edx,dl
  656.         dec     dl
  657.         imul    ebx,edx,BTN_HEIGHT
  658.         add     ebx,(4 shl 16) + TXT_Y
  659.         movzx   ecx,dl
  660.         inc     ecx
  661.         mov     edx,[edi + pointer]
  662. ;--------------------------------------
  663. align 4
  664. .findline:
  665.         cmp     byte [edx],13
  666.         je      .linefound
  667.         inc     edx
  668.         jmp     .findline
  669. ;------------------------------------------------------------------------------
  670. align 4
  671. .linefound:
  672.         inc     edx
  673.         cmp     byte [edx],10
  674.         jne     .findline
  675.         dec     ecx
  676.         jnz     .findline
  677.        
  678.         mcall   4,,[sc.work_text],,21
  679.         pop     edx
  680.         ret
  681. ;------------------------------------------------------------------------------
  682. align 4
  683. searchstartstring:
  684.         mov     ecx,40
  685.         mov     al,13
  686.         cld
  687.         repne   scasb
  688.         cmp     byte [edi],10
  689.         jne     searchstartstring
  690.         ret
  691. ;------------------------------------------------------------------------------
  692. ;*** DATA AREA ****************************************************************
  693. menu_mame:
  694.         db '@MENU',0
  695.  
  696. align 4
  697. free_my_area_lock       dd 0
  698. free_my_area    dd 0
  699.  
  700. processes      dd 0
  701. ;--------------------------------------
  702. align 4
  703. fileinfo:
  704.  .subfunction    dd 5           ; 5 - file info; 0 - file read
  705.  .start          dd 0           ; start byte
  706.  .size_high      dd 0           ; rezerved
  707.  .size           dd 0           ; bytes to read
  708.  .return         dd procinfo    ; return data pointer
  709.  .name:
  710.      db   '/sys/MENU.DAT',0   ; ASCIIZ dir & filename
  711. ;--------------------------------------
  712. align 4
  713. fileinfo_start:
  714.  .subfunction   dd 7    ; 7=START APPLICATION
  715.  .flags         dd 0    ; flags
  716.  .params        dd 0x0  ; nop
  717.  .rezerved      dd 0x0  ; nop
  718.  .rezerved_1    dd 0x0  ; nop
  719.  .name:
  720.    times 50 db ' '
  721. ;------------------------------------------------------------------------------
  722. IM_END:
  723. ;------------------------------------------------------------------------------
  724. align 4
  725. close_now       dd ?   ; close all processes immediately
  726. end_pointer     dd ?
  727. buffer          dd ?
  728. mousemask       dd ?   ; mask for mouse pointer location
  729.  
  730. active_process  dd ?
  731. main_process_ID dd ?
  732. ;--------------------------------------
  733. screen_mouse_position:
  734. .y      dw ?
  735. .x      dw ?
  736. ;--------------------------------------
  737. screen_size:
  738. .y      dw ?
  739. .x      dw ?
  740. ;--------------------------------------
  741. sc system_colors
  742. ;--------------------------------------
  743. last_key        db ?
  744. ;------------------------------------------------------------------------------
  745. align 4
  746. menu_data       dd ?
  747. ;--------------------------------------
  748. virtual at 0          ; PROCESSES TABLE (located at menu_data)
  749.   pointer       dd ?   ; +0    pointer in file
  750.   rows          db ?    ; +4    numer of strings
  751.   x_start       dw ?   ; +5    x start
  752.   y_end         dw ?   ; +7    y end
  753.   child         db ?   ; +9    id of child menu
  754.   parent        db ?   ; +10   id of parent menu
  755.   cur_sel       db ?   ; +11   current selection
  756.   prev_sel      db ?   ; +12   previous selection
  757.   rb            16-$+1 ; [16 bytes per element]
  758. end virtual
  759. ;------------------------------------------------------------------------------
  760. align 4
  761. procinfo:
  762.         rb 1024
  763. ;------------------------------------------------------------------------------
  764. align 4
  765.         rb 0x1000
  766. stack_area:
  767. ;------------------------------------------------------------------------------
  768. mem_end:
  769. ;------------------------------------------------------------------------------