0,0 → 1,755 |
; <Lrz> 21.07.2006 ¤®¡ ¢«¥ äãªæ¨ï ª®¯ª¨ Del, ⥯¥àì ¬®¦® 㤠«ïâì ᨬ¢®«ë ¯à¨ ¯®¬®é¨ ¤ ®© ª®« ¢¨è¨ |
; ¢â®à:
¢â¨å®¢ ªá¨¬ (Maxxxx32) email: maxxxxm@mail.ru |
; â ¯®á«¥¤¨å ¨§¬¥¥¨©: 13.07.06 10:40 |
; ¯¨è¨â¥ ¢ ¨á室®¬ ª®¤¥ ᢮¥© ¯à®£à ¬¬ë use_edit_box, |
; íâ® ¢áâ ¢¨â ¥®¡å®¤¨¬ë¥ ¯à®æ¥¤ãàë ¢ ª®¤ ¢ 襩 ¯à®£à ¬¬ë. |
; à®æ¥¤ãàë: |
; edit_box.draw - ¯®« ï ¯¥à¥à¨á®¢ª ; |
; edit_box.key - ®¡à ¡®âª ª« ¢¨ âãàë; |
; edit_box.mouse - ®¡à ¡®âª ¬ëè¨; |
; edit_box.focus - ãáâ ®¢ª 䮪ãá ; |
; edit_box.blur - ¥£® à §¬ë¢ ¨¥; |
; edit_box.get_n - ¯®«ãç¨âì ª®«¨ç¥á⢮ ¯à®à¨á®¢ë¢ ¥¬ëå ᨬ¢®«®¢. |
; ਠ¢ë§®¢¥ «î¡ëå ¨§ íâ¨å ¯à®æ¥¤ãà ¢ ॣ¨áâॠedi á«¥¤ã¥â |
; ®áâ ¢¨âì 㪠§ ⥫ì áâàãªâãàã. |
; ਬ¥à áâàãªâãàë: |
; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text |
; ¤«¨ , «¥¢®, ¢¥àå, 梥â ä® , 梥â à ¬ª¨, ¥á«¨ ¢ë¡à , |
; 梥â à ¬ª¨, ¥á«¨ ¥ ¢ë¡à , ¬ ªá¨¬ «ì®¥ ª®«¨ç¥á⢮ ᨬ¢®«®¢, |
; 㪠§ â¥«ì ¡ãä¥à, £¤¥ ¡ã¤ãâ åà ¨âáï ᨬ¢®«ë. ãä¥à ¤®«¦¥ |
; ®ª 稢 âìáï ã«¥¬, ¯à¨¬¥à ¥á«¨ ¬ ªá¨¬ «ì®¥ ª®«¨ç¥á⢮ 255: |
; some_edit_text: |
; rb 256 ;255+1 |
|
; ਬ¥à ¢ë§®¢ ¯à®æ¥¤ãàë: |
; mov edi,some_edit |
; call edit_box.draw |
|
; ਠ¢ë§®¢¥ ¯à®æ¥¤ãàë edit_box.key ª®¤ ª« ¢¨è¨ ¤®«¦¥ |
; 室¨âáï ¢ ah, â® ¥áâì ¯¥à¥¤ ¢ë§®¢®¬ í⮩ ¯à®æ¥¤ãàë ¤® ¢ë§¢ âì |
; 2-ãî á¨á¥¬ãî äãªæ¨î, ¯à¨¬¥à: |
; mov eax,2 |
; int 0x40 |
; mov edi,some_edit1 |
; call edit_box.key |
; mov edi,some_edit2 |
; call edit_box.key |
; ¥à¥¤ ¢ë§®¢®¬ ®¡à ¡®â稪 ¬ëè¨ á«¥¤ã¥â ¯à®¢¥à¨âì, ï¥âáï «¨ ®ª® |
; ªâ¨¢ë¬. |
;
᫨ 饫箪 ¬ëè¨ ¡ë« ¯à®©§¢¥¤¥ § ¯à¥¤¥« ¬¨ edit box |
; 䮪ãá â¥àï¥âáï. |
macro use_edit_box |
{ |
edit_box: |
ed_width equ [edi] |
ed_left equ [edi+2] |
ed_top equ [edi+4] |
ed_color equ [edi+6] |
ed_focus_border_color equ [edi+10] |
ed_blur_border_color equ [edi+14] |
ed_text_color equ [edi+18] |
ed_flags equ [edi+22] |
ed_max equ [edi+24] |
ed_size equ [edi+26] |
ed_pos equ [edi+28] |
ed_offset equ [edi+30] |
ed_text equ [edi+32] |
ed_height=14 ; ¢ëá®â |
;========================================================== |
;=== ¯à®æ¥¤ãà ¯à®à¨á®¢ª¨ ================================= |
;========================================================== |
.draw: |
pusha |
;--- à¨á㥬 à ¬ªã --- |
call .draw_border |
|
.draw_bg_cursor_text: |
;--- ¨§¬¥ï¥¬ ᬥ饨¥, ¥á«¨ ¤® --- |
call .check_offset |
;--- à¨á㥬 ¢ãâà¥îî ®¡« áâì --- |
call .draw_bg |
.draw_cursor_text: |
;--- à¨á㥬 ªãàá®à --- |
;--- ¬®¦¥â ¥£® ¥ ¤® à¨á®¢ âì ---- |
bt word ed_flags,1 |
jnc @f |
call .draw_cursor |
@@: |
call .draw_text |
popa |
ret |
|
;---------------------------------------------------------- |
;--- ¯à®æ¥¤ãà ¯à®à¨á®¢ª¨ ⥪áâ -------------------------- |
;---------------------------------------------------------- |
.draw_text: |
;--- ¢ëç¨á«ï¥¬, ᪮«ìª® ¯®¬¥é ¥âáï ᨬ¢®«®¢ --- |
call .get_n |
;--- çâ®¡ë ¬ãá®à ¥ à¨á®¢ âì --- |
movsx esi,word ed_size |
sub si,ed_offset |
cmp ax,si |
ja @f |
mov si,ax |
@@: |
|
;--- à¨á㥬 ⥪áâ --- |
mov eax,4 |
mov bx,ed_left |
add bx,2 |
shl ebx,16 |
mov bx,ed_top |
add bx,4 |
mov ecx,ed_text_color |
movsx edx,word ed_offset |
add edx,ed_text |
int 0x40 |
ret |
|
;---------------------------------------------------------- |
;--- ¯à®æ¥¤ãà ¯à®à¨á®¢ª¨ ä® ---------------------------- |
;---------------------------------------------------------- |
.draw_bg_eax: |
pusha |
movsx ebx,ax |
lea ebx,[ebx*2+ebx] |
shl bx,1 |
shl ebx,16 |
shr eax,16 |
lea eax,[eax*2+eax] |
shl ax,1 |
add ax,ed_left |
add ax,2 |
mov bx,ax |
ror ebx,16 |
jmp @f |
.draw_bg: |
pusha |
mov bx,ed_left |
inc bx |
shl ebx,16 |
mov bx,ed_width |
dec bx |
|
@@: |
mov cx,ed_top |
inc cx |
shl ecx,16 |
mov cx,ed_height |
dec cx |
|
mov edx,ed_color |
mov eax,13 |
int 0x40 |
popa |
ret |
|
;---------------------------------------------------------- |
;--- ¯à®æ¥¤ãà ¯®«ãç¥¨ï ª®«¨ç¥á⢠ᨬ¢®«®¢ -------------- |
;---------------------------------------------------------- |
.get_n: |
xor edx,edx |
movsx eax,word ed_width |
sub ax,4 |
mov bx,6 |
div bx |
ret |
|
;---------------------------------------------------------- |
;--- ¯à®æ¥¤ãà à¨á®¢ ¨ï ªãàá®à -------------------------- |
;---------------------------------------------------------- |
.clear_cursor: |
mov edx,ed_color |
jmp @f |
.draw_cursor: |
mov edx,ed_text_color |
@@: |
movsx ebx,word ed_pos |
sub bx,ed_offset |
;lea ebx,[ebx*2+ebx] |
;shl ebx,1 |
imul ebx,6 |
add bx,ed_left |
inc bx |
push bx |
shl ebx,16 |
pop bx |
mov cx,ed_top |
add cx,2 |
push cx |
shl ecx,16 |
pop cx |
add cx,ed_height-4 |
mov eax,38 |
int 0x40 |
ret |
|
;---------------------------------------------------------- |
;--- ¯à®æ¥¤ãà à¨á®¢ ¨ï à ¬ª¨ ---------------------------- |
;---------------------------------------------------------- |
.draw_border: |
;--- 梥â à ¬ª¨ --- |
bt word ed_flags,1 |
mov edx,ed_focus_border_color |
jc @f |
mov edx,ed_blur_border_color |
@@: |
;--- ᢥàåã --- |
mov bx,ed_left |
push bx |
shl ebx,16 |
pop bx |
add bx,ed_width |
mov cx,ed_top |
push cx |
shl ecx,16 |
pop cx |
mov eax,38 |
int 0x40 |
|
;--- ᨧã --- |
push cx |
add cx,ed_height |
push cx |
shl ecx,16 |
pop cx |
int 0x40 |
|
;--- á«¥¢ --- |
pop cx |
push bx |
sub bx,ed_width |
int 0x40 |
|
;--- á¯à ¢ --- |
pop bx |
push bx |
shl ebx,16 |
pop bx |
int 0x40 |
ret |
|
;---------------------------------------------------------- |
;--- ¯à®¢¥àª , § 襫 «¨ ªãàá®à § £à ¨æë ¨, ¥á«¨ ¤®, --- |
;--- ¨§¬¥ï¥¬ ᬥ饨¥ ------------------------------------ |
;--- eax = 1, ¥á«¨ ¥ ¨§¬¥¨«®áì ¨«¨ eax = 0, ¥á«¨ |
; ¨§¬¥¨«®áì |
;---------------------------------------------------------- |
.check_offset: |
push word ed_offset |
call .get_n |
;--- ¯à ¢¥¥ --- |
mov bx,ed_offset |
add bx,ax |
cmp bx,ed_pos |
ja @f |
mov bx,ed_pos |
mov cx,ax |
shr cx,2 |
sub bx,cx |
mov cx,ax |
shr cx,1 |
sub bx,cx |
mov ed_offset,bx |
@@: |
;--- «¥¢¥¥ --- |
mov bx,ed_offset |
cmp bx,ed_pos |
jb @f |
mov bx,ed_pos |
mov cx,ax |
shr cx,2 |
sub bx,cx |
jnc $+5 |
xor bx,bx |
mov ed_offset,bx |
@@: |
xor eax,eax |
pop bx |
cmp bx,ed_offset |
jne @f |
inc eax |
@@: |
ret |
|
;========================================================== |
;=== ®¡à ¡®âª ª« ¢¨ âãàë ================================= |
;========================================================== |
.key: |
pusha |
bt word ed_flags,1 ; ¥á«¨ ¥ ¢ 䮪ãá¥, ¢ë室¨¬ |
jc @f |
popa |
ret |
@@: |
|
;---------------------------------------------------------- |
;--- ¯à®¢¥à塞, çâ® ¦ â® -------------------------------- |
;---------------------------------------------------------- |
cmp ah,8 |
je .backspace |
cmp ah,0xb6 |
je .delete |
cmp ah,176 |
je .left |
cmp ah,179 |
je .right |
cmp ah,180 |
je .home |
cmp ah,181 |
je .end |
|
;--- ¦ â ¤àã£ ï ª« ¢¨è --- |
bt word ed_flags,15 ; ⮫쪮 æ¨äàë ? |
jnc @f |
cmp ah,'0' |
jb .no_figure |
cmp ah,'9' |
ja .no_figure |
jmp @f |
.no_figure: |
popa |
ret |
@@: |
; ¯à®¢¥à塞, 室¨âáï «¨ ªãàá®à ¢ ª®æ¥ |
mov bx,ed_max |
cmp bx,ed_pos |
jne @f ; ¥á«¨ ¤ , ¢ ª®¥æ ¯à®æ¥¤ãàë |
popa |
ret |
@@: |
; ᤢ¨£ ¥¬ ᨬ¢®«ë ¯®á«¥ ªãàá®à ¢¯à ¢® |
mov edx,ed_text |
dec edx |
xor ecx,ecx |
mov cx,ed_size |
cmp cx,ed_pos |
je @f |
.mov_right_next: |
mov bh,[edx+ecx] |
mov [edx+ecx+1],bh |
dec cx |
cmp cx,ed_pos |
jne .mov_right_next |
@@: |
|
|
; ¢áâ ¢«ï¥¬ ª®¤ ª« ¢¨è¨ â㤠, £¤¥ ªãàá®à |
mov edx,ed_text |
movsx ebx,word ed_pos |
mov [ebx+edx],ah |
|
call .clear_cursor |
; 㢥«¨ç¨¢ ¥¬ § 票¥ à §¬¥à ¨ ¯®§¨æ¨¨ |
inc word ed_pos |
mov bx,ed_size |
cmp bx,ed_max |
je .draw_bg_cursor_text;.key_end_draw |
inc word ed_size |
|
;push word ed_offset |
call .check_offset |
;pop ax |
;cmp ax,ed_offset |
;jne .draw_bg_cursor_text |
test eax,eax |
jz .draw_bg_cursor_text |
|
call .get_n |
sub ax,ed_pos |
add ax,ed_offset |
inc ax |
shl eax,16 |
mov ax,ed_pos |
sub ax,ed_offset |
dec ax |
ror eax,16 |
call .draw_bg_eax |
|
jmp .draw_cursor_text |
|
;jmp .draw_cursor_text;.key_end_draw |
|
.delete: |
mov dx,ed_size |
mov cx,ed_pos |
;inc edx |
;add ecx,900 |
;sub ecx,1 |
cmp dx,cx |
jg @f |
popa |
ret |
|
@@: |
mov edx,ed_text |
;dec edx |
.mov_stop_next: |
mov bh,[edx+ecx+1] |
mov [edx+ecx],bh |
inc cx |
mov bx,ed_size |
;dec bx |
;dec bx |
cmp cx,bx |
jne .mov_stop_next |
|
; 㬥ìè ¥¬ § 票¥ ¯®§¨æ¨¨ ¨ à §¬¥à |
;dec word ed_pos |
dec word ed_size |
;push word ed_offset |
call .check_offset |
;pop ax |
;cmp ax,ed_offset |
;jne .draw_bg_cursor_text |
test eax,eax |
jz .draw_bg_cursor_text |
|
call .get_n |
sub ax,ed_pos |
add ax,ed_offset |
shl eax,16 |
mov ax,ed_pos |
sub ax,ed_offset |
ror eax,16 |
call .draw_bg_eax |
|
jmp .draw_cursor_text |
popa |
ret |
|
;--- ¦ â ª« ¢¨è backspace --- |
.backspace: |
; ¯à®¢¥à塞, ªãàá®à ã «¥¢®£® ªà ï ? |
mov bx,ed_pos |
;cmp bx,0 |
;jne @f; .key_end ; ¥á«¨ ¤ , ¢ ª®¥æ |
test bx,bx |
jnz @f |
popa |
ret |
@@: |
|
; ᤢ¨£ ¥¬ ᨬ¢®«ë ¯®á«¥ ªãàá®à ¢«¥¢® |
mov edx,ed_text |
dec edx |
movsx ecx,word ed_pos |
|
.mov_left_next: |
mov bh,[edx+ecx+1] |
mov [edx+ecx],bh |
inc cx |
mov bx,ed_size |
inc bx |
cmp cx,bx |
jne .mov_left_next |
|
; 㬥ìè ¥¬ § 票¥ ¯®§¨æ¨¨ ¨ à §¬¥à |
dec word ed_pos |
dec word ed_size |
|
;push word ed_offset |
call .check_offset |
;pop ax |
;cmp ax,ed_offset |
;jne .draw_bg_cursor_text |
test eax,eax |
jz .draw_bg_cursor_text |
|
call .get_n |
sub ax,ed_pos |
add ax,ed_offset |
shl eax,16 |
mov ax,ed_pos |
sub ax,ed_offset |
ror eax,16 |
call .draw_bg_eax |
|
jmp .draw_cursor_text |
popa |
ret |
|
;--- ¦ â ª« ¢¨è left --- |
.left: |
mov bx,ed_pos |
;cmp bx,0 |
;je @f |
test bx,bx |
jz @f |
call .clear_cursor |
dec word ed_pos |
call .check_offset |
test eax,eax |
jz .draw_bg_cursor_text |
call .draw_cursor |
@@: |
popa |
ret |
|
;--- ¦ â ª« ¢¨è right --- |
.right: |
mov bx,ed_pos |
cmp bx,ed_size |
je @f |
call .clear_cursor |
inc word ed_pos |
call .check_offset |
test eax,eax |
jz .draw_bg_cursor_text |
call .draw_cursor |
@@: |
popa |
ret |
|
.home: |
mov bx,ed_pos |
test bx,bx |
jz @f |
call .clear_cursor |
xor eax,eax |
mov ed_pos,ax |
call .check_offset |
test eax,eax |
jz .draw_bg_cursor_text |
call .draw_cursor |
@@: |
popa |
ret |
|
.end: |
mov bx,ed_pos |
cmp bx,ed_size |
je @f |
call .clear_cursor |
mov ax,ed_size |
mov ed_pos,ax |
call .check_offset |
test eax,eax |
jz .draw_bg_cursor_text |
call .draw_cursor |
@@: |
popa |
ret |
|
|
;========================================================== |
;=== ®¡à ¡®âª ¬ëè¨ ======================================= |
;========================================================== |
.mouse: |
pusha |
;---------------------------------------------------------- |
;--- ¯®«ãç ¥¬ á®áâ®ï¨¥ ª®¯®ª ¬ëè¨ ----------------------- |
;---------------------------------------------------------- |
mov eax,37 |
mov ebx,2 |
int 0x40 |
;---------------------------------------------------------- |
;--- ¯à®¢¥à塞 á®áâ®ï¨¥ ---------------------------------- |
;---------------------------------------------------------- |
bt eax,0 |
jc .mouse_left_button |
|
bt eax,1 |
jc @f |
btr word ed_flags,2 |
@@: |
|
popa |
ret |
|
.mouse_left_button: |
;---------------------------------------------------------- |
;--- ¯®«ãç ¥¬ ª®®à¤¨ âë ¬ëè¨ ----------------------------- |
;---------------------------------------------------------- |
bts word ed_flags,2 |
jc .mouse_pressed |
mov eax,37 |
;mov ebx,1 |
xor ebx,ebx |
inc ebx |
int 0x40 |
;---------------------------------------------------------- |
;--- ¯à®¢¥à塞, ¯®¯ ¤ ¥â «¨ ªãàá®à ¢ edit box ------------- |
;---------------------------------------------------------- |
mov bx,ed_top |
cmp ax,bx |
jl ._blur;.mouse_end_no_focus |
|
add bx,ed_height |
cmp ax,bx |
jg ._blur;.mouse_end_no_focus |
|
shr eax,16 |
|
mov bx,ed_left |
cmp ax,bx |
jl ._blur;.mouse_end_no_focus |
|
add bx,ed_width |
cmp ax,bx |
jg ._blur;.mouse_end_no_focus |
|
;--- ¨§¬¥ï¥¬ ¯®§¨æ¨î ªãàá®à --- |
push eax |
call .clear_cursor |
pop eax |
xor dx,dx |
sub ax,ed_left |
add ax,2 |
mov bx,6 |
div bx |
add ax,ed_offset |
cmp ax,ed_size |
jna @f |
mov ax,ed_size |
@@: |
mov ed_pos,ax |
call .check_offset |
test eax,eax |
jz .draw_bg_cursor_text |
call .draw_cursor |
|
call .focus |
|
.mouse_pressed: |
popa |
ret |
|
;.mouse_end_no_focus: |
; call .blur |
;popa |
;ret |
|
|
;---------------------------------------------------------- |
;--- ¯à®æ¥¤ãà ãáâ ®¢ª¨ 䮪ãá --------------------------- |
;---------------------------------------------------------- |
.blur: |
pusha |
._blur: |
bt word ed_flags,14 |
jc @f |
btr word ed_flags,1 |
jnc @f |
call .clear_cursor |
jmp .blur_end |
.focus: |
pusha |
bts word ed_flags,1 |
jc @f |
call .draw_cursor |
.blur_end: |
call .draw_border |
@@: |
popa |
ret |
|
;---------------------------------------------------------- |
;--- ¯à®æ¥¤ãà à §¬ë¢ ¨ï 䮪ãá -------------------------- |
;---------------------------------------------------------- |
;.blur: |
;pusha |
;._blur: |
;btr word ed_flags,1 |
;jnc @f |
;call .draw_border |
;call .clear_cursor |
;@@: |
;popa |
;ret |
} |
ed_figure_only=1000000000000000b |
ed_always_focus=100000000000000b |
ed_focus=10b |
ed_struc_size=36 |
macro draw_edit_boxes start,end |
{ |
mov edi,start |
mov ecx,((end-start)/ed_struc_size) |
@@: |
call edit_box.draw |
add edi,ed_struc_size |
loop @b |
} |
|
macro mouse_edit_boxes start,end |
{ |
mov edi,start |
mov ecx,((end-start)/ed_struc_size) |
@@: |
call edit_box.mouse |
add edi,ed_struc_size |
loop @b |
} |
|
macro key_edit_boxes start,end |
{ |
mov edi,start |
mov ecx,((end-start)/ed_struc_size) |
@@: |
call edit_box.key |
add edi,ed_struc_size |
loop @b |
} |
|
struc edit_box width,left,top,color,focus_border_color,\ |
blur_border_color,text_color,max,text,flags,size |
{ |
.width dw width |
.left dw left |
.top dw top |
.color dd color |
.focus_border_color dd focus_border_color |
.blur_border_color dd blur_border_color |
.text_color dd text_color |
.flags dw flags+0 |
.max dw max |
.size dw size+0 |
.pos dw 0 |
.offset dw 0 |
.text dd text |
} |
|
macro edit_boxes_set_sys_color start,end,color_table |
{ |
mov edi,start |
mov ecx,((end-start)/ed_struc_size) |
mov esi,color_table |
@@: |
mov eax,[esi+36] |
mov ebx,[esi+20] |
mov ed_focus_border_color,eax |
shr bh,1 |
shr bl,1 |
shr ah,1 |
shr al,1 |
add ah,bh |
add al,bl |
ror eax,16 |
ror ebx,16 |
shr bl,1 |
shr al,1 |
add al,bl |
ror eax,16 |
mov ed_blur_border_color,eax |
add edi,ed_struc_size |
loop @b |
} |
|
macro draw_edit_box ed_ptr |
{ |
mov edi,ed_ptr |
call edit_box.draw |
} |
|
macro mouse_edit_box ed_ptr |
{ |
mov edi,ed_ptr |
call edit_box.mouse |
} |
|
macro key_edit_box ed_ptr |
{ |
mov edi,ed_ptr |
call edit_box.key |
} |