Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
51 mikedld 1
;********************************
2
;*                              *
3
;*     DESKTOP ICON MANAGER     *
4
;*                              *
5
;*  Compile with flat assembler *
6
;*                              *
7
;********************************
2697 mario79 8
; version:	3.11
9
; last update:  28/05/2012
10
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
11
; changes:      Fixed crash when trying to select some of the icons.
12
;               (bug 000013)
13
;---------------------------------------------------------------------
2548 mario79 14
; version:	3.10
15
; last update:  03/04/2012
16
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
17
; changes:      Drawing selection rectangle.
18
;               Using new kernel function: 15.9
19
;---------------------------------------------------------------------
2542 mario79 20
; version:	3.01
21
; last update:  02/04/2012
22
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
23
; changes:      Fix for previous revision - not drawed icons after
24
;               startup in certain cases.
25
;---------------------------------------------------------------------
2538 mario79 26
; version:	3.00
27
; last update:  02/04/2012
28
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
2548 mario79 29
; changes:      Program use only 2 threads: draw and mouse
30
;               Using new kernel functions: 25, 34, 15.8, 4 (redirect).
31
;               Using PNG icons with transparent.
2538 mario79 32
;---------------------------------------------------------------------
2476 mario79 33
; version:	2.11
34
; last update:  19/03/2012
35
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
36
; changes:      The program uses only 140 Kb memory is now.
37
;               Some speedup.
2475 mario79 38
;---------------------------------------------------------------------
39
; version:	2.1
40
; last update:  17/03/2012
41
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
42
; changes:      Global optimization! The program uses
43
;               only 161 KB of memory instead of 603 kb is now.
44
;---------------------------------------------------------------------
45
; version:	2.02
46
; last update:  15/03/2012
47
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
48
; changes:      some optimisations and code refactoring
49
;---------------------------------------------------------------------
50
; version:	2.01
51
; last update:  27/09/2011
52
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
53
; changes:      deactivate the window after click
54
;              (working to kernel r.2244 and above)
55
;---------------------------------------------------------------------
56
; Many fix's and changes created by:
57
;               Halyavin, Diamond, Heavyiron,
58
;               SPraid, Dunkaist
59
;---------------------------------------------------------------------
60
; version:	2.00
2538 mario79 61
; last update:  22/02/2005
2475 mario79 62
; changed by:   Willow and Mario79
63
; changes:      modified for work with new multi-thread ICON.
51 mikedld 64
;******************************************************************************
2538 mario79 65
ICON_SIZE equ 32*32*4
51 mikedld 66
REC_SIZE equ 80
2538 mario79 67
ICONS_DAT equ '/sys/icons.dat'
2548 mario79 68
ICON_APP equ '/sys/ICON'
2538 mario79 69
ICON_STRIP equ '/rd/1/iconstrp.png'
2469 mario79 70
;------------------------------------------------------------------------------
71
	use32
72
	org 0x0
2475 mario79 73
	db 'MENUET01'	; 8 byte id
74
	dd 0x01		; header version
75
	dd START	; start of code
76
	dd IM_END	; size of image
77
	dd I_END	; memory for app
78
	dd stack_area	; esp
79
	dd I_Param	; boot parameters
2538 mario79 80
	dd path		; path
2469 mario79 81
;------------------------------------------------------------------------------
2538 mario79 82
include 'lang.inc'
2469 mario79 83
include '../../../macros.inc'
2538 mario79 84
include '../../../develop/libraries/box_lib/load_lib.mac'
2469 mario79 85
;include 'debug.inc'
86
;------------------------------------------------------------------------------
2538 mario79 87
        @use_library    ;use load lib macros
88
;------------------------------------------------------------------------------
2475 mario79 89
START:		; start of execution
2476 mario79 90
	mcall	68,11
2538 mario79 91
;---------------------------------------------------------------------
92
load_libraries l_libs_start,end_l_libs
93
	test	eax,eax
94
	jnz	close
95
 
96
; unpack deflate
97
	mov	eax,[unpack_DeflateUnpack2]
98
	mov	[deflate_unpack],eax
99
;---------------------------------------------------------------------
2697 mario79 100
; get size of file ICONSTRP.PNG
2469 mario79 101
	mcall	70,finfo
2476 mario79 102
	test	eax,eax
103
	jnz	close
2697 mario79 104
; get memory for ICONSTRP.PNG
2538 mario79 105
	mov	ecx,[procinfo+32]
2476 mario79 106
	mov	[finfo.size],ecx
2538 mario79 107
	mov	[img_size],ecx
2476 mario79 108
	mcall	68,12
109
	mov	[finfo.point],eax
2538 mario79 110
	mov	[image_file],eax
2697 mario79 111
; load ICONSTRP.PNG
2476 mario79 112
	mov	[finfo],dword 0
113
	mcall	70,finfo
114
	test	eax,eax
115
	jnz	close
2538 mario79 116
; convert PNG to RAW
117
	xor	eax,eax
118
	mov	[return_code],eax
119
 
120
	push	image_file
121
	call	[cnv_png_import.Start]
122
 
123
	mov	eax,[raw_pointer]
2697 mario79 124
	mov	ebx,[eax+32]
125
	mov	[strip_file_size],ebx
2538 mario79 126
	mov	eax,[eax+28]
127
	add	eax,[raw_pointer]
2476 mario79 128
	mov	[strip_file],eax
129
; back memeory to system
130
	mcall	68,13,[finfo.point]
2538 mario79 131
 
132
	mov	eax,[raw_pointer]
133
	mov	eax,[eax+8]
2469 mario79 134
	shr	eax,5
135
	mov	[icon_count],eax
2697 mario79 136
 
137
	and	eax,0x7
138
	mov	[cur_band_compensation],eax
2476 mario79 139
; load ICON.DAT
2469 mario79 140
	call	load_ic
141
boot_str:
142
	cmp	[I_Param],dword 'BOOT'
2538 mario79 143
	je	START2
144
;------------------------------------------------------------------------------
145
; ICON EDITOR MODE - START1 entering label
146
;------------------------------------------------------------------------------
147
START1:
2469 mario79 148
	call	load_icon_list
2538 mario79 149
;------------------------------------------------------------------------------
150
align 4
2469 mario79 151
red:
2475 mario79 152
	call	draw_window	; at first, draw the window
2469 mario79 153
	mov	esi,[current_icon]
154
	jmp	band
155
;------------------------------------------------------------------------------
156
align 4
51 mikedld 157
still:
2469 mario79 158
	mcall	10	; wait here for event
2475 mario79 159
	dec	eax	; redraw request ?
2469 mario79 160
	jz	red
161
 
2475 mario79 162
	dec	eax	; key in buffer ?
2469 mario79 163
	jz	key
164
;------------------------------------------------------------------------------
165
align 4
2475 mario79 166
button:
2469 mario79 167
	mcall	17	; get id
168
	shr	eax,8
51 mikedld 169
 
2475 mario79 170
	cmp	eax,1	; button id=1 ?
2469 mario79 171
	je	close
2538 mario79 172
 
173
	mov	esi,[current_icon]
174
	add	esi,12
175
	mov	ebx,[cur_band]
176
 
177
	cmp	eax,11
178
	jb	@f
179
	cmp	eax,13
180
	ja	@f
181
	call	read_string
182
	jmp	still
2469 mario79 183
;--------------------------------------
184
align 4
2538 mario79 185
@@:
186
	cmp	eax,21	; apply changes
187
	je	apply
188
 
189
	cmp	eax,22		; user pressed the 'add icon' button
190
	je	add_icon
191
 
192
	cmp	eax,23	; user pressed the remove icon button
193
	je	remove_icon
194
 
195
 
196
	cmp	eax,30	; left arrow to icons bar
197
	je	arrow.left
198
 
2469 mario79 199
	cmp	eax,31	; right arrow to icons bar
2538 mario79 200
	je	arrow.right
201
 
202
	cmp	eax,32
203
	je	ico
51 mikedld 204
 
2538 mario79 205
	cmp	eax,40	; user pressed button for icon position
206
	jae	press_button_for_icon_position
207
 
208
	jmp	still
209
;------------------------------------------------------------------------------
210
align 4
211
arrow:
212
.right:
213
 
2469 mario79 214
	mov	eax,[icon_count]
2538 mario79 215
	sub	eax,8
216
	cmp	ebx,eax
217
	jae	still	;.drwic2
51 mikedld 218
 
2538 mario79 219
	add	ebx,1
2469 mario79 220
	jmp	.drwic2
221
;--------------------------------------
222
align 4
2538 mario79 223
.left:
2469 mario79 224
	test	ebx,ebx
2538 mario79 225
	jz	still
51 mikedld 226
 
2538 mario79 227
	sub	ebx,1
2469 mario79 228
;--------------------------------------
229
align 4
230
.drwic2:
231
	mov	[cur_band],ebx
232
;--------------------------------------
233
align 4
234
.drwic1:
235
	call	draw_icon
236
	jmp	still
2538 mario79 237
;------------------------------------------------------------------------------
2469 mario79 238
align 4
2538 mario79 239
ico:
2469 mario79 240
	push	ebx
241
	mcall	37,1
242
	pop	ebx
243
	shr	eax,16
244
	sub	eax,33-19
245
	mov	edi,34
246
	xor	edx,edx
247
	div	edi
248
	lea	ecx,[ebx+eax]
249
	cmp	ecx,[icon_count]
250
	jae	still
51 mikedld 251
 
2469 mario79 252
	mov	ecx,eax
253
	add	eax,ebx
254
	call	itoa
2538 mario79 255
	jmp	arrow.drwic1
256
;------------------------------------------------------------------------------
2475 mario79 257
align 4
2538 mario79 258
apply:
2469 mario79 259
	; (1) save list
2538 mario79 260
	mov	ebx,finfo
2469 mario79 261
	mov	dword[ebx],2
262
	mov	edx,REC_SIZE
263
	imul	edx,dword [icons]
264
	mov	[ebx+12],edx
265
	mov	esi,iconlst
266
	call	lst_path
267
	mcall	70
268
	; (2) terminate all icons
2475 mario79 269
	or	ecx,-1
2538 mario79 270
	mcall	9,procinfo
2469 mario79 271
	mov	edi,[ebx+30]
272
;--------------------------------------
273
align 4
274
newread2:
275
	mov	esi,1
276
;--------------------------------------
277
align 4
278
newread:
279
	inc	esi
280
	mov	ecx,esi
2538 mario79 281
	mcall	9,procinfo
282
 
2469 mario79 283
	cmp	edi,[ebx+30]
284
	je	newread
51 mikedld 285
 
2469 mario79 286
	cmp	esi,eax
2538 mario79 287
	jg	.apply_changes
51 mikedld 288
 
2475 mario79 289
	mov	eax,[ebx+10]
2469 mario79 290
	and	eax,not 20202020h
291
	cmp	eax,'@ICO'
292
	jz	@f
293
	cmp	eax,'ICON'
294
	jne	newread
295
;--------------------------------------
296
align 4
297
@@:
2538 mario79 298
	xor	eax,eax
2475 mario79 299
	cmp	eax,[ebx+42]
2469 mario79 300
	jne	newread
51 mikedld 301
 
2475 mario79 302
	cmp	eax,[ebx+46]
2469 mario79 303
	jne	newread
51 mikedld 304
 
2469 mario79 305
	mov	ecx,esi
306
	mcall	18,2
2538 mario79 307
 
2469 mario79 308
	jmp	newread2
2538 mario79 309
;--------------------------------------
2469 mario79 310
align 4
2538 mario79 311
.apply_changes:
2469 mario79 312
	mov	ebx, finfo_start
313
	mov	dword [ebx+8], boot_str+6
314
	mov	esi, iconname
315
	call	lst_path
316
	mcall	70
2538 mario79 317
	mcall	68,1
318
	mcall	15,3
2469 mario79 319
	jmp	still
320
;------------------------------------------------------------------------------
321
align 4
2538 mario79 322
add_icon:
2469 mario79 323
	mov	ebx,24*65536+250+8*14
324
	mcall	4,,0xc0ff0000,add_text,,0xffffff
408 halyavin 325
 
2469 mario79 326
	mcall	10
327
	cmp	eax,3
328
	jne	still
51 mikedld 329
 
2469 mario79 330
	mcall	17
331
	shr	eax,8
332
	cmp	eax,40
333
	jb	no_f
334
	mov	edi,eax
335
	sub	eax,40
336
 
2475 mario79 337
	xor	edx,edx		; bcd -> 10
2469 mario79 338
	mov	ebx,16
339
	div	ebx
340
; multiply x10
341
	shl	eax,1		; multiply x2
342
	lea	eax,[eax+eax*4] ; multiply x5
343
	add	eax,edx
344
 
345
	mov	ebx,eax
346
	add	ebx,icons_reserved
347
	cmp	[ebx],byte 'x'
348
	je	no_f
349
	mov	[ebx],byte 'x'
350
 
351
	mov	[cur_btn],edi
352
	xor	edx,edx
353
	mov	ebx,10
354
	div	ebx
355
	add	eax,65
356
	add	edx,65
357
	mov	[icon_default+0],dl
358
	mov	[icon_default+1],al
359
 
360
	inc	dword [icons]
361
	mov	edi,[icons]
362
	dec	edi
363
	imul	edi,REC_SIZE
364
	add	edi,icon_data
365
 
366
	mov	[current_icon],edi
51 mikedld 367
 
2469 mario79 368
	mov	esi,icon_default
369
	mov	ecx,REC_SIZE
370
	cld
371
	rep	movsb
372
	mov	esi,[current_icon]
373
	jmp	band
374
;--------------------------------------
375
align 4
376
no_f:
377
	call	draw_btns	;draw_window
378
	jmp	still
2538 mario79 379
;------------------------------------------------------------------------------
2469 mario79 380
align 4
2538 mario79 381
remove_icon:
2469 mario79 382
	mov	ebx,24*65536+250+8*14
383
	mcall	4,,0xc0ff0000,rem_text,,0xffffff
384
 
385
	mcall	10
386
	cmp	eax,3
2476 mario79 387
	jne	no_f
51 mikedld 388
 
2469 mario79 389
	mcall	17
390
	shr	eax,8
391
	cmp	eax,40
2475 mario79 392
	jb	red
2469 mario79 393
	sub	eax,40
394
 
395
	xor	edx,edx
396
	mov	ebx,16
397
	div	ebx
398
; multiply x10
399
	shl	eax,1		; multiply x2
400
	lea	eax,[eax+eax*4] ; multiply x5
401
	add	eax,edx
402
 
403
	mov	ebx,eax
404
	add	ebx,icons_reserved
405
	cmp	[ebx],byte 'x'
406
	jne	red
407
	mov	[ebx],byte ' '
408
 
409
	xor	edx,edx
410
	mov	ebx,10
411
	div	ebx
412
	shl	eax,8
413
	mov	al,dl
414
 
415
	add	eax,65*256+65
416
 
417
	mov	esi,icon_data
418
	mov	edi,REC_SIZE
419
	imul	edi,[icons]
420
	add	edi,icon_data
421
;--------------------------------------
422
align 4
423
news:
424
	cmp	word [esi],ax
425
	je	foundi
426
	add	esi,REC_SIZE
427
	cmp	esi,edi
428
	jb	news
429
	jmp	red
430
;--------------------------------------
431
align 4
432
foundi:
433
	mov	ecx,edi
434
	sub	ecx,esi
435
 
436
	mov	edi,esi
437
	add	esi,REC_SIZE
438
 
439
	cld
440
	rep	movsb
441
 
442
	dec	[icons]
443
 
444
	mov	eax,icon_data
445
	mov	[current_icon],eax
446
	movzx	ebx,word[eax]
447
	sub	bx,'AA'
448
	shl	bl,4
449
	shr	ebx,4
450
	add	ebx,40
451
	mov	[cur_btn],ebx
452
	jmp	red
2538 mario79 453
;------------------------------------------------------------------------------
2469 mario79 454
align 4
2538 mario79 455
press_button_for_icon_position:
2469 mario79 456
	mov	edi,eax
457
	sub	eax,40
458
	mov	edx,eax
459
	shl	eax,4
460
	and	edx,0xf
461
	mov	dh,ah
462
	add	edx,65*256+65
463
	mov	esi,icon_data
464
	mov	ecx,[icons]
465
	cld
466
;--------------------------------------
467
align 4
468
findl1:
469
	cmp	dx,[esi]
470
	je	foundl1
471
	add	esi,REC_SIZE
472
	loop	findl1
473
	jmp	still
474
;--------------------------------------
475
align 4
476
foundl1:
477
	mov	[current_icon],esi
478
	mov	[cur_btn],edi
479
;--------------------------------------
480
align 4
481
band:
482
	add	esi,12
2538 mario79 483
	call	ASCII_to_icon_number
2697 mario79 484
;	and	eax,0xfffff8
485
	cmp	eax,[cur_band_compensation]
486
	jb	@f
487
 
488
	sub	eax,[cur_band_compensation]
489
;--------------------------------------
490
align 4
491
@@:
2469 mario79 492
	mov	[cur_band],eax
493
	call	draw_btns
494
	jmp	still
495
;------------------------------------------------------------------------------
496
align 4
51 mikedld 497
print_strings:
2469 mario79 498
	pusha
499
	mcall	13,<100,180>,<278+12,40>,0xffffff	; clear text area
500
	xor	edi,edi
2475 mario79 501
	mov	eax,4		; icon text
2469 mario79 502
	mov	ebx,100*65536+278+14
503
	mov	ecx,3
504
;--------------------------------------
505
align 4
506
.ll:
507
	push	ecx
508
	mov	ecx,0x000000
509
	mov	edx,[current_icon]
510
	add	edx,[positions+edi*4]
511
	movzx	esi,byte[str_lens+edi]
512
	inc	edi
513
	mcall
514
	add	ebx,14
515
	pop	ecx
516
	loop	.ll
51 mikedld 517
 
2469 mario79 518
	popa
519
	ret
520
;------------------------------------------------------------------------------
521
align 4
51 mikedld 522
load_icon_list:
2475 mario79 523
	mov	edi,icons_reserved	; clear reserved area
2469 mario79 524
	mov	eax,32
525
	mov	ecx,10*9
526
	cld
527
	rep	stosb
51 mikedld 528
 
2475 mario79 529
	mov	ecx,[icons]	; set used icons to reserved area
2469 mario79 530
	mov	esi,icon_data
531
;--------------------------------------
532
align 4
533
ldl1:
534
	movzx	ebx,byte [esi+1]
535
	sub	ebx,65
536
; multiply x10
537
	shl	ebx,1		; multiply x2
538
	lea	ebx,[ebx+ebx*4] ; multiply x5
539
	movzx	eax,byte [esi]
540
	add	ebx,eax
541
	sub	ebx,65
542
	add	ebx,icons_reserved
543
	mov	[ebx],byte 'x'
544
	add	esi,REC_SIZE
545
	loop	ldl1
546
	ret
547
;------------------------------------------------------------------------------
548
align 4
51 mikedld 549
lst_path:
2469 mario79 550
	mov	ecx,30
551
	mov	edi,finfo.path
552
	rep	movsb
553
	ret
554
;------------------------------------------------------------------------------
555
align 4
51 mikedld 556
load_ic:
2469 mario79 557
	mov	ebx,finfo
558
	mov	dword[ebx+12],48*REC_SIZE
559
	mov	dword[ebx+16],icon_data
560
	mov	esi,iconlst
561
	call	lst_path
562
	mcall	70
563
	lea	eax,[ebx+10]
564
	xor	edx,edx
565
	mov	ebx,REC_SIZE
566
	div	ebx
567
	mov	[icons],eax
568
	ret
569
;------------------------------------------------------------------------------
570
align 4
51 mikedld 571
read_string:
2469 mario79 572
	pusha
573
	sub	eax,11
574
	movzx	ecx,byte[str_lens+eax]
575
	mov	[cur_str],ecx
576
	mov	eax,[positions+eax*4]
577
	mov	edi,[current_icon]
578
	add	edi,eax
579
	mov	[addr],edi
580
	add	edi,ecx
581
;--------------------------------------
582
align 4
583
.l1:
584
	dec	edi
585
	cmp	byte[edi],' '
586
	jne	.found
51 mikedld 587
 
2469 mario79 588
	mov	byte[edi],'_'
589
	loop	.l1
51 mikedld 590
 
2469 mario79 591
	dec	edi
592
;--------------------------------------
593
align 4
594
.found:
595
	inc	edi
596
	push	edi
597
	call	print_strings
598
	pop	edi
599
;--------------------------------------
600
align 4
601
f11:
602
	mcall	10
603
	cmp	eax,2
604
	jz	fbu
605
	jmp	rs_done
606
;--------------------------------------
607
align 4
608
fbu:
609
	mcall	2
610
	shr	eax,8
611
	cmp	eax,13
612
	je	rs_done
613
	cmp	eax,8
614
	jnz	nobsl
615
	cmp	edi,[addr]
616
	jz	f11
617
	dec	edi
618
	mov	[edi],byte '_'
619
	call	print_strings
620
	jmp	f11
621
;--------------------------------------
622
align 4
623
nobsl:
624
	cmp	eax,31
625
	jbe	f11
626
	mov	[edi],al
627
	call	print_strings
628
	inc	edi
629
	mov	esi,[addr]
630
	add	esi,[cur_str]
631
	cmp	esi,edi
632
	jnz	f11
633
;--------------------------------------
634
align 4
635
rs_done:
636
	mov	ecx,[addr]
637
	add	ecx,[cur_str]
638
	sub	ecx,edi
639
	mov	eax,32
640
	cld
641
	rep	stosb
642
	call	print_strings
643
	popa
644
	ret
645
;------------------------------------------------------------------------------
646
align 4
2475 mario79 647
key:
648
	mcall	2	; just read it and ignore
2469 mario79 649
	jmp	still
650
;------------------------------------------------------------------------------
51 mikedld 651
;   *********************************************
652
;   *******  WINDOW DEFINITIONS AND DRAW ********
653
;   *********************************************
2469 mario79 654
align 4
51 mikedld 655
draw_window:
2469 mario79 656
	mcall	12,1
2475 mario79 657
	; DRAW WINDOW
2469 mario79 658
	xor	eax,eax
659
	xor	esi,esi
660
	mcall	,<210,300>,<30,(390-14)>,0x14ffffff,,title
51 mikedld 661
 
2469 mario79 662
	mcall	13,<20,260>,<35,200>,0x3366cc	; WINDOW AREA
51 mikedld 663
 
2469 mario79 664
	mcall	38,<150,150>,<35,235>,0xffffff	; VERTICAL LINE ON WINDOW AREA
51 mikedld 665
 
2469 mario79 666
	mcall	,<20,280>,<135,135>	; HOROZONTAL LINE ON WINDOW AREA
51 mikedld 667
 
2469 mario79 668
	mcall	8,<20,72>,<(275+1+14),(13-2)>,11,[bcolor]	;id 11 TEXT ENTER BUTTONS
669
 
670
	inc	edx
671
	add	ecx,14*65536
672
	mcall			; id 12
673
 
674
	inc	edx
675
	add	ecx,14*65536
676
	mcall			; id 13
51 mikedld 677
 
2469 mario79 678
	mcall	,<20,259>,<(329+2),(15-4)>,21	; id 21 APPLY AND SAVE CHANGES BUTTON
51 mikedld 679
 
2469 mario79 680
	add	ecx,14*65536
681
	inc	edx
682
	mcall	,<20,(129-2)>	; id 22 ADD ICON BUTTON
51 mikedld 683
 
2469 mario79 684
	add	ebx,(130+2)*65536
685
	inc	edx
686
	mcall			; id 23 REMOVE ICON BUTTON
51 mikedld 687
 
2469 mario79 688
	mcall	,<(20-14),8>,<(260-23),32>,30 + 1 shl 30	; id 30 IMAGE BUTTON
51 mikedld 689
 
2469 mario79 690
	inc	edx
691
	add	ebx,(36*7+26) shl 16
692
	mcall		; id 31
51 mikedld 693
 
2469 mario79 694
	add	edx,1 + 1 shl 29
695
	mcall	,<(33-19),(34*8)>	; id 32
696
 
697
	mcall	4,<(23-15),(273-24)>,0,arrows,1
51 mikedld 698
 
2469 mario79 699
	add	ebx,(36*7+27)shl 16
700
	add	edx,2
701
	mcall
51 mikedld 702
 
2469 mario79 703
	dec	edx
704
	mcall	,<120,250>
51 mikedld 705
 
2469 mario79 706
	lea	edx,[ebx+8 shl 16]
707
	mcall	47,0x30000,[icon_count],,0
51 mikedld 708
 
2469 mario79 709
	mov	eax,4
710
	mov	ebx,24 shl 16+(250+14+14+14)
711
	mov	ecx,0xffffff
712
	mov	edx,text
713
	mov	esi,47
714
;--------------------------------------
715
align 4
2538 mario79 716
.newline:
2469 mario79 717
	mov	ecx,[edx]
718
	add	edx,4
719
	mcall
720
	add	ebx,14
721
	add	edx,47
722
	cmp	[edx],byte 'x'
2538 mario79 723
	jne	.newline
2469 mario79 724
;--------------------------------------
725
align 4
726
draw_btns:
2475 mario79 727
	mov	eax,0	; DRAW BUTTONS ON WINDOW AREA
2469 mario79 728
	mov	ebx,20 shl 16+25
729
	mov	ecx,35 shl 16+19
730
	mov	edi,icon_table
731
	mov	edx,40
732
;--------------------------------------
733
align 4
734
newbline:
735
	cmp	[edi],byte 'x'
736
	jne	no_button
51 mikedld 737
 
2469 mario79 738
	mov	esi,0x5577cc
739
	cmp	[edi+90],byte 'x'
740
	jne	nores
51 mikedld 741
 
2469 mario79 742
	mov	esi,0xcc5555
743
	cmp	edx,[cur_btn]
744
	jne	nores
51 mikedld 745
 
2469 mario79 746
	mov	esi,0xe7e05a
747
;--------------------------------------
748
align 4
749
nores:
750
	push	eax
751
	mcall	8
752
	pop	eax
753
;--------------------------------------
754
align 4
755
no_button:
756
	add	ebx,26 shl 16
51 mikedld 757
 
2469 mario79 758
	inc	edi
759
	inc	edx
760
	inc	al
761
	cmp	al,9
762
	jbe	newbline
763
 
764
	mov	al,0
765
	add	edx,6
766
	ror	ebx,16
767
	mov	bx,20
768
	ror	ebx,16
769
	add	ecx,20 shl 16
770
	inc	ah
2538 mario79 771
	cmp	ah,8
2469 mario79 772
	jbe	newbline
51 mikedld 773
 
2469 mario79 774
	call	print_strings
775
	call	draw_icon
776
	mcall	12,2
777
	ret
778
;------------------------------------------------------------------------------
779
align 4
51 mikedld 780
draw_icon:
2469 mario79 781
	mcall	13,<(33-20),(34*8+2)>,<(260-24),(37+15-2)>,0xffffff
782
	mov	esi,[current_icon]
783
	add	esi,12
2538 mario79 784
	call	ASCII_to_icon_number
2469 mario79 785
	push	eax
786
	cmp	eax,[cur_band]
787
	jb	.nou
788
	sub	eax,[cur_band]
789
	cmp	eax,7
790
	ja	.nou
791
	imul	eax,34 shl 16
792
	lea	ebx,[eax+(33-19) shl 16]
793
	mov	bx,34
794
	mcall	13,,<(236+35),3>,0xff0000
795
	mov	eax,[esp]
796
;--------------------------------------
797
align 4
798
.nou:
799
	mov	eax,[cur_band]
800
	push	eax
801
	imul	eax,ICON_SIZE
2476 mario79 802
	mov	ebx,[strip_file]
2538 mario79 803
	add	ebx,eax
2469 mario79 804
	mov	ecx,8
805
	mov	edx,(33-18) shl 16+238
806
;--------------------------------------
807
align 4
808
.nxt:
809
	push	ecx
2538 mario79 810
	pusha
811
	mov	ebp,0
2697 mario79 812
 
813
	mov	eax,[strip_file_size]
814
	add	eax,[strip_file]
815
	cmp	eax,ebx
816
	ja	@f
817
; draw a rectangle if icon does not exist
818
	mov	ebx,edx	; X
819
	mov	ecx,edx	; Y
820
	shl	ecx,16
821
	mov	bx,32
822
	mov	cx,bx
823
	xor	edx,edx
824
	mcall	13
825
	jmp	.draw_pict_end
826
;--------------------------------------
827
align 4
828
@@:
2538 mario79 829
	mcall	65,,<32,32>,,32
2697 mario79 830
;--------------------------------------
831
align 4
832
.draw_pict_end:
2538 mario79 833
	popa
2469 mario79 834
	pop	ecx
835
	add	ebx,ICON_SIZE
836
	add	edx,34 shl 16
51 mikedld 837
 
2697 mario79 838
	dec	ecx
839
	jnz	.nxt
840
 
2469 mario79 841
	mcall	4,<45,280-2>,0,rep_text,rep_text_len-rep_text
842
	lea	edx,[ebx+(8*5)shl 16]
843
	pop	ecx
844
	mcall	47,0x30000,,,0xff
845
 
846
	add	ecx,7
847
	add	edx,(3*8+4)shl 16
848
	mcall
849
 
850
	add	edx,(5*8+4)shl 16
851
	mcall	,,[icon_count]
852
 
853
	pop	ecx
854
	add	edx,(10*8+4)shl 16
855
	mcall	,,,,0xff0000
856
	ret
857
;------------------------------------------------------------------------------
858
align 4
859
close:
860
	or	eax,-1
861
	mcall
862
;------------------------------------------------------------------------------
2538 mario79 863
; ICON PROCESSING MODE - START2 entering label
2475 mario79 864
;------------------------------------------------------------------------------
2469 mario79 865
align 4
2538 mario79 866
START2:
867
	mcall	40,10000b	; only Event 5 - draw background
868
 
2542 mario79 869
	mcall	48,5
870
	mov	[warea.by_x],eax
871
	mov	[warea.by_y],ebx
872
 
2538 mario79 873
	mcall	51,1,START_mouse_thread,stack_mouse_thread
2542 mario79 874
 
875
	xor	eax,eax
876
	mov	[x_left],eax
877
	mov	[y_top],eax
878
 
879
	mcall	14
880
	mov	ebx,eax
881
	shr	eax,16
882
	and	ebx,0xffff
883
	mov	[x_right],eax
884
	mov	[y_bottom],ebx
885
	jmp	still2.1
2469 mario79 886
;------------------------------------------------------------------------------
887
align 4
51 mikedld 888
still2:
2469 mario79 889
	mcall	10
51 mikedld 890
 
2538 mario79 891
	mcall	15,8
892
 
893
	mov	ecx,eax
894
	shr	ecx,16
895
	mov	[x_left],ecx
896
	and	eax,0xffff
897
	mov	[x_right],eax
898
 
899
	mov	ecx,ebx
900
	shr	ecx,16
901
	mov	[y_top],ecx
902
	and	ebx,0xffff
903
	mov	[y_bottom],ebx
904
 
2542 mario79 905
	mcall	48,5
906
	mov	[warea.by_x],eax
907
	mov	[warea.by_y],ebx
908
.1:
2538 mario79 909
	mov	ecx,[icons]
910
	mov	ebx,icon_data
911
;--------------------------------------
2469 mario79 912
align 4
2538 mario79 913
.start_new:
914
	push	ebx ecx
915
	mov	[adress_of_icon_data],ebx
916
	mov	eax,[ebx]
2469 mario79 917
	call	calc_icon_pos
2538 mario79 918
	mov	[current_X],ebx
919
	mov	[current_Y],eax
920
 
921
	call	draw_picture
922
	pop	ecx ebx
923
	add	ebx,REC_SIZE
924
	dec	ecx
925
	jnz	.start_new
2469 mario79 926
	jmp	still2
2538 mario79 927
;------------------------------------------------------------------------------
2469 mario79 928
align 4
2538 mario79 929
draw_picture:
930
	mov	eax,[current_X]
931
	cmp	eax,[x_right]
932
	ja	.exit
51 mikedld 933
 
2538 mario79 934
	add	eax,52
935
	cmp	eax,[x_left]
936
	jb	.exit
937
 
938
	mov	eax,[current_Y]
939
	cmp	eax,[y_bottom]
940
	ja	.exit
941
 
942
	add	eax,52
943
	cmp	eax,[y_top]
944
	jb	.exit
2469 mario79 945
;--------------------------------------
946
align 4
2245 mario79 947
@@:
2548 mario79 948
	mov	edi,[adress_of_icon_data]
2538 mario79 949
	lea	esi,[edi+12]
950
	call	ASCII_to_icon_number
951
; protect for icon area RAW size limit
952
	cmp	eax,[icon_count]
953
	jbe	@f
2469 mario79 954
;--------------------------------------
955
align 4
2538 mario79 956
.exit:
2469 mario79 957
	ret
958
;--------------------------------------
959
align 4
2476 mario79 960
@@:
2538 mario79 961
	push	eax
962
	mcall	68,12,52*52*4+8
963
	mov	[draw_area],eax
964
	mov	ebx,52
965
	mov	[eax],ebx
966
	mov	[eax+4],ebx
967
	pop	eax
2475 mario79 968
 
2538 mario79 969
	shl	eax,12		; multiply x4096
970
	add	eax,[strip_file]
971
	mov	esi,eax
51 mikedld 972
 
2538 mario79 973
	mov	edi,[draw_area]
974
	add	edi,(52-32)/2*4+8
975
	mov	ebx,32
976
	cld
2469 mario79 977
;--------------------------------------
2538 mario79 978
align 4
979
.y:
980
	mov	ecx,32
981
	rep	movsd
2475 mario79 982
 
2538 mario79 983
	add	edi,(52-32)*4
984
	dec	ebx
985
	jnz	.y
2476 mario79 986
 
2538 mario79 987
	call	draw_text
2475 mario79 988
 
2548 mario79 989
	mov	edx,[current_X]
2538 mario79 990
	shl	edx,16
2548 mario79 991
	add	edx,[current_Y]
2538 mario79 992
	mov	ebx,[draw_area]
993
	add	ebx,8
994
	mcall	25,,<52,52>
995
	mcall	68,13,[draw_area]
2469 mario79 996
	ret
997
;------------------------------------------------------------------------------
998
align 4
999
draw_text:
2548 mario79 1000
	mov	esi,[adress_of_icon_data]
2469 mario79 1001
	add	esi,3
1002
	push	edi
1003
	mov	edi,title
1004
	mov	ecx,8/4
1005
	cld
1006
	rep	movsd
1007
	pop	edi
1008
	mov	eax,title
1009
;--------------------------------------
1010
align 4
1011
news2:
1012
	cmp	[eax],byte 33
1013
	jb	founde
1014
	inc	eax
1015
	cmp	eax,title+8	;11
1016
	jb	news2
1017
;--------------------------------------
1018
align 4
1019
founde:
1020
	sub	eax,title
1021
	mov	[tl],eax
1022
 
1023
	mov	eax,[tl]
2475 mario79 1024
	lea	eax,[eax+eax*2]		; eax *= char_width/2
2469 mario79 1025
	shl	eax,16
1026
 
1027
	mov	ebx,27 shl 16+40
1028
	sub	ebx,eax
1029
 
2475 mario79 1030
	xor	ecx,ecx		; black shade of text
2538 mario79 1031
	or	ecx,0x08000000	; redirect the output to the user area
2475 mario79 1032
	add	ebx,1 shl 16	;*65536+1
2538 mario79 1033
 
1034
	mov	edi,[draw_area]
2469 mario79 1035
	mcall	4,,,title,[tl]
51 mikedld 1036
 
2469 mario79 1037
	inc	ebx
1038
	mcall
51 mikedld 1039
 
2469 mario79 1040
	add	ebx,1 shl 16
1041
	mcall
51 mikedld 1042
 
2469 mario79 1043
	inc	ebx
1044
	mcall
51 mikedld 1045
 
2469 mario79 1046
	sub	ebx,1 shl 16
1047
	mcall
51 mikedld 1048
 
2469 mario79 1049
	dec	ebx
1050
	sub	ebx,1 shl 16
1051
	mcall
51 mikedld 1052
 
2469 mario79 1053
	sub	ebx,1 shl 16
1054
	dec	ebx
1055
	mcall
51 mikedld 1056
 
2469 mario79 1057
	dec	ebx
1058
	add	ebx,1 shl 16
1059
	mcall
51 mikedld 1060
 
2469 mario79 1061
	inc	ebx
2538 mario79 1062
	mov	ecx,0xffffff		; white text
1063
	or	ecx,0x08000000	; redirect the output to the user area
1064
	mcall
2469 mario79 1065
	ret
1066
;------------------------------------------------------------------------------
1067
align 4
2538 mario79 1068
ASCII_to_icon_number:
1069
;
1070
; in:
1071
; esi - adress of icon ASCII text number (line start + 12)
1072
;
1073
; out:
1074
; eax - number of icon
1075
;
1076
	push	esi
1077
	xor	eax,eax
1078
	xor	ebx,ebx
2475 mario79 1079
;--------------------------------------
1080
align 4
2538 mario79 1081
.next:
1082
	lodsb
1083
	cmp	al,'0'
1084
	jb	.done
1085
	cmp	al,'9'
1086
	ja	.done
1087
	sub	eax,'0'
1088
; multiply x10
1089
	shl	ebx,1		; multiply x2
1090
	lea	ebx,[ebx+ebx*4] ; multiply x5
1091
	add	ebx,eax
1092
	jmp	.next
2469 mario79 1093
;--------------------------------------
1094
align 4
2538 mario79 1095
.done:
1096
	pop	esi
1097
	mov	eax,ebx
1098
	ret
1099
;------------------------------------------------------------------------------
2469 mario79 1100
align 4
2538 mario79 1101
itoa:
1102
	add	esi,2
1103
	mov	ebx,10
1104
	mov	ecx,3
2469 mario79 1105
;--------------------------------------
1106
align 4
2538 mario79 1107
.l0:
1108
	xor	edx,edx
1109
	div	ebx
1110
	add	dl,'0'
1111
	mov	[esi],dl
1112
	dec	esi
1113
	loop	.l0
2469 mario79 1114
	ret
1115
;------------------------------------------------------------------------------
2538 mario79 1116
align 4
1117
calc_icon_pos:
1118
; in:
1119
; eax - dword [icon_position]
1120
; out:
1121
; eax - current Y
1122
; ebx - current X
1123
	push	eax
1124
	movzx	eax,al
1125
	sub	eax,'A'		;eax - number of letter
1126
	cmp	eax,4
1127
	jg	no_left
51 mikedld 1128
 
2538 mario79 1129
	shl	eax,6	;imul eax,64
1130
	add	eax,16
1131
	movzx	ebx,[warea.left]
1132
	add	eax,ebx
1133
	jmp	x_done
1134
;--------------------------------------
2475 mario79 1135
align 4
2538 mario79 1136
no_left:
1137
	sub	eax,9
1138
	sal	eax,6	;imul eax,64
1139
	sub	eax,16+52-1
1140
	movzx	ebx,[warea.right]
1141
	add	eax,ebx
1142
;--------------------------------------
2475 mario79 1143
align 4
2538 mario79 1144
x_done:
1145
	mov	ebx,eax
1146
	pop	eax
1147
	push	ebx
1148
	movzx	eax,ah
1149
	sub	eax,'A'		; eax - number of letter
1150
	cmp	eax,4
1151
	jg	no_up
1152
 
1153
	shl	eax,6		;imul eax,80
1154
	add	eax,16
1155
	movzx	ebx,[warea.top]
1156
	add	eax,ebx
1157
	jmp	y_done
1158
;--------------------------------------
2475 mario79 1159
align 4
2538 mario79 1160
no_up:
1161
	sub	eax,9
1162
	shl	eax,6		;imul eax,80
1163
	sub	eax,16-1
1164
	movzx	ebx,[warea.bottom]
1165
	add	eax,ebx
1166
;--------------------------------------
2475 mario79 1167
align 4
2538 mario79 1168
y_done:
1169
	pop	ebx
1170
	ret
2475 mario79 1171
;------------------------------------------------------------------------------
2538 mario79 1172
include 'mouse.inc'
2475 mario79 1173
;------------------------------------------------------------------------------
2538 mario79 1174
include 'data.inc'
2475 mario79 1175
;------------------------------------------------------------------------------
2538 mario79 1176
IM_END:
2475 mario79 1177
;------------------------------------------------------------------------------
2538 mario79 1178
include 'dat_area.inc'
1179
;------------------------------------------------------------------------------
51 mikedld 1180
I_END:
2538 mario79 1181
;------------------------------------------------------------------------------