Subversion Repositories Kolibri OS

Rev

Rev 31 | Rev 485 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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