Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
31 halyavin 1
;******************************************************************************
2211 mario79 2
;   MAIN MENU
3
;******************************************************************************
2618 mario79 4
; last update:  17/04/2012
5
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
6
; changes:      Support for boot parameters.
7
;------------------------------------------------------------------------------
2488 mario79 8
; last update:  22/03/2012
9
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
10
; changes:      Global optimization! The program uses
11
;               only 32 KB of memory instead of 128 kb is now.
12
;------------------------------------------------------------------------------
2211 mario79 13
; last update:  19/09/2011
14
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
15
; changes:      Checking for program exist to memory
16
;               Added processing of keys: left and right arrow
2488 mario79 17
;------------------------------------------------------------------------------
31 halyavin 18
;   MAIN MENU by lisovin@26.ru
19
;   Some parts of code rewritten by Ivan Poddubny 
20
;
21
;   Compile with FASM for Menuet
22
;******************************************************************************
8484 leency 23
  BTN_HEIGHT         = 22  ;26
24
  BTN_WIDTH          = 140 ;178
25
  TXT_Y              = (BTN_HEIGHT)/2-4
26
  FONT_TYPE          = 0x80000000 ;0x90000000
31 halyavin 27
 
8484 leency 28
  PANEL_HEIGHT       = 20
29
  MENU_BOTTON_X_POS  = 10
30
  MENU_BOTTON_X_SIZE = 50
2488 mario79 31
;------------------------------------------------------------------------------
2211 mario79 32
	use32
33
	org 0x0
2488 mario79 34
 
8484 leency 35
	db 'MENUET01'  ; 8 byte id
36
	dd 0x01        ; header version
37
	dd START       ; start of code
38
	dd IM_END      ; size of image
39
	dd mem_end     ; memory for app
40
	dd stack_area  ; esp
41
	dd bootparam   ; boot parameters
42
	dd 0x0         ; path
2488 mario79 43
;------------------------------------------------------------------------------
2618 mario79 44
include "..\..\..\macros.inc"
7786 leency 45
include "..\..\..\gui_patterns.inc"
3013 dunkaist 46
;include "../../../debug.inc"             ; debug macros
2488 mario79 47
;------------------------------------------------------------------------------
48
align 4
2618 mario79 49
conversion_ASCII_to_HEX:
50
	xor	ebx,ebx
51
	cld
52
	lodsd
53
	mov	ecx,4
54
;--------------------------------------
55
align 4
56
.loop:
57
	cmp	al,0x60	; check for ABCDEF
58
	ja	@f
59
	sub	al,0x30 ; 0-9
60
	jmp	.store
61
;--------------------------------------
62
align 4
63
@@:
64
	sub	al,0x57 ; A-F
65
;--------------------------------------
66
align 4
67
.store:
68
	and	al,0xf
69
	rol	ebx,4
70
	add	bl,al
71
	ror	eax,8
72
	dec	ecx
73
	jnz	.loop
74
 
75
	ret
76
;------------------------------------------------------------------------------
77
align 4
97 mario79 78
START:		       ; start of execution
2488 mario79 79
	mcall	68,11
8484 leency 80
 
81
	mcall 30, 1, default_dir
2618 mario79 82
 
83
	mov	esi,bootparam
84
	cmp	[esi],byte 0
85
	je	.no_boot_parameters
86
; boot params - hex
87
; db '9999'	; +0	Menu button X
88
; db '9999'	; +4	Menu button X size
89
; db '9999'	; +8	Menu button Y
90
; db '9999'	; +12	Menu button Y size
91
; db '9999'	; +16	Panel height
92
; db '1000'	; +20	Panel attachment
93
 
94
;	mov	edx,bootparam
95
;	call	debug_outstr
96
;	newline
97
 
98
	call	conversion_ASCII_to_HEX
99
	mov	[menu_button_x.start],ebx
100
 
101
;	dps	"menu_button_x.start: "
102
;	dpd	ebx
103
;	newline
104
 
105
	call	conversion_ASCII_to_HEX
106
	mov	[menu_button_x.size],ebx
107
 
108
;	dps	"menu_button_x.size: "
109
;	dpd	ebx
110
;	newline
111
 
112
	call	conversion_ASCII_to_HEX
113
	mov	[menu_button_y.start],ebx
114
 
115
;	dps	"menu_button_y.start: "
116
;	dpd	ebx
117
;	newline
118
 
119
	call	conversion_ASCII_to_HEX
120
	mov	[menu_button_y.size],ebx
121
 
122
;	dps	"menu_button_y.size: "
123
;	dpd	ebx
124
;	newline
125
 
126
	call	conversion_ASCII_to_HEX
127
	mov	[panel_height],ebx
128
 
129
;	dps	"panel_height: "
130
;	dpd	ebx
131
;	newline
132
 
133
	call	conversion_ASCII_to_HEX
134
	mov	[panel_attachment],ebx
135
 
136
;	dps	"panel_attachment: "
137
;	dpd	ebx
138
;	newline
139
;--------------------------------------
140
align 4
141
.no_boot_parameters:
2211 mario79 142
	call	program_exist
143
	mcall	14
144
	mov	[screen_size],eax
145
 
146
	mcall	48,3,sc,sizeof.system_colors	; load system colors
2488 mario79 147
 
148
; get size of file MENU.DAT
149
	mcall	70,fileinfo
150
	test	eax,eax
2211 mario79 151
	jnz	close
2488 mario79 152
; get memory for MENU.DAT
153
	mov	ecx,[procinfo+32]
154
	mov	[fileinfo.size],ecx
155
	mcall	68,12
156
	mov	[fileinfo.return],eax
157
	mcall	68
158
	mov	[menu_data],eax
159
; load MENU.DAT
160
	mov	[fileinfo],dword 0
161
	mcall	70,fileinfo
162
	test	eax,eax
163
	jnz	close
164
 
2211 mario79 165
	test	ebx,ebx	   ; length = 0 ?
166
	jz	close
167
	mov	ecx,ebx
2488 mario79 168
	mov	edi,[fileinfo.return]	;mem_end
169
;--------------------------------------
170
align 4
2211 mario79 171
newsearch:
172
	mov	al,'#'
173
	cld
174
	repne	scasb
175
	test	ecx,ecx	   ; if not found
176
	jz	close
177
	call	get_number
178
	test	ebx,ebx
179
	jnz	.number
180
	cmp	al,'#'
181
	je	search_end
2488 mario79 182
;--------------------------------------
183
align 4
2211 mario79 184
.number:
185
	shl	ebx,4
2488 mario79 186
	add	ebx,[menu_data]     ; pointer to process table
2211 mario79 187
	mov	[ebx],edi
188
	inc	[processes]
189
	jmp	newsearch
2488 mario79 190
;--------------------------------------
191
align 4
2211 mario79 192
search_end:
193
	mov	[end_pointer],edi
194
	mov	ebx,[processes]
195
	dec	ebx
196
	shl	ebx,4
2488 mario79 197
	add	ebx,[menu_data]
198
;--------------------------------------
199
align 4
2211 mario79 200
newprocess:
201
	xor	edx,edx
202
	mov	ecx,edi
203
	sub	ecx,[ebx]
204
	mov	al,10
2488 mario79 205
;--------------------------------------
206
align 4
2211 mario79 207
newsearch1:
208
	std
209
	repne	scasb
210
	test	ecx,ecx
211
	je	endprocess
212
	cmp	[edi],byte 13
213
	jne	newsearch1
214
	inc	edx
215
	jmp	newsearch1
2488 mario79 216
;--------------------------------------
217
align 4
2211 mario79 218
endprocess:
219
	mov	esi,ebx
220
	add	esi,4
221
	dec	edx
222
	mov	[esi],dl
2488 mario79 223
	cmp	ebx,[menu_data]
2211 mario79 224
	jbe	search_end1
225
	sub	ebx,16
226
	jmp	newprocess
2488 mario79 227
;--------------------------------------
228
align 4
2211 mario79 229
search_end1:
230
	mcall	14
2618 mario79 231
	cmp	[panel_attachment],byte 1
232
	je	@f
233
	xor	ax,ax
234
	jmp	.store
235
;--------------------------------------
236
align 4
237
@@:
238
	sub	ax,[panel_height]	;20
239
.store:
2488 mario79 240
	mov	ebx,[menu_data]
241
	mov	[ebx + y_end],ax
242
	mov	[ebx + x_start],5
243
	mov	al,[ebx + rows]
244
	mov	[ebx + cur_sel],al	 ; clear selection
245
	mov	[ebx + prev_sel],al
2211 mario79 246
	mov	[buffer],0
2488 mario79 247
;------------------------------------------------------------------------------
248
align 4
2211 mario79 249
thread:
2488 mario79 250
	mov	ebp,esp
251
	sub	ebp,0x1000
252
	cmp	ebp,0x2000 ; if this is first started thread
253
	ja	@f
254
	xor	ebp,ebp ; not free area
255
;--------------------------------------
256
align 4
257
@@:
2211 mario79 258
	mov	eax,[buffer]      ; identifier
259
	shl	eax,4
2488 mario79 260
	add	eax,[menu_data]
2211 mario79 261
	mov	edi,eax
262
	mcall	40,100111b	; mouse + button + key + redraw
2488 mario79 263
;------------------------------------------------------------------------------
264
align 4
2211 mario79 265
red:
266
	call	draw_window	; redraw
2488 mario79 267
;------------------------------------------------------------------------------
268
align 4
31 halyavin 269
still:
2488 mario79 270
	call	free_area_if_set_mutex
271
 
2211 mario79 272
	mcall	23,5	; wait here for event
273
	test	[close_now],1      ; is close flag set?
274
	jnz	close
275
 
276
	cmp	eax,1	; redraw request ?
277
	je	red
278
	cmp	eax,2	; key pressed ?
279
	je	key
280
	cmp	eax,3	; button in buffer ?
281
	je	button
282
	cmp	eax,6	; mouse event ?
283
	je	mouse
2488 mario79 284
	cmp	edi,[menu_data]
2211 mario79 285
	je	still	     ; if main process-ignored
286
 
287
	movzx	ebx,[edi + parent]	 ; parent id
288
	shl	ebx,4
2488 mario79 289
	add	ebx,[menu_data]      ; ebx = base of parent info
2211 mario79 290
	call	backconvert	     ; get my id in al
291
	cmp	al,[ebx + child]    ; if I'm not child of my parent, I shall die :)
292
	jne	close
293
 
294
	jmp	still
2488 mario79 295
;------------------------------------------------------------------------------
296
align 4
2211 mario79 297
key:
2488 mario79 298
	mcall	2
2211 mario79 299
	mov	[last_key],ah
300
	mov	al,[edi + rows]     ; number of buttons
301
	cmp	ah,178	  ; KEY_UP
302
	jne	.noup
303
 
304
	mov	ah,[edi+cur_sel]
305
	mov	[edi+prev_sel],ah
306
	dec	byte [edi+cur_sel]
307
	jnz	redrawbut
308
	mov	[edi+cur_sel],al
309
	jmp	redrawbut
2488 mario79 310
;--------------------------------------
311
align 4
2211 mario79 312
.noup:
313
	cmp	ah,177	 ; KEY_DOWN
314
	jne	.nodn
315
 
316
	mov	ah,[edi + cur_sel]
317
	mov	[edi + prev_sel],ah
318
	inc	[edi + cur_sel]
319
	cmp	[edi + cur_sel],al
320
	jna	redrawbut
321
	mov	[edi + cur_sel],1
322
	jmp	redrawbut
2488 mario79 323
;--------------------------------------
324
align 4
2211 mario79 325
.nodn:
326
	cmp	ah,179 	 ; KEY_LEFT
327
	je	@f
328
	cmp	ah,13 	 ; ENTER
329
	jne	.noenter
330
@@:
331
	mov	ah,[edi + cur_sel]
332
	jmp	button1
2488 mario79 333
;--------------------------------------
334
align 4
2211 mario79 335
.noenter:
336
	cmp	ah,176 	 ; KEY_RIGHT
337
	je	@f
338
	cmp	ah,27 	 ; ESC
339
	jne	still
340
	jmp	close
2488 mario79 341
;--------------------------------------
342
align 4
2211 mario79 343
@@:
344
	call	get_process_ID
345
	cmp	[main_process_ID],ecx
346
	jne	close
347
	jmp	still
2488 mario79 348
;------------------------------------------------------------------------------
349
align 4
2211 mario79 350
button:	; BUTTON HANDLER
351
	mcall	17	; get id
352
				; dunkaist[
5452 leency 353
	test	eax,0xfffffe00	; is it system close button? (close signal from @taskbar)
2211 mario79 354
	setz	byte[close_now]	; set (or not set) close_recursive flag
355
	jz	close		; if so,close all menus
356
				; dunkaist]
2488 mario79 357
;--------------------------------------
358
align 4
2211 mario79 359
button1:
360
	mov	esi,edi
361
	push	edi
362
	mov	edi,[edi + pointer]
31 halyavin 363
; print "hello"
2211 mario79 364
	mov	al,[esi + cur_sel]
365
	mov	[esi + prev_sel],al
366
	mov	[esi + cur_sel],ah
367
 
368
	pushad
369
	mov	edi,esi
370
; dph eax
371
	call	draw_only_needed_buttons
372
	popad
373
; look for the next line  times;  = button_id
374
	push	eax
2488 mario79 375
;--------------------------------------
376
align 4
2211 mario79 377
.next_string:
378
	call	searchstartstring
379
	dec	ah
380
	jnz	.next_string
381
	pop	eax
382
 
383
	mov	ecx,40
8484 leency 384
	mov	al,'|'
2211 mario79 385
	cld
386
	repne	scasb
8484 leency 387
	test	ecx,ecx	  ; if '|' not found
2211 mario79 388
	je	searchexit
389
 
390
	cmp	[edi],byte '@'     ; check for submenu
391
	je	runthread
392
 
393
	cmp	[last_key],179
394
	je	searchexit
395
 
8484 leency 396
	;dec	edi
2211 mario79 397
	push	edi			; pointer to start of filename
398
	call	searchstartstring	; search for next string
399
	sub	edi,2		; to last byte of string
400
 
401
	mov	ecx,edi
402
	pop	esi
403
	sub	ecx,esi
404
	inc	ecx		 ; length of filename
405
	mov	edi, fileinfo_start.name
406
	rep	movsb		   ; copy string
407
	mov	[edi],byte 0	       ; store terminator
408
	mcall	70,fileinfo_start	; start program
409
	or	[close_now],1      ; set close flag
410
	pop	edi
411
	mov	[mousemask],0
412
	jmp	close
2488 mario79 413
;--------------------------------------
414
align 4
2211 mario79 415
searchexit:
416
	pop	edi
417
	jmp	still
2488 mario79 418
;------------------------------------------------------------------------------
419
align 4
2211 mario79 420
runthread:
421
	inc	edi
422
 
423
	push	eax
424
	call	get_number	     ; get number of this process
425
	pop	eax
426
 
427
	test	ebx,ebx	   ; returned zero - main menu or not number
428
	jz	searchexit
429
 
430
	mov	al,bl
431
 
432
	mov	ebx,[processes]
433
	dec	bl
434
	cmp	al,bl
435
	ja	searchexit	       ; such process doesnt exist
436
	cmp	al,[esi + child]
437
	je	searchexit	       ; such process already exists
438
 
439
	mov	[esi + child],al    ; this is my child
440
	mov	cx,[esi + x_start]
8484 leency 441
	add	cx,BTN_WIDTH+1	  ; new x_start in cx
2211 mario79 442
	movzx	edx,al
443
	shl	edx,4
2488 mario79 444
	add	edx,[menu_data]       ; edx points to child's base address
2211 mario79 445
	mov	[edx + x_start],cx  ; xstart for new thread
446
	mov	cx,[esi + y_end]   ; y_end in cx
447
	mov	bl,[esi + rows]    ; number of buttons in bl
448
	sub	bl,ah	  ; number of btn from bottom
7848 leency 449
 
450
	; Leency: store vars for case when attachement=top
451
	pusha
452
	mov [prior_thread_selected_y_end], bl
453
	mcall	9,procinfo,-1
454
	m2m     [prior_thread_y], dword[procinfo+38]
455
	m2m     [prior_thread_h], dword[procinfo+46]
456
	popa
457
 
2211 mario79 458
	movzx	eax,al
459
	mov	[buffer],eax		; thread id in buffer
460
	movzx	ebx,bl
461
	push	edx
462
	mov	eax,BTN_HEIGHT
463
	mul	ebx
464
	sub	cx,ax	  ; new y_end for new thread
465
	pop	edx
466
	mov	[edx + y_end],cx    ; store y_end
467
	mov	edi,esi
468
	call	backconvert	      ; get number of this process (al)
469
	mov	[edx + parent],al   ; store number of parent process
7848 leency 470
 
2211 mario79 471
	mov	al,[edx + rows]
472
	mov	[edx + cur_sel],al  ; clear current selected element
473
	mov	[edx + prev_sel],al ; clear previous selected element
474
	mov	[edx + child],0
475
 
2488 mario79 476
	mcall	68,12,0x1000	; stack of each thread is allocated 4 KB
477
	add	eax,0x1000	; set the stack pointer to the desired position
478
	mov	edx,eax
479
	mcall	51,1,thread	; Go ahead!
2211 mario79 480
	jmp	searchexit
2488 mario79 481
;------------------------------------------------------------------------------
482
align 4
2211 mario79 483
mouse: 	      ; MOUSE EVENT HANDLER
484
	mcall	37,0
485
	mov	[screen_mouse_position],eax ; eax = [ Y | X ] relative to screen
31 halyavin 486
 
2211 mario79 487
	mcall	37,2
488
	test	eax,eax	   ; check buttons state
489
	jnz	click
490
	mcall	37,1
491
	ror	eax,16	  ; eax = [ Y | X ] relative to window
7786 leency 492
	cmp	ax,BTN_WIDTH	   ; pointer in window?
2211 mario79 493
	ja	noinwindow
494
; *** in window ***
495
	shr	eax,16	  ; eax = [ 0 | Y ]
496
	xor	edx,edx
497
	mov	ebx,BTN_HEIGHT
498
	div	ebx
499
	inc	eax		  ; number of "button" in eax
500
	movzx	ebx,[edi + rows]    ; total strings in ebx
501
	cmp	eax,ebx
502
	ja	noinwindow
503
	cmp	[edi + cur_sel],al
504
	je	noredrawbut
505
	mov	bl,[edi + cur_sel]
506
;;;;;;
507
	cmp	[edi + child],0
508
	jne	noredrawbut
509
;;;;;;
510
	mov	[edi + cur_sel],al
511
	mov	[edi + prev_sel],bl
2488 mario79 512
;--------------------------------------
513
align 4
2211 mario79 514
redrawbut:
515
	call	draw_only_needed_buttons
2488 mario79 516
;--------------------------------------
517
align 4
2211 mario79 518
noredrawbut:
519
	call	backconvert
520
	bts	[mousemask],eax
521
	jmp	still
2488 mario79 522
;--------------------------------------
523
align 4
2211 mario79 524
noinwindow:
525
	call	backconvert
526
	btr	[mousemask],eax
527
	jmp	still
2488 mario79 528
;------------------------------------------------------------------------------
529
align 4
2211 mario79 530
click:
531
	cmp	[mousemask],0  ; not in a window (i.e. menu)
532
	jne	still
533
; checking for pressing 'MENU' on the taskbar
534
	mov	eax,[screen_mouse_position]
2618 mario79 535
 
536
	cmp	[panel_attachment],byte 1
537
	je	@f
538
 
539
	xor	ebx,ebx
540
	jmp	.check_y
541
;--------------------------------------
542
align 4
543
@@:
2211 mario79 544
	mov	ebx,[screen_size]
2618 mario79 545
	sub	bx,word [panel_height]	;PANEL_HEIGHT
546
;--------------------------------------
547
align 4
548
.check_y:
549
	add	bx,word [menu_button_y.start]
2211 mario79 550
	cmp	bx,ax
551
	ja	close
2618 mario79 552
 
553
	add	bx,word [menu_button_y.size]
554
	cmp	bx,ax
555
	jb	close
556
 
2211 mario79 557
	shr	eax,16
2618 mario79 558
 
559
	mov	ebx,[menu_button_x.start]
560
	cmp	bx,ax	; MENU_BOTTON_X_SIZE
2211 mario79 561
	ja	close
2618 mario79 562
 
563
	add	bx,[menu_button_x.size]
564
	cmp	bx,ax	; MENU_BOTTON_X_POS
2211 mario79 565
	ja	still
2488 mario79 566
;------------------------------------------------------------------------------
567
align 4
2211 mario79 568
close:
569
 
570
	movzx	ebx,[edi+parent]       ; parent id
571
	shl	ebx,4
2488 mario79 572
	add	ebx,[menu_data]          ; ebx = base of parent info
2211 mario79 573
	call	backconvert
574
	cmp	[ebx + child],al       ; if i am the child of my parent...
575
	jnz	@f
576
	mov	[ebx + child],-1       ; ...my parent now has no children
2488 mario79 577
;--------------------------------------
578
align 4
728 diamond 579
@@:
2211 mario79 580
	or	eax,-1                 ; close this thread
581
	mov	[edi + child],al       ; my child is not mine
2488 mario79 582
 
583
	call	free_area_if_set_mutex
584
	call	set_mutex_for_free_area
585
 
2211 mario79 586
	mcall
2488 mario79 587
;--------------------------------------
588
align 4
2211 mario79 589
backconvert:		  ; convert from pointer to process id
590
	mov	eax,edi
2488 mario79 591
	sub	eax,[menu_data]
2211 mario79 592
	shr	eax,4
593
	ret
2488 mario79 594
;------------------------------------------------------------------------------
595
align 4
596
set_mutex_for_free_area:
597
; set mutex for free thread stack area
598
	push	eax ebx
599
;--------------------------------------
600
align 4
601
.wait_lock:
602
        cmp     [free_my_area_lock], 0
603
        je      .get_lock
604
	mcall	68,1
605
        jmp     .wait_lock
606
;--------------------------------------
607
align 4
608
.get_lock:
609
        mov     eax, 1
610
        xchg    eax, [free_my_area_lock]
611
        test    eax, eax
612
        jnz     .wait_lock
613
	mov	[free_my_area],ebp
614
	pop	ebx eax
615
	ret
616
;------------------------------------------------------------------------------
617
align 4
618
free_area_if_set_mutex:
619
	cmp	[free_my_area_lock],0
620
	je	.end
621
 
622
	push	eax ebx ecx
623
	mov	ecx,[free_my_area]
624
 
625
	test	ecx,ecx
626
	jz	@f
627
	mcall	68,13
628
;--------------------------------------
629
align 4
630
@@:
631
	xor	eax,eax
632
	mov	[free_my_area_lock],eax
633
	pop	ecx ebx eax
634
;--------------------------------------
635
align 4
636
.end:
637
	ret
638
;------------------------------------------------------------------------------
31 halyavin 639
;==================================
640
; get_number
641
;    load number from [edi] to ebx
642
;==================================
2488 mario79 643
align 4
2211 mario79 644
get_number:
645
	push	edi
646
	xor	eax,eax
647
	xor	ebx,ebx
2488 mario79 648
;--------------------------------------
649
align 4
2211 mario79 650
.get_next_char:
651
	mov	al,[edi]
652
	inc	edi
653
	cmp	al, '0'
654
	jb	.finish
655
	cmp	al, '9'
656
	ja	.finish
657
	sub	al, '0'
658
	imul	ebx,10
659
	add	ebx,eax
660
	jmp	.get_next_char
661
;-------------------------------------
2488 mario79 662
align 4
2211 mario79 663
.finish:
664
	pop	edi
665
	ret
2488 mario79 666
;------------------------------------------------------------------------------
667
align 4
2211 mario79 668
get_process_ID:
669
	mcall	9,procinfo,-1
670
	mov	edx,eax
671
	mov	ecx,[ebx+30]	; PID
672
	ret
2488 mario79 673
;------------------------------------------------------------------------------
674
align 4
2211 mario79 675
program_exist:
676
	call	get_process_ID
677
	mov	[main_process_ID],ecx
678
	mcall	18,21
679
	mov	[active_process],eax	; WINDOW SLOT
680
	mov	ecx,edx
681
	xor	edx,edx
682
;-----------------------------------------
2488 mario79 683
align 4
2211 mario79 684
.loop:
685
	push	ecx
686
	mcall	9,procinfo
687
	mov	eax,[menu_mame]
688
	cmp	[ebx+10],eax
689
	jne	@f
8484 leency 690
	; temporary to fit into 3 IMG sectors
691
	;mov	ax,[menu_mame+4]
692
	;cmp	[ebx+14],ax
693
	;jne	@f
2211 mario79 694
	cmp	ecx,[active_process]
695
	je	@f
696
; dph ecx
697
	mcall	18,2
698
	mov	edx,1
2488 mario79 699
;--------------------------------------
700
align 4
2211 mario79 701
@@:
702
	pop	ecx
703
	loop	.loop
2488 mario79 704
 
2211 mario79 705
	test	edx,edx
706
	jz	@f
707
	mcall	-1
2488 mario79 708
;--------------------------------------
709
align 4
2211 mario79 710
@@:
711
	ret
2488 mario79 712
;------------------------------------------------------------------------------
31 halyavin 713
;   *********************************************
714
;   *******  WINDOW DEFINITIONS AND DRAW ********
715
;   *********************************************
2488 mario79 716
align 4
31 halyavin 717
draw_window:
2618 mario79 718
	mcall	48,5
719
	mov	[x_working_area],eax
720
	mov	[y_working_area],ebx
721
 
2211 mario79 722
	mcall	12,1	; 1,start of draw
723
	movzx	ebx,[edi + rows]
724
	imul	eax,ebx,BTN_HEIGHT	    ; eax = height of window
725
	movzx	ecx,[edi + y_end]
2618 mario79 726
	cmp	[panel_attachment],byte 1
727
	je	@f
7848 leency 728
 
729
 
730
	;cmp	ebp,0x000 ; if this is first started thread
731
	;je .1            ; then show it at the very top
732
 
733
	push  ebx eax
734
	; if attachement=top
735
	; then NEW_WIN_Y = PRIOR_WIN_Y + PRIOR_WIN_H - ITEM_H + 1 - SEL_ITEM_Y
736
 
737
	mov ecx, [prior_thread_y]
738
	add ecx, [prior_thread_h]
739
	sub ecx, BTN_HEIGHT
740
	inc ecx
741
 
742
	xor eax, eax
743
	mov al, [prior_thread_selected_y_end]
744
	mov ebx, BTN_HEIGHT
745
	mul ebx
746
 
747
	sub ecx, eax
748
 
749
	mov	[edi + cur_sel],1 ;if attachement=top then set item=1 selected
750
 
751
	pop eax ebx
752
 
2618 mario79 753
	jmp	.1
754
;--------------------------------------
755
align 4
756
@@:
2211 mario79 757
	sub	ecx,eax	    ; ecx = Y_START
2618 mario79 758
;--------------------------------------
759
align 4
760
.1:
2211 mario79 761
	shl	ecx,16
762
	add	ecx,eax	    ; ecx = [ Y_START | Y_SIZE ]
7786 leency 763
	dec ecx
7548 leency 764
 
2211 mario79 765
	movzx	ebx,[edi + x_start]
766
	shl	ebx,16
7786 leency 767
	mov	bx,BTN_WIDTH	    ; ebx = [ X_START | X_SIZE ]
2211 mario79 768
	mov	edx,0x01000000       ; color of work area RRGGBB,8->color gl
769
	mov	esi,edx	    ; unmovable window
2618 mario79 770
 
771
	mov	eax,[y_working_area]
772
	shr	eax,16
773
	ror	ecx,16
774
	test	cx,0x8000
775
	jz	@f
776
	mov	cx,ax
777
;--------------------------------------
778
align 4
779
@@:
780
	cmp	cx,ax
781
	ja	@f
782
	mov	cx,ax
783
;--------------------------------------
784
align 4
785
@@:
786
	rol	ecx,16
2211 mario79 787
	xor	eax,eax	    ; function 0 : define and draw window
788
	mcall
789
 
2618 mario79 790
;	dps	"[ Y_START | Y_SIZE ] : "
791
;	dph	ecx
792
;	newline
793
 
794
;	dps	"[ X_START | X_SIZE ] : "
795
;	dph	ebx
796
;	newline
797
 
2211 mario79 798
	call	draw_all_buttons
799
	mcall	12,2
800
	ret
2488 mario79 801
;------------------------------------------------------------------------------
802
align 4
2211 mario79 803
draw_all_buttons:
804
	xor	edx,edx
2488 mario79 805
;--------------------------------------
806
align 4
2211 mario79 807
.new_button:
808
	call	draw_one_button
809
	inc	edx
810
	cmp	dl,[edi + rows]
811
	jb	.new_button
812
	ret
2488 mario79 813
;------------------------------------------------------------------------------
814
align 4
2211 mario79 815
draw_only_needed_buttons:
816
	xor	edx,edx
817
	mov	dl,[edi + cur_sel]
818
	dec	dl
819
	call	draw_one_button
820
	mov	dl,[edi + prev_sel]
821
	dec	dl
822
	call	draw_one_button
823
	ret
2488 mario79 824
;------------------------------------------------------------------------------
825
align 4
2211 mario79 826
draw_one_button:
827
; receives number of button in dl
828
	push	edx
829
	mov	eax,8
7786 leency 830
	mov	ebx,BTN_WIDTH
2211 mario79 831
	movzx	ecx,dl
832
	imul	ecx,BTN_HEIGHT
7786 leency 833
	mov [draw_y], ecx
2211 mario79 834
	shl	ecx,16
6258 leency 835
	add	ecx,BTN_HEIGHT
2211 mario79 836
; edx = button identifier
837
	mov	esi,[sc.work]
838
	cmp	esi,0xdfdfdf
839
	jb	nocorrect
840
	sub	esi,0x1b1b1b
7786 leency 841
 
2488 mario79 842
;--------------------------------------
843
align 4
2211 mario79 844
nocorrect:
845
	inc	dl
846
	cmp	[edi + cur_sel],dl
847
	jne	.nohighlight
7935 leency 848
	cmp esi,0
849
	jne @f
850
	mov esi,0x2a2a2a
851
@@:
2211 mario79 852
	add	esi,0x1a1a1a
2488 mario79 853
;--------------------------------------
854
align 4
2211 mario79 855
.nohighlight:
7786 leency 856
	or	edx,BT_NOFRAME + BT_HIDE
2211 mario79 857
				; dunkaist[
858
	add	edx,0xd1ff00	; This makes first menu buttons differ
859
				; from system close button with 0x000001 id
860
				; dunkaist]
861
	mcall
8484 leency 862
	push edx
7786 leency 863
 
864
	mov edx, esi
865
	mcall 13
866
 
8484 leency 867
	mcall , BTN_WIDTH,<[draw_y],1>,[sc.work_light]
868
	add     ecx, BTN_HEIGHT-1
869
	mcall , 1
870
	inc     ecx
871
	mcall , , , [sc.work_dark]
872
	add     [draw_y], BTN_HEIGHT-1
873
	mcall , BTN_WIDTH,<[draw_y],1>
7786 leency 874
 
8484 leency 875
	pop edx
2211 mario79 876
	movzx	edx,dl
877
	dec	dl
878
	imul	ebx,edx,BTN_HEIGHT
879
	add	ebx,(4 shl 16) + TXT_Y
880
	movzx	ecx,dl
881
	inc	ecx
882
	mov	edx,[edi + pointer]
2488 mario79 883
;--------------------------------------
884
align 4
2211 mario79 885
.findline:
886
	cmp	byte [edx],13
887
	je	.linefound
888
	inc	edx
889
	jmp	.findline
2488 mario79 890
;------------------------------------------------------------------------------
891
align 4
2211 mario79 892
.linefound:
893
	inc	edx
894
	cmp	byte [edx],10
895
	jne	.findline
896
	dec	ecx
897
	jnz	.findline
898
 
899
	mcall	4,,[sc.work_text],,21
900
	pop	edx
901
	ret
2488 mario79 902
;------------------------------------------------------------------------------
903
align 4
2211 mario79 904
searchstartstring:
905
	mov	ecx,40
906
	mov	al,13
907
	cld
908
	repne	scasb
909
	cmp	byte [edi],10
910
	jne	searchstartstring
911
	ret
2488 mario79 912
;------------------------------------------------------------------------------
31 halyavin 913
;*** DATA AREA ****************************************************************
8484 leency 914
menu_mame:   db '@MENU',0
915
default_dir: db '/sys',0
31 halyavin 916
 
2488 mario79 917
align 4
918
free_my_area_lock	dd 0
919
free_my_area	dd 0
920
 
2211 mario79 921
processes      dd 0
2488 mario79 922
;--------------------------------------
2618 mario79 923
menu_button_x:
924
.start:	dd MENU_BOTTON_X_POS
925
.size:	dd MENU_BOTTON_X_SIZE
926
;--------------------------------------
927
menu_button_y:
928
.start:	dd 2
929
.size:	dd 18
930
;--------------------------------------
931
panel_height:		dd PANEL_HEIGHT
932
panel_attachment:	dd 1
933
;--------------------------------------
2488 mario79 934
align 4
31 halyavin 935
fileinfo:
2488 mario79 936
 .subfunction	 dd 5		; 5 - file info; 0 - file read
937
 .start 	 dd 0		; start byte
938
 .size_high	 dd 0		; rezerved
939
 .size		 dd 0		; bytes to read
940
 .return	 dd procinfo	; return data pointer
31 halyavin 941
 .name:
8484 leency 942
     db   'SETTINGS/MENU.DAT',0   ; ASCIIZ dir & filename
2488 mario79 943
;--------------------------------------
944
align 4
31 halyavin 945
fileinfo_start:
2488 mario79 946
 .subfunction	dd 7	; 7=START APPLICATION
947
 .flags		dd 0	; flags
948
 .params	dd 0x0	; nop
949
 .rezerved	dd 0x0	; nop
950
 .rezerved_1	dd 0x0	; nop
31 halyavin 951
 .name:
952
   times 50 db ' '
2488 mario79 953
;------------------------------------------------------------------------------
954
IM_END:
955
;------------------------------------------------------------------------------
956
align 4
2211 mario79 957
close_now	dd ?   ; close all processes immediately
958
end_pointer	dd ?
959
buffer		dd ?
960
mousemask	dd ?   ; mask for mouse pointer location
31 halyavin 961
 
2211 mario79 962
active_process	dd ?
963
main_process_ID	dd ?
2488 mario79 964
;--------------------------------------
2211 mario79 965
screen_mouse_position:
966
.y	dw ?
967
.x	dw ?
2488 mario79 968
;--------------------------------------
2211 mario79 969
screen_size:
970
.y	dw ?
971
.x	dw ?
2488 mario79 972
;--------------------------------------
7786 leency 973
draw_y dd ?
974
;--------------------------------------
2618 mario79 975
x_working_area:
976
.right:		dw ?
977
.left:		dw ?
978
y_working_area:
979
.bottom:	dw ?
980
.top:		dw ?
981
;--------------------------------------
31 halyavin 982
sc system_colors
2488 mario79 983
;--------------------------------------
984
last_key	db ?
7848 leency 985
prior_thread_y dd ?
986
prior_thread_h dd ?
987
prior_thread_selected_y_end db ?
2488 mario79 988
;------------------------------------------------------------------------------
989
align 4
8484 leency 990
menu_data   dd ?
2488 mario79 991
;--------------------------------------
8484 leency 992
virtual     at 0       ; PROCESSES TABLE (located at menu_data)
993
  pointer   dd ?   ; +0    pointer in file
994
  rows      db ?   ; +4    numer of strings
995
  x_start   dw ?   ; +5    x start
996
  y_end     dw ?   ; +7    y end
997
  child     db ?   ; +9    id of child menu
998
  parent    db ?   ; +10   id of parent menu
999
  cur_sel   db ?   ; +11   current selection
1000
  prev_sel  db ?   ; +12   previous selection
1001
  rb        16-$+1 ; [16 bytes per element]
31 halyavin 1002
end virtual
2488 mario79 1003
;------------------------------------------------------------------------------
2211 mario79 1004
align 4
2618 mario79 1005
bootparam:
2211 mario79 1006
procinfo:
1007
	rb 1024
2488 mario79 1008
;------------------------------------------------------------------------------
1009
align 4
1010
	rb 0x1000
1011
stack_area:
1012
;------------------------------------------------------------------------------
31 halyavin 1013
mem_end:
3013 dunkaist 1014
;------------------------------------------------------------------------------