391 lines
6.0 KiB
NASM
391 lines
6.0 KiB
NASM
|
struct TBOX
|
||
|
x dw ?
|
||
|
width dw ?
|
||
|
y dw ?
|
||
|
height dw ?
|
||
|
sel.x db ?
|
||
|
pos.x db ?
|
||
|
ofs.x db ?
|
||
|
length db ?
|
||
|
text rb 255
|
||
|
ends
|
||
|
|
||
|
virtual at ebp
|
||
|
tbox TBOX
|
||
|
end virtual
|
||
|
|
||
|
tb.pos.x db ?
|
||
|
tb.sel.x db ?
|
||
|
tb.sel.selected db ?
|
||
|
|
||
|
func textbox.get_width
|
||
|
push ebx edx
|
||
|
movzx eax,[tbox.width-2]
|
||
|
add eax,-6
|
||
|
xor edx,edx
|
||
|
mov ebx,6
|
||
|
div ebx
|
||
|
movzx ebx,[tbox.length]
|
||
|
cmp eax,ebx
|
||
|
jle @f
|
||
|
mov eax,ebx
|
||
|
@@: pop edx ebx
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
func textbox.delete_selection
|
||
|
cmp [tb.sel.selected],0
|
||
|
je .exit.2
|
||
|
pushad
|
||
|
movzx ecx,[tbox.length]
|
||
|
sub cl,[tb.sel.x]
|
||
|
lea eax,[tbox.text]
|
||
|
movzx esi,[tb.pos.x]
|
||
|
movzx edi,[tb.sel.x]
|
||
|
add esi,eax
|
||
|
add edi,eax
|
||
|
mov eax,esi
|
||
|
sub eax,edi
|
||
|
sub [tbox.length],al
|
||
|
cld
|
||
|
rep movsb
|
||
|
|
||
|
.exit:
|
||
|
mov al,[tb.sel.x]
|
||
|
mov [tbox.pos.x],al
|
||
|
mov [tbox.sel.x],al
|
||
|
popad
|
||
|
clc
|
||
|
ret
|
||
|
|
||
|
.exit.2:
|
||
|
stc
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
func textbox.draw ; TBOX* ebp
|
||
|
call textbox.get_width
|
||
|
movzx ebx,[tbox.pos.x]
|
||
|
sub bl,[tbox.ofs.x]
|
||
|
sub ebx,eax
|
||
|
jle @f
|
||
|
mov bl,[tbox.pos.x]
|
||
|
sub bl,al
|
||
|
mov [tbox.ofs.x],bl
|
||
|
@@:
|
||
|
mov [tb.sel.selected],0
|
||
|
mov al,[tbox.pos.x]
|
||
|
mov ah,[tbox.sel.x]
|
||
|
cmp al,ah
|
||
|
je @f
|
||
|
inc [tb.sel.selected]
|
||
|
ja @f
|
||
|
xchg al,ah
|
||
|
@@: mov [tb.pos.x],al
|
||
|
mov [tb.sel.x],ah
|
||
|
|
||
|
mcall 13,dword[tbox.x],dword[tbox.y],[color_tbl+4*5];[sc.work]
|
||
|
call draw_framerect
|
||
|
|
||
|
call textbox.get_width
|
||
|
mov esi,eax
|
||
|
mov edi,eax
|
||
|
|
||
|
cmp ebp,[focused_tb]
|
||
|
je @f
|
||
|
mov ebx,dword[tbox.x]
|
||
|
mov bx,[tbox.y+2]
|
||
|
movzx eax,[tbox.height-2]
|
||
|
shr eax,1
|
||
|
add eax,4*65536-4
|
||
|
add ebx,eax
|
||
|
lea edx,[tbox.text]
|
||
|
; movzx esi,[tbox.length]
|
||
|
mcall 4,,[color_tbl+4*0];[sc.work_text]
|
||
|
ret
|
||
|
|
||
|
@@: movzx eax,[tb.pos.x]
|
||
|
cmp al,[tb.sel.x]
|
||
|
je @f
|
||
|
sub al,[tbox.ofs.x]
|
||
|
jz @f
|
||
|
movzx ebx,[tb.sel.x]
|
||
|
sub bl,[tbox.ofs.x]
|
||
|
jge .lp1
|
||
|
xor ebx,ebx
|
||
|
.lp1: push eax ebx
|
||
|
sub eax,ebx
|
||
|
mov ecx,edi
|
||
|
sub ecx,ebx
|
||
|
cmp eax,ecx
|
||
|
jbe .lp2
|
||
|
mov eax,ecx
|
||
|
.lp2: imul eax,6
|
||
|
imul ebx,6
|
||
|
movzx ecx,[tbox.x+2]
|
||
|
add ecx,3
|
||
|
; sub eax,ebx
|
||
|
add ebx,ecx
|
||
|
shl ebx,16
|
||
|
add ebx,eax
|
||
|
movzx ecx,[tbox.height-2]
|
||
|
shr ecx,1
|
||
|
add cx,[tbox.y+2]
|
||
|
shl ecx,16
|
||
|
add ecx,-5*65536+10
|
||
|
mcall 13,,,[color_tbl+4*7];0x0000007F
|
||
|
|
||
|
mov esi,[esp]
|
||
|
lea edx,[tbox.text]
|
||
|
movzx eax,[tbox.ofs.x]
|
||
|
add edx,eax
|
||
|
mov ebx,dword[tbox.x]
|
||
|
mov bx,[tbox.y+2]
|
||
|
movzx eax,[tbox.height-2]
|
||
|
shr eax,1
|
||
|
add eax,4*65536-4
|
||
|
add ebx,eax
|
||
|
mov eax,4
|
||
|
or esi,esi
|
||
|
jz .lp3
|
||
|
mcall ,,[color_tbl+4*0];[sc.work_text]
|
||
|
.lp3: sub edi,esi
|
||
|
jnz .lp4
|
||
|
add esp,8
|
||
|
jmp .exit
|
||
|
.lp4:
|
||
|
add edx,esi
|
||
|
imul esi,6*65536
|
||
|
add ebx,esi
|
||
|
pop ecx esi
|
||
|
sub esi,ecx
|
||
|
cmp esi,edi
|
||
|
jbe .lp5
|
||
|
mov esi,edi
|
||
|
.lp5:
|
||
|
mcall ,,[color_tbl+4*6];0x00FFFFFF
|
||
|
sub edi,esi
|
||
|
jz .exit
|
||
|
add edx,esi
|
||
|
imul esi,6*65536
|
||
|
add ebx,esi
|
||
|
lea ecx,[tbox.text]
|
||
|
; sub ecx,edx
|
||
|
; add edi,ecx
|
||
|
mcall ,,[color_tbl+4*0],,edi;[sc.work_text],,edi
|
||
|
jmp .exit
|
||
|
|
||
|
@@: lea edx,[tbox.text]
|
||
|
movzx eax,[tbox.ofs.x]
|
||
|
add edx,eax
|
||
|
mov ebx,dword[tbox.x]
|
||
|
mov bx,[tbox.y+2]
|
||
|
movzx eax,[tbox.height-2]
|
||
|
shr eax,1
|
||
|
add eax,4*65536-4
|
||
|
add ebx,eax
|
||
|
movzx eax,[tbox.ofs.x]
|
||
|
call textbox.get_width
|
||
|
mov esi,eax
|
||
|
mcall 4,,[color_tbl+4*0];[sc.work_text]
|
||
|
|
||
|
.exit:
|
||
|
movzx ebx,[tbox.pos.x]
|
||
|
movzx eax,[tbox.ofs.x]
|
||
|
sub ebx,eax
|
||
|
imul ebx,6
|
||
|
movzx eax,[tbox.x+2]
|
||
|
add eax,3
|
||
|
add ebx,eax
|
||
|
push bx
|
||
|
shl ebx,16
|
||
|
pop bx
|
||
|
movzx ecx,[tbox.height-2]
|
||
|
shr ecx,1
|
||
|
add cx,[tbox.y+2]
|
||
|
push cx
|
||
|
shl ecx,16
|
||
|
pop cx
|
||
|
add ecx,-5*65536+4
|
||
|
mcall 38,,,0x01000000
|
||
|
add ebx,0x00010001
|
||
|
mcall
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
func textbox.key
|
||
|
mov ebp,[focused_tb]
|
||
|
mov esi,accel_table_textbox
|
||
|
.acc: cmp ebx,[esi]
|
||
|
jne @f
|
||
|
call dword[esi+4]
|
||
|
jmp .exit.2
|
||
|
@@: add esi,8
|
||
|
cmp byte[esi],0
|
||
|
jne .acc
|
||
|
|
||
|
test byte[shi+2],0x06
|
||
|
jnz .exit
|
||
|
cmp [tbox.length],255
|
||
|
je .exit
|
||
|
|
||
|
movzx eax,[chr]
|
||
|
movzx eax,[eax+key0]
|
||
|
or al,al
|
||
|
jz .exit
|
||
|
mov al,[eax+key1]
|
||
|
cmp [tb_casesen],0
|
||
|
je @f
|
||
|
cmp al,$60
|
||
|
jle @f
|
||
|
add al,[add_table-$60+eax]
|
||
|
@@:
|
||
|
call textbox.delete_selection
|
||
|
|
||
|
mov ecx,255
|
||
|
sub cl,[tbox.pos.x]
|
||
|
lea edi,[tbox.text]
|
||
|
add edi,255
|
||
|
lea esi,[edi-1]
|
||
|
std
|
||
|
rep movsb
|
||
|
stosb
|
||
|
cld
|
||
|
inc [tbox.length]
|
||
|
call key.tb.right
|
||
|
|
||
|
.exit.2:
|
||
|
call textbox.draw
|
||
|
.exit:
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
textbox.mouse:
|
||
|
ret
|
||
|
|
||
|
func key.tb.bkspace
|
||
|
call textbox.delete_selection
|
||
|
jnc @f
|
||
|
|
||
|
cmp [tbox.pos.x],0
|
||
|
je @f
|
||
|
call key.tb.left
|
||
|
jmp key.tb.del.direct
|
||
|
|
||
|
@@: ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.home
|
||
|
xor al,al
|
||
|
mov [tbox.pos.x],al
|
||
|
mov [tbox.sel.x],al
|
||
|
mov [tbox.ofs.x],al
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.left
|
||
|
mov al,[tbox.pos.x]
|
||
|
mov [tbox.sel.x],al
|
||
|
dec al
|
||
|
js @f
|
||
|
mov [tbox.pos.x],al
|
||
|
mov [tbox.sel.x],al
|
||
|
cmp [tbox.ofs.x],al
|
||
|
jl @f
|
||
|
sub [tbox.ofs.x],8
|
||
|
jge @f
|
||
|
mov [tbox.ofs.x],0
|
||
|
@@: ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.right
|
||
|
call textbox.get_width
|
||
|
mov bl,[tbox.pos.x]
|
||
|
mov [tbox.sel.x],bl
|
||
|
inc bl
|
||
|
cmp bl,[tbox.length]
|
||
|
ja @f
|
||
|
mov [tbox.pos.x],bl
|
||
|
mov [tbox.sel.x],bl
|
||
|
sub bl,[tbox.ofs.x]
|
||
|
cmp bl,al
|
||
|
jbe @f
|
||
|
inc [tbox.ofs.x]
|
||
|
@@: ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.end
|
||
|
call textbox.get_width
|
||
|
movzx ebx,[tbox.length]
|
||
|
mov [tbox.pos.x],bl
|
||
|
mov [tbox.sel.x],bl
|
||
|
sub ebx,eax
|
||
|
jge @f
|
||
|
xor bl,bl
|
||
|
@@: mov [tbox.ofs.x],bl
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.del
|
||
|
call textbox.delete_selection
|
||
|
jnc @f
|
||
|
.direct:
|
||
|
movzx ecx,[tbox.length]
|
||
|
sub cl,[tbox.pos.x]
|
||
|
jz @f
|
||
|
lea eax,[tbox.text]
|
||
|
movzx edi,[tbox.pos.x]
|
||
|
add edi,eax
|
||
|
lea esi,[edi+1]
|
||
|
dec [tbox.length]
|
||
|
cld
|
||
|
rep movsb
|
||
|
|
||
|
@@: ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.shift_home
|
||
|
xor al,al
|
||
|
mov [tbox.pos.x],al
|
||
|
mov [tbox.ofs.x],al
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.shift_left
|
||
|
mov al,[tbox.pos.x]
|
||
|
dec al
|
||
|
js @f
|
||
|
mov [tbox.pos.x],al
|
||
|
cmp [tbox.ofs.x],al
|
||
|
jl @f
|
||
|
sub [tbox.ofs.x],8
|
||
|
jge @f
|
||
|
mov [tbox.ofs.x],0
|
||
|
@@: ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.shift_right
|
||
|
call textbox.get_width
|
||
|
mov bl,[tbox.pos.x]
|
||
|
inc bl
|
||
|
cmp bl,[tbox.length]
|
||
|
ja @f
|
||
|
mov [tbox.pos.x],bl
|
||
|
sub bl,[tbox.ofs.x]
|
||
|
cmp bl,al
|
||
|
jbe @f
|
||
|
inc [tbox.ofs.x]
|
||
|
@@: ret
|
||
|
endf
|
||
|
|
||
|
func key.tb.shift_end
|
||
|
call textbox.get_width
|
||
|
movzx ebx,[tbox.length]
|
||
|
mov [tbox.pos.x],bl
|
||
|
sub ebx,eax
|
||
|
jge @f
|
||
|
xor bl,bl
|
||
|
@@: mov [tbox.ofs.x],bl
|
||
|
ret
|
||
|
endf
|