Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1032 Lrz 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;Basic macros for use editbox                             ;
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
 
1228 Lrz 5
macro init_editbox
6
{
7
pushad
8
	mcall
9
 
10
popad
11
}
12
 
13
 
14
macro use_editbox_draw
15
{
16
edit_box:
1032 Lrz 17
.draw:
18
        pushad
19
;--- рисуем рамку ---
20
        mov     edi,dword [esp+36]
21
        call    .draw_border            ; Функция стабильна
22
.draw_bg_cursor_text:
23
;--- изменяем смещение, если надо ---
24
        call    .check_offset           ;вычисление позиции курсора стабильна
25
;--- рисуем внутреннюю область ---
26
        call    .draw_bg                ;нарисовать прямоугольник рабочей области
27
;---- рисуем выделение, по shift если есть
28
        call    .draw_shift
29
.draw_cursor_text:
30
;--- рисуем курсор ---
31
        ;--- может его не надо рисовать ----
32
        test    word ed_flags,ed_focus
1214 Lrz 33
        jz     	@f
1032 Lrz 34
        call    .draw_cursor
35
@@:
36
        call    .draw_text
37
;        ret
38
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39
;Общий выход из editbox для всех функций и пост обработчиков;;
40
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41
.editbox_exit:
42
        popad
43
        ret 4
44
}
45
 
46
 
47
macro use_editbox_key
48
{
49
;==========================================================
50
;=== обработка клавиатуры =================================
51
;==========================================================
52
edit_box_key:
53
pushad
54
        mov     edi,dword [esp+36]
55
        test    word ed_flags,ed_focus ; если не в фокусе, выходим
56
        je      edit_box.editbox_exit
57
        test    word ed_flags,ed_mouse_on
58
        jne     edit_box.editbox_exit
59
 
60
;Проверка нажат shift ?
61
        call    edit_box_key.check_shift
62
;----------------------------------------------------------
63
;--- проверяем, что нажато --------------------------------
64
;----------------------------------------------------------
65
use_key_process  backspase,delete,left,right,home,end,insert
66
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
67
;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика
68
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
69
use_key_no_process   up,down,esc,enter,tab,numl,capsl,scrolll
70
;--- нажата другая клавиша ---
71
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72
;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос
73
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
74
use_key_figures_only
75
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
76
;проверка на shift был ли нажат
77
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78
are_key_shift_press
79
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80
; проверяем, находится ли курсор в конце + дальнейшая обработка
81
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
82
are_key_cur_end
83
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
84
;Обработка клавиш insert,delete.backspase,home,end,left,right
85
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
86
use_work_key
87
}
88
 
89
macro use_editbox_mouse
90
{
91
;==========================================================
92
;=== обработка мыши =======================================
93
;==========================================================
94
;save for stdcall ebx,esi,edi,ebp
95
edit_box_mouse:
96
pushad
97
        mov     edi,dword [esp+36]
98
;debug
99
;----------------------------------------------------------
100
;--- получаем состояние кнопок мыши -----------------------
101
;----------------------------------------------------------
102
        mcall   37,2
103
;----------------------------------------------------------
104
;--- проверяем состояние ----------------------------------
105
;----------------------------------------------------------
106
        test    eax,1
107
        jnz     edit_box_mouse.mouse_left_button
108
        and     word ed_flags,ed_mouse_on_off
1214 Lrz 109
	mov	ebx,dword ed_mouse_variable
110
	push	0
111
	pop	dword [ebx]
112
;        mov     dword [ebx],ebx
1032 Lrz 113
        jmp     edit_box.editbox_exit
114
.mouse_left_button:
115
;----------------------------------------------------------
116
;--- блокировка от фокусировки в других боксах при попадании на них курсора
117
;----------------------------------------------------------
1214 Lrz 118
        mov     eax,dword ed_mouse_variable
119
	push	dword [eax]
120
	pop	eax
1032 Lrz 121
        test    eax,eax
122
        jz      @f
123
        cmp     eax,edi
124
        je      @f
125
        jmp     edit_box_mouse._blur
126
;----------------------------------------------------------
127
;--- получаем координаты мыши относительно 0 т.е всей области экрана
128
;----------------------------------------------------------
129
@@:     mcall   37,1
130
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
131
;Функция обработки  мышки получение координат и проверка их + выделения
132
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133
use_work_mouse
134
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
135
;Общие функции обработки
136
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137
use_general_func
138
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
139
;Функции для работы с key
140
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
141
use_key_func
142
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
143
;Функции для работы с mouse
144
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
145
use_mouse_func
146
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147
;Bit mask from editbox
148
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149
}
150
 
151
 
152
 
153
 
154
 
155
 
156
 
157
 
158
 
159
 
160
 
161
 
162
 
163
 
164
 
165
 
166
 
167
 
168
 
169
 
170
 
171
 
172
 
173
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
174
;ниже расположены функции которыми реализуется весь алгоритм
175
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
176
;Макрос для вывода основных функций которые испльзуются боксом
177
macro use_general_func
178
{
179
;debug_func
180
;----------------------------------------------------------
181
;--- процедура прорисовки выделеной части -----------------
182
;----------------------------------------------------------
183
edit_box.draw_shift:
184
        test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
185
        jz      @f
186
        mov     ebp,shift_color
187
        mov     ebx,dword       ed_shift_pos
188
        call    edit_box_key.sh_cl_
189
@@:     ret
190
;----------------------------------------------------------
191
;--- процедура прорисовки текста --------------------------
192
;----------------------------------------------------------
193
edit_box.draw_text:
194
;--- вычисляем, сколько помещается символов ---
195
;--- чтобы мусор не рисовать ---
196
        call    edit_box.get_n
197
        mov     esi,ed_size
198
        mov     ebx,ed_offset
199
        sub     esi,ebx
200
        cmp     eax,esi
201
        jae     @F
202
        mov     esi,eax         ;чтобы не выходить за пределы экрана
203
;--- рисуем текст ---
204
@@:     mov     eax,4
205
        mov     ebx,ed_left
206
        mov     edx,ed_offset
207
        add     ebx,2
208
        shl     ebx,16
209
        add     ebx,ed_top
210
        mov     ecx,ed_text_color
211
        add     ebx,4
212
        add     edx,ed_text
213
        mcall
214
ret
215
;----------------------------------------------------------
216
;--- процедура прорисовки фона ----------------------------
217
;входные данные
218
;eax
219
;edx - color
220
;----------------------------------------------------------
1596 Lrz 221
 
1032 Lrz 222
edit_box.draw_bg:
223
        mov     ebx,ed_left
224
        add     ebx,1
225
        mov     edx,ed_color
226
        shl     ebx,16
227
        add     ebx,ed_width
228
        sub     ebx,1
1596 Lrz 229
;вход только цвет edx
1032 Lrz 230
edit_box.draw_bg_eax:
231
        mov     ecx,ed_top
232
        mov     eax,13
233
        add     ecx,1
234
        shl     ecx,16
235
        add     ecx,ed_height
236
        dec     ecx
237
        mcall
238
ret
239
;----------------------------------------------------------
240
;--- процедура получения количества символов в текущей щирине компонента
241
;----------------------------------------------------------
242
edit_box.get_n:
243
        mov     eax,ed_width    ;получем ширину компонента
244
        xor     edx,edx   ;результат распологается в паре edx:eax в eax - остаток
245
        sub     eax,4           ;вычтим 4
246
        mov     ebx,6           ;загрузми делитель
247
        div     ebx             ;размделим на 6
248
ret
249
;----------------------------------------------------------
250
;--- процедура рисования курсора --------------------------
251
;----------------------------------------------------------
252
;входные ebp- цвет
253
edit_box.clear_cursor:
254
        mov     edx,ebp
255
        mov     ebx,cl_curs_x
256
        mov     ecx,cl_curs_y
257
        jmp     edit_box.draw_curs
258
edit_box.draw_cursor:
259
        mov     edx,ed_text_color
260
        mov     ebx,ed_pos
261
        mov     ecx,ed_offset
262
        sub     ebx,ecx
263
 
264
        lea     ebx,[ebx*2+ebx]
265
        shl     ebx,1
266
        ;imul   ebx,6
267
        add     ebx,ed_left
268
        mov     ecx,ed_top
269
        inc     ebx
270
        add     ecx,2
271
        mov     ebp,ebx
272
        shl     ebx,16
273
        mov     bx,bp
274
        mov     ebp,ecx
275
 
276
        shl     ecx,16
277
        mov     cx,bp
278
        add     ecx,ed_height-4
279
 
280
        mov     cl_curs_x,ebx
281
        mov     cl_curs_y,ecx
282
edit_box.draw_curs:
283
        mcall   38
284
ret
285
;----------------------------------------------------------
286
;--- процедура рисования рамки ----------------------------
287
;----------------------------------------------------------
288
edit_box.draw_border:
289
;--- цвет рамки ---
290
        test    word ed_flags,ed_focus
291
        mov     edx,ed_focus_border_color
292
        jne     @f
293
        mov     edx,ed_blur_border_color
294
@@:
295
;--- сверху ---
296
        mov     eax,38
297
        mov     ebx,ed_left
298
        mov     ecx,ebx
299
        shl     ebx,16
300
        mov     bx,cx
301
        add     ebx,ed_width
302
        mov     ecx,ed_top
303
        mov     esi,ecx
304
        shl     ecx,16
305
        mov     cx,si
306
        mcall
307
;--- снизу ---
308
        mov     esi,ecx
309
        add     ecx,ed_height
310
        mov     ebp,ecx
311
        shl     ecx,16
312
        mov     cx,bp
313
        mcall
314
;--- слева ---
315
        mov     cx,si
316
        mov     ebp,ebx
317
        sub     ebx,ed_width
318
        mcall
319
;--- справа ---
320
        mov     ebx,ebp
321
        shl     ebx,16
322
        mov     bx,bp
323
        mcall
324
ret
325
;----------------------------------------------------------
326
;--- проверка, зашел ли курсор за границы и, если надо, ---
327
;--- изменяем смещение ------------------------------------
328
;--- если смещение было установка флага ed_offset_cl иначе
329
; если ничего не изменилось то выставление ed_offset_fl
1619 IgorA 330
; в общей битовой матрице состояния компонентов word ed_flags
1032 Lrz 331
;----------------------------------------------------------
332
edit_box.check_offset:
333
pushad
334
        mov     ecx,ed_pos
335
        mov     ebx,ed_offset
336
        cmp     ebx,ecx
337
        ja      edit_box.sub_8
338
 
339
        push    ebx
1596 Lrz 340
        call    edit_box.get_n  ;получим кол-во символов которые уменщаются в ширине компонента, в паре регистров edx:eax
1032 Lrz 341
        pop     ebx
342
        mov     edx,ebx
343
        add     edx,eax         ;ed_offset+width editbox
1596 Lrz 344
        inc     edx             ;необходимо для нормального положения курсора в крайней левой позиции
1032 Lrz 345
        cmp     edx,ecx
346
        ja      @f
347
 
348
        mov     edx,ed_size
349
        cmp     edx,ecx
350
        je      edit_box.add_end
351
 
352
        sub     edx,ecx
353
        cmp     edx,8
354
        jbe     edit_box.add_8
355
        add     ebx,8
356
        jmp     edit_box.chk_d
357
 
1216 Lrz 358
edit_box.sub_8:
1596 Lrz 359
	test    ecx,ecx
360
        jz      edit_box.sub_min
1032 Lrz 361
        cmp     ebx,8
362
        jbe     edit_box.sub_min
363
        sub     ebx,8   ;ebx=ed_offset
364
        jmp     edit_box.chk_d
365
edit_box.sub_min:
366
        xor     ebx,ebx
367
        jmp     edit_box.chk_d
368
 
369
edit_box.add_end:sub    edx,eax
370
        mov     ebx,edx
371
        jmp     edit_box.chk_d
372
edit_box.add_8: add     ebx,edx
373
edit_box.chk_d: mov     ed_offset,ebx
374
        call    edit_box.draw_bg
375
        and     word ed_flags,ed_offset_cl
376
edit_ex
1596 Lrz 377
@@:
1032 Lrz 378
        or      word ed_flags,ed_offset_fl
1596 Lrz 379
 
1032 Lrz 380
edit_ex
1619 IgorA 381
 
382
align 4
383
proc edit_box_set_text, edit:dword, text:dword
384
pushad
385
	mov edi,dword[edit]
386
	mov ecx,ed_max
387
	inc ecx ;учитываем будущее обрезание строки для ascii 0
388
	mov edi,dword[text]
389
	xor al,al
390
	cld
391
	repne scasb ;поиск в строке edi символа al
392
	mov ecx,edi ;ecx = text + мин. значение из: 1) ed_max или 2) длинны строки text
393
 
394
	mov edi,dword[edit]
395
	mov esi,dword[text]
396
	sub ecx,esi ;ecx = длинна строки text (но не больше чем ed_max)
397
	dec ecx
398
	mov ed_size,ecx ;ставим новый размер строки
399
	mov ed_pos,ecx ;ставим курсор в конец новой строки
400
	mov edi,ed_text
401
	repne movsb ;копирование текстовой строки text в edit_box
402
	mov byte[edi],0 ;ставим ascii 0 в конце строки
403
popad
404
ret
405
endp
1032 Lrz 406
}
407
 
408
macro use_key_func
409
{
410
;Обработка Shift для снятия выделения неизвестной области
411
edit_box_key.shift: ;;;;;;;SHIFT
412
        test    word ed_flags,ed_shift
413
        je      edit_box_key.f_exit
414
 
415
@@:     mov     ebp,shift_color
416
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
417
        mov     ebx,dword       ed_shift_pos
418
        call    edit_box_key.sh_cl_
419
        jmp     edit_box.draw_cursor_text
420
;;;;;;;;;;;;;;;;;;;;;
1596 Lrz 421
edit_box_key.f_exit:
422
	call	edit_box.check_offset
1032 Lrz 423
        and     word ed_flags,ed_shift_cl
424
        call    edit_box_key.enable_null
425
        jmp     edit_box.draw_cursor_text
426
edit_box_key.sh_cl_:
427
;;;;;;SHIFT end
428
;обработка очистки, при левом - правом движении выделения
429
;для обработки снятия выделения
430
;входные параметры ebp=color ebx=ed_shift_pos
431
        mov     eax,dword       ed_pos
432
        cmp     eax,ebx
433
 
434
        jae     edit_box_key.sh_n
435
        push    eax  ;меньшее в eax
436
        push    ebx  ;большее
437
        jmp     edit_box_key.sh_n1
438
                     ;если иначе
1214 Lrz 439
edit_box_key.sh_n:
440
	push    ebx
1032 Lrz 441
        push    eax
442
edit_box_key.sh_n1:
443
        call    edit_box.check_offset
444
        call    edit_box.get_n
445
        mov     edx,eax ;size of ed_box
446
        mov     ecx,ed_offset
447
        add     eax,ecx ;eax = w_off= ed_offset+width
448
        mov     edx,eax ;save
449
        pop     ebx     ;большее
450
        pop     eax     ;меньшее
451
 
452
        cmp     eax,ecx         ;сравнение с меньшего с offset.
453
        jae     edit_box_key.f_f            ;если больше
454
        xor     eax,eax
455
        cmp     edx,ebx         ;cравним размер w_off с большим
456
        jb      @f
457
        sub     ebx,ecx
458
        jmp     edit_box_key.nxt_f
459
@@:     mov     ebx,edx
460
        sub     ebx,ecx
461
        jmp     edit_box_key.nxt_f
462
edit_box_key.f_f:
463
        sub     eax,ecx
464
        cmp     edx,ebx         ;cравним размер w_off с большим
465
        jle     @f
466
        sub     ebx,ecx
467
        sub     ebx,eax
468
        jmp     edit_box_key.nxt_f
469
@@:
470
        mov     ebx,edx
471
        sub     ebx,ecx
472
        sub     ebx,eax
473
edit_box_key.nxt_f:
474
        mov     edx,ebx
475
        lea     ebx,[eax*2+eax]
476
        shl     ebx,1
477
        add     ebx,ed_left
478
        inc     ebx
479
        shl     ebx,16
480
        lea     ecx,[edx*2+edx]
481
        shl     ecx,1
482
        mov     bx,cx
483
        inc     ebx
484
        mov     edx,ebp;shift_color
485
 
486
        call    edit_box.draw_bg_eax
487
@@:     call    edit_box_key.enable_null
488
        ret
489
;;;;;;;;;;;;;;;;;;;;;
490
;Установка- снятие выделения в один символ
491
;;;;;;;;;;;;;;;;;;;;;
492
edit_box_key.drw_sim:
493
        mov     eax,dword       ed_pos
494
        call    edit_box_key.draw_rectangle   ;нарисовать прямоугольник с заданным цветом
495
        jmp     @b
496
;;;;;;;;;;;;;;;;;;;;;
497
;Фукция установки выделения при движения влево и вправо и нажатии shift
498
;Логика:
499
;;;;;;;;;;
500
edit_box_key.draw_wigwag:
501
;функция установки переменных
502
        mov     ebp,shift_color
503
        call    edit_box.clear_cursor
504
 
505
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
506
        mov     ebp,shift_color
507
        mov     eax,dword       ed_pos
508
        test    word ed_flags,ed_left_fl
509
        jz      edit_box_key.low
510
        jmp     @f
511
;;;;;;;;;;
512
;Фукция удаления выделения при движения влево и вправо и нажатии shift
513
;Логика:
514
;;;;;;;;;;
515
edit_box_key.draw_wigwag_cl:
516
;функция установки переменных
517
        mov     ebp,ed_color
518
        call    edit_box.clear_cursor
519
 
520
        mov     ebp,ed_color
521
        mov     eax,dword       ed_pos
522
        test    word ed_flags,ed_left_fl
523
        jz      edit_box_key.low
524
@@:     call    edit_box_key.draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
525
        ret
526
edit_box_key.low:   dec     eax
527
        jmp     @b
528
;входной параметр ebx - ed_pos
529
edit_box_key.sh_first_sh:
530
        test    word ed_flags,ed_shift
531
        je      @f
532
        mov     dword ed_shift_pos_old,ebx
533
        test    word ed_flags,ed_shift_on
534
        jne     @f
535
        mov     dword ed_shift_pos,ebx
536
        or      word ed_flags,ed_shift_on
537
@@:     ret
538
;Обработка крайних положений в editbox при нажатом shift
539
;производит снятие выделение, если нет shift
540
;иначе вообще выходит
541
edit_box_key.sh_st_of:
542
        test    word ed_flags,ed_shift
543
        jne     @f
544
        test    word ed_flags,ed_shift_bac
545
        je      @f
546
        mov     ebp,ed_color
547
        mov     ebx,dword       ed_shift_pos
548
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
549
        and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
550
        jmp     edit_box.draw_cursor_text
551
@@:
552
        and     word ed_flags,ed_shift_off
1113 diamond 553
        popad
554
        ret     4
1032 Lrz 555
;проверка состояния shift был ли он нажат раньше?
556
edit_box_key.sh_enable:
557
        test    word ed_flags,ed_shift
558
        jne     edit_box_key.sh_ext_en ;нарисовать закрашеный прямоугольник
559
 
560
        test    word ed_flags,ed_shift_bac
561
        je      @f
562
        call    edit_box.check_offset
563
 
564
        mov     ebp,ed_color
565
        mov     ebx,dword       ed_shift_pos
566
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
567
        call    edit_box_key.draw_wigwag_cl
568
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
569
        ret
570
 
571
@@:     mov     ebp,ed_color
572
        call    edit_box.clear_cursor
573
        call    edit_box.check_offset
574
        ret
575
edit_box_key.sh_ext_en:
576
        call    edit_box.check_offset
577
        test    word ed_flags,ed_offset_fl
578
        je      @f
579
;Рисование закрашеных прямоугольников и очистка их
580
        mov     eax,dword       ed_shift_pos
581
        mov     ebx,dword       ed_pos
582
        mov     ecx,dword       ed_shift_pos_old
583
;проверка и рисование закрашеных областей
584
        cmp     eax,ecx
585
        je      edit_box_key.1_shem
586
        jb      edit_box_key.smaller
587
        cmp     ecx,ebx
588
        ja      edit_box_key.1_shem
589
        call    edit_box_key.draw_wigwag_cl ;clear
590
        jmp     edit_box_key.sh_e_end
591
edit_box_key.smaller:
592
        cmp     ecx,ebx
593
        jb      edit_box_key.1_shem
594
        call    edit_box_key.draw_wigwag_cl ;clear
595
        jmp     edit_box_key.sh_e_end
596
;alike  =
597
edit_box_key.1_shem:        call   edit_box_key.draw_wigwag
598
edit_box_key.sh_e_end:      and     word ed_flags,ed_shift_off
599
        ret
600
@@:     mov     ebp,shift_color
601
        mov     ebx,dword       ed_shift_pos
602
        call    edit_box_key.sh_cl_
603
        jmp     edit_box_key.sh_e_end
604
;функция для обработки shift при нажатии home and end
605
edit_box_key.sh_home_end:
606
        mov     ebp,ed_color
607
        call    edit_box.clear_cursor
608
        test    word ed_flags,ed_shift_bac
609
        je      @f
610
        mov     ebp,ed_color
611
        mov     ebx,dword       ed_shift_pos_old
612
        call    edit_box_key.sh_cl_
613
 
614
@@:     test    word ed_flags,ed_shift
615
        je      edit_box_key.sh_exit_ ;выйти
616
        mov     ebp,shift_color
617
        mov     ebx,dword       ed_shift_pos
618
        call    edit_box_key.sh_cl_
619
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
620
        jmp     edit_box_key.sh_e_end
1216 Lrz 621
edit_box_key.sh_exit_:
1596 Lrz 622
        call    edit_box.draw_bg
1216 Lrz 623
	call    edit_box.check_offset
1032 Lrz 624
        ret
625
;функция внесения 0 по адресу ed_size+1
626
edit_box_key.enable_null:
627
        pusha
628
        mov     eax,ed_size
629
        mov     ebx,ed_text
630
        test    eax,eax
631
        add     eax,ebx
632
        jne     @f
633
        inc     eax
634
@@:     xor     ebx,ebx
635
        mov     [eax],bl
636
edit_ex
637
;- удаление символа
638
;Входные данные edx=ed_size;ecx=ed_pos
639
edit_box_key.del_char:
640
        mov     esi,ed_text
641
        test    word ed_flags,ed_shift_on
642
        je      @f
643
        mov     eax,dword ed_shift_pos
644
        mov     ebx,esi
645
        cmp     eax,ecx
646
        jae     edit_box_key.dh_n
647
 
648
        mov     ed_pos,eax      ;что бы не было убегания курсора
649
        mov     ebp,ecx
650
        sub     ebp,eax
651
        add     ebx,eax  ;eax меньше
652
        sub     edx,ecx
653
        add     esi,ecx
654
 
655
        mov     dword ed_shift_pos,ebp
656
        jmp     edit_box_key.del_ch_sh
657
                     ;если иначе
658
edit_box_key.dh_n:
659
        mov     ebp,eax
660
        sub     ebp,ecx
661
        add     ebx,ecx
662
        sub     edx,eax
663
        add     esi,eax
664
        mov     dword ed_shift_pos,ebp
665
        jmp     edit_box_key.del_ch_sh
666
 
667
@@:     add     esi,ecx ;указатель + смещение к реальному буфферу
668
        mov     ebx,esi
669
        inc     esi
670
        cld
671
 
672
        sub     edx,ecx
673
edit_box_key.del_ch_sh:
674
 
675
        push    edi
676
        mov     edi,ebx
677
@@:
678
        lodsb
679
        stosb
680
        dec edx
681
        jns @b
682
 
683
        pop edi
684
        ret
685
;вычислить закрашиваемую область
686
;соглашение в ebp - передается ed_size
687
edit_box_key.clear_bg:
688
        call    edit_box.get_n  ;получить размер в символах ширины компонента
689
        push    eax
690
        mov     ebx,ed_offset
691
        add     eax,ebx ;eax = w_off= ed_offset+width
692
        mov     ebx,ebp ;ed_size
693
 
694
        cmp     eax,ebx
695
        jb      @f
696
        mov     eax,ed_pos
697
        sub     ebx,eax
698
        mov     ecx,ed_offset
699
        sub     eax,ecx
700
        jmp     edit_box_key.nxt
701
@@:     mov     ebx,ed_pos
702
        push    ebx
703
        sub     eax,ebx
704
        mov     ebx,eax ;It is don't optimal
705
 
706
        pop     eax     ;ed_pos
707
        mov     ecx,ed_offset
708
        sub     eax,ecx
709
edit_box_key.nxt:
710
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
711
        add     ebp,ebx
712
        pop     edx
713
        cmp     ebp,edx
714
        je      @f
715
        inc     ebx
716
 
717
@@:     mov     edx,ebx
718
        lea     ebx,[eax*2+eax]
719
        shl     ebx,1
720
        add     ebx,ed_left
721
        inc     ebx
722
        shl     ebx,16
723
        lea     ecx,[edx*2+edx]
724
        shl     ecx,1
725
        mov     bx,cx
726
        mov     edx,ed_color
727
        call    edit_box.draw_bg_eax
728
        ret
729
;;;;;;;;;;;;;;;;;;;
730
;;; Обработка примитивов
731
;;;;;;;;;;;;;;;;;;;;
732
;Нарисовать прямоугольник, цвет передается в ebp
733
;входные параметры:
734
;eax=dword ed_pos
735
;ebp=-цвет ed_color or shift_color
736
edit_box_key.draw_rectangle:
737
        mov     ecx,dword ed_offset
738
        sub     eax,ecx
739
        lea     ebx,[eax*2+eax]
740
        shl     ebx,1
741
        inc     ebx
742
        add     ebx,ed_left
743
        shl     ebx,16
744
        add     ebx,6
745
        mov     edx,ebp
746
        call    edit_box.draw_bg_eax
747
        ret
748
;;;;;;;;;;;;;;;;;;
749
;;Проверка нажат ли shift
750
;;;;;;;;;;;;;;;;;;
751
edit_box_key.check_shift:
752
pusha   ;сохраним все регистры
1034 Lrz 753
        mcall   66,3
1032 Lrz 754
        test    al,0x03
755
        je      @f
756
        or      word ed_flags,ed_shift   ;установим флаг
757
@@:edit_ex
758
}
759
;макрос клавиш на которые происходит реакция
760
macro use_key_process backspase,delete,left,right,home,end,insert
761
{
762
if backspase eq
763
else
764
        cmp     ah,8
765
        jz      edit_box_key.backspace
766
end if
767
if delete eq
768
else
769
        cmp     ah,0xb6
770
        jz      edit_box_key.delete
771
end if
772
if left eq
773
else
774
        cmp     ah,176
775
        jz      edit_box_key.left
776
end if
777
if right eq
778
else
779
        cmp     ah,179
780
        jz      edit_box_key.right
781
end if
782
if home eq
783
else
784
        cmp     ah,180
785
        jz      edit_box_key.home
786
end if
787
if home eq
788
else
789
        cmp     ah,181
790
        jz      edit_box_key.end
791
end if
792
if insert eq
793
else
794
        cmp     ah,185  ;insert
795
        jz      edit_box_key.insert
796
end if
797
}
798
 
799
macro use_key_no_process  up,down,esc,enter,tab,numl,capsl,scrolll
800
{
801
if up eq
802
else
803
        cmp     ah,177
804
        jz      edit_box.editbox_exit
805
end if
806
if down eq
807
else
808
        cmp     ah,178
809
        jz      edit_box.editbox_exit
810
end if
811
if esc eq
812
else
813
        cmp     ah,27   ;ESC - клавиша ))
814
        jz      edit_box.editbox_exit
815
end if
816
if enter eq
817
else
818
        cmp     ah,13   ;ENTER - клавиша ))
819
        jz      edit_box.editbox_exit
820
end if
821
if tab eq
822
else
823
        cmp     ah,9   ;TAB - клавиша ))
824
        jz      edit_box.editbox_exit
825
end if
826
 
827
if numl eq
828
else
829
        cmp     ah,4   ;Num Lock - клавиша ))
830
        jz      edit_box.editbox_exit
831
end if
832
 
833
if capsl eq
834
else
835
        cmp     ah,2   ;Caps Lock - клавиша ))
836
        jz      edit_box.editbox_exit
837
end if
838
 
839
if scrolll eq
840
else
841
        cmp     ah,1   ;Scroll Lock - клавиша ))
842
        jz      edit_box.editbox_exit
843
end if
844
 
845
}
846
 
847
macro use_key_figures_only
848
{
849
        test    word ed_flags,ed_figure_only  ; только цифры ?
850
        jz      @f
851
        cmp     ah,'0'
852
        jb      edit_box.editbox_exit
853
        cmp     ah,'9'
854
        ja      edit_box.editbox_exit
855
@@:
856
}
857
macro are_key_shift_press
858
{
859
        test    word ed_flags,ed_shift_on
860
        je      @f
861
        ;Входные данные edx=ed_size;ecx=ed_pos
862
        push    eax
863
        mov     edx,ed_size
864
        mov     ecx, ed_pos
865
        pusha
866
;;;;;;;;;;;;;;;;;;;;;
867
;clear input arrea
868
        mov     ebp,ed_color
869
        mov     ebx,dword       ed_shift_pos
870
        call    edit_box_key.sh_cl_
871
        mov     ebp,ed_size
872
        call    edit_box_key.clear_bg
873
;;;;;;;;;;;;;;;;;;;;;
874
        popa
875
        call    edit_box_key.del_char
876
;;;;
877
        mov     eax,dword ed_shift_pos
878
        mov     ebx,ed_size
879
        sub     ebx,eax
880
        mov     ed_size,ebx
881
        pop     eax
882
@@:
883
}
884
macro are_key_cur_end
885
{
886
        mov     ecx,ed_size
887
        mov     edx, ed_max
888
        test    word ed_flags,ed_insert
889
        jne     @f
890
        cmp     ecx,edx
891
        jae     edit_box.editbox_exit
892
@@:     mov     ebx, ed_pos
893
        cmp     ebx,edx
894
        jl      @f ; если меньше или равно
895
        jmp     edit_box.editbox_exit
896
 
897
@@:     ; сдвигаем символы после курсора вправо
898
        mov     ecx,ed_size
899
        push    edi eax
900
        mov     ebp,edi
901
        mov     esi,ed_text     ; Указатель на буфер
902
                                ;Будем работать со строкой
903
        add     esi,ecx         ;add ed_size добавим max size
904
        mov     edi,esi
905
 
906
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
907
        je      edit_box_key.In_k
908
 
1216 Lrz 909
        test    dword bp_flags,ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
1032 Lrz 910
        jne     edit_box_key.ins_v
911
;clear
912
pusha
913
        mov     edi,ebp
914
        mov     ebp,ed_size
915
        call    edit_box_key.clear_bg
916
popa
917
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
918
        inc     edi             ;Сместим наши символы в право
919
        std
920
        inc     ecx
921
   @@:
922
        ;--------
923
        lodsb
924
        stosb
925
        ;--------
926
        loop    @b
1214 Lrz 927
edit_box_key.In_k:
928
	cld
1032 Lrz 929
        pop eax
930
        mov al,ah
931
        stosb
932
        pop edi
933
; вставляем код клавиши туда, где курсор
934
        ; увеличиваем значение размера и позиции
935
        inc      dword ed_size
936
        inc      dword ed_pos
937
        call    edit_box_key.draw_all2
938
        jmp     edit_box_key.shift
939
}
940
macro use_work_key
941
{
942
edit_box_key.insert: test   word ed_flags,ed_insert ;not    word ed_insert
943
         je     @f
944
         and    word ed_flags,ed_insert_cl
945
 
946
        jmp     edit_box.editbox_exit
947
@@:
948
        or      word ed_flags,ed_insert
949
        jmp     edit_box.editbox_exit
950
edit_box_key.ins_v:
1216 Lrz 951
;        dec     dword [ebp+48];ed_size    ;processing is insert
952
	dec	dword bp_size
1032 Lrz 953
        sub     esi,ecx
954
        add     esi,ebx
955
        mov     edi,esi
956
;clear
957
pusha
958
        mov     edi,ebp
959
        mov     ebp,ed_pos
960
        call    edit_box_key.clear_bg
961
popa
962
        jmp     edit_box_key.In_k
963
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
964
edit_box_key.delete:
965
        mov     edx,ed_size
966
        mov     ecx,ed_pos
967
        cmp     edx,ecx
968
        jg      edit_box_key.bac_del
969
        test    word ed_flags,ed_shift_on
970
        jne     edit_box_key.del_bac
1113 diamond 971
        popad
972
        ret     4
1032 Lrz 973
edit_box_key.bac_del:
974
        call    edit_box_key.del_char
975
        jmp     edit_box_key.draw_all
976
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
977
;--- нажата клавиша backspace ---
978
edit_box_key.backspace:
979
        ; проверяем, курсор у левого края ?
980
        mov     ecx,ed_pos
981
        test    ecx,ecx
982
        jnz     edit_box_key.del_bac
983
        test    word ed_flags,ed_shift_on
984
        jne     edit_box_key.bac_del
1113 diamond 985
        popad
986
        ret     4
1032 Lrz 987
 
988
edit_box_key.del_bac:
989
        mov     edx,ed_size
990
        cmp     edx,ecx ;if ed_pos=ed_size
991
        je      @f
992
        dec     ecx
993
        call    edit_box_key.del_char
994
@@:     test    word ed_flags,ed_shift_on
995
        jne     edit_box_key.bac_del
996
        dec      dword ed_pos
997
edit_box_key.draw_all:
998
        push    edit_box_key.shift;.draw_cursor_text;eax
999
 
1000
        test    word ed_flags,ed_shift_on
1001
        je      @f
1002
        mov     eax,dword ed_shift_pos
1003
        mov     ebx,ed_size
1004
        sub     ebx,eax
1005
        mov     ed_size,ebx
1006
 
1007
        mov     ebp,ed_color
1008
        call    edit_box.clear_cursor
1009
        call    edit_box.check_offset
1010
        call    edit_box.draw_bg
1011
        ret
1012
@@:     dec      dword ed_size
1013
 
1014
edit_box_key.draw_all2:
1015
        and    word ed_flags,ed_shift_cl
1016
        mov     ebp,ed_color
1017
        call    edit_box.clear_cursor
1018
        call    edit_box.check_offset
1019
        mov     ebp,ed_size
1020
        call    edit_box_key.clear_bg
1021
        ret
1022
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1023
;--- нажата клавиша left ---
1214 Lrz 1024
edit_box_key.left:
1025
	mov     ebx,ed_pos
1032 Lrz 1026
        test    ebx,ebx
1027
        jz      edit_box_key.sh_st_of
1028
        or      word ed_flags,ed_left_fl
1029
        call    edit_box_key.sh_first_sh
1030
        dec      dword ed_pos
1031
        call    edit_box_key.sh_enable
1032
        jmp     edit_box.draw_cursor_text
1033
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1034
;--- нажата клавиша right ---
1214 Lrz 1035
edit_box_key.right:
1036
	mov     ebx,ed_pos
1032 Lrz 1037
        cmp     ebx,ed_size
1038
        je      edit_box_key.sh_st_of
1039
        and     word ed_flags,ed_right_fl
1040
        call    edit_box_key.sh_first_sh
1041
        inc     dword  ed_pos
1042
        call    edit_box_key.sh_enable
1043
        jmp     edit_box.draw_cursor_text
1044
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1045
edit_box_key.home:
1046
        mov     ebx,ed_pos
1047
        test    ebx,ebx
1048
        jz      edit_box_key.sh_st_of
1049
        call    edit_box_key.sh_first_sh
1050
        xor     eax,eax
1051
        mov     ed_pos,eax
1052
        call    edit_box_key.sh_home_end
1053
        jmp     edit_box.draw_cursor_text
1054
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1055
edit_box_key.end:
1056
        mov     ebx,ed_pos
1057
        cmp     ebx,dword ed_size
1058
        je      edit_box_key.sh_st_of
1059
        call    edit_box_key.sh_first_sh
1060
        mov     eax,ed_size
1061
        mov     ed_pos,eax
1062
        call    edit_box_key.sh_home_end
1063
        jmp     edit_box.draw_cursor_text
1064
}
1065
 
1066
macro use_mouse_func
1067
{
1068
;----------------------------------------------------------
1069
;--- Обработка .mouse_wigwag
1070
;----------------------------------------------------------
1071
edit_box_mouse.mouse_wigwag:
1072
        shr     eax,16
1073
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
1074
;;;;;;;;;;;;;;;;;;
1075
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
1076
;;;;;;;;;;;;;;;;;;
1077
        test    ax,0x8000
1078
        jnz     edit_box_mouse.mleft
1079
 
1080
        mov     ebx,ed_left
1081
        cmp     eax,ebx
1082
        jb      edit_box_mouse.mleft
1083
 
1084
        add     ebx,ed_width
1085
        cmp     eax,ebx
1086
        ja      edit_box_mouse.mright
1087
 
1088
        sub     ebx,ed_width
1089
 
1090
        xor     edx,edx
1091
        sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
1092
        mov     ebx,6
1093
        div     ebx
1094
;;;;;;;;;;;;;;;;;;
1095
;;процедура обработки положения выделенного текста, в пределах области editbox
1096
;;;;;;;;;;;;;;;;;;
1097
;Получили координаты в eax мышки, т.е. куда она переместилась
1098
;Рисование закрашеных прямоугольников и очистка их
1099
        add     eax,ed_offset   ;добавим смещение
1100
        cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
1101
        ja      edit_box_mouse.mwigvag
1102
edit_box_mouse.mdraw:
1103
        mov     dword   ed_pos,eax ;сохраним новое значение
1104
;Рисование закрашеных прямоугольников и очистка их
1105
        mov     ecx,dword       ed_shift_pos
1106
        mov     ebx,dword       ed_shift_pos_old
1107
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
1108
;проверка и рисование закрашеных областей
1109
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
1110
        je      edit_box_mouse.m1_shem        ;движения не было ранее
1111
        jb      edit_box_mouse.msmaller       ;движение было ->
1112
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
1113
        ja      edit_box_mouse.m1_shem        ;если было движение <- то нужно закрасить область
1114
        je      edit_box_mouse.mwigvag        ;если изменения не было, то ничего не делать
1115
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
1116
;входные параметры ebp=color ebx=ed_shift_pos
1117
        call    edit_box_key.sh_cl_
1118
        jmp     edit_box_mouse.mwigvag
1119
edit_box_mouse.msmaller:
1120
        cmp     ebx,eax
1121
        jb      edit_box_mouse.m1_shem
1122
        mov     ebp,ed_color
1123
;входные параметры ebp=color ebx=ed_shift_pos
1124
        call    edit_box_key.sh_cl_
1125
        jmp     edit_box_mouse.mwigvag
1126
;alike  =
1127
edit_box_mouse.m1_shem:
1128
        mov     ebp,shift_color
1129
;входные параметры ebp=color ebx=ed_shift_pos
1130
        mov     ebx,ecx
1131
        call    edit_box_key.sh_cl_
1132
        jmp     edit_box_mouse.mwigvag
1133
edit_box_mouse.mwigvag:
1134
        and     word ed_flags,ed_shift_mcl
1135
        jmp     edit_box.draw_cursor_text
1136
;       popa
1137
;       ret
1138
edit_box_mouse.mleft:
1139
        mov     eax,ed_pos
1140
        cmp     eax,0
1141
        jbe      edit_box_mouse.mwigvag
1142
        dec     eax
1143
        call    edit_box.check_offset
1144
        push    eax
1145
        mov     ebx,ed_shift_pos
1146
        mov     ebp,shift_color
1147
        call    edit_box_key.sh_cl_
1148
        pop     eax
1149
        jmp     edit_box_mouse.mdraw
1150
edit_box_mouse.mright:
1151
        mov     eax,ed_pos
1152
        mov     ebx,ed_size
1153
        cmp     eax,ebx
1154
        jae     edit_box_mouse.mwigvag
1155
        inc     eax
1156
        call    edit_box.check_offset
1157
        mov     ebx,ed_shift_pos
1158
        mov     ebp,shift_color
1159
        push    eax
1160
        call    edit_box_key.sh_cl_
1161
        pop     eax
1162
        jmp     edit_box_mouse.mdraw
1163
}
1164
 
1165
macro use_work_mouse
1166
;----------------------------------------------------------
1167
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
1168
;----------------------------------------------------------
1169
{
1170
        test    word ed_flags,ed_mouse_on
1171
        jne     edit_box_mouse.mouse_wigwag
1172
;----------------------------------------------------------
1173
;--- проверяем, попадает ли курсор в edit box -------------
1174
;----------------------------------------------------------
1175
        mov     ebx,ed_top
1176
        cmp     ax,bx
1177
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1178
 
1179
        add     ebx,ed_height
1180
        cmp     ax,bx
1181
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1182
 
1183
        shr     eax,16
1184
 
1185
        mov     ebx,ed_left
1186
        cmp     ax,bx
1187
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1188
 
1189
        add     ebx,ed_width
1190
 
1191
        cmp     ax,bx
1192
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1193
 
1194
;--- изменяем позицию курсора ---
1195
        push    eax
1196
        mov     ebp,ed_color
1197
        call    edit_box.clear_cursor
1198
        pop     eax
1199
edit_box_mouse._mvpos:
1200
        xor     edx,edx
1201
        sub     eax,ed_left
1202
 
1203
        mov     ebx,6
1204
        div     bx
1205
        add     eax,ed_offset
1206
        cmp     eax,ed_size
1207
        jna     edit_box_mouse._mshift
1208
        mov     eax,ed_size
1209
 
1210
edit_box_mouse._mshift:
1211
;;;;;;;
1212
;;Секция обработки shift и выделения по shift
1213
;;;;;;;
1214
        test    word ed_flags,ed_shift_bac
1215
        je      @f
1216
        mov     ebp,dword       ed_color
1217
        mov     ebx,dword ed_shift_pos
1218
        push    eax
1219
        call    edit_box_key.sh_cl_
1220
        and     word ed_flags,ed_shift_bac_cl
1221
        pop     eax
1222
@@:
1223
        test    word ed_flags,ed_mouse_on
1224
        jne     @f
1225
 
1226
        mov     dword ed_shift_pos,eax
1227
        or      word  ed_flags,ed_mouse_on
1228
        mov     dword ed_pos,eax
1214 Lrz 1229
 
1230
;        mov     dword [mouse_flag],edi          ;установим идентификатор
1231
 
1232
       	mov	ebx,dword ed_mouse_variable
1233
	push	edi
1234
	pop	dword [ebx]
1235
 
1236
 
1237
 
1238
 
1032 Lrz 1239
        bts     word ed_flags,1                 ;установка фокуса
1240
        jmp     edit_box_mouse.m_sh
1241
@@:
1242
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
1243
        je      edit_box.editbox_exit
1244
        mov     ed_pos,eax
1245
        mov     ebp,dword shift_color
1246
        mov     ebx,dword ed_shift_pos
1247
        call    edit_box_key.sh_cl_
1248
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
1214 Lrz 1249
edit_box_mouse.m_sh:
1250
	call    edit_box.draw_text
1032 Lrz 1251
        call    edit_box.draw_cursor
1252
;----------------------------------------------------------
1253
;--- процедура установки фокуса ---------------------------
1254
;----------------------------------------------------------
1255
        jmp     edit_box_mouse.drc
1256
edit_box_mouse._blur:
1257
        test    word ed_flags,ed_always_focus
1258
        jne     edit_box.editbox_exit
1259
        btr     word ed_flags,1 ; если не в фокусе, выходим
1260
        jnc     edit_box.editbox_exit
1261
 
1262
        mov     ebp,ed_color
1263
        call    edit_box.clear_cursor
1264
edit_box_mouse.drc:   call    edit_box.draw_border
1265
        jmp     edit_box.editbox_exit
1266
}
1267
 
1268
 
1269
; Макрос выхода
1270
macro edit_ex
1271
{
1272
popad
1273
ret
1274
}
1275
macro debug
1276
{
1277
        ;-----------  отладка
1278
        pushad
1279
;        mov     dword [ed_buffer.2],0
1280
;        mov     eax,edi
1281
        mov eax,dword [ed_buffer.2]
1282
        mov edi,ed_buffer.3
1283
        call .str
1284
        ;рисование фона
1285
        mov eax,13
1286
        mov ebx,178*65536+70
1287
        mov ecx,28*65536+10
1288
        xor edx,edx
1289
        int 0x40
1290
        ;вывод значения на экран
1291
        mov eax,4
1292
        mov ebx,180*65536+30
1293
        mov ecx,0x10DDBBCC
1294
        mov edx,ed_buffer.3
1295
        mov esi,8
1296
        int 0x40
1297
        popad
1298
        ;----------- отладка
1299
}
1300
macro   debug_func
1301
{
1302
.str:
1303
        mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1304
         ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1305
        cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1306
        jb @f
1307
        xor edx,edx  ;очистить edx
1308
        div ecx      ;разделить - остаток в edx
1309
        push edx     ;положить в стек
1310
        ;dec edi             ;смещение необходимое для записи с конца строки
1311
        call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1312
        pop eax
1313
        @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1314
        ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1315
        ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1316
        or al,0x30  ;данная команда короче  чем две выше
1317
        stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1318
 
1319
        ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1320
}
1321
 
1214 Lrz 1322
ed_struc_size=76
1032 Lrz 1323
struc  edit_box width,left,top,color,shift_color,focus_border_color,\
1214 Lrz 1324
       blur_border_color,text_color,max,text,mouse_variable,flags,size,pos
1032 Lrz 1325
{
1326
.width dd width
1327
.left dd left
1328
.top dd top
1329
.color dd color
1330
.shift_color dd shift_color
1331
.focus_border_color dd focus_border_color
1332
.blur_border_color dd blur_border_color
1333
.text_color dd text_color
1334
.max dd max
1335
.text dd text
1214 Lrz 1336
.mouse_variable dd mouse_variable
1032 Lrz 1337
.flags dd flags+0
1338
.size dd size+0
1339
.pos dd pos+0
1340
.offset dd 0
1341
.cl_curs_x dd 0
1342
.cl_curs_y dd 0
1343
.shift   dd 0
1344
.shift_old   dd 0
1345
}