591 lines
13 KiB
NASM
591 lines
13 KiB
NASM
|
;-----------------------------------------------------------------------------
|
||
|
func check_cur_vis_inv ;//////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
push eax ebx
|
||
|
xor bl,bl
|
||
|
.chk_y:
|
||
|
mov eax,[pos.y]
|
||
|
or eax,eax
|
||
|
jge @f
|
||
|
mov [pos.y],0
|
||
|
jmp .chk_dy
|
||
|
@@: cmp eax,[lines]
|
||
|
jl .chk_dy
|
||
|
mov eax,[lines]
|
||
|
dec eax
|
||
|
mov [pos.y],eax
|
||
|
.chk_dy:
|
||
|
mov eax,[top_line]
|
||
|
cmp eax,[pos.y]
|
||
|
jle @f
|
||
|
push [pos.y]
|
||
|
pop [top_line]
|
||
|
inc bl
|
||
|
@@: add eax,[lines.scr]
|
||
|
cmp eax,[pos.y]
|
||
|
jg .chk_x
|
||
|
mov eax,[pos.y]
|
||
|
sub eax,[lines.scr]
|
||
|
inc eax
|
||
|
mov [top_line],eax
|
||
|
inc bl
|
||
|
.chk_x:
|
||
|
mov eax,[pos.x]
|
||
|
or eax,eax
|
||
|
jge @f
|
||
|
mov [pos.x],0
|
||
|
jmp .chk_dx
|
||
|
@@: cmp eax,[columns]
|
||
|
jl .chk_dx
|
||
|
mov eax,[columns]
|
||
|
mov [pos.x],eax
|
||
|
.chk_dx:
|
||
|
mov eax,[left_col]
|
||
|
cmp eax,[pos.x]
|
||
|
jle @f
|
||
|
push [pos.x]
|
||
|
pop [left_col]
|
||
|
inc bl
|
||
|
@@: add eax,[columns.scr]
|
||
|
cmp eax,[pos.x]
|
||
|
jg @f
|
||
|
mov eax,[pos.x]
|
||
|
sub eax,[columns.scr]
|
||
|
inc eax
|
||
|
mov [left_col],eax
|
||
|
inc bl
|
||
|
@@: cmp [mev],MEV_LDOWN
|
||
|
jne .exit
|
||
|
push [pos.x] [pos.y]
|
||
|
pop [sel.y] [sel.x]
|
||
|
.exit:
|
||
|
or bl,bl
|
||
|
clc
|
||
|
jz @f
|
||
|
call draw_file
|
||
|
stc
|
||
|
@@: pop ebx eax
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func clear_selection ;////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
push eax ebx
|
||
|
mov eax,[sel.y]
|
||
|
mov ebx,[pos.y]
|
||
|
cmp eax,ebx
|
||
|
jle @f
|
||
|
xchg eax,ebx
|
||
|
@@: push [pos.x] [pos.y]
|
||
|
pop [sel.y] [sel.x]
|
||
|
call draw_file.ex
|
||
|
pop ebx eax
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func pt_in_rect ;/////////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
cmp eax,[ecx+0x0]
|
||
|
jl @f
|
||
|
cmp ebx,[ecx+0x4]
|
||
|
jl @f
|
||
|
cmp eax,[ecx+0x8]
|
||
|
jg @f
|
||
|
cmp ebx,[ecx+0xC]
|
||
|
jg @f
|
||
|
stc
|
||
|
ret
|
||
|
@@: clc
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func check_bottom_right ;/////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
push eax
|
||
|
mov eax,[top_line]
|
||
|
add eax,[lines.scr]
|
||
|
cmp eax,[lines]
|
||
|
jbe .lp1
|
||
|
mov eax,[lines]
|
||
|
sub eax,[lines.scr]
|
||
|
jns @f
|
||
|
xor eax,eax
|
||
|
@@: mov [top_line],eax
|
||
|
.lp1: mov eax,[left_col]
|
||
|
add eax,[columns.scr]
|
||
|
cmp eax,[columns]
|
||
|
jbe .exit
|
||
|
mov eax,[columns]
|
||
|
sub eax,[columns.scr]
|
||
|
jns @f
|
||
|
xor eax,eax
|
||
|
@@: mov [left_col],eax
|
||
|
.exit:
|
||
|
pop eax
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func check_inv_str ;//////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
@^
|
||
|
mov eax,[pos.y]
|
||
|
mov ecx,[top_line]
|
||
|
.skip_init:
|
||
|
call check_cur_vis
|
||
|
mov [pos.y],eax
|
||
|
mov [top_line],ecx
|
||
|
.skip_check:
|
||
|
; call invalidate_string
|
||
|
call drawfile
|
||
|
ret
|
||
|
^@
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func check_inv_all ;//////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
mov eax,[pos.y]
|
||
|
mov ecx,[top_line]
|
||
|
.skip_init:
|
||
|
call check_cur_vis
|
||
|
mov [pos.y],eax
|
||
|
mov [top_line],ecx
|
||
|
.skip_check:
|
||
|
; call clear_screen
|
||
|
call draw_file
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func check_cur_vis ;//////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
cmp eax,ecx
|
||
|
jb .low
|
||
|
mov edx,ecx
|
||
|
add edx,[lines.scr]
|
||
|
cmp edx,[lines]
|
||
|
jbe @f
|
||
|
mov edx,[lines]
|
||
|
@@: cmp eax,edx
|
||
|
jb @f
|
||
|
lea ecx,[eax+1]
|
||
|
sub ecx,[lines.scr]
|
||
|
jns @f
|
||
|
xor ecx,ecx
|
||
|
jmp @f
|
||
|
.low: mov ecx,eax
|
||
|
@@: mov edx,ecx
|
||
|
add edx,[lines.scr]
|
||
|
cmp edx,[lines]
|
||
|
jbe @f
|
||
|
mov ecx,[lines]
|
||
|
sub ecx,[lines.scr]
|
||
|
jns @f
|
||
|
xor ecx,ecx
|
||
|
@@:;mov [top_line],ecx
|
||
|
|
||
|
pushad
|
||
|
mov eax,[pos.x]
|
||
|
mov ebx,[left_col]
|
||
|
mov ecx,ebx
|
||
|
add ecx,[columns.scr]
|
||
|
cmp eax,ebx
|
||
|
jb .lp1
|
||
|
cmp eax,ecx
|
||
|
jb .exit
|
||
|
lea ebx,[eax]
|
||
|
sub ebx,[columns.scr]
|
||
|
jmp @f
|
||
|
.lp1: mov ebx,eax
|
||
|
@@: mov [left_col],ebx
|
||
|
|
||
|
.exit:
|
||
|
mov [pos.x],eax
|
||
|
popad
|
||
|
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func get_real_length ;////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
movzx eax,word[esi]
|
||
|
@@: cmp byte[esi+eax+4-1],' '
|
||
|
jne @f
|
||
|
dec eax
|
||
|
jnz @b
|
||
|
@@: ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func get_line_offset ;////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
; Input:
|
||
|
; ECX = line number
|
||
|
; Output:
|
||
|
; ESI = line data offset
|
||
|
;-----------------------------------------------------------------------------
|
||
|
push eax ecx
|
||
|
mov esi,AREA_EDIT
|
||
|
jecxz .exit
|
||
|
@@: movzx eax,word[esi]
|
||
|
dec ecx
|
||
|
lea esi,[esi+eax+4]
|
||
|
jnz @b
|
||
|
.exit:
|
||
|
pop ecx eax
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func init_sel_vars ;//////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
pushad
|
||
|
mov [sel.selected],1
|
||
|
mov eax,[sel.x]
|
||
|
mov ebx,[sel.y]
|
||
|
mov ecx,[pos.x]
|
||
|
mov edx,[pos.y]
|
||
|
cmp ebx,edx
|
||
|
jl .lp2
|
||
|
jne @f
|
||
|
cmp eax,ecx
|
||
|
jl .lp2
|
||
|
jne .lp1
|
||
|
dec [sel.selected]
|
||
|
jmp .lp2
|
||
|
@@: xchg ebx,edx
|
||
|
.lp1: xchg eax,ecx
|
||
|
.lp2: mov [sel.begin.x],eax
|
||
|
mov [sel.begin.y],ebx
|
||
|
mov [sel.end.x],ecx
|
||
|
mov [sel.end.y],edx
|
||
|
popad
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func get_scroll_vars ;////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
; Input:
|
||
|
; EAX = maximum data size (units)
|
||
|
; EBX = visible data size (units)
|
||
|
; ECX = current data position (units)
|
||
|
; EDX = scrolling area size (pixels)
|
||
|
; Output:
|
||
|
; EAX = srcoller offset (pixels)
|
||
|
; EBX = scroller size (pixels)
|
||
|
;-----------------------------------------------------------------------------
|
||
|
push eax ebx edx
|
||
|
; sub eax,ebx
|
||
|
mov esi,eax
|
||
|
mov eax,edx
|
||
|
imul ebx
|
||
|
idiv esi
|
||
|
cmp eax,[esp]
|
||
|
jge .null
|
||
|
cmp eax,AMINS
|
||
|
jge @f
|
||
|
neg eax
|
||
|
add eax,AMINS
|
||
|
sub [esp],eax
|
||
|
mov eax,AMINS
|
||
|
@@: mov [esp+4],eax ; scroller size
|
||
|
mov eax,[esp]
|
||
|
imul ecx
|
||
|
idiv esi
|
||
|
or eax,eax
|
||
|
jns @f
|
||
|
xor eax,eax
|
||
|
@@: mov [esp+8],eax ; scroller offset
|
||
|
add eax,[esp+4]
|
||
|
cmp eax,[esp]
|
||
|
jle @f
|
||
|
; mov eax,[esp]
|
||
|
; sub eax,[esp+4]
|
||
|
; js @f
|
||
|
; mov [esp+8],eax
|
||
|
@@:
|
||
|
pop edx ebx eax
|
||
|
ret
|
||
|
.null:
|
||
|
mov dword[esp+4],0
|
||
|
mov dword[esp+8],0
|
||
|
jmp @b
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func uint2strz ;//////////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
dec ebx
|
||
|
jz @f
|
||
|
xor edx,edx
|
||
|
div ecx
|
||
|
push edx
|
||
|
call uint2strz
|
||
|
pop eax
|
||
|
@@: cmp al,10
|
||
|
sbb al,$69
|
||
|
das
|
||
|
stosb
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func uint2str ;///////////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
cmp eax,ecx
|
||
|
jb @f
|
||
|
xor edx,edx
|
||
|
div ecx
|
||
|
push edx
|
||
|
call uint2str
|
||
|
pop eax
|
||
|
@@: cmp al,10
|
||
|
sbb al,$69
|
||
|
das
|
||
|
stosb
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func rgb_to_gray ;////////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
push 0 eax
|
||
|
and dword[esp],0x000000FF
|
||
|
fild dword[esp]
|
||
|
fmul [float_gray_b]
|
||
|
shr eax,8
|
||
|
mov [esp],eax
|
||
|
and dword[esp],0x000000FF
|
||
|
fild dword[esp]
|
||
|
fmul [float_gray_g]
|
||
|
faddp
|
||
|
shr eax,8
|
||
|
and eax,0x000000FF
|
||
|
mov [esp],eax
|
||
|
fild dword[esp]
|
||
|
fmul [float_gray_r]
|
||
|
faddp
|
||
|
frndint
|
||
|
fist dword[esp]
|
||
|
fist dword[esp+1]
|
||
|
fistp dword[esp+2]
|
||
|
pop eax
|
||
|
add esp,4
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;float_gray_r dd 0.30f
|
||
|
;float_gray_g dd 0.59f
|
||
|
;float_gray_b dd 0.11f
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func get_active_menu_item ;///////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
pushad
|
||
|
mov [mi_cur],0
|
||
|
mcall 37,1
|
||
|
movsx ebx,ax
|
||
|
sar eax,16
|
||
|
mov ecx,__rc
|
||
|
pushd 2 0 (main_menu.width+7) (ATOPH-2)
|
||
|
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
|
||
|
; add [__rc+0xC],ATOPH-2
|
||
|
call pt_in_rect
|
||
|
jnc .outside_menu
|
||
|
m2m dword[ecx+0x8],dword[ecx+0x0]
|
||
|
mov edx,main_menu
|
||
|
@@: inc [mi_cur]
|
||
|
movzx esi,word[edx+0]
|
||
|
add [ecx+0x8],esi
|
||
|
call pt_in_rect
|
||
|
jc .exit
|
||
|
m2m dword[ecx+0x0],dword[ecx+0x8]
|
||
|
add edx,8+1
|
||
|
movzx esi,byte[edx-1]
|
||
|
add edx,esi
|
||
|
cmp byte[edx+8],0
|
||
|
jne @b
|
||
|
mov [mi_cur],0
|
||
|
.exit:
|
||
|
popad
|
||
|
ret
|
||
|
.outside_menu:
|
||
|
or [mi_cur],-1
|
||
|
@@: popad
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func get_active_popup_item ;//////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
pushad
|
||
|
mov [pi_cur],0
|
||
|
mcall 37,1
|
||
|
movsx ebx,ax
|
||
|
sar eax,16
|
||
|
mov ecx,__rc
|
||
|
mov dword[ecx+0x0],0
|
||
|
mov dword[ecx+0x4],0
|
||
|
movzx edx,[ebp+POPUP.width]
|
||
|
mov dword[ecx+0x8],edx;POP_WIDTH
|
||
|
movzx edx,[ebp+POPUP.height]
|
||
|
mov dword[ecx+0xC],edx;POP_HEIGHT
|
||
|
call pt_in_rect
|
||
|
jnc .outside_window
|
||
|
inc dword[ecx+0x0]
|
||
|
mov dword[ecx+0x4],3
|
||
|
dec dword[ecx+0x8]
|
||
|
mov dword[ecx+0xC],3+POP_IHEIGHT-1
|
||
|
mov edx,[ebp+POPUP.data];popup_text.data
|
||
|
@@: inc [pi_cur]
|
||
|
inc edx
|
||
|
movzx esi,byte[edx-1]
|
||
|
cmp byte[edx],'-'
|
||
|
jne .lp1
|
||
|
pushd [ecx+0xC]
|
||
|
sub dword[ecx+0xC],POP_IHEIGHT-4
|
||
|
call pt_in_rect
|
||
|
popd [ecx+0xC]
|
||
|
jc .separator
|
||
|
add dword[ecx+0x4],4
|
||
|
add dword[ecx+0xC],4
|
||
|
jmp .lp3
|
||
|
.lp1: call pt_in_rect
|
||
|
jnc .lp2
|
||
|
mov eax,[pi_cur]
|
||
|
test byte[ebp+eax-1],1;byte[popup_text+eax-1],1
|
||
|
jnz .exit
|
||
|
jmp .separator
|
||
|
.lp2: add dword[ecx+0x4],POP_IHEIGHT
|
||
|
add dword[ecx+0xC],POP_IHEIGHT
|
||
|
add edx,esi
|
||
|
inc edx
|
||
|
movzx esi,byte[edx-1]
|
||
|
.lp3: add edx,esi
|
||
|
cmp byte[edx],0
|
||
|
jne @b
|
||
|
.separator:
|
||
|
mov [pi_cur],0
|
||
|
.exit:
|
||
|
popad
|
||
|
ret
|
||
|
.outside_window:
|
||
|
or [pi_cur],-1
|
||
|
jmp .exit
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func line_add_spaces ;////////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
; esi = line offset
|
||
|
; ecx = needed line length
|
||
|
;-----------------------------------------------------------------------------
|
||
|
pushad
|
||
|
movzx edx,word[esi]
|
||
|
cmp ecx,edx
|
||
|
jbe .exit
|
||
|
sub ecx,edx
|
||
|
push ecx
|
||
|
mov edi,AREA_TEMP2
|
||
|
mov eax,esi
|
||
|
mov esi,edi
|
||
|
sub esi,ecx
|
||
|
lea ecx,[eax+4]
|
||
|
add ecx,edx;[eax]
|
||
|
push ecx
|
||
|
neg ecx
|
||
|
lea ecx,[esi+ecx+1]
|
||
|
std
|
||
|
rep movsb
|
||
|
pop edi ecx
|
||
|
add [eax],cx
|
||
|
mov al,' '
|
||
|
cld
|
||
|
rep stosb
|
||
|
.exit:
|
||
|
popad
|
||
|
ret
|
||
|
endf
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
func delete_selection ;///////////////////////////////////////////////////////
|
||
|
;-----------------------------------------------------------------------------
|
||
|
cmp [sel.selected],0
|
||
|
je .exit.2
|
||
|
|
||
|
pushad
|
||
|
mov ecx,[sel.begin.y]
|
||
|
cmp ecx,[sel.end.y]
|
||
|
je .single_line
|
||
|
call get_line_offset
|
||
|
and dword[esi],not 0x00020000
|
||
|
or dword[esi],0x00010000
|
||
|
mov ecx,[sel.begin.x]
|
||
|
call line_add_spaces
|
||
|
lea edi,[esi+4]
|
||
|
mov ecx,[sel.end.y]
|
||
|
call get_line_offset
|
||
|
call get_real_length
|
||
|
cmp eax,[sel.end.x]
|
||
|
jbe @f
|
||
|
mov eax,[sel.end.x]
|
||
|
@@: movzx ecx,word[esi]
|
||
|
sub ecx,eax
|
||
|
mov ebx,[sel.begin.x]
|
||
|
add ebx,ecx
|
||
|
mov [edi-4],bx
|
||
|
add edi,[sel.begin.x]
|
||
|
lea esi,[esi+eax+4]
|
||
|
mov ecx,AREA_TEMP2
|
||
|
sub ecx,esi
|
||
|
cld
|
||
|
rep movsb
|
||
|
mov eax,[sel.end.y]
|
||
|
sub eax,[sel.begin.y]
|
||
|
sub [lines],eax
|
||
|
jmp .exit
|
||
|
|
||
|
.single_line:
|
||
|
call get_line_offset
|
||
|
and dword[esi],not 0x00020000
|
||
|
or dword[esi],0x00010000
|
||
|
call get_real_length
|
||
|
cmp eax,[sel.begin.x]
|
||
|
jbe .exit
|
||
|
mov ecx,[sel.end.x]
|
||
|
cmp ecx,eax
|
||
|
jbe @f
|
||
|
mov ecx,eax
|
||
|
@@: sub ecx,[sel.begin.x]
|
||
|
sub [esi],cx
|
||
|
lea edi,[esi+4]
|
||
|
add edi,[sel.begin.x]
|
||
|
lea esi,[edi+ecx]
|
||
|
mov ecx,AREA_TEMP2
|
||
|
sub ecx,esi
|
||
|
cld
|
||
|
rep movsb
|
||
|
|
||
|
.exit:
|
||
|
mov eax,[sel.begin.x]
|
||
|
mov [pos.x],eax
|
||
|
mov [sel.x],eax
|
||
|
mov eax,[sel.begin.y]
|
||
|
mov [pos.y],eax
|
||
|
mov [sel.y],eax
|
||
|
popad
|
||
|
mov [modified],1
|
||
|
clc
|
||
|
ret
|
||
|
|
||
|
.exit.2:
|
||
|
stc
|
||
|
ret
|
||
|
endf
|