Subversion Repositories Kolibri OS

Rev

Rev 1476 | Rev 1619 | 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
330
; в общей битовой маррице состояния компонентов word ed_flags
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
381
}
382
 
383
macro use_key_func
384
{
385
;Обработка Shift для снятия выделения неизвестной области
386
edit_box_key.shift: ;;;;;;;SHIFT
387
        test    word ed_flags,ed_shift
388
        je      edit_box_key.f_exit
389
 
390
@@:     mov     ebp,shift_color
391
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
392
        mov     ebx,dword       ed_shift_pos
393
        call    edit_box_key.sh_cl_
394
        jmp     edit_box.draw_cursor_text
395
;;;;;;;;;;;;;;;;;;;;;
1596 Lrz 396
edit_box_key.f_exit:
397
	call	edit_box.check_offset
1032 Lrz 398
        and     word ed_flags,ed_shift_cl
399
        call    edit_box_key.enable_null
400
        jmp     edit_box.draw_cursor_text
401
edit_box_key.sh_cl_:
402
;;;;;;SHIFT end
403
;обработка очистки, при левом - правом движении выделения
404
;для обработки снятия выделения
405
;входные параметры ebp=color ebx=ed_shift_pos
406
        mov     eax,dword       ed_pos
407
        cmp     eax,ebx
408
 
409
        jae     edit_box_key.sh_n
410
        push    eax  ;меньшее в eax
411
        push    ebx  ;большее
412
        jmp     edit_box_key.sh_n1
413
                     ;если иначе
1214 Lrz 414
edit_box_key.sh_n:
415
	push    ebx
1032 Lrz 416
        push    eax
417
edit_box_key.sh_n1:
418
        call    edit_box.check_offset
419
        call    edit_box.get_n
420
        mov     edx,eax ;size of ed_box
421
        mov     ecx,ed_offset
422
        add     eax,ecx ;eax = w_off= ed_offset+width
423
        mov     edx,eax ;save
424
        pop     ebx     ;большее
425
        pop     eax     ;меньшее
426
 
427
        cmp     eax,ecx         ;сравнение с меньшего с offset.
428
        jae     edit_box_key.f_f            ;если больше
429
        xor     eax,eax
430
        cmp     edx,ebx         ;cравним размер w_off с большим
431
        jb      @f
432
        sub     ebx,ecx
433
        jmp     edit_box_key.nxt_f
434
@@:     mov     ebx,edx
435
        sub     ebx,ecx
436
        jmp     edit_box_key.nxt_f
437
edit_box_key.f_f:
438
        sub     eax,ecx
439
        cmp     edx,ebx         ;cравним размер w_off с большим
440
        jle     @f
441
        sub     ebx,ecx
442
        sub     ebx,eax
443
        jmp     edit_box_key.nxt_f
444
@@:
445
        mov     ebx,edx
446
        sub     ebx,ecx
447
        sub     ebx,eax
448
edit_box_key.nxt_f:
449
        mov     edx,ebx
450
        lea     ebx,[eax*2+eax]
451
        shl     ebx,1
452
        add     ebx,ed_left
453
        inc     ebx
454
        shl     ebx,16
455
        lea     ecx,[edx*2+edx]
456
        shl     ecx,1
457
        mov     bx,cx
458
        inc     ebx
459
        mov     edx,ebp;shift_color
460
 
461
        call    edit_box.draw_bg_eax
462
@@:     call    edit_box_key.enable_null
463
        ret
464
;;;;;;;;;;;;;;;;;;;;;
465
;Установка- снятие выделения в один символ
466
;;;;;;;;;;;;;;;;;;;;;
467
edit_box_key.drw_sim:
468
        mov     eax,dword       ed_pos
469
        call    edit_box_key.draw_rectangle   ;нарисовать прямоугольник с заданным цветом
470
        jmp     @b
471
;;;;;;;;;;;;;;;;;;;;;
472
;Фукция установки выделения при движения влево и вправо и нажатии shift
473
;Логика:
474
;;;;;;;;;;
475
edit_box_key.draw_wigwag:
476
;функция установки переменных
477
        mov     ebp,shift_color
478
        call    edit_box.clear_cursor
479
 
480
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
481
        mov     ebp,shift_color
482
        mov     eax,dword       ed_pos
483
        test    word ed_flags,ed_left_fl
484
        jz      edit_box_key.low
485
        jmp     @f
486
;;;;;;;;;;
487
;Фукция удаления выделения при движения влево и вправо и нажатии shift
488
;Логика:
489
;;;;;;;;;;
490
edit_box_key.draw_wigwag_cl:
491
;функция установки переменных
492
        mov     ebp,ed_color
493
        call    edit_box.clear_cursor
494
 
495
        mov     ebp,ed_color
496
        mov     eax,dword       ed_pos
497
        test    word ed_flags,ed_left_fl
498
        jz      edit_box_key.low
499
@@:     call    edit_box_key.draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
500
        ret
501
edit_box_key.low:   dec     eax
502
        jmp     @b
503
;входной параметр ebx - ed_pos
504
edit_box_key.sh_first_sh:
505
        test    word ed_flags,ed_shift
506
        je      @f
507
        mov     dword ed_shift_pos_old,ebx
508
        test    word ed_flags,ed_shift_on
509
        jne     @f
510
        mov     dword ed_shift_pos,ebx
511
        or      word ed_flags,ed_shift_on
512
@@:     ret
513
;Обработка крайних положений в editbox при нажатом shift
514
;производит снятие выделение, если нет shift
515
;иначе вообще выходит
516
edit_box_key.sh_st_of:
517
        test    word ed_flags,ed_shift
518
        jne     @f
519
        test    word ed_flags,ed_shift_bac
520
        je      @f
521
        mov     ebp,ed_color
522
        mov     ebx,dword       ed_shift_pos
523
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
524
        and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
525
        jmp     edit_box.draw_cursor_text
526
@@:
527
        and     word ed_flags,ed_shift_off
1113 diamond 528
        popad
529
        ret     4
1032 Lrz 530
;проверка состояния shift был ли он нажат раньше?
531
edit_box_key.sh_enable:
532
        test    word ed_flags,ed_shift
533
        jne     edit_box_key.sh_ext_en ;нарисовать закрашеный прямоугольник
534
 
535
        test    word ed_flags,ed_shift_bac
536
        je      @f
537
        call    edit_box.check_offset
538
 
539
        mov     ebp,ed_color
540
        mov     ebx,dword       ed_shift_pos
541
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
542
        call    edit_box_key.draw_wigwag_cl
543
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
544
        ret
545
 
546
@@:     mov     ebp,ed_color
547
        call    edit_box.clear_cursor
548
        call    edit_box.check_offset
549
        ret
550
edit_box_key.sh_ext_en:
551
        call    edit_box.check_offset
552
        test    word ed_flags,ed_offset_fl
553
        je      @f
554
;Рисование закрашеных прямоугольников и очистка их
555
        mov     eax,dword       ed_shift_pos
556
        mov     ebx,dword       ed_pos
557
        mov     ecx,dword       ed_shift_pos_old
558
;проверка и рисование закрашеных областей
559
        cmp     eax,ecx
560
        je      edit_box_key.1_shem
561
        jb      edit_box_key.smaller
562
        cmp     ecx,ebx
563
        ja      edit_box_key.1_shem
564
        call    edit_box_key.draw_wigwag_cl ;clear
565
        jmp     edit_box_key.sh_e_end
566
edit_box_key.smaller:
567
        cmp     ecx,ebx
568
        jb      edit_box_key.1_shem
569
        call    edit_box_key.draw_wigwag_cl ;clear
570
        jmp     edit_box_key.sh_e_end
571
;alike  =
572
edit_box_key.1_shem:        call   edit_box_key.draw_wigwag
573
edit_box_key.sh_e_end:      and     word ed_flags,ed_shift_off
574
        ret
575
@@:     mov     ebp,shift_color
576
        mov     ebx,dword       ed_shift_pos
577
        call    edit_box_key.sh_cl_
578
        jmp     edit_box_key.sh_e_end
579
;функция для обработки shift при нажатии home and end
580
edit_box_key.sh_home_end:
581
        mov     ebp,ed_color
582
        call    edit_box.clear_cursor
583
        test    word ed_flags,ed_shift_bac
584
        je      @f
585
        mov     ebp,ed_color
586
        mov     ebx,dword       ed_shift_pos_old
587
        call    edit_box_key.sh_cl_
588
 
589
@@:     test    word ed_flags,ed_shift
590
        je      edit_box_key.sh_exit_ ;выйти
591
        mov     ebp,shift_color
592
        mov     ebx,dword       ed_shift_pos
593
        call    edit_box_key.sh_cl_
594
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
595
        jmp     edit_box_key.sh_e_end
1216 Lrz 596
edit_box_key.sh_exit_:
1596 Lrz 597
        call    edit_box.draw_bg
1216 Lrz 598
	call    edit_box.check_offset
1032 Lrz 599
        ret
600
;функция внесения 0 по адресу ed_size+1
601
edit_box_key.enable_null:
602
        pusha
603
        mov     eax,ed_size
604
        mov     ebx,ed_text
605
        test    eax,eax
606
        add     eax,ebx
607
        jne     @f
608
        inc     eax
609
@@:     xor     ebx,ebx
610
        mov     [eax],bl
611
edit_ex
612
;- удаление символа
613
;Входные данные edx=ed_size;ecx=ed_pos
614
edit_box_key.del_char:
615
        mov     esi,ed_text
616
        test    word ed_flags,ed_shift_on
617
        je      @f
618
        mov     eax,dword ed_shift_pos
619
        mov     ebx,esi
620
        cmp     eax,ecx
621
        jae     edit_box_key.dh_n
622
 
623
        mov     ed_pos,eax      ;что бы не было убегания курсора
624
        mov     ebp,ecx
625
        sub     ebp,eax
626
        add     ebx,eax  ;eax меньше
627
        sub     edx,ecx
628
        add     esi,ecx
629
 
630
        mov     dword ed_shift_pos,ebp
631
        jmp     edit_box_key.del_ch_sh
632
                     ;если иначе
633
edit_box_key.dh_n:
634
        mov     ebp,eax
635
        sub     ebp,ecx
636
        add     ebx,ecx
637
        sub     edx,eax
638
        add     esi,eax
639
        mov     dword ed_shift_pos,ebp
640
        jmp     edit_box_key.del_ch_sh
641
 
642
@@:     add     esi,ecx ;указатель + смещение к реальному буфферу
643
        mov     ebx,esi
644
        inc     esi
645
        cld
646
 
647
        sub     edx,ecx
648
edit_box_key.del_ch_sh:
649
 
650
        push    edi
651
        mov     edi,ebx
652
@@:
653
        lodsb
654
        stosb
655
        dec edx
656
        jns @b
657
 
658
        pop edi
659
        ret
660
;вычислить закрашиваемую область
661
;соглашение в ebp - передается ed_size
662
edit_box_key.clear_bg:
663
        call    edit_box.get_n  ;получить размер в символах ширины компонента
664
        push    eax
665
        mov     ebx,ed_offset
666
        add     eax,ebx ;eax = w_off= ed_offset+width
667
        mov     ebx,ebp ;ed_size
668
 
669
        cmp     eax,ebx
670
        jb      @f
671
        mov     eax,ed_pos
672
        sub     ebx,eax
673
        mov     ecx,ed_offset
674
        sub     eax,ecx
675
        jmp     edit_box_key.nxt
676
@@:     mov     ebx,ed_pos
677
        push    ebx
678
        sub     eax,ebx
679
        mov     ebx,eax ;It is don't optimal
680
 
681
        pop     eax     ;ed_pos
682
        mov     ecx,ed_offset
683
        sub     eax,ecx
684
edit_box_key.nxt:
685
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
686
        add     ebp,ebx
687
        pop     edx
688
        cmp     ebp,edx
689
        je      @f
690
        inc     ebx
691
 
692
@@:     mov     edx,ebx
693
        lea     ebx,[eax*2+eax]
694
        shl     ebx,1
695
        add     ebx,ed_left
696
        inc     ebx
697
        shl     ebx,16
698
        lea     ecx,[edx*2+edx]
699
        shl     ecx,1
700
        mov     bx,cx
701
        mov     edx,ed_color
702
        call    edit_box.draw_bg_eax
703
        ret
704
;;;;;;;;;;;;;;;;;;;
705
;;; Обработка примитивов
706
;;;;;;;;;;;;;;;;;;;;
707
;Нарисовать прямоугольник, цвет передается в ebp
708
;входные параметры:
709
;eax=dword ed_pos
710
;ebp=-цвет ed_color or shift_color
711
edit_box_key.draw_rectangle:
712
        mov     ecx,dword ed_offset
713
        sub     eax,ecx
714
        lea     ebx,[eax*2+eax]
715
        shl     ebx,1
716
        inc     ebx
717
        add     ebx,ed_left
718
        shl     ebx,16
719
        add     ebx,6
720
        mov     edx,ebp
721
        call    edit_box.draw_bg_eax
722
        ret
723
;;;;;;;;;;;;;;;;;;
724
;;Проверка нажат ли shift
725
;;;;;;;;;;;;;;;;;;
726
edit_box_key.check_shift:
727
pusha   ;сохраним все регистры
1034 Lrz 728
        mcall   66,3
1032 Lrz 729
        test    al,0x03
730
        je      @f
731
        or      word ed_flags,ed_shift   ;установим флаг
732
@@:edit_ex
733
}
734
;макрос клавиш на которые происходит реакция
735
macro use_key_process backspase,delete,left,right,home,end,insert
736
{
737
if backspase eq
738
else
739
        cmp     ah,8
740
        jz      edit_box_key.backspace
741
end if
742
if delete eq
743
else
744
        cmp     ah,0xb6
745
        jz      edit_box_key.delete
746
end if
747
if left eq
748
else
749
        cmp     ah,176
750
        jz      edit_box_key.left
751
end if
752
if right eq
753
else
754
        cmp     ah,179
755
        jz      edit_box_key.right
756
end if
757
if home eq
758
else
759
        cmp     ah,180
760
        jz      edit_box_key.home
761
end if
762
if home eq
763
else
764
        cmp     ah,181
765
        jz      edit_box_key.end
766
end if
767
if insert eq
768
else
769
        cmp     ah,185  ;insert
770
        jz      edit_box_key.insert
771
end if
772
}
773
 
774
macro use_key_no_process  up,down,esc,enter,tab,numl,capsl,scrolll
775
{
776
if up eq
777
else
778
        cmp     ah,177
779
        jz      edit_box.editbox_exit
780
end if
781
if down eq
782
else
783
        cmp     ah,178
784
        jz      edit_box.editbox_exit
785
end if
786
if esc eq
787
else
788
        cmp     ah,27   ;ESC - клавиша ))
789
        jz      edit_box.editbox_exit
790
end if
791
if enter eq
792
else
793
        cmp     ah,13   ;ENTER - клавиша ))
794
        jz      edit_box.editbox_exit
795
end if
796
if tab eq
797
else
798
        cmp     ah,9   ;TAB - клавиша ))
799
        jz      edit_box.editbox_exit
800
end if
801
 
802
if numl eq
803
else
804
        cmp     ah,4   ;Num Lock - клавиша ))
805
        jz      edit_box.editbox_exit
806
end if
807
 
808
if capsl eq
809
else
810
        cmp     ah,2   ;Caps Lock - клавиша ))
811
        jz      edit_box.editbox_exit
812
end if
813
 
814
if scrolll eq
815
else
816
        cmp     ah,1   ;Scroll Lock - клавиша ))
817
        jz      edit_box.editbox_exit
818
end if
819
 
820
}
821
 
822
macro use_key_figures_only
823
{
824
        test    word ed_flags,ed_figure_only  ; только цифры ?
825
        jz      @f
826
        cmp     ah,'0'
827
        jb      edit_box.editbox_exit
828
        cmp     ah,'9'
829
        ja      edit_box.editbox_exit
830
@@:
831
}
832
macro are_key_shift_press
833
{
834
        test    word ed_flags,ed_shift_on
835
        je      @f
836
        ;Входные данные edx=ed_size;ecx=ed_pos
837
        push    eax
838
        mov     edx,ed_size
839
        mov     ecx, ed_pos
840
        pusha
841
;;;;;;;;;;;;;;;;;;;;;
842
;clear input arrea
843
        mov     ebp,ed_color
844
        mov     ebx,dword       ed_shift_pos
845
        call    edit_box_key.sh_cl_
846
        mov     ebp,ed_size
847
        call    edit_box_key.clear_bg
848
;;;;;;;;;;;;;;;;;;;;;
849
        popa
850
        call    edit_box_key.del_char
851
;;;;
852
        mov     eax,dword ed_shift_pos
853
        mov     ebx,ed_size
854
        sub     ebx,eax
855
        mov     ed_size,ebx
856
        pop     eax
857
@@:
858
}
859
macro are_key_cur_end
860
{
861
        mov     ecx,ed_size
862
        mov     edx, ed_max
863
        test    word ed_flags,ed_insert
864
        jne     @f
865
        cmp     ecx,edx
866
        jae     edit_box.editbox_exit
867
@@:     mov     ebx, ed_pos
868
        cmp     ebx,edx
869
        jl      @f ; если меньше или равно
870
        jmp     edit_box.editbox_exit
871
 
872
@@:     ; сдвигаем символы после курсора вправо
873
        mov     ecx,ed_size
874
        push    edi eax
875
        mov     ebp,edi
876
        mov     esi,ed_text     ; Указатель на буфер
877
                                ;Будем работать со строкой
878
        add     esi,ecx         ;add ed_size добавим max size
879
        mov     edi,esi
880
 
881
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
882
        je      edit_box_key.In_k
883
 
1216 Lrz 884
        test    dword bp_flags,ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
1032 Lrz 885
        jne     edit_box_key.ins_v
886
;clear
887
pusha
888
        mov     edi,ebp
889
        mov     ebp,ed_size
890
        call    edit_box_key.clear_bg
891
popa
892
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
893
        inc     edi             ;Сместим наши символы в право
894
        std
895
        inc     ecx
896
   @@:
897
        ;--------
898
        lodsb
899
        stosb
900
        ;--------
901
        loop    @b
1214 Lrz 902
edit_box_key.In_k:
903
	cld
1032 Lrz 904
        pop eax
905
        mov al,ah
906
        stosb
907
        pop edi
908
; вставляем код клавиши туда, где курсор
909
        ; увеличиваем значение размера и позиции
910
        inc      dword ed_size
911
        inc      dword ed_pos
912
        call    edit_box_key.draw_all2
913
        jmp     edit_box_key.shift
914
}
915
macro use_work_key
916
{
917
edit_box_key.insert: test   word ed_flags,ed_insert ;not    word ed_insert
918
         je     @f
919
         and    word ed_flags,ed_insert_cl
920
 
921
        jmp     edit_box.editbox_exit
922
@@:
923
        or      word ed_flags,ed_insert
924
        jmp     edit_box.editbox_exit
925
edit_box_key.ins_v:
1216 Lrz 926
;        dec     dword [ebp+48];ed_size    ;processing is insert
927
	dec	dword bp_size
1032 Lrz 928
        sub     esi,ecx
929
        add     esi,ebx
930
        mov     edi,esi
931
;clear
932
pusha
933
        mov     edi,ebp
934
        mov     ebp,ed_pos
935
        call    edit_box_key.clear_bg
936
popa
937
        jmp     edit_box_key.In_k
938
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
939
edit_box_key.delete:
940
        mov     edx,ed_size
941
        mov     ecx,ed_pos
942
        cmp     edx,ecx
943
        jg      edit_box_key.bac_del
944
        test    word ed_flags,ed_shift_on
945
        jne     edit_box_key.del_bac
1113 diamond 946
        popad
947
        ret     4
1032 Lrz 948
edit_box_key.bac_del:
949
        call    edit_box_key.del_char
950
        jmp     edit_box_key.draw_all
951
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
952
;--- нажата клавиша backspace ---
953
edit_box_key.backspace:
954
        ; проверяем, курсор у левого края ?
955
        mov     ecx,ed_pos
956
        test    ecx,ecx
957
        jnz     edit_box_key.del_bac
958
        test    word ed_flags,ed_shift_on
959
        jne     edit_box_key.bac_del
1113 diamond 960
        popad
961
        ret     4
1032 Lrz 962
 
963
edit_box_key.del_bac:
964
        mov     edx,ed_size
965
        cmp     edx,ecx ;if ed_pos=ed_size
966
        je      @f
967
        dec     ecx
968
        call    edit_box_key.del_char
969
@@:     test    word ed_flags,ed_shift_on
970
        jne     edit_box_key.bac_del
971
        dec      dword ed_pos
972
edit_box_key.draw_all:
973
        push    edit_box_key.shift;.draw_cursor_text;eax
974
 
975
        test    word ed_flags,ed_shift_on
976
        je      @f
977
        mov     eax,dword ed_shift_pos
978
        mov     ebx,ed_size
979
        sub     ebx,eax
980
        mov     ed_size,ebx
981
 
982
        mov     ebp,ed_color
983
        call    edit_box.clear_cursor
984
        call    edit_box.check_offset
985
        call    edit_box.draw_bg
986
        ret
987
@@:     dec      dword ed_size
988
 
989
edit_box_key.draw_all2:
990
        and    word ed_flags,ed_shift_cl
991
        mov     ebp,ed_color
992
        call    edit_box.clear_cursor
993
        call    edit_box.check_offset
994
        mov     ebp,ed_size
995
        call    edit_box_key.clear_bg
996
        ret
997
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
998
;--- нажата клавиша left ---
1214 Lrz 999
edit_box_key.left:
1000
	mov     ebx,ed_pos
1032 Lrz 1001
        test    ebx,ebx
1002
        jz      edit_box_key.sh_st_of
1003
        or      word ed_flags,ed_left_fl
1004
        call    edit_box_key.sh_first_sh
1005
        dec      dword ed_pos
1006
        call    edit_box_key.sh_enable
1007
        jmp     edit_box.draw_cursor_text
1008
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1009
;--- нажата клавиша right ---
1214 Lrz 1010
edit_box_key.right:
1011
	mov     ebx,ed_pos
1032 Lrz 1012
        cmp     ebx,ed_size
1013
        je      edit_box_key.sh_st_of
1014
        and     word ed_flags,ed_right_fl
1015
        call    edit_box_key.sh_first_sh
1016
        inc     dword  ed_pos
1017
        call    edit_box_key.sh_enable
1018
        jmp     edit_box.draw_cursor_text
1019
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1020
edit_box_key.home:
1021
        mov     ebx,ed_pos
1022
        test    ebx,ebx
1023
        jz      edit_box_key.sh_st_of
1024
        call    edit_box_key.sh_first_sh
1025
        xor     eax,eax
1026
        mov     ed_pos,eax
1027
        call    edit_box_key.sh_home_end
1028
        jmp     edit_box.draw_cursor_text
1029
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1030
edit_box_key.end:
1031
        mov     ebx,ed_pos
1032
        cmp     ebx,dword ed_size
1033
        je      edit_box_key.sh_st_of
1034
        call    edit_box_key.sh_first_sh
1035
        mov     eax,ed_size
1036
        mov     ed_pos,eax
1037
        call    edit_box_key.sh_home_end
1038
        jmp     edit_box.draw_cursor_text
1039
}
1040
 
1041
macro use_mouse_func
1042
{
1043
;----------------------------------------------------------
1044
;--- Обработка .mouse_wigwag
1045
;----------------------------------------------------------
1046
edit_box_mouse.mouse_wigwag:
1047
        shr     eax,16
1048
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
1049
;;;;;;;;;;;;;;;;;;
1050
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
1051
;;;;;;;;;;;;;;;;;;
1052
        test    ax,0x8000
1053
        jnz     edit_box_mouse.mleft
1054
 
1055
        mov     ebx,ed_left
1056
        cmp     eax,ebx
1057
        jb      edit_box_mouse.mleft
1058
 
1059
        add     ebx,ed_width
1060
        cmp     eax,ebx
1061
        ja      edit_box_mouse.mright
1062
 
1063
        sub     ebx,ed_width
1064
 
1065
        xor     edx,edx
1066
        sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
1067
        mov     ebx,6
1068
        div     ebx
1069
;;;;;;;;;;;;;;;;;;
1070
;;процедура обработки положения выделенного текста, в пределах области editbox
1071
;;;;;;;;;;;;;;;;;;
1072
;Получили координаты в eax мышки, т.е. куда она переместилась
1073
;Рисование закрашеных прямоугольников и очистка их
1074
        add     eax,ed_offset   ;добавим смещение
1075
        cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
1076
        ja      edit_box_mouse.mwigvag
1077
edit_box_mouse.mdraw:
1078
        mov     dword   ed_pos,eax ;сохраним новое значение
1079
;Рисование закрашеных прямоугольников и очистка их
1080
        mov     ecx,dword       ed_shift_pos
1081
        mov     ebx,dword       ed_shift_pos_old
1082
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
1083
;проверка и рисование закрашеных областей
1084
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
1085
        je      edit_box_mouse.m1_shem        ;движения не было ранее
1086
        jb      edit_box_mouse.msmaller       ;движение было ->
1087
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
1088
        ja      edit_box_mouse.m1_shem        ;если было движение <- то нужно закрасить область
1089
        je      edit_box_mouse.mwigvag        ;если изменения не было, то ничего не делать
1090
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
1091
;входные параметры ebp=color ebx=ed_shift_pos
1092
        call    edit_box_key.sh_cl_
1093
        jmp     edit_box_mouse.mwigvag
1094
edit_box_mouse.msmaller:
1095
        cmp     ebx,eax
1096
        jb      edit_box_mouse.m1_shem
1097
        mov     ebp,ed_color
1098
;входные параметры ebp=color ebx=ed_shift_pos
1099
        call    edit_box_key.sh_cl_
1100
        jmp     edit_box_mouse.mwigvag
1101
;alike  =
1102
edit_box_mouse.m1_shem:
1103
        mov     ebp,shift_color
1104
;входные параметры ebp=color ebx=ed_shift_pos
1105
        mov     ebx,ecx
1106
        call    edit_box_key.sh_cl_
1107
        jmp     edit_box_mouse.mwigvag
1108
edit_box_mouse.mwigvag:
1109
        and     word ed_flags,ed_shift_mcl
1110
        jmp     edit_box.draw_cursor_text
1111
;       popa
1112
;       ret
1113
edit_box_mouse.mleft:
1114
        mov     eax,ed_pos
1115
        cmp     eax,0
1116
        jbe      edit_box_mouse.mwigvag
1117
        dec     eax
1118
        call    edit_box.check_offset
1119
        push    eax
1120
        mov     ebx,ed_shift_pos
1121
        mov     ebp,shift_color
1122
        call    edit_box_key.sh_cl_
1123
        pop     eax
1124
        jmp     edit_box_mouse.mdraw
1125
edit_box_mouse.mright:
1126
        mov     eax,ed_pos
1127
        mov     ebx,ed_size
1128
        cmp     eax,ebx
1129
        jae     edit_box_mouse.mwigvag
1130
        inc     eax
1131
        call    edit_box.check_offset
1132
        mov     ebx,ed_shift_pos
1133
        mov     ebp,shift_color
1134
        push    eax
1135
        call    edit_box_key.sh_cl_
1136
        pop     eax
1137
        jmp     edit_box_mouse.mdraw
1138
}
1139
 
1140
macro use_work_mouse
1141
;----------------------------------------------------------
1142
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
1143
;----------------------------------------------------------
1144
{
1145
        test    word ed_flags,ed_mouse_on
1146
        jne     edit_box_mouse.mouse_wigwag
1147
;----------------------------------------------------------
1148
;--- проверяем, попадает ли курсор в edit box -------------
1149
;----------------------------------------------------------
1150
        mov     ebx,ed_top
1151
        cmp     ax,bx
1152
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1153
 
1154
        add     ebx,ed_height
1155
        cmp     ax,bx
1156
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1157
 
1158
        shr     eax,16
1159
 
1160
        mov     ebx,ed_left
1161
        cmp     ax,bx
1162
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1163
 
1164
        add     ebx,ed_width
1165
 
1166
        cmp     ax,bx
1167
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1168
 
1169
;--- изменяем позицию курсора ---
1170
        push    eax
1171
        mov     ebp,ed_color
1172
        call    edit_box.clear_cursor
1173
        pop     eax
1174
edit_box_mouse._mvpos:
1175
        xor     edx,edx
1176
        sub     eax,ed_left
1177
 
1178
        mov     ebx,6
1179
        div     bx
1180
        add     eax,ed_offset
1181
        cmp     eax,ed_size
1182
        jna     edit_box_mouse._mshift
1183
        mov     eax,ed_size
1184
 
1185
edit_box_mouse._mshift:
1186
;;;;;;;
1187
;;Секция обработки shift и выделения по shift
1188
;;;;;;;
1189
        test    word ed_flags,ed_shift_bac
1190
        je      @f
1191
        mov     ebp,dword       ed_color
1192
        mov     ebx,dword ed_shift_pos
1193
        push    eax
1194
        call    edit_box_key.sh_cl_
1195
        and     word ed_flags,ed_shift_bac_cl
1196
        pop     eax
1197
@@:
1198
        test    word ed_flags,ed_mouse_on
1199
        jne     @f
1200
 
1201
        mov     dword ed_shift_pos,eax
1202
        or      word  ed_flags,ed_mouse_on
1203
        mov     dword ed_pos,eax
1214 Lrz 1204
 
1205
;        mov     dword [mouse_flag],edi          ;установим идентификатор
1206
 
1207
       	mov	ebx,dword ed_mouse_variable
1208
	push	edi
1209
	pop	dword [ebx]
1210
 
1211
 
1212
 
1213
 
1032 Lrz 1214
        bts     word ed_flags,1                 ;установка фокуса
1215
        jmp     edit_box_mouse.m_sh
1216
@@:
1217
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
1218
        je      edit_box.editbox_exit
1219
        mov     ed_pos,eax
1220
        mov     ebp,dword shift_color
1221
        mov     ebx,dword ed_shift_pos
1222
        call    edit_box_key.sh_cl_
1223
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
1214 Lrz 1224
edit_box_mouse.m_sh:
1225
	call    edit_box.draw_text
1032 Lrz 1226
        call    edit_box.draw_cursor
1227
;----------------------------------------------------------
1228
;--- процедура установки фокуса ---------------------------
1229
;----------------------------------------------------------
1230
        jmp     edit_box_mouse.drc
1231
edit_box_mouse._blur:
1232
        test    word ed_flags,ed_always_focus
1233
        jne     edit_box.editbox_exit
1234
        btr     word ed_flags,1 ; если не в фокусе, выходим
1235
        jnc     edit_box.editbox_exit
1236
 
1237
        mov     ebp,ed_color
1238
        call    edit_box.clear_cursor
1239
edit_box_mouse.drc:   call    edit_box.draw_border
1240
        jmp     edit_box.editbox_exit
1241
}
1242
 
1243
 
1244
; Макрос выхода
1245
macro edit_ex
1246
{
1247
popad
1248
ret
1249
}
1250
macro debug
1251
{
1252
        ;-----------  отладка
1253
        pushad
1254
;        mov     dword [ed_buffer.2],0
1255
;        mov     eax,edi
1256
        mov eax,dword [ed_buffer.2]
1257
        mov edi,ed_buffer.3
1258
        call .str
1259
        ;рисование фона
1260
        mov eax,13
1261
        mov ebx,178*65536+70
1262
        mov ecx,28*65536+10
1263
        xor edx,edx
1264
        int 0x40
1265
        ;вывод значения на экран
1266
        mov eax,4
1267
        mov ebx,180*65536+30
1268
        mov ecx,0x10DDBBCC
1269
        mov edx,ed_buffer.3
1270
        mov esi,8
1271
        int 0x40
1272
        popad
1273
        ;----------- отладка
1274
}
1275
macro   debug_func
1276
{
1277
.str:
1278
        mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1279
         ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1280
        cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1281
        jb @f
1282
        xor edx,edx  ;очистить edx
1283
        div ecx      ;разделить - остаток в edx
1284
        push edx     ;положить в стек
1285
        ;dec edi             ;смещение необходимое для записи с конца строки
1286
        call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1287
        pop eax
1288
        @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1289
        ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1290
        ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1291
        or al,0x30  ;данная команда короче  чем две выше
1292
        stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1293
 
1294
        ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1295
}
1296
 
1214 Lrz 1297
ed_struc_size=76
1032 Lrz 1298
struc  edit_box width,left,top,color,shift_color,focus_border_color,\
1214 Lrz 1299
       blur_border_color,text_color,max,text,mouse_variable,flags,size,pos
1032 Lrz 1300
{
1301
.width dd width
1302
.left dd left
1303
.top dd top
1304
.color dd color
1305
.shift_color dd shift_color
1306
.focus_border_color dd focus_border_color
1307
.blur_border_color dd blur_border_color
1308
.text_color dd text_color
1309
.max dd max
1310
.text dd text
1214 Lrz 1311
.mouse_variable dd mouse_variable
1032 Lrz 1312
.flags dd flags+0
1313
.size dd size+0
1314
.pos dd pos+0
1315
.offset dd 0
1316
.cl_curs_x dd 0
1317
.cl_curs_y dd 0
1318
.shift   dd 0
1319
.shift_old   dd 0
1320
}