Subversion Repositories Kolibri OS

Rev

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

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