Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7427 theonlymir 1
;CNC CONTROL
2
;Igor Afanasyev (aka IgorA) and Sergey Efremenkov (aka theonlymirage), 2018
3
 
4
;02.10.18 - Only prototype UI
7440 theonlymir 5
;08.10.18 - Add ComboBox (Button + KMenu), small text
7427 theonlymir 6
 
7
format binary as ""
8
use32
9
        org 0
10
        db 'MENUET01'
11
        dd 1,start,i_end,mem,stacktop,0,sys_path
12
 
13
include '../../macros.inc'
14
include '../../proc32.inc'
15
include '../../KOSfuncs.inc'
16
include '../../load_img.inc'
17
include '../../develop/libraries/libs-dev/libimg/libimg.inc'
18
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
19
include 'lang.inc'
20
include 'cnc_control.inc'
21
include '../../develop/info3ds/info_fun_float.inc'
22
 
7440 theonlymir 23
KMENUITEM_NORMAL equ 0
24
KMENUITEM_SUBMENU equ 1
25
KMENUITEM_SEPARATOR equ 2
26
 
7427 theonlymir 27
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
7440 theonlymir 28
caption db 'CNC Control 08.10.18',0 ;подпись окна
7427 theonlymir 29
 
30
run_file_70 FileInfoBlock
31
 
32
offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
33
 
34
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
35
image_data_toolbar dd 0 ;указатель на временную память. для нужен преобразования изображения
36
icon_tl_sys dd 0 ;указатель на память для хранения системных иконок
37
icon_toolbar dd 0 ;указатель на память для хранения иконок объектов
38
 
39
align 4
40
start:
41
        load_libraries l_libs_start,l_libs_end
42
        ;проверка на сколько удачно загузилась библиотека
43
        mov     ebp,lib_0
44
        cmp     dword [ebp+ll_struc_size-4],0
45
        jz      @f
46
                mcall SF_TERMINATE_PROCESS
47
        @@:
48
        mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
49
        mcall SF_SET_EVENTS_MASK,0xC0000027
50
        stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
51
 
52
        stdcall [buf2d_create], buf_0 ;создание буфера
53
 
54
        ;шрифт делаем до создания панели (для экономии указателя image_data_toolbar)
55
        include_image_file '..\..\fs\kfar\trunk\font6x9.bmp', image_data_toolbar, buf_1.w,buf_1.h
56
        stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
57
        stdcall mem.Free,[image_data_toolbar] ;освобождаем память
58
        stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
59
        stdcall [buf2d_convert_text_matrix], buf_1
60
        mov eax,[buf_1.h]
61
        shr eax,8
62
        mov [font_h],eax
63
 
64
        include_image_file 'toolbar.png', image_data_toolbar
65
 
66
        ;*** установка времени для таймера
67
        mcall SF_SYSTEM_GET,SSF_TIME_COUNT
68
        mov [last_time],eax
69
 
70
        ;call but_new_file
71
        option_boxes_set_sys_color sc,opt_grlist1
72
 
7440 theonlymir 73
        ;progress bar
7427 theonlymir 74
        mov    [pb.left],           dword  50
75
        mov    [pb.top],            dword  30
76
        mov    [pb.width],          dword  350
77
        mov    [pb.height],         dword  17
78
        mov    [pb.max],            dword  100;599
79
        mov    [pb.min],            dword  0 ;-397
80
        mov    [pb.value],          dword  50;-397
81
        mov    [pb.back_color],     dword 00C8D0D4h
82
        mov    [pb.progress_color], dword 8072B7EBh
83
        mov    [pb.frame_color],    dword 00406175h
84
 
7440 theonlymir 85
        ;port menu
86
        stdcall [kmenu_init], sc    ;kmenu initialisation
87
        ;stdcall [ksubmenu_new]
88
        ;mov [main_menu], eax
89
 
90
        stdcall [ksubmenu_new]
91
        mov [port_menu], eax
92
        stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_COMport, 110
93
        stdcall [ksubmenu_add], [port_menu], eax
94
        stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_USBport, 111
95
        stdcall [ksubmenu_add], [port_menu], eax
96
        ;stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
97
        ;stdcall [ksubmenu_add], [port_menu], eax
98
        ;stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_OTHERport, 112
99
        ;stdcall [ksubmenu_add], [port_menu], eax
100
        stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_PortMenu, [port_menu]
101
        ;stdcall [ksubmenu_add], [main_menu], eax
102
 
7427 theonlymir 103
align 4
104
red_win:
105
        call draw_window
106
 
107
align 4
108
still:
109
        mcall SF_SYSTEM_GET,SSF_TIME_COUNT
110
        mov ebx,[last_time]
111
        add ebx,10 ;задержка
112
        cmp ebx,eax
113
        jge @f
114
                mov ebx,eax
115
        @@:
116
        sub ebx,eax
117
        mcall SF_WAIT_EVENT_TIMEOUT
118
        cmp eax,0
119
        jne @f
120
                call timer_funct
121
                jmp still
122
        @@:
123
 
124
        cmp al,1
125
        jz red_win
126
        cmp al,2
127
        jz key
128
        cmp al,3
129
        jz button
130
        cmp al,6
131
        jne @f
132
                mcall SF_THREAD_INFO,procinfo,-1
133
                cmp ax,word[procinfo.window_stack_position]
134
                jne @f ;окно не активно
135
                call mouse
136
        @@:
137
        jmp still
138
 
139
align 4
140
mouse:
141
        stdcall [option_box_mouse], opt_grlist1
142
        stdcall [edit_box_mouse], editFileName
143
        stdcall [edit_box_mouse], editCommand
7440 theonlymir 144
        stdcall [kmainmenu_dispatch_cursorevent], [port_menu] ;[main_menu]
7427 theonlymir 145
 
146
        push eax ebx ecx
147
        mcall SF_MOUSE_GET,SSF_BUTTON_EXT
148
        bt eax,8
149
        jnc @f
150
                ;mouse l. but. press
151
                call mouse_left_d
152
                jmp .end_l
153
        @@:
154
        ;bt eax,0
155
        ;jnc @f
156
                ;mouse l. but. move
157
                ;call mouse_left_m
158
                ;jmp .end_l
159
        ;@@:
160
        bt eax,16
161
        jnc .end_l
162
                ;mouse l. but. up
163
                call mouse_left_u
164
                ;jmp .end_l
165
        .end_l:
166
        ;bt eax,9
167
        ;jnc @f
168
                ;mouse r. but. press
169
                ;jmp .end_r
170
        ;@@:
171
        ;bt eax,1
172
        ;jnc @f
173
                ;mouse r. but. move
174
                ;call mouse_right_m
175
                ;jmp .end_r
176
        ;@@:
177
        ;.end_r:
178
 
179
        call buf_get_mouse_coord
180
        cmp eax,-1
181
        je .end0
182
                shl eax,1
183
                sub eax,[buf_0.w]
184
                sar eax,1
185
                mov [mouse_prop_x],eax
186
                mov ecx,ObjData
187
                shl ebx,1
188
                sub ebx,[buf_0.h]
189
                sar ebx,1
190
                mov [mouse_prop_y],ebx
191
 
192
                mcall SF_MOUSE_GET,SSF_SCROLL_DATA
193
                test ax,ax
194
                jz .end0
195
                finit
196
                fld qword[zoom_plus]
197
                fld1
198
                fsubp
199
                fld st0 ;for Y coord
200
 
201
                ;for X coord
202
                fild dword[mouse_prop_x]
203
                fmulp st1,st0
204
 
205
                mov ebx,eax
206
                test ax,0x8000
207
                jnz .decr
208
                        ;увеличение масштаба
209
                        fchs
210
                        fild dword[ecx+Figure.MCentrX] ;add old value
211
                        fmul qword[zoom_plus]
212
                        faddp
213
 
214
                        fld qword[ecx+Figure.MScale]
215
                        fmul qword[zoom_plus]
216
                        ;if (Figure.MScale>16.0)
217
                        ;...
218
                        jmp @f
219
                .decr:
220
                        ;уменьшение масштаба
221
                        fild dword[ecx+Figure.MCentrX] ;add old value
222
                        fdiv qword[zoom_plus]
223
                        faddp
224
 
225
                        fld qword[ecx+Figure.MScale]
226
                        fdiv qword[zoom_plus]
227
                        fld1
228
                        fcomp
229
                        fstsw ax
230
                        sahf
231
                        jbe @f
232
                                ;if (Figure.MScale<1.0)
233
                                ffree st0
234
                                fincstp
235
                                ffree st0
236
                                fincstp
237
                                fldz ;default Figure.MCentrX
238
                                fld1 ;default Figure.MScale
239
                                mov dword[ecx+Figure.MCentrY],0
240
                @@:
241
                fstp qword[ecx+Figure.MScale]
242
                fistp dword[ecx+Figure.MCentrX]
243
 
244
                ;for Y coord
245
                fild dword[mouse_prop_y]
246
                fmulp st1,st0
247
                test bx,0x8000
248
                jnz .decr_y
249
                        ;увеличение масштаба
250
                        fild dword[ecx+Figure.MCentrY] ;add old value
251
                        fmul qword[zoom_plus]
252
                        faddp
253
                        jmp @f
254
                .decr_y:
255
                        ;уменьшение масштаба
256
                        fchs
257
                        fild dword[ecx+Figure.MCentrY] ;add old value
258
                        fdiv qword[zoom_plus]
259
                        faddp
260
                @@:
261
                fistp dword[ecx+Figure.MCentrY]
262
 
263
                mov dword[offs_last_timer],0
264
        .end0:
265
 
266
        pop ecx ebx eax
267
        ret
268
 
269
;output:
270
; eax - buffer coord X (если курсор за буфером -1)
271
; ebx - buffer coord Y (если курсор за буфером -1)
272
align 4
273
proc buf_get_mouse_coord
274
        mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
275
        cmp ax,word[buf_0.t]
276
        jl .no_buf ;не попали в окно буфера по оси y
277
        mov ebx,eax
278
        shr ebx,16
279
        cmp bx,word[buf_0.l]
280
        jl .no_buf ;не попали в окно буфера по оси x
281
 
282
        and eax,0xffff ;оставляем координату y
283
        sub ax,word[buf_0.t]
284
        cmp eax,[buf_0.h]
285
        jg .no_buf
286
        sub bx,word[buf_0.l]
287
        cmp ebx,[buf_0.w]
288
        jg .no_buf
289
        xchg eax,ebx
290
        jmp .end_f
291
        .no_buf:
292
                xor eax,eax
293
                not eax
294
                xor ebx,ebx
295
                not ebx
296
        .end_f:
297
        ret
298
endp
299
 
300
align 4
301
proc timer_funct
302
        pushad
303
        mcall SF_SYSTEM_GET,SSF_TIME_COUNT
304
        mov [last_time],eax
305
 
306
        cmp dword[offs_last_timer],ObjData
307
        je @f
308
                mov dword[offs_last_timer],ObjData
309
                stdcall draw_obj2d,ObjData
310
                stdcall [buf2d_draw], buf_0
311
        @@:
312
        popad
313
        ret
314
endp
315
 
7440 theonlymir 316
WINDOW_WIDTH  = 775
317
WINDOW_HEIGHT = 445
318
 
7427 theonlymir 319
align 4
320
draw_window:
321
pushad
322
        mcall SF_REDRAW,SSF_BEGIN_DRAW
323
 
324
        ; *** рисование главного окна (выполняется 1 раз при запуске) ***
325
        mov edx,[sc.work]
326
        or  edx,0x33000000
327
        mov edi,caption
7440 theonlymir 328
        mcall SF_CREATE_WINDOW,(20 shl 16)+WINDOW_WIDTH,(20 shl 16)+WINDOW_HEIGHT
7427 theonlymir 329
 
330
        ;;mcall SF_THREAD_INFO,procinfo,-1
331
        ;;mov eax,dword[procinfo.box.height]
332
        ;;cmp eax,120
333
        ;;jge @f
334
                ;;mov eax,120 ;min size
335
        ;;@@:
336
        ;;sub eax,65
337
        ;;mov ebx,dword[procinfo.box.width]
338
        ;;cmp ebx,270
339
        ;;jge @f
340
                ;;mov ebx,270
341
        ;;@@:
342
        ;;sub ebx,215
343
        ;;cmp eax,dword[buf_0.h] ;смотрим размер буфера
344
        ;;jne @f
345
        ;;cmp ebx,dword[buf_0.w]
346
        ;;jne @f
347
                ;;jmp .end0
348
        ;;@@:
349
                ;;stdcall [buf2d_resize],buf_0,ebx,eax,1
350
                mov ecx,[ObjData.FigCount]
351
                or ecx,ecx
352
                jz .end0
353
                mov eax,[ObjData.FigData]
354
                xor edx,edx
355
                .cycle0:
356
                        stdcall FigCalculateSizes,[eax+4*edx],0
357
                        inc edx
358
                        loop .cycle0
359
                stdcall ObjCalculateScale,ObjData
360
                mov dword[offs_last_timer],0
361
                call timer_funct
362
        .end0:
363
 
364
        stdcall [edit_box_draw], editFileName
365
        stdcall [edit_box_draw], editCommand
366
 
367
        stdcall [option_box_draw], opt_grlist1
368
        push   pb
369
        call   [progressbar_draw]
370
 
371
        ; *** создание кнопок на панель ***
372
        mcall SF_DEFINE_BUTTON,(731 shl 16)+20,(75 shl 16)+20,3, [sc.work_button]
373
        mcall , (15 shl 16)+20,(27 shl 16)+20,4 ;restore
374
        mcall ,(538 shl 16)+20,,5 ;connect
375
        mcall ,(563 shl 16)+20,,6 ;close connect
376
        mcall ,(437 shl 16)+86,(378 shl 16)+20,7 ;cancel
377
        mcall ,(616 shl 16)+136,(378 shl 16)+20,8 ;run
378
 
379
        ; ***
380
        mov ecx,[sc.work_text]
7440 theonlymir 381
        or ecx,0x80000000 ;0x81000000
382
        textYcoord = 13;5
383
        mcall SF_DRAW_TEXT,(15 shl 16)+textYcoord,,txt_preview
384
        mcall ,(424 shl 16)+textYcoord,,txt_port
7427 theonlymir 385
        mov ecx,[sc.work_button_text]
386
        or ecx,0x81000000
387
        mcall ,(440 shl 16)+381,,txt_but_cancel
388
        mcall ,(619 shl 16)+381,,txt_but_run
389
 
390
        ; *** рисование иконок на кнопках ***
391
        mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16,(733 shl 16)+77 ;icon open
392
 
393
        add ebx,IMAGE_TOOLBAR_ICON_SIZE
394
        mcall ,,,(17 shl 16)+29 ;restore scale
395
        add ebx,IMAGE_TOOLBAR_ICON_SIZE
396
        mcall ,,,(540 shl 16)+29 ;connect
397
        add ebx,IMAGE_TOOLBAR_ICON_SIZE
398
        mcall ,,,(565 shl 16)+29 ;close connect
399
        ;;add ebx,IMAGE_TOOLBAR_ICON_SIZE
400
        ;;mcall ,,,(439 shl 16)+380 ;cancel
401
        add ebx,IMAGE_TOOLBAR_ICON_SIZE
402
        mcall ,,,((638+97) shl 16)+380 ;run
403
 
404
        stdcall [buf2d_draw], buf_0
405
 
7440 theonlymir 406
        ;delete port button, if it exist
407
        mov edx, 0x80000008
408
        mcall 8
409
        ;draw button PORT
410
        buttonPortX = 433
411
        buttonPortY = 27 ;50
412
        buttonPortTextXoffset = 5
413
        mov ebx, buttonPortX*65536 + 95   ;X + Width
414
        mov ecx, buttonPortY*65536 + 20   ;Y + Height
415
        mov edx, 0x00000008       ;button id
416
        mov esi, 0x00AABBCC       ;color button
417
        mcall 8
418
        ;draw text for button PORT
419
        mov     ebx, (buttonPortX+buttonPortTextXoffset) * 65536 + (buttonPortY+6)    ;(x, y)
420
        mov     ecx, 0xFFFFFF
421
        mov     edx, sz_PortMenu
422
        mov     esi, 11
423
        mcall 4
424
        ;stdcall [kmainmenu_draw], [main_menu]
425
        ;mov word[coord.x], 0
426
        ;mov word[coord.y], 0
427
        ;stdcall [ksubmenu_draw], [port_menu], coord
428
 
7427 theonlymir 429
        mcall SF_REDRAW,SSF_END_DRAW
430
popad
431
        ret
432
 
433
align 4
434
key:
435
        mcall SF_GET_KEY
436
 
437
        stdcall [edit_box_key], editFileName
438
        stdcall [edit_box_key], editCommand
439
 
440
        mov ecx,eax
441
        mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS
442
        bt eax,2 ;left Ctrl
443
        jc .key_Ctrl
444
        bt eax,3 ;right Ctrl
445
        jc .key_Ctrl
446
        jmp .end0
447
        .key_Ctrl:
448
                cmp ch,15 ;111 ;Ctrl+O
449
                jne @f
450
                        call but_open_file
451
                @@:
452
        .end0:
453
        jmp still
454
 
455
align 4
456
button:
457
        mcall SF_GET_BUTTON
7440 theonlymir 458
 
7427 theonlymir 459
        cmp ah,3
460
        jne @f
461
                call but_open_file
462
                jmp still
463
        @@:
464
        cmp ah,4
465
        jne @f
466
                call but_restore_zoom
467
                jmp still
468
        @@:
7440 theonlymir 469
        cmp ah, 8
470
        jne @f
471
                push eax ebx ecx
472
                mcall 9, pi, -1 ;get window coord
7427 theonlymir 473
 
7440 theonlymir 474
                mov eax, dword[pi+34]
475
                add eax, buttonPortX + 5
476
                mov word[coord.x], ax
477
 
478
                mov eax, dword[pi+38]
479
                add eax, buttonPortY + 42
480
                mov word[coord.y], ax
481
 
482
                stdcall [ksubmenu_draw], [port_menu], coord
483
                pop ecx ebx eax
484
        @@:
7427 theonlymir 485
        ;cmp ah,5
486
        ;jne @f
487
                ;call but_...
488
                ;jmp still
489
        ;@@:
490
        cmp ah,1
491
        jne still
492
.exit:
493
        stdcall [buf2d_delete],buf_0
494
        stdcall mem.Free,[image_data_toolbar]
495
        stdcall mem.Free,[open_file_data]
496
        mcall SF_TERMINATE_PROCESS
497
 
498
 
499
 
500
align 4
501
open_file_data dd 0 ;указатель на память для открытия файлов
502
open_file_size dd 0 ;размер открытого файла
503
 
504
align 4
505
but_open_file:
506
        pushad
507
        copy_path open_dialog_name,communication_area_default_path,file_name,0
508
        mov [OpenDialog_data.type],0
509
        stdcall [OpenDialog_Start],OpenDialog_data
510
        cmp [OpenDialog_data.status],2
511
        je .end_open_file
512
        ;код при удачном открытии диалога
513
 
7438 theonlymir 514
        push eax ebx ecx edx    ;copy file name path from OpenDialog
515
        mov eax, openfile_path
7427 theonlymir 516
        mov ebx, fileNameBuffer ;.data
517
        mov ecx, 0
518
      @@:
519
        mov dl, byte[eax]
520
        cmp dl, 0 ;byte[eax], 0
521
        je @f
522
        mov byte[ebx], dl
523
        inc eax
524
        inc ebx
525
        inc ecx
526
        jmp @b
527
      @@:
528
        mov byte[ebx], 0
529
        mov dword[fileNameBuffer.size], ecx
530
        mov dword[editFileName.size], ecx
531
        mov dword[editFileName.pos], ecx
532
        pop edx ecx ebx eax
533
 
534
        mov [run_file_70.Function], SSF_GET_INFO
535
        mov [run_file_70.Position], 0
536
        mov [run_file_70.Flags], 0
537
        mov dword[run_file_70.Count], 0
538
        mov dword[run_file_70.Buffer], open_b
539
        mov byte[run_file_70+20], 0
540
        mov dword[run_file_70.FileName], openfile_path
541
        mcall SF_FILE,run_file_70
542
 
543
        mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
544
        inc ecx ;for text files
545
        stdcall mem.ReAlloc,[open_file_data],ecx
546
        mov [open_file_data],eax
547
        dec ecx ;for text files
548
        mov byte[eax+ecx],0 ;for text files
549
 
550
        mov [run_file_70.Function], SSF_READ_FILE
551
        mov [run_file_70.Position], 0
552
        mov [run_file_70.Flags], 0
553
        mov dword[run_file_70.Count], ecx
554
        m2m dword[run_file_70.Buffer], dword[open_file_data]
555
        mov byte[run_file_70+20], 0
556
        mov dword[run_file_70.FileName], openfile_path
557
        mcall SF_FILE,run_file_70 ;загружаем файл изображения
558
        test eax,eax
559
        jnz .end_open_file
560
        cmp ebx,0xffffffff
561
        je .end_open_file
562
 
563
                mov [open_file_size],ebx
564
                mcall SF_SET_CAPTION,1,openfile_path
565
 
566
                ;---
567
                stdcall FileInit,[open_file_data],[open_file_size]
568
                stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
569
                stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
570
        .end_open_file:
571
        popad
572
        ret
573
 
574
;output:
575
; ecx - memory size for save file
576
align 4
577
proc get_file_save_size uses eax ebx edx esi
578
        mov ecx,100 ;title
579
        mov ebx,ObjData
580
        add ecx,50 ;object
581
        mov edx,[ebx+Object.FigCount]
582
        or edx,edx
583
        jz .cycle1end
584
        mov esi,[ebx+Object.FigData]
585
align 4
586
        .cycle1: ; цикл по фигурам
587
                add ecx,80 ;figure
588
                mov eax,[esi]
589
                or eax,eax
590
                jz @f
591
                        mov eax,[eax+Figure.PoiCount]
592
                        imul eax,70
593
                        add ecx,eax ;points
594
                @@:
595
                add esi,4
596
                dec edx
597
                jnz .cycle1
598
        .cycle1end:
599
        ret
600
endp
601
 
602
align 4
603
proc but_restore_zoom
604
        finit
605
        fld1
606
        fstp qword[ObjData.MScale]
607
        mov dword[ObjData.MCentrX],0
608
        mov dword[ObjData.MCentrY],0
609
        mov dword[offs_last_timer],0
610
        ret
611
endp
612
 
613
 
614
 
615
;input:
616
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
617
;output:
618
; eax - число
619
align 4
620
proc conv_str_to_int uses ebx ecx esi, buf:dword
621
        xor eax,eax
622
        xor ebx,ebx
623
        mov esi,[buf]
624
 
625
        ;на случай если перед числом находятся пробелы
626
        @@:
627
        cmp byte[esi],' '
628
        jne @f
629
                inc esi
630
                jmp @b
631
        @@:
632
 
633
        ;определение отрицательных чисел
634
        xor ecx,ecx
635
        inc ecx
636
        cmp byte[esi],'-'
637
        jne @f
638
                dec ecx
639
                inc esi
640
        @@:
641
 
642
        cmp word[esi],'0x'
643
        je .load_digit_16
644
 
645
        .load_digit_10: ;считывание 10-тичных цифр
646
                mov bl,byte[esi]
647
                cmp bl,'0'
648
                jl @f
649
                cmp bl,'9'
650
                jg @f
651
                        sub bl,'0'
652
                        imul eax,10
653
                        add eax,ebx
654
                        inc esi
655
                        jmp .load_digit_10
656
        jmp @f
657
 
658
        .load_digit_16: ;считывание 16-ричных цифр
659
                add esi,2
660
        .cycle_16:
661
                mov bl,byte[esi]
662
                cmp bl,'0'
663
                jl @f
664
                cmp bl,'f'
665
                jg @f
666
                cmp bl,'9'
667
                jle .us1
668
                        cmp bl,'A'
669
                        jl @f ;отсеиваем символы >'9' и <'A'
670
                .us1: ;составное условие
671
                cmp bl,'F'
672
                jle .us2
673
                        cmp bl,'a'
674
                        jl @f ;отсеиваем символы >'F' и <'a'
675
                        sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
676
                .us2: ;составное условие
677
                        sub bl,'0'
678
                        cmp bl,9
679
                        jle .cor1
680
                                sub bl,7 ;convert 'A' to '10'
681
                        .cor1:
682
                        shl eax,4
683
                        add eax,ebx
684
                        inc esi
685
                        jmp .cycle_16
686
        @@:
687
        cmp ecx,0 ;если число отрицательное
688
        jne @f
689
                sub ecx,eax
690
                mov eax,ecx
691
        @@:
692
        ret
693
endp
694
 
695
 
696
;данные для диалога открытия файлов
697
align 4
698
OpenDialog_data:
699
.type                   dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
700
.procinfo               dd procinfo     ;+4
701
.com_area_name          dd communication_area_name      ;+8
702
.com_area               dd 0    ;+12
703
.opendir_path           dd plugin_path  ;+16
704
.dir_default_path       dd default_dir ;+20
705
.start_path             dd file_name ;+24 путь к диалогу открытия файлов
706
.draw_window            dd draw_window  ;+28
707
.status                 dd 0    ;+32
708
.openfile_path          dd openfile_path        ;+36 путь к открываемому файлу
709
.filename_area          dd filename_area        ;+40
710
.filter_area            dd Filter
711
.x:
712
.x_size                 dw 420 ;+48 ; Window X size
713
.x_start                dw 10 ;+50 ; Window X position
714
.y:
715
.y_size                 dw 320 ;+52 ; Window y size
716
.y_start                dw 10 ;+54 ; Window Y position
717
 
718
default_dir db '/rd/1',0
719
 
720
communication_area_name:
721
        db 'FFFFFFFF_open_dialog',0
722
open_dialog_name:
723
        db 'opendial',0
724
communication_area_default_path:
725
        db '/rd/1/File managers/',0
726
 
727
Filter:
728
dd Filter.end - Filter ;.1
729
.1:
730
db 'NC',0
731
db 'PNG',0
732
.end:
733
db 0
734
 
735
 
7440 theonlymir 736
;[
737
;for test
738
main_menu dd 0
739
port_menu dd 0
7427 theonlymir 740
 
7440 theonlymir 741
sz_PortMenu  db 'COM 12     ',0
742
sz_COMport   db 'COM port 12',0
743
sz_USBport   db 'USB port   ',0
744
sz_OTHERport db 'Other port ',0
745
 
746
coord:
747
  .x dw 100
748
  .y dw 200
749
;]
750
 
7427 theonlymir 751
head_f_i:
752
head_f_l db 'Системная ошибка',0
753
 
754
system_dir_0 db '/sys/lib/'
755
lib_name_0 db 'proc_lib.obj',0
756
err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
757
err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
758
 
759
system_dir_1 db '/sys/lib/'
760
lib_name_1 db 'libimg.obj',0
761
err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
762
err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
763
 
764
system_dir_2 db '/sys/lib/'
765
lib_name_2 db 'buf2d.obj',0
766
err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
767
err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
768
 
769
system_dir_3 db '/sys/lib/'
770
lib_name_3 db 'box_lib.obj',0
771
err_msg_found_lib_3 db 'Не найдена библиотека ',39,'box_lib.obj',39,0
772
err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,0
773
 
7440 theonlymir 774
system_dir_4 db '/sys/lib/'
775
lib_name_4 db 'kmenu.obj',0
776
err_msg_found_lib_4 db 'Не найдена библиотека ',39,'kmenu.obj',39,0
777
err_msg_import_4 db 'Ошибка при импорте библиотеки ',39,'kmenu',39,0
778
 
7427 theonlymir 779
l_libs_start:
780
        lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
781
                err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
782
        lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
783
                err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
784
        lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\
785
                err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i
786
        lib_3 l_libs lib_name_3, sys_path, file_name,  system_dir_3,\
787
                err_msg_found_lib_3, head_f_l, import_box_lib,err_msg_import_3,head_f_i
7440 theonlymir 788
        lib_4 l_libs lib_name_4, sys_path, file_name, system_dir_4,\
789
                err_msg_found_lib_4, head_f_l, import_libkmenu,err_msg_import_4,head_f_i
7427 theonlymir 790
l_libs_end:
791
 
792
align 4
793
import_libimg:
794
        dd alib_init1
795
        img_is_img  dd aimg_is_img
796
        img_info    dd aimg_info
797
        img_from_file dd aimg_from_file
798
        img_to_file dd aimg_to_file
799
        img_from_rgb dd aimg_from_rgb
800
        img_to_rgb  dd aimg_to_rgb
801
        img_to_rgb2 dd aimg_to_rgb2
802
        img_decode  dd aimg_decode
803
        img_encode  dd aimg_encode
804
        img_create  dd aimg_create
805
        img_destroy dd aimg_destroy
806
        img_destroy_layer dd aimg_destroy_layer
807
        img_count   dd aimg_count
808
        img_lock_bits dd aimg_lock_bits
809
        img_unlock_bits dd aimg_unlock_bits
810
        img_flip    dd aimg_flip
811
        img_flip_layer dd aimg_flip_layer
812
        img_rotate  dd aimg_rotate
813
        img_rotate_layer dd aimg_rotate_layer
814
        img_draw    dd aimg_draw
815
 
816
        dd 0,0
817
        alib_init1   db 'lib_init',0
818
        aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
819
        aimg_info    db 'img_info',0
820
        aimg_from_file db 'img_from_file',0
821
        aimg_to_file db 'img_to_file',0
822
        aimg_from_rgb db 'img_from_rgb',0
823
        aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
824
        aimg_to_rgb2 db 'img_to_rgb2',0
825
        aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
826
        aimg_encode  db 'img_encode',0
827
        aimg_create  db 'img_create',0
828
        aimg_destroy db 'img_destroy',0
829
        aimg_destroy_layer db 'img_destroy_layer',0
830
        aimg_count   db 'img_count',0
831
        aimg_lock_bits db 'img_lock_bits',0
832
        aimg_unlock_bits db 'img_unlock_bits',0
833
        aimg_flip    db 'img_flip',0
834
        aimg_flip_layer db 'img_flip_layer',0
835
        aimg_rotate  db 'img_rotate',0
836
        aimg_rotate_layer db 'img_rotate_layer',0
837
        aimg_draw    db 'img_draw',0
838
 
839
align 4
840
proclib_import: ;описание экспортируемых функций
841
        OpenDialog_Init dd aOpenDialog_Init
842
        OpenDialog_Start dd aOpenDialog_Start
843
dd 0,0
844
        aOpenDialog_Init db 'OpenDialog_init',0
845
        aOpenDialog_Start db 'OpenDialog_start',0
846
 
847
align 4
848
import_buf2d:
849
        init dd sz_init
850
        buf2d_create dd sz_buf2d_create
851
        buf2d_create_f_img dd sz_buf2d_create_f_img
852
        buf2d_clear dd sz_buf2d_clear
853
        buf2d_draw dd sz_buf2d_draw
854
        buf2d_delete dd sz_buf2d_delete
855
        buf2d_resize dd sz_buf2d_resize
856
        buf2d_line dd sz_buf2d_line
857
        buf2d_line_sm dd sz_buf2d_line_sm
858
        buf2d_rect_by_size dd sz_buf2d_rect_by_size
859
        buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
860
        buf2d_circle dd sz_buf2d_circle
861
        buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
862
        buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
863
        buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
864
        buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
865
        buf2d_bit_blt dd sz_buf2d_bit_blt
866
        buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
867
        buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
868
        buf2d_curve_bezier dd sz_buf2d_curve_bezier
869
        buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
870
        buf2d_draw_text dd sz_buf2d_draw_text
871
        buf2d_crop_color dd sz_buf2d_crop_color
872
        buf2d_flip_h dd sz_buf2d_flip_h
873
        buf2d_flip_v dd sz_buf2d_flip_v
874
        buf2d_offset_h dd sz_buf2d_offset_h
875
        buf2d_flood_fill dd sz_buf2d_flood_fill
876
        buf2d_set_pixel dd sz_buf2d_set_pixel
877
        dd 0,0
878
        sz_init db 'lib_init',0
879
        sz_buf2d_create db 'buf2d_create',0
880
        sz_buf2d_create_f_img db 'buf2d_create_f_img',0
881
        sz_buf2d_clear db 'buf2d_clear',0
882
        sz_buf2d_draw db 'buf2d_draw',0
883
        sz_buf2d_delete db 'buf2d_delete',0
884
        sz_buf2d_resize db 'buf2d_resize',0
885
        sz_buf2d_line db 'buf2d_line',0
886
        sz_buf2d_line_sm db 'buf2d_line_sm',0
887
        sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
888
        sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
889
        sz_buf2d_circle db 'buf2d_circle',0
890
        sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
891
        sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
892
        sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
893
        sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
894
        sz_buf2d_bit_blt db 'buf2d_bit_blt',0
895
        sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
896
        sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
897
        sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
898
        sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
899
        sz_buf2d_draw_text db 'buf2d_draw_text',0
900
        sz_buf2d_crop_color db 'buf2d_crop_color',0
901
        sz_buf2d_flip_h db 'buf2d_flip_h',0
902
        sz_buf2d_flip_v db 'buf2d_flip_v',0
903
        sz_buf2d_offset_h db 'buf2d_offset_h',0
904
        sz_buf2d_flood_fill db 'buf2d_flood_fill',0
905
        sz_buf2d_set_pixel db 'buf2d_set_pixel',0
906
 
907
align 4
908
import_box_lib:
909
        dd sz_init1
910
 
911
        init_checkbox   dd sz_Init_checkbox
912
        check_box_draw  dd sz_Check_box_draw
913
        check_box_mouse dd sz_Check_box_mouse
914
        ;version_ch     dd sz_Version_ch
915
 
916
        option_box_draw  dd sz_Option_box_draw
917
        option_box_mouse dd sz_Option_box_mouse
918
        ;version_op      dd sz_Version_op
919
 
920
        edit_box_draw      dd sz_edit_box_draw
921
        edit_box_key       dd sz_edit_box_key
922
        edit_box_mouse     dd sz_edit_box_mouse
923
        edit_box_set_text  dd sz_edit_box_set_text
924
        scrollbar_ver_draw dd sz_scrollbar_ver_draw
925
        scrollbar_hor_draw dd sz_scrollbar_hor_draw
926
 
927
        progressbar_draw     dd sz_progressbar_draw
928
        progressbar_progress dd sz_progressbar_progress
929
 
930
        dd 0,0
931
        sz_init1 db 'lib_init',0
932
 
933
        sz_Init_checkbox   db 'init_checkbox2',0
934
        sz_Check_box_draw  db 'check_box_draw2',0
935
        sz_Check_box_mouse db 'check_box_mouse2',0
936
        ;sz_Version_ch     db 'version_ch2',0
937
 
938
        sz_Option_box_draw      db 'option_box_draw',0
939
        sz_Option_box_mouse     db 'option_box_mouse',0
940
        ;sz_Version_op      db 'version_op',0
941
 
942
        sz_edit_box_draw      db 'edit_box',0
943
        sz_edit_box_key       db 'edit_box_key',0
944
        sz_edit_box_mouse     db 'edit_box_mouse',0
945
        sz_edit_box_set_text  db 'edit_box_set_text',0
946
        sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
947
        sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
948
 
949
        sz_progressbar_draw     db 'progressbar_draw', 0
950
        sz_progressbar_progress db 'progressbar_progress', 0
951
 
952
align 4
7440 theonlymir 953
import_libkmenu:
954
        kmenu_init      dd akmenu_init
955
        kmainmenu_draw  dd akmainmenu_draw
956
        kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
957
        ksubmenu_new    dd aksubmenu_new
958
        ksubmenu_delete dd aksubmenu_delete
959
        ksubmenu_draw   dd aksubmenu_draw
960
        ksubmenu_add    dd aksubmenu_add
961
        kmenuitem_new   dd akmenuitem_new
962
        kmenuitem_delete dd akmenuitem_delete
963
        kmenuitem_draw  dd akmenuitem_draw
964
dd 0,0
965
        akmenu_init     db 'kmenu_init',0
966
        akmainmenu_draw db 'kmainmenu_draw',0
967
        akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
968
        aksubmenu_new   db 'ksubmenu_new',0
969
        aksubmenu_delete db 'ksubmenu_delete',0
970
        aksubmenu_draw  db 'ksubmenu_draw',0
971
        aksubmenu_add   db 'ksubmenu_add',0
972
        akmenuitem_new  db 'kmenuitem_new',0
973
        akmenuitem_delete db 'kmenuitem_delete',0
974
        akmenuitem_draw  db 'kmenuitem_draw',0
975
 
976
button_press  dd 0     ;for kmenu
977
 
978
align 4
7427 theonlymir 979
mouse_dd dd 0
980
last_time dd 0
981
 
982
align 16
983
sc system_colors
984
 
985
align 16
986
procinfo process_information
987
 
988
align 4
989
buf_0: dd 0 ;указатель на буфер изображения
990
.l: dw 15 ;+4 left
991
.t: dw 50 ;+6 top
992
.w: dd 384 ;+8 w
993
.h: dd 350 ;+12 h
994
.color: dd 0xffffd0 ;+16 color
995
        db 24 ;+20 bit in pixel
996
 
997
align 4
998
buf_1:
999
        dd 0 ;указатель на буфер изображения
1000
        dd 0 ;+4 left,top
1001
.w: dd 0
1002
.h: dd 0,0,24 ;+12 color,bit in pixel
1003
 
1004
font_h dd 0 ;высота шрифта
1005
 
1006
;input:
1007
; eax - число
1008
; edi - буфер для строки
1009
; len - длинна буфера
1010
;output:
1011
align 4
1012
proc convert_int_to_str uses eax ecx edx edi esi, len:dword
1013
        mov esi,[len]
1014
        add esi,edi
1015
        dec esi
1016
        call .str
1017
        ret
1018
endp
1019
 
1020
align 4
1021
.str:
1022
        mov ecx,10
1023
        cmp eax,ecx
1024
        jb @f
1025
                xor edx,edx
1026
                div ecx
1027
                push edx
1028
                ;dec edi  ;смещение необходимое для записи с конца строки
1029
                call .str
1030
                pop eax
1031
        @@:
1032
        cmp edi,esi
1033
        jge @f
1034
                or al,0x30
1035
                stosb
1036
                mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор
1037
        @@:
1038
        ret
1039
 
1040
align 4
1041
proc mem_copy uses ecx esi edi, destination:dword, source:dword, len:dword
1042
        cld
1043
        mov esi, dword[source]
1044
        mov edi, dword[destination]
1045
        mov ecx, dword[len]
1046
        rep movsb
1047
        ret
1048
endp
1049
 
1050
edMaxSize = 511
1051
edMax = 0 ;max, size, pos
1052
 
1053
align 4
1054
editFileName  edit_box 270,450,78, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, fileNameBuffer.data, mouse_dd, 0, edMax, edMax
1055
editCommand   edit_box 150,450,121, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, commandBuffer.data, mouse_dd, 0, edMax, edMax
1056
 
1057
opt1 option_box opt_gr1, 433,64, 6,12,0xd0d0ff, 0xff, 0x80ff,txt_filename,txt_filename.end-txt_filename
1058
opt2 option_box opt_gr1, 433,107,6,12,0xd0d0ff, 0xff, 0x80ff,txt_command,txt_command.end-txt_command
1059
opt_gr1 dd opt1
1060
align 4
1061
opt_grlist1 dd opt1,opt2,0 ;end option group
1062
 
1063
pb:
1064
.value          dd 0
1065
.left           dd 0
1066
.top            dd 0
1067
.width          dd 0
1068
.height         dd 0
1069
.style          dd 0
1070
.min            dd 0
1071
.max            dd 0
1072
.back_color     dd 0
1073
.progress_color dd 0
1074
.frame_color    dd 0
1075
 
1076
fileNameBuffer:
1077
.data: rb 512
1078
.size: rd 1
1079
fileNameBufferEnd:
1080
 
1081
commandBuffer:
1082
.data: rb 512
1083
.size: rd 1
1084
commandBufferEnd:
1085
 
1086
align 16
1087
i_end:
1088
        rb 2048
1089
thread_coords:
1090
        rb 2048
1091
thread_scale:
1092
        rb 2048
1093
thread_n_file:
1094
        rb 2048
1095
stacktop:
1096
        sys_path rb 1024
7438 theonlymir 1097
        file_name:   rb 1024 ;4096
7427 theonlymir 1098
        library_path rb 1024
7438 theonlymir 1099
        plugin_path  rb 4096
7427 theonlymir 1100
        openfile_path rb 4096
1101
        filename_area rb 256
7440 theonlymir 1102
        pi rb 1024
7427 theonlymir 1103
mem:
1104