Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;   MENU EXAMPLE
  3. ;
  4. ;   Compile with FASM for Menuet
  5. ;
  6.  
  7.   use32
  8.   org    0x0
  9.  
  10.   db     'MENUET01'    ; 8 byte id
  11.   dd     0x01          ; header version
  12.   dd     START         ; start of code
  13.   dd     I_END         ; size of image
  14.   dd     0x1000        ; memory for app
  15.   dd     0x1000        ; esp
  16.   dd     0x0 , 0x0     ; I_Param , I_Icon
  17.  
  18. include  'lang.inc'
  19. include  '..\..\..\..\macros.inc'
  20.  
  21. START:                             ; start of execution
  22.  
  23.   red:
  24.     call draw_window               ; draw window
  25.     call clear_data                ; clear status bar
  26.  
  27. still:
  28.  
  29.     mov  eax,10                    ; wait here for event
  30.     mcall                      ; do it
  31.  
  32.     cmp  eax,1                     ; redraw request ?
  33.     jz   red                       ; yes jump to it
  34.     cmp  eax,2                     ; key in buffer ?
  35.     jnz   button
  36.  
  37.   key:                             ; key
  38.     mov  eax,2                     ; just read it and ignore
  39.     mcall                      ; do it
  40.     jmp  still                     ; start again
  41.  
  42.   button:                          ; button
  43.     mov  eax,17                    ; get id
  44.     mcall                      ; do it
  45.  
  46.     cmp  ah,1                      ; is it the close button
  47.     jne  noclose                   ; no then jump code
  48.     or   eax,-1                    ; close this program
  49.     mcall                      ; do it
  50. noclose:
  51.  
  52.     cmp  ah,100                    ; is it main menu
  53.     jb   not_menu                  ; no then jump code
  54.     cmp  ah,104                    ; is it main menu
  55.     ja   not_menu                  ; no then jump code
  56.     call draw_window               ; redraw window
  57.     call clear_data                ; clear status info
  58.     call draw_data                 ; update status info
  59.     call write_sub                 ; draw a sub menu
  60.     jmp  still                     ; start again
  61. not_menu:
  62.  
  63.     cmp  ah,110                    ; is it a sub menu
  64.     jb   not_sub                   ; no then jump code
  65.     cmp  ah,145                    ; is it a sub menu
  66.     ja   not_sub                   ; no then jump code
  67.     call draw_window               ; redraw window
  68.     call clear_data                ; clear status info
  69.     mov  [button_press],1          ; sub button pressed
  70.     call draw_data                 ; update status info
  71.     mov  [button_press],0          ; clear pressed
  72.     jmp  still                     ; start again
  73. not_sub:
  74.  
  75.     jmp  still                     ; start again
  76.  
  77.  
  78. ;   *********************************************
  79. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  80. ;   *********************************************
  81.  
  82. draw_window:
  83.  
  84.     push eax                       ; save register
  85.  
  86.     mov  eax,12                    ; function 12: tell os about windowdraw
  87.     mov  ebx,1                     ; 1, start of draw
  88.     mcall                      ; do it
  89.  
  90.     mov  eax,0                     ; function 0: define and draw window
  91.     mov  ebx,50*65536              ; [x start] *65536
  92.     add  ebx,[x_size]              ; add [x size]
  93.     mov  ecx,50*65536              ; [y start] *65536
  94.     add  ecx,[y_size]              ; add [y size]
  95.     mov  edx,0x80ffffff            ; colour of work area RRGGBB
  96.     mov  esi,0x806688dd            ; grab bar colour. negative glide
  97.     mcall                      ; do it
  98.  
  99.     mov  eax,4                     ; function 4: write text to window
  100.     mov  ebx,6*65536+7             ; [x start] *65536 + [y start]
  101.     mov  ecx,0x00ffffff            ; text colour
  102.     mov  edx,window_text           ; pointer to text beginning
  103.     mov  esi,12                    ; text length
  104.     mcall                      ; do it
  105.  
  106.     mov  eax,8                     ; function 8: define and draw button
  107.     mov  ebx,(381-18)*65536+13     ; [x start] *65536 + [x size]
  108.     mov  ecx,4*65536+13            ; [y start] *65536 + [y size]
  109.     mov  edx,1                     ; button id
  110.     mov  esi,0x6688dd              ; button color RRGGBB
  111.     mcall                      ; do it
  112.  
  113.     mov  eax,13                    ; function 13: draw bar
  114.     mov  ebx,1*65536               ; [x start] *65536
  115.     add  ebx,[x_size]              ; add [x size]
  116.     dec  ebx                       ; x size - 1
  117.     mov  ecx,[y_size]              ; [y start] *65536
  118.     sub  ecx,17                    ; minus height
  119.     shl  ecx,16                    ; *65536
  120.     add  ecx,17                    ; add height
  121.     mov  edx,0x006688dd            ; bar colour
  122.     mcall                      ; do it
  123.  
  124.     mov  eax,4                     ; function 4 : write text to window
  125.     mov  ebx,5*65536               ; [x start] *65536
  126.     add  ebx,[y_size]              ; add [y start]
  127.     sub  ebx,12                    ; move up
  128.     xor  ecx,ecx                   ; text colour
  129.     mov  edx,button_no             ; pointer to text beginning
  130.     mov  esi,14                    ; text length
  131.     mcall                      ; do it
  132.  
  133.     add  ebx,95*65536              ; move xy position
  134.     mov  edx,menu_text             ; pointer to text beginning
  135.     mcall                      ; do it
  136.  
  137.     call write_main                ; draw menu
  138.  
  139.     mov  eax,12                    ; function 12: tell os about windowdraw
  140.     mov  ebx,2                     ; 2, end of draw
  141.     mcall                      ; do it
  142.  
  143.     pop  eax                       ; restore register
  144.     ret                            ; return
  145.  
  146.  ; ************* WRITE MAIN *************
  147.  
  148. write_main:
  149.  
  150.     mov  eax,13                    ; function 13: draw bar
  151.     mov  ebx,1*65536               ; [x start] *65536
  152.     add  ebx,[x_size]              ; +[x_size]
  153.     dec  ebx                       ; x size - 1
  154.     mov  ecx,21*65536+17           ; [y start] *65536 +[y size]
  155.     mov  edx,[menu_colour]         ; menu colour
  156.     mcall                      ; do it
  157.  
  158.     mov  [main_pos],1              ; start position first button
  159.     xor  edi,edi                   ; data offset = 0
  160.  
  161. next_main_item:
  162.     mov  al,[MENU_DATA+edi]        ; get byte at menu_data + offset
  163.     cmp  al,'E'                    ; is it the END
  164.     je   main_get_out              ; yes then exit
  165.     cmp  al,'0'                    ; is it a main menu item
  166.     jne  not_main_menu             ; no then jump code
  167.  
  168. main_menu:
  169.     mov  al,[MENU_DATA+edi+1]      ; get byte at menu_data + offset + 1
  170.     cmp  al,'0'                    ; is it a divider
  171.     je   is_main_bar               ; yes then jump code
  172.     mov  eax,8                     ; function 8: define button
  173.     mov  ebx,[main_pos]            ; [x start]
  174.     shl  ebx,16                    ; *65536
  175.     add  bl,75                     ; +[x size]
  176.     mov  ecx,21*65536+16           ; [y start] *65536 +[y size]
  177.     xor  edx,edx                   ; clear register
  178.     mov  dl,[MENU_DATA+edi+2]      ; get byte button id number
  179.     mov  esi,[menu_colour]         ; button colour
  180.     mcall                      ; do it
  181.     mov  eax,4                     ; function 4: write text to window
  182.     add  ebx,6*65536-49            ; move xy position
  183.     xor  ecx,ecx                   ; text colour
  184.     mov  edx,MENU_DATA+3           ; point at menu text
  185.     add  edx,edi                   ; add our offset
  186.     mov  esi,11                    ; number of characters
  187.     mcall                      ; do it
  188.  
  189. is_main_bar:
  190.     add  [main_pos],76             ; update button position
  191.  
  192. not_main_menu:
  193.     add  edi,14                    ; update offset
  194.     jmp  next_main_item            ; do next menu item
  195.  
  196. main_get_out:
  197.  
  198.     ret                            ; return
  199.  
  200. ; *********** DRAW DATA ***********
  201.  
  202. draw_data:
  203.  
  204.     push eax                       ; save register
  205.     mov  ebx,0x00030000            ; display 3 decimal characters
  206.     xor  ecx,ecx                   ; clear register
  207.     mov  cl,ah                     ; swap data
  208.     mov  eax,47                    ; function 47: display number to window
  209.     mov  edx,70*65536              ; [x start] *65536
  210.     add  edx,[y_size]              ; +[y start]
  211.     sub  edx,12                    ; move position
  212.     xor  esi,esi                   ; text colour
  213.     mcall                      ; do it
  214.     pop  eax                       ; restore register
  215.  
  216.     cmp  [button_press],1          ; has a sub button been pressed
  217.     je   draw_get_out              ; then jump code
  218.  
  219.     push eax                       ; save register
  220.     xor  edx,edx                   ; clear register
  221.     shr  ax,8                      ; move button id into al
  222.     sub  eax,100                   ; subtract 100
  223.     mov  dx,14                     ; use record length as multiplier
  224.     mul  dx                        ; multiply
  225.     mov  edx,eax                   ; swap registers
  226.     add  edx,MENU_DATA             ; add offset
  227.     inc  edx                       ; add 1
  228.     mov  ebx,188*65536             ; [x start] *65536
  229.     add  ebx,[y_size]              ; +[y start]
  230.     sub  ebx,12                    ; move position
  231.     mov  esi,1                     ; 1 character
  232.     mov  eax,4                     ; function 4: write text to window
  233.     xor  ecx,ecx                   ; text colour
  234.     mcall                      ; do it
  235.     pop  eax                       ; restore register
  236.  
  237. draw_get_out:
  238.     ret                            ; return
  239.  
  240. ; **************** CLEAR DATA ******************
  241.  
  242. clear_data:
  243.  
  244.     push eax                       ; save register
  245.     mov  eax,13                    ; function 13: draw bar
  246.     mov  ebx,67*65536+23           ; [x start] *65536 +[x size]
  247.     mov  ecx,[y_size]              ; [y start]
  248.     sub  ecx,15                    ; move position
  249.     shl  ecx,16                    ; *65536
  250.     add  ecx,13                    ; [y size]
  251.     mov  edx,0x00aaaaaa            ; bar colour
  252.     mcall                      ; do it
  253.     mov  ebx,185*65536+11          ; move position
  254.     mcall                      ; do it again
  255.  
  256.     pop  eax                       ; restore register
  257.     ret                            ; return
  258.  
  259.  ; ************* WRITE SUB *************
  260.  
  261. write_sub:
  262.  
  263.     push eax                       ; save register
  264.     mov  [but_pos],38              ; y start position offset
  265.     mov  [sub_pos],1               ; x start position offset
  266.     xor  edx,edx                   ; clear register
  267.     shr  ax,8                      ; move button id into al
  268.     sub  eax,100                   ; subtract 100
  269.     mov  dx,76                     ; menu width + 1
  270.     mul  dx                        ; multiply
  271.     add  [sub_pos],eax             ; add menu position to offset
  272.     pop  eax                       ; restore register
  273.  
  274.     xor  edx,edx                   ; clear register
  275.     shr  ax,8                      ; move button id into al
  276.     sub  eax,100                   ; subtract 100
  277.     mov  dx,14                     ; use record length as multiplier
  278.     mul  dx                        ; multiply
  279.     add  eax,MENU_DATA             ; add offset
  280.     inc  eax                       ; plus 1
  281.     mov  al,[eax]                  ; get menu number byte
  282.     mov  [menu_number],al          ; save it
  283.  
  284.     xor  edi,edi                   ; clear offset
  285.  
  286. next_sub_item:
  287.     mov  al,[MENU_DATA+edi]        ; get byte at menu_data + offset
  288.     cmp  al,'E'                    ; is it the END
  289.     je   sub_get_out               ; yes then exit
  290.     cmp  al,[menu_number]          ; is it sub menu item
  291.     jne  not_sub_menu              ; no then jump code
  292.  
  293. sub_menu:
  294.     mov  al,[MENU_DATA+edi+1]      ; get byte at menu_data + offset + 1
  295.     cmp  al,'0'                    ; is it a divider
  296.     jne  is_sub_button             ; no then jump code
  297.     mov  eax,13                    ; function 13: draw bar
  298.     mov  edx,[menu_colour]         ; bar colour
  299.     mov  ebx,[sub_pos]             ; [x start]
  300.     shl  ebx,16                    ; *65536
  301.     add  ebx,76                    ; [x size]
  302.     mov  ecx,[but_pos]             ; [y start]
  303.     shl  ecx,16                    ; *65536
  304.     add  ecx,17                    ; [y size]
  305.     mcall                      ; do it
  306.     jmp  is_sub_bar                ; jump button code
  307.  
  308. is_sub_button:
  309.     mov  eax,8                     ; function 8: define and draw button
  310.     xor  edx,edx                   ; clear register
  311.     mov  dl,[MENU_DATA+edi+2]      ; get byte button id number
  312.     mov  ebx,[sub_pos]             ; [x start]
  313.     shl  ebx,16                    ; *65536
  314.     add  ebx,75                    ; [x size]
  315.     mov  ecx,[but_pos]             ; [y start]
  316.     shl  ecx,16                    ; *65536
  317.     add  ecx,16                    ; [y size]
  318.     mov  esi,[menu_colour]         ; button colour
  319.     mcall                      ; do it
  320.  
  321.     mov  ebx,[sub_pos]             ; [x start]
  322.     shl  ebx,16                    ; *65536
  323.     add  ebx,6*65536               ; move position
  324.     add  ebx,[but_pos]             ; [y start]
  325.     add  bl,5                      ; move position
  326.     xor  ecx,ecx                   ; clear register
  327.     mov  edx,MENU_DATA+3           ; point to button text
  328.     add  edx,edi                   ; add offset
  329.     mov  esi,11                    ; number of characters
  330.     mov  eax,4                     ; function 4: write text to window
  331.     mcall                      ; do it
  332. is_sub_bar:
  333.     add  [but_pos],17              ; move y position
  334.  
  335. not_sub_menu:
  336.     add  edi,14                    ; move offset
  337.     jmp  next_sub_item             ; do next button
  338.  
  339. sub_get_out:
  340.  
  341.     ret                            ; return
  342.  
  343. ; ***************** DATA AREA ******************
  344.  
  345. x_size:       dd 381               ; window x size
  346. y_size:       dd 200               ; window y size
  347.  
  348. window_text   db 'MENU EXAMPLE'    ; grab bar text
  349. button_no     db 'BUTTON No:    '  ; status bar text
  350. menu_text     db 'MENU SELECTED:'  ; status bar text
  351.  
  352. button_press  dd 0
  353.  
  354. menu_colour   dd 0x00aaaaaa        ; menu & button colour
  355.  
  356. menu_number   db '0'               ; menu selection
  357.  
  358. sub_pos       dd 1                 ; sub menu x position
  359. but_pos       dd 38                ; sub menu y position
  360.  
  361. main_pos      dd 1                 ; main menu x position
  362.  
  363. MENU_DATA:    db '01'              ; MAIN MENU = 0 - 1 = menu
  364.               db 100               ; button id
  365.               db 'FILE       '     ; button text
  366.               db '02'              ; MAIN MENU = 0 - 2 = menu
  367.               db 101               ; button id
  368.               db 'EDIT       '     ; button text
  369.               db '04'              ; MAIN MENU = 0 - 3 = menu
  370.               db 102               ; button id
  371.               db 'TEST       '     ; button text
  372.               db '00'              ; MAIN MENU = 0 - 0 = divider
  373.               db 103               ; SPACER ID
  374.               db '           '     ; SPACER TEXT padding
  375.               db '03'              ; MAIN MENU = 0 - 4 = menu
  376.               db 104               ; button id
  377.               db 'HELP       '     ; button text
  378.  
  379.               db '11'              ; menu level = 1 - 1 = button
  380.               db 110               ; button id
  381.               db 'LOAD       '     ; button text
  382.               db '11'              ; menu level = 1 - 1 = button
  383.               db 111               ; button id
  384.               db 'SAVE       '     ; button text
  385.               db '10'              ; menu level = 1 - 0 = divider
  386.               db 112               ; SPACER ID
  387.               db '           '     ; SPACER TEXT padding
  388.               db '11'              ; menu level = 1 - 1 = button
  389.               db 113               ; button id
  390.               db 'QUIT       '     ; button text
  391.  
  392.               db '21'              ; menu level = 2 - 1 = button
  393.               db 120               ; button id
  394.               db 'COPY       '     ; button text
  395.               db '21'              ; menu level = 2 - 1 = button
  396.               db 121               ; button id
  397.               db 'PASTE      '     ; button text
  398.  
  399.               db '31'              ; menu level = 3 - 1 = button
  400.               db 130               ; button id
  401.               db 'SETUP      '     ; button text
  402.               db '31'              ; menu level = 3 - 1 = button
  403.               db 131               ; button id
  404.               db 'ABOUT..    '     ; button text
  405.  
  406.               db '41'              ; menu level = 3 - 1 = button
  407.               db 140               ; button id
  408.               db 'TEST 1     '     ; button text
  409.               db '41'              ; menu level = 3 - 1 = button
  410.               db 141               ; button id
  411.               db 'TEST 2     '     ; button text
  412.               db '41'              ; menu level = 3 - 1 = button
  413.               db 142               ; button id
  414.               db 'TEST 3     '     ; button text
  415.               db '41'              ; menu level = 3 - 1 = button
  416.               db 143               ; button id
  417.               db 'TEST 4     '     ; button text
  418.               db '41'              ; menu level = 3 - 1 = button
  419.               db 144               ; button id
  420.               db 'TEST 5     '     ; button text
  421.               db '41'              ; menu level = 3 - 1 = button
  422.               db 145               ; button id
  423.               db 'TEST 6     '     ; button text
  424.  
  425.               db 'END'             ; IMPORTANT need an END
  426. I_END:
  427.