Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1337 → Rev 1338

/programs/other/t_edit/t_work.inc
0,0 → 1,1759
struct f70
func_n dd ?
param1 dd ?
param2 dd ?
param3 dd ?
param4 dd ?
rezerv db ?
name dd ?
ends
 
struct TexSelect
x0 dd ?
y0 dd ?
x1 dd ?
y1 dd ?
ends
 
struct TexColViv
Text rb MAX_COLOR_WORD_LEN; // ñëîâî
f1 dd 0
wwo db ? ; whole words only
endc db ? ; ñèìâîë êîíöà âûäåëåíèÿ (wwo&4)
color db ? ; íîìåð öâåòà
ends
 
struct symbol
c db ? ; +0 ñèìâîë
col db ? ; +1 öâåò
perv dd ? ; +2
next dd ? ; +6 óêàçàòåëè
tc dd ? ; +10 âðåì. ñîçäàíèÿ
td dd ? ; +14 âðåì. óäàëåíèÿ
ends
 
ColColor dd 1
ColWords dd 0
CURSOR_COLOR dd 0x808080
WND_CAPT_COLOR dd 0x80
WND_WORK_COLOR dd 0x0
WND_BORD_COLOR dd 0xd0d0d0
SELECT_COLOR dd 0x208080
CUR_TEXT_COLOR dd 0xff0000
WND_TEXT_COLOR dd 0xffff00
 
options_file dd 0
options_file_end dd 0
tex_colors dd 0
tex_help_f1 dd 0
 
FkPos: rd 256
Col dd 0 ;óêàçàòåëü íà ñòðóêòóðû êëþ÷åâûõ ñëîâ TexColViv
 
conv_tabl rb 128 ; òàáëèöà äëÿ êîíâåðòèðîâàíèÿ scan-êîäà â ascii-êîä
keyUpr dd 0
err_opn db 0 ;îøèáêà îòêðûòèÿ ôàéëà
err_sav db 0 ;îøèáêà ñîõðàíåíèÿ ôàéëà
panel_id db 0 ;íîìåð îòêðûòîé ïàíåëè
 
ch_tim dd ? ; êîëè÷åñòâî èçìåíåíèé â ôàéëå
ls_tim dd ? ; âðåìÿ ïîñëåäíåãî ñîõðàíåíèÿ
co_tim dd ? ; âðåìÿ ïîñëåäíåé öâåòîâîé ðàçìåòêè
tim_Undo dd ? ; êîëè÷åñòâî îòìåíåííûõ äåéñòâèé
gpOpt db 0
mode_colored db 1 ; ðåæèì âûäåëåíèÿ ñëîâ öâåòîì (0-âûêë. 1-âêë.)
 
txtBuf db 'ãä¥à: '
buf db BUF_SIZE dup(0)
key_new db 0 ; ñèìâîë, êîòîðûé áóäåò äîáàâëÿòñÿ ñ êëàâèàòóðû
tex dd 0
tex_1 dd 0
tex_end dd 0
 
hed db 'TextEditor 29.12.09',0 ;ïîäïèñü îêíà
sc system_colors
 
wndMain BOX 0,50,440,150
recMain BOX 30,23,7,10
 
curMod db 1
cur_x dd 0
cur_y dd 0
invis db 0 ;ðåæèì ïîêàçà íåïå÷àòàåìûõ ñèìâîëîâ
symbol_new_line db 20 ;ñèìâîë çàâåðøåíèÿ ñòðîêè
dragm db 0 ;âûäåëåíèå îò ìûøè
dragk db 0 ;âûäåëåíèå îò êëàâèàòóðû
sel TexSelect 0,0,0,0 ;ñòðóêòóðà âûäåëåíèÿ
seln TexSelect ;äîïîëíèòåëüíàÿ ñòðóêòóðà âûäåëåíèÿ
help_id dd -1 ;èäåíòèôèêàòîð äëÿ ñïðàâêè
 
fn_icon db 'te_icon.bmp',0
bmp_icon dd 0
run_file_70 f70
 
 
;input:
; reg = index
;output:
; reg = pointer to 'tex' struct
macro ConvertIndexToPointer reg {
imul reg,sizeof.symbol
add reg,[tex]
}
 
 
;output:
; al = 1 - can save
CanSave:
push ecx
mov ecx,[ch_tim]
sub ecx,[tim_Undo]
mov al,1
cmp [ls_tim],ecx
jne @f
dec al
@@:
pop ecx
ret
 
 
;output:
; al = 1 - selected
IsSel:
push ebx
xor al,al
cmp [dragm],1
je @f
mov al,1
mov ebx,[sel.x0]
cmp ebx,[sel.x1]
jne @f
mov ebx,[sel.y0]
cmp ebx,[sel.y1]
jne @f
xor al,al
@@:
pop ebx
ret
 
SelNormalize:
push ecx esi edi
mov esi,sel
mov edi,seln
mov ecx,sizeof.TexSelect
rep movsb
 
jmp @f
.swp_f:
mov ecx,[seln.x0]
m2m [seln.x0],[seln.x1]
mov [seln.x1],ecx
 
mov ecx,[seln.y0]
cmp ecx,[seln.y1] ;(sel.y0>sel.y1)
jle .end_f
m2m [seln.y0],[seln.y1]
mov [seln.y1],ecx
 
jmp .end_f
@@:
 
mov ecx,[seln.y0]
cmp ecx,[seln.y1] ;(sel.y0>sel.y1)
jg .swp_f
 
cmp ecx,[seln.y1] ;(sel.y0==sel.y1)
jne .end_f
mov ecx,[seln.x0]
cmp ecx,[seln.x1] ;(sel.x0>sel.x1)
jg .swp_f
 
.end_f:
pop edi esi ecx
ret
 
SelStart:
push ecx
mov ecx,[cur_x]
add ecx,[hScr.position]
mov [sel.x0],ecx
mov [sel.x1],ecx
 
mov ecx,[cur_y]
add ecx,[wScr.position]
mov [sel.y0],ecx
mov [sel.y1],ecx
pop ecx
ret
 
SelMove:
push ecx
mov ecx,[cur_x]
add ecx,[hScr.position]
mov [sel.x1],ecx
 
mov ecx,[cur_y]
add ecx,[wScr.position]
mov [sel.y1],ecx
pop ecx
ret
 
;input:
; al = 1 - clear all memory
Clear:
mov [cur_x],0
mov [cur_y],0
mov [ch_tim],0
mov [ls_tim],0
mov [co_tim],0
mov [tim_Undo],0
mov [help_id],-1
 
mov [wScr.position],0
mov [wScr.max_area],100
mov [wScr.redraw],1
mov [hScr.position],0
mov [hScr.max_area],100
 
mov [sel.x0],0
mov [sel.y0],0
mov [sel.x1],0
mov [sel.y1],0
 
cmp al,0
je .exit
 
push ecx edx
mov ecx,sizeof.symbol*maxChars
mov edx,[tex]
@@:
mov byte [edx],0
inc edx
loop @b
mov edx,[tex]
mov dword [edx+6],1
pop edx ecx
 
.exit:
ret
 
 
;--- out_reg = Col[keyw[ind_reg]].Text[0] ---
macro ColToIndexOffset ind_reg,out_reg {
mov out_reg,ind_reg
imul out_reg,sizeof.TexColViv
add out_reg,[Col]
}
 
 
 
InitColText:
push eax ebx ecx esi edi
 
; mov ebx,fn_col_option
; mov esi,sys_path
; mov edi,file_name
mov ebx,dword[fn_col_option]
copy_path ebx,fn_syntax_dir,file_name_rez
copy_path file_name_rez,sys_path,file_name
 
mov eax,70
mov [run_file_70.func_n], 0
mov [run_file_70.param1], 0
mov [run_file_70.param2], 0
mov ebx,[options_file_end]
sub ebx,[options_file]
mov [run_file_70.param3], ebx
m2m [run_file_70.param4], [options_file]
mov [run_file_70.rezerv], 0
mov [run_file_70.name], file_name
mov ebx,run_file_70
int 0x40
 
mov ecx,0x100
mov edi,FkPos
@@:
mov dword[edi],-1
add edi,4
loop @b
 
 
;init: ColColor, ColWords, ...
mov dword[ColColor],1
mov dword[ColWords],0
mov dword[tex_help_f1],0
mov [help_id],-1 ;èäåíòèôèêàòîð ñëîâà äëÿ ñïðàâêè
 
cmp eax,6
je @f
cmp eax,0
je @f
cmp ax,10
jl .zifra_0_9
mov al,'?'
sub ax,48
.zifra_0_9:
add ax,48
 
mov byte[msgbox_3.err],al
push thread
push msgbox_3
call [mb_create] ;message: Can-t open color options file!
jmp .no_colors
@@:
 
mov esi,[options_file]
mov edi,ColColor
mov ecx,9*4
rep movsb
 
mov eax,[options_file]
add eax,32
mov dword[tex_colors],eax
 
mov eax,dword[ColColor] ;init: Col (offset to key words)
add eax,8
shl eax,2
add eax,[options_file]
mov dword[Col],eax
 
mov ecx,dword[ColWords] ;init: FkPos (first key positions)
xor eax,eax
@@:
ColToIndexOffset eax,edi
xor ebx,ebx
mov bl,byte[edi]
shl bx,2
mov esi,FkPos
add esi,ebx
cmp dword[esi],-1
jne .no_ch_key
mov dword[esi],eax
.no_ch_key:
inc eax
loop @b
 
;init: tex_help_f1
mov ecx,dword[ColWords]
imul ecx,sizeof.TexColViv
add ecx,dword[Col]
mov dword[tex_help_f1],ecx
 
;copy new colors in dir_list
; m2m dword[eax+28],dword[WND_WORK_COLOR]
; m2m dword[eax+32],dword[SELECT_COLOR]
; m2m dword[eax+36],dword[WND_CAPT_COLOR]
; m2m dword[eax+40],dword[WND_TEXT_COLOR]
; m2m dword[eax+44],dword[CUR_TEXT_COLOR]
.no_colors:
pop edi esi ecx ebx eax
ret
 
 
;input:
; ebx = file size
OpenFile:
mov [err_opn],0
push eax ;destination
push ecx ;for cycle
push edx ;source
 
xor al,al
call Clear
mov eax,ebx
mov ecx,ebx
add eax,2
ConvertIndexToPointer eax
mov edx,[tex]
add edx,ebx
push ebx
@@:
mov ebx,[edx]
mov byte [eax],bl
mov dword [eax+2],ecx
inc dword [eax+2]
mov dword [eax+6],ecx
add dword [eax+6],3
;mov byte[eax+1],0 ;col=0
mov dword [eax+10],-1 ;tc=-1
mov dword [eax+14],0 ;td=0
 
cmp ecx,0
je @f
dec ecx
dec edx
sub eax,sizeof.symbol
jmp @b
@@:
pop ebx
add eax,2
mov dword [eax],0 ; first sumbol 'perv=0'
 
mov edx,[tex]
; begining sumbol 'perv=0' 'next=2'
mov dword [edx+2],0
mov dword [edx+6],2
 
add edx,sizeof.symbol
mov dword [edx+6],0 ; last sumbol 'next=0'
mov dword [edx+2],ebx ; last sumbol 'perv=last'
inc dword [edx+2]
 
mov edx,ebx
inc edx ;2 = rezerv sumbols
imul edx,sizeof.symbol
add edx,[tex]
mov dword [edx+6],1 ; last sumbol 'next=1'
 
@@: ;clear memory, need if before was open big file
add edx,sizeof.symbol
cmp edx,[tex_end]
jge @f
mov dword[edx+10],0
mov dword[edx+14],0
jmp @b
@@:
 
call GetNumLines
cmp eax,100
jge @f
mov eax,100
@@:
mov [wScr.max_area],eax
; mov [wScr.redraw],1
pop edx ecx eax
call CmColored
ret
 
;input:
; edx = pointer to symbol struct
;output:
; edx = pointer to 'perv' visible symbol struct
IteratPerv:
cmp [tim_Undo],0
je .else
push ebx
@@:
call GetTexPervPos
cmp edx,[tex]
je @f
call SymbNotVis
cmp bl,1
je @b
cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
je @b
@@:
pop ebx
ret
.else:
call GetTexPervPos
cmp edx,[tex]
je .endif
cmp dword [edx+14],0
jne .else
cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
je .else
.endif:
ret
 
 
;input:
; edx = pointer to symbol struct
;output:
; edx = pointer to 'next' visible symbol struct
IteratNext:
cmp [tim_Undo],0
je .else
push ebx
@@:
call GetTexNextPos
cmp edx,[tex_1]
jle @f
call SymbNotVis
cmp bl,1
je @b
cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
je @b
@@:
pop ebx
ret
.else:
call GetTexNextPos
cmp edx,[tex_1]
jle .endif
cmp dword [edx+14],0
jne .else
cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
je .else
.endif:
ret
 
;input:
; edx = pointer to symbol struct
; bl = symbol end of select
ItPoNextUc:
@@:
cmp bl,byte[edx]
je @f
cmp edx,[tex_1]
jle @f
call IteratNext
jmp @b
@@:
call IteratNext
ret
 
;input:
; edx = pointer to symbol struct
ItPervColorTag:
@@:
cmp byte[edx+1],0
jne @f
call IteratPerv
cmp edx,[tex_1]
jle @f
jmp @b
@@:
ret
 
;input:
; edx = pointer to symbol struct
ItNextColorTag:
@@:
call IteratNext
cmp byte[edx+1],0
jne @f
cmp edx,[tex_1]
jle @f
jmp @b
@@:
;call IteratNext
ret
 
;input:
; edx = pointer to symbol struct
;output:
; bl = 1 if sumbol not visible
; (tex[i].td+tim_Undo<=ch_tim && tex[i].td) || (tex[i].tc>ch_tim-tim_Undo)
SymbNotVis:
push eax
 
xor bl,bl
 
cmp dword [edx+14],0
je @f
mov eax,[edx+14] ;eax=tex[i].td
add eax,[tim_Undo]
cmp eax,[ch_tim]
jg @f
mov bl,1
pop eax
ret
@@:
 
mov eax,[ch_tim]
sub eax,[tim_Undo]
cmp [edx+10],eax
jle @f
or bl,1
@@:
 
pop eax
ret
 
 
;input:
; bh = 1 - move cursor after text add
; bl = 1 - change time when text add
; esi = add text len
; edi = pointer to text string
TextAdd:
push ebp
mov ebp,esp
sub esp,4*2
 
push eax ;po_t
push ecx edx edi
 
call GetPos
call GetTexPervPos
call GetTexArrIndex ;eax=po_t
 
mov dword[ebp-4],0 ;count new spaces
cmp [gpOpt],2
je @f
push eax ebx ;c_sp=cur[cn].x+Scroller->XPos-StrLen(cur[cn].y+Scroller->YPos);
mov eax,[cur_x]
add eax,[hScr.position]
mov dword[ebp-4],eax
 
mov eax,[cur_y]
add eax,[wScr.position]
call StrLen
sub dword[ebp-4],ebx
pop ebx eax
@@:
 
mov dword[ebp-8],0 ;count new lines
cmp [gpOpt],0
jne @f
push eax
mov eax,[cur_y]
add eax,[wScr.position]
inc eax
mov dword[ebp-8],eax
 
call GetNumLines
sub dword[ebp-8],eax
pop eax
@@:
 
mov edx,sizeof.symbol
shl edx,1
add edx,[tex]
@@: ;for(i=2;i<texMax;i++)
cmp dword [edx+10],0 ;if(!tex[i].tc && !tex[i].td)
jne .u1f
cmp dword [edx+14],0
jne .u1f
cmp bl,0 ;if(n_tim) ch_tim++;
je .no_tim
inc [ch_tim]
.no_tim:
cmp bh,0
je .no_cur_mov
cmp dword[ebp-8],0 ;åñëè åñòü äîáàâî÷íûå ñòðîêè, òî êóðñîð åùå íå äâèãàåì
jg .no_cur_mov
cmp dword[ebp-4],0 ;åñëè íåò äîáàâî÷íûõ ïðîáåëîâ, òî êóðñîð òîæå íå äâèãàåì
jg .no_cur_mov
inc [cur_x] ;move cursor
;call GoToPos
cmp byte [edi],13
jne .no_cur_mov
mov [cur_x],0
inc [cur_y]
.no_cur_mov:
 
xor bl,bl ;n_tim=false;
 
mov cl,byte [edi] ;tex[i].c=ta[ns];
mov byte [edx],cl
m2m dword [edx+10],dword [ch_tim] ;tex[i].tc=ch_tim;
mov [edx+2],eax ;tex[i].perv=po_t;
 
mov ecx,eax
imul ecx,sizeof.symbol
add ecx,[tex] ; *** ecx = tex[po_t] ***
add ecx,6 ; *** ecx = tex[po_t].next ***
m2m dword [edx+6],dword [ecx] ;tex[i].next=tex[po_t].next;
 
call GetTexArrIndex ;*** eax = i ***
cmp eax,maxChars
jge @f
mov [ecx],eax ;tex[po_t].next=i; // ññûëêè ïåðåíàïðàâëÿåì
mov ecx,[edx+6] ; *** ecx = tex[i].next ***
imul ecx,sizeof.symbol
add ecx,[tex] ; *** ecx = tex[tex[i].next] ***
mov [ecx+2],eax ;tex[tex[i].next].perv=i;
 
cmp dword[ebp-8],0 ;add lines or text
jle .spc_add
dec dword[ebp-8]
mov byte [edx],13
jmp .u1f
.spc_add:
cmp dword[ebp-4],0 ;add spaces or text
jle .tex_add
dec dword[ebp-4]
mov byte [edx],' '
jmp .u1f
.tex_add:
inc edi
dec esi
.u1f:
add edx,sizeof.symbol
cmp edx,[tex_end]
jge @f ;out of memory
cmp esi,0
jne @b
@@:
 
pop edi edx ecx eax
mov esp,ebp ; âîññòàíàâëèâàåì ñòåê
pop ebp
call CmColored
ret
 
 
 
;input:
; ecx = position to free insert cell
; edx = pointer to sumbol, when insert
; esi = pointer to added symbol
;output:
; ecx = position to inserted cell
CharAdd:
 
.loop_b:
cmp ecx,[tex_end]
jge .end_f
cmp dword[ecx+10],0
jne @f
cmp dword[ecx+14],0
je .loop_e
@@:
add ecx,sizeof.symbol
jmp .loop_b
.loop_e:
 
push eax ebx
mov eax,[ch_tim]
mov dword[ecx+10],eax
mov al,byte[esi]
mov byte[ecx],al
 
call GetTexArrIndex ; *** eax=pos ***
mov [ecx+2],eax ;tex[i].perv=pos;
m2m dword[ecx+6],dword[edx+6] ;tex[i].next=tex[pos].next;
 
push edx
mov edx,ecx
call GetTexArrIndex ; *** eax=i ***
pop edx
 
mov [edx+6],eax ;tex[pos].next=i; // ññûëêè ïåðåíàïðàâëÿåì
mov ebx,[ecx+6]
ConvertIndexToPointer ebx
mov [ebx+2],eax ;tex[tex[i].next].perv=i; // ...
pop ebx eax
 
.end_f:
call CmColored
ret
 
 
;input:
; conv_table = pointert to convert table
;output:
; edi = count converted symbols
ConvertSelText:
xor edi,edi
push eax ebx ecx edx esi
call IsSel
cmp al,0
je .end_f
call SetUndo
call SelNormalize
 
mov esi,[seln.x0]
mov ecx,[seln.y0]
call GetPosByParam
mov eax,edx
mov esi,[seln.x1]
mov ecx,[seln.y1]
call GetPosByParam
;call GetTexPervPos
mov ebx,edx
 
cmp eax,ebx
je .end_f
 
inc [ch_tim]
mov edx,eax ;i=p0;
mov ecx,2
ConvertIndexToPointer ecx
@@:
mov esi,[edx]
and esi,0xff
add esi,[conv_table] ;EvUpper
cmp byte [esi],0
je .no_change
m2m dword [edx+14],dword [ch_tim]
call CharAdd ;b_pos=CharAdd(tex[i].c^32,i,false,b_pos);
call GetTexNextPos ;go to added symbol
inc edi
.no_change:
 
call IteratNext
cmp edx,[tex]
je @f
cmp edx,ebx
je @f
 
jmp @b
@@:
cmp edi,0
jne @f
dec [ch_tim]
@@:
.end_f:
pop esi edx ecx ebx eax
 
ret
 
;input:
; bh = (0-backspace, 1-delete)
; bl = 1 - change time
;output:
; bl = 0 - no delete
; bl = 1 - delete
TextDel:
push edx cx
xor cl,cl
cmp bh,1
je @f
call CurMoveLeft
cmp dl,0
je .no_del
@@:
call GetPos
cmp [gpOpt],1
je .no_del
cmp bl,0
je @f
inc [ch_tim]
@@:
m2m dword [edx+14], dword [ch_tim]
mov cl,1
.no_del:
mov bl,cl
pop cx edx
ret
 
 
 
;input:
; eax = pointer to begin select
; ebx = pointer to end select
Revers:
cmp eax,ebx
jne @f
ret
@@:
 
push ecx edx
 
mov edx,[tex_1]
cmp edx,ebx ;if(p1==1)p1=tex[1].perv;
jne @f
call GetTexPervPos
mov ebx,edx
@@:
 
push esi
mov edx,[eax+2] ; *** edx = tex[p0].perv ***
ConvertIndexToPointer edx
add edx,6
mov ecx,[edx] ;tmp = tex[tex[p0].perv].next;
 
mov esi,[ebx+6] ; *** esi = tex[p1].next ***
ConvertIndexToPointer esi
add esi,2
m2m dword[edx],dword[esi] ;tex[tex[p0].perv].next = tex[tex[p1].next].perv;
 
mov [esi],ecx ;tex[tex[p1].next].perv = tmp;
pop esi
 
mov ecx,[eax+2] ;tmp = tex[p0].perv;
m2m dword[eax+2],dword[ebx+6] ;tex[p0].perv = tex[p1].next;
mov [ebx+6],ecx ;tex[p1].next = tmp;
 
mov edx,eax ;i=p0;
@@:
mov ecx,[edx+6] ;tmp = tex[i].next;
m2m dword[edx+6],dword[edx+2] ;tex[i].next = tex[i].perv;
mov [edx+2],ecx ;tex[i].perv = tmp;
cmp edx,ebx ;if(i==p1)break;
je @f
; ---
;cmp edx,[tex]
;je @f
; ---
mov edx,ecx ;i = tmp;
ConvertIndexToPointer edx
jmp @b
@@:
pop edx ecx
call CmColored
ret
 
 
;output:
; dl = 0 not move
; dl = 2 if move up
; dl = 8 if scroll move up
CurMoveUp:
cmp [cur_y],0
je @f
dec [cur_y]
mov dl,2
ret
@@:
cmp [wScr.position],0
je @f
dec [wScr.position]
mov dl,8
ret
@@:
mov dl,0
ret
 
;output:
; dl = 0 not move
; dl = 2 if move down
; dl = 8 if scroll move down
CurMoveDown:
push eax
mov dl,0
mov eax,[wScr.cur_area]
dec eax
cmp [cur_y],eax
jge @f
inc [cur_y]
mov dl,2
jmp .ret_f
@@:
mov eax,[cur_y]
add eax,[wScr.position]
inc eax
cmp [wScr.max_area],eax
jle @f
inc [wScr.position]
mov dl,8
@@:
.ret_f:
pop eax
ret
 
 
;output:
; dl = 0 not move
; dl = 1 if move up
CurMovePageUp:
push eax
mov eax,[wScr.cur_area]
xor dl,dl
cmp eax,[wScr.position]
jg @f
sub [wScr.position],eax
mov dl,1
@@:
cmp [wScr.position],0
je @f
cmp dl,1
je @f
mov [wScr.position],0
mov dl,1
@@:
pop eax
ret
 
CurMovePageDown:
push eax ebx
xor dl,dl
mov eax,[wScr.max_area]
sub eax,[wScr.cur_area]
cmp [wScr.position],eax
jge @f
mov ebx,[wScr.cur_area]
add [wScr.position],ebx
mov dl,1
mov [wScr.redraw],1
cmp [wScr.position],eax
jle @f
mov [wScr.position],eax
@@:
pop ebx eax
ret
 
;output:
; dl = 0 not move
; dl = 1 if move left
; dl = 3 if move left and up
; dl = 8 if scroll move up
CurMoveLeft:
cmp [cur_x],0
je @f
dec [cur_x]
mov dl,1
ret
@@:
cmp [hScr.position],0
je @f
dec [hScr.position]
mov dl,8
ret
@@:
cmp [cur_y],0
jne @f
mov dl,0
cmp [wScr.position],0
je .ret_f
dec [wScr.position]
call OnInitialUpdate
call CurMoveX_LastChar
mov dl,8
jmp .ret_f
@@:
cmp [cur_y],0
je @f
dec [cur_y]
call CurMoveX_LastChar
cmp dl,8
je .ret_f
mov dl,3
ret
@@:
mov dl,0
.ret_f:
ret
 
CurMoveRight:
push eax
xor dl,dl
mov eax,[hScr.cur_area]
cmp [cur_x],eax
jge @f
inc [cur_x]
mov dl,1
jmp .ret_f
@@:
inc [hScr.position]
mov dl,8
.ret_f:
pop eax
ret
 
CurMoveX_LastChar:
;[hScr.position]
;[hScr.cur_area]
;dl-???
push eax ebx
mov eax,[cur_y]
add eax,[wScr.position]
call StrLen
xor dl,dl
 
cmp ebx,[hScr.position]
jge @f
mov dl,8
mov [hScr.position],ebx
@@:
sub ebx,[hScr.position]
 
cmp ebx,[hScr.cur_area]
jle @f ; b---[---]---e
add [hScr.position],ebx
mov ebx,[hScr.cur_area]
sub [hScr.position],ebx
mov dl,8
@@:
mov [cur_x],ebx
pop ebx eax
ret
 
;output:
; dl = 0 not move
; dl = 1 move cursor
; dl = 8 move cursor and scroll
CurMoveX_FirstChar:
xor dl,dl
cmp [cur_x],0
je @f
mov [cur_x],0
mov dl,1
@@:
cmp [hScr.position],0
je @f
mov [hScr.position],0
mov dl,8
@@:
ret
 
;input:
; edx = pointer to symbol struct
;output:
; eax = array index
GetTexArrIndex:
push ecx edx
 
mov eax,edx
sub eax,[tex]
xor edx,edx
mov ecx,sizeof.symbol
div ecx
 
pop edx ecx
ret
 
;input:
; edx = pointer to symbol struct
;output:
; edx = pointer to 'perv' struct
GetTexPervPos:
push dword [edx+2]
pop edx
imul edx,sizeof.symbol
add edx,[tex]
ret
 
;input:
; edx = pointer to symbol struct
;output:
; edx = pointer to 'next' symbol struct
GetTexNextPos:
push dword [edx+6]
pop edx
imul edx,sizeof.symbol
add edx,[tex]
ret
 
 
;output:
; edx = symbol under cursor
; gpOpt = 1,2
; edx = tex[1].perv if error
; gpOpt = 0
GetPos:
push esi ecx
mov esi,[cur_x]
add esi,[hScr.position]
mov ecx,[cur_y]
add ecx,[wScr.position]
call GetPosByParam
pop ecx esi
ret
 
 
;input:
; esi = XPos
; ecx = YPos
;output:
; edx = symbol under cursor
; gpOpt = 1 if found text line
; gpOpt = 2 if found text line and column
; edx = tex[1] if error
; gpOpt = 0 if text no found
GetPosByParam:
push eax ;Row
push ebx ;Col
 
xor eax,eax
xor ebx,ebx
mov [gpOpt],0
mov edx,[tex]
@@:
call IteratNext
cmp edx,[tex_1]
jle @f
cmp ebx,esi
jne .u1_0 ;Col <> cur_x
mov [gpOpt],1
cmp eax,ecx
jge @f ; Row >= cur_y
.u1_0:
mov [gpOpt],0
inc ebx
cmp byte [edx],13
jne @b
cmp eax,ecx
jge @f ; Row >= cur_y
inc eax
xor ebx,ebx
jmp @b
@@:
cmp eax,ecx
jne @f ; Row = cur_y
inc [gpOpt]
@@:
cmp [gpOpt],0
jne @f
mov edx,[tex_1]
;call GetTexPervPos
@@:
pop ebx eax
ret
 
 
;input:
; eax = Row
;output:
; ebx = str len
StrLen:
push edx ecx
;ecx = Row, from cycle
 
xor ebx,ebx
xor ecx,ecx
mov edx,[tex]
@@:
call IteratNext
cmp edx,[tex_1]
jle @f
inc ebx
cmp byte [edx],13
jne @b
dec ebx ;lenght minus 1 sumbol to paragraph
cmp eax,ecx
je @f
xor ebx,ebx
inc ecx
jmp @b
@@:
 
cmp eax,ecx
je @f
xor ebx,ebx
@@:
 
pop ecx edx
ret
 
 
;output:
; edx = symbol position
;output:
; eax = number of line
; ebx = symbol position in line
GetTexCoords:
push edx
xor eax,eax
xor ebx,ebx
@@:
call IteratPerv
 
cmp eax,0
jne .no_col_mov
inc ebx
.no_col_mov:
 
cmp edx,[tex_1]
jle @f
cmp byte [edx],13
jne @b
inc eax
jmp @b
@@:
dec ebx
pop edx
ret
 
;output:
; eax = num lines
GetNumLines:
push edx
mov eax,1
mov edx,[tex]
@@:
call IteratNext
cmp edx,[tex_1]
jle @f
cmp byte [edx],13
jne @b
inc eax
jmp @b
@@:
;...
;dec eax
pop edx
ret
 
SetUndo:
mov [dragk],0 ;çàêàí÷èâàåì âûäåëåíèå îò êëàâèàòóðû
cmp [tim_Undo],1
jl .no_work
 
push eax ebx edx
mov edx,[tex]
call GetTexNextPos ;long i=tex[0].next;
mov eax,[tim_Undo]
sub [ch_tim],eax ;ch_tim-=tim_Undo;
mov eax,[ch_tim]
cmp [ls_tim],eax ;if(ls_tim>ch_tim)
jle @f
mov dword [ls_tim],0
@@:
cmp edx,[tex]
je @f
 
;if(tex[i].tc>ch_tim){ // åñëè ñîçäàíèå ñèìâîëà áûëî îòìåíåíî
cmp [edx+10],eax
jle .no_u1
mov dword [edx+10],0
mov dword [edx+14],0
 
mov ebx,[edx+2]
imul ebx,sizeof.symbol
add ebx,[tex];.next
m2m dword [ebx+6],dword [edx+6] ;tex[tex[i].perv].next=tex[i].next;
 
mov ebx,[edx+6]
imul ebx,sizeof.symbol
add ebx,[tex];.perv
m2m dword [ebx+2],dword [edx+2] ;tex[tex[i].next].perv=tex[i].perv;
 
.no_u1:
 
;else if(tex[i].td>ch_tim) tex[i].td=0; // åñëè óäàëåíèå ñèìâîëà áûëî îòìåíåíî
cmp [edx+14],eax
jle .no_u2
mov dword [edx+14],0
.no_u2:
 
call GetTexNextPos
jmp @b
@@:
mov dword [tim_Undo],0
mov eax,[co_tim]
cmp [ch_tim],eax
jge @f
mov [co_tim],0
@@:
pop edx ebx eax
.no_work:
ret
 
;input:
; ecx = Col
; edx = Row
GoToPos:
mov [cur_x],ecx
sub edx,[wScr.position]
 
cmp edx,[wScr.cur_area] ;[cur_y] > [.cur_area]
jl @f
push ebx
mov ebx,edx
sub ebx,[wScr.cur_area]
inc ebx
add [wScr.position],ebx
sub edx,ebx
pop ebx
; ??? redrav
@@:
mov [cur_y],edx
ret
 
;input:
; bl = 1 change time when delete text
;output:
; al = 1 if delete
SelTextDel:
call IsSel
cmp al,0
jne @f
ret
@@:
;call SelEnd
call SelNormalize
push esi edi ecx edx
mov esi,[seln.x1]
mov ecx,[seln.y1]
call GetPosByParam
mov edi,edx
 
mov esi,[seln.x0]
mov ecx,[seln.y0]
call GetPosByParam
 
cmp bl,0
je @f
inc [ch_tim]
 
@@:
cmp edx,[tex]
je @f
cmp edx,edi ;if(i==te)break;
je @f
m2m dword[edx+14],dword[ch_tim]
xor bl,bl ;n_tim=false;
call IteratNext
jmp @b
@@:
cmp bl,0
je @f
dec [ch_tim]
xor al,al
@@:
cmp bl,0
jne @f
mov ecx,[seln.x0]
mov edx,[seln.y0]
call GoToPos
mov [sel.x0],0
mov [sel.y0],0
mov [sel.x1],0
mov [sel.y1],0
@@:
pop edx ecx edi esi
 
ret
 
 
CmColored:
push eax edx
mov eax,[ch_tim]
sub eax,[tim_Undo]
mov dword[co_tim],eax
mov edx,[tex]
@@:
call IteratNext
cmp edx,[tex_1]
jle @f
mov byte[edx+1],0
jmp @b
@@:
 
cmp dword[ColWords],1
jl .no_colors
mov edx,[tex]
@@:
call TextFSColor
cmp edx,[tex_1]
jle .no_colors
jmp @b
.no_colors:
pop edx eax
ret
 
 
 
;input:
; edx = pointer to start symbol
;output:
; edx = pointer to next symbol
TextFSColor:
;eax = word_n
;ecx = l_pos
push ebp
mov ebp,esp
sub esp,10 ;2*4+2*1
;bP = dword[ebp-4]
;eP = dword[ebp-8]
;fnd = byte[ebp-12]
;f_color = byte[ebp-13]
 
push eax ebx ecx esi edi
mov dword[ebp-4],1
mov dword[ebp-4],1
mov byte[ebp-12],0
mov byte[ebp-13],1
@@:
call IteratNext
cmp edx,[tex_1]
jle @f
 
xor ebx,ebx
mov bl,byte[edx]
;mov byte[buf],bl
;mov byte[buf+1],0
shl bx,2 ;ebx*=4
add ebx,FkPos
mov eax,dword[ebx]
cmp eax,0
jl @b ;if( (word_n=FkPos[(unsigned char)tex[i].c])>-1 ){
 
mov ecx,eax
;while(l_pos<ColWords && Col[keyw[l_pos]].Text[0]==Col[keyw[word_n]].Text[0])
.wh_1b:
cmp ecx,dword[ColWords]
jge .wh_1e
ColToIndexOffset ecx,esi
mov bh,byte[esi]
ColToIndexOffset eax,esi
mov bl,byte[esi]
cmp bh,bl
jne .wh_1e
inc ecx
jmp .wh_1b
.wh_1e:
 
mov dword[ebp-4],edx ;bP=i;
mov edi,1
 
.wh_2b: ;while(1){
call IteratNext
 
;while(l_pos>word_n && Col[keyw[l_pos-1]].Text[pos]!=tex[i].c)
.wh_3b:
cmp ecx,eax
jle .wh_3e
dec ecx
ColToIndexOffset ecx,ebx
inc ecx
;cmp byte[ebx+edi],byte[edx]
push ax
mov al,byte[ebx+edi]
mov bl,al
pop ax
cmp bl,byte[edx]
je .wh_3e
dec ecx
jmp .wh_3b
.wh_3e:
 
ColToIndexOffset eax,ebx
cmp byte[ebx+edi],0
jne .if_0 ;if(Col[keyw[word_n]].Text[pos]==0){
mov dword[ebp-8],edx ;eP=i;
ColToIndexOffset eax,esi
mov bl,byte[esi+MAX_COLOR_WORD_LEN+6]
mov byte[ebp-13],bl ;f_color=Col[keyw[word_n]].color;
 
mov byte[ebp-12],1
;... esi = Col[keyw[word_n]]
mov bl,byte[esi+MAX_COLOR_WORD_LEN+4]
cmp bl,0 ;if(Col[keyw[word_n]].wwo)
je .if_2n
push edx
mov edx,dword[ebp-4]
call IteratPerv
; mov bh,bl
 
btr bx,0 ;1-1
jae .if_3e ;if(Col[keyw[word_n]].wwo&1)
;u1= !(isalnum(cont_s)||cont_s=='_')
call isalnum
jae .if_3e
mov byte[ebp-12],0
.if_3e:
 
btr bx,3 ;4-1
jae .if_4e ;if(Col[keyw[word_n]].wwo&8)
;u1= !isalpha(cont_s);
call isalpha
jae .if_4e
mov byte[ebp-12],0
.if_4e:
 
 
mov edx,dword[ebp-8]
; call IteratNext
 
btr bx,1 ;2-1
jae .if_5e ;if(Col[keyw[word_n]].wwo&2)
;u1= !(isalnum(cont_s)||cont_s=='_')
call isalnum
jae .if_5e
mov byte[ebp-12],0
.if_5e:
 
btr bx,4 ;5-1
jae .if_6e ;if(Col[keyw[word_n]].wwo&16)
;u1= !isalpha(cont_s);
call isalpha
jae .if_6e
mov byte[ebp-12],0
.if_6e:
 
btr bx,2 ;3-1
jae .if_7e ;if(Col[keyw[word_n]].wwo&4)
mov bl,byte[esi+MAX_COLOR_WORD_LEN+5]
call ItPoNextUc
cmp edx,[tex_1]
jle .if_7e
mov dword[ebp-8],edx
.if_7e:
 
pop edx
.if_2n:
; if(i!=1){ // íå êîíåö äîêóìåíòà
; cont_s=tex[eP].c;
; if(Col[keyw[word_n]].wwo&2) u2= !(isalnum(cont_s)||cont_s=='_'); // íå áóêâ.-÷èñë. ñèìâîë
; if(u2 && Col[keyw[word_n]].wwo&16) u2= !isalpha(cont_s); // íå ÷èñë. ñèìâîë
; if(Col[keyw[word_n]].wwo&4) eP=ItPoNextUc(eP,Col[keyw[word_n]].endc);
 
cmp eax,ecx
je .wh_2e ;if(word_n==l_pos) break; // do double - åñëè ñëîâî òî÷íî ïîñëåäíåå
.if_0:
 
cmp edx,[tex_1]
jle .wh_2e ;if(i==1) break;
 
;while(l_pos>word_n && Col[keyw[word_n]].Text[pos]!=tex[i].c)
.wh_4b:
cmp ecx,eax
jle .wh_4e
ColToIndexOffset eax,ebx
;cmp byte[ebx+edi],byte[edx]
push ax
mov al,byte[ebx+edi]
mov bl,al
pop ax
cmp bl,byte[edx]
je .wh_4e
inc eax
jmp .wh_4b
.wh_4e:
 
cmp eax,ecx
je .wh_2e;if(word_n==l_pos) break;
inc edi ;pos++;
jmp .wh_2b
.wh_2e:
 
cmp byte[ebp-12],1 ;if(fnd)break;
je @f
mov edx,dword[ebp-4];i=bP;
jmp @b
@@:
 
cmp byte[ebp-12],1
jne .if_1e ;if(fnd){ // âûäåëåíèå íàéäåíîãî òåêñòà
; if(!mode_sf1 || (mode_sf1 && strlen(Col[keyw[word_n]].f1->c_str())>0)){
mov eax,dword[ebp-4]
mov bl,byte[ebp-13]
mov byte[eax+1],bl ;tex[bP].col=f_color;
mov eax,dword[ebp-8]
mov byte[eax+1],0xff ;tex[eP].col=255;
; return ItPoPerv(eP); // âîçâðàùàåì ïîçèöèþ êîíöà âõîæäåíèÿ
mov edx,dword[ebp-8]
call GetTexPervPos
jmp @f
.if_1e:
mov edx,[tex]
@@:
 
pop edi esi ecx ebx eax
mov esp,ebp
pop ebp
ret
 
 
;input:
; edx = pointer to char (byte)
;output:
; cf=1 if symbol is...
tab_all_num db 0,0,0,0,0,0,11111111b,11b,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0;,0,0,0,0,0,0 - tab_alpha_0,0,0,0,0,0
tab_alpha db 0,0,0,0,0,0,0,0,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;db 0,0,0,0,0,0,11111111b,11b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
isalnum:
push eax ebx
mov al,byte[edx] ;al=offset
shr al,3
and eax,11111b
mov ebx,tab_all_num
add ebx,eax
mov ah,byte[ebx]
mov al,byte[edx] ;al=bit
and ax,111b
m2m bx,word[ebx]
btr bx,ax
pop ebx eax
ret
isalpha:
push eax ebx
mov al,byte[edx] ;al=offset
shr al,3
and eax,11111b
mov ebx,tab_alpha
add ebx,eax
mov ah,byte[ebx]
mov al,byte[edx] ;al=bit
and ax,111b
m2m bx,word[ebx]
btr bx,ax
pop ebx eax
ret
 
 
ShowHelpF1:
push eax edx
 
call GetPos
push edx
call ItNextColorTag
mov eax,edx
pop edx
call ItPervColorTag
 
cmp eax,[tex]
jle @f
cmp edx,[tex_1]
jle @f
call FindHelpId
@@:
pop edx eax
;call draw_main_cursor
call draw_help_f1
ret
 
;input:
; edx = position begin 'symbol' struct
; eax = position end 'symbol' struct
FindHelpId:
; ecx = word_n
; ebx = l_pos
mov [help_id],-1
 
push ebx ecx
xor ebx,ebx
mov bl,byte[edx]
shl bx,2 ;ebx*=4
add ebx,FkPos
mov ecx,dword[ebx]
cmp ecx,0
jl .if_0e ;if( (word_n=FkPos[(unsigned char)tf[0]])>-1 ){
push esi edi
mov ebx,ecx ;l_pos=word_n;
ColToIndexOffset ecx,esi
push cx
mov cl,byte[esi]
@@:
cmp ebx,dword[ColWords] ;while(l_pos<ColWords
jge @f
;ColToIndexOffset ecx,esi
ColToIndexOffset ebx,edi
cmp cl,byte[edi] ;&& Col[keyw[l_pos]].Text[0]==Col[keyw[word_n]].Text[0])
jne @f
inc ebx ;l_pos++;
jmp @b
@@:
pop cx
call IteratNext ;pos=1;
mov esi,1
@@:
push dx
push word[edx]
pop dx
.wh_0b:
cmp ebx,ecx ;while(l_pos>word_n
jle .wh_0e
dec ebx
ColToIndexOffset ebx,edi
inc ebx
cmp byte[edi+esi],dl ;&& Col[keyw[l_pos-1]].Text[pos]!=tf[i])
je .wh_0e
dec ebx ;l_pos--;
jmp .wh_0b
.wh_0e:
 
.wh_1b:
cmp ebx,ecx ;while(l_pos>word_n
jle .wh_1e
ColToIndexOffset ecx,edi
cmp byte[edi+esi],dl
je .wh_1e
inc ecx ;word_n++;
jmp .wh_1b
.wh_1e:
pop dx
 
cmp ecx,ebx ;if(word_n==l_pos) break;
je @f
call IteratNext ;pos++;
cmp edx,eax ;for(...;i<strlen;...)
je @f ;jge
inc esi
jmp @b
@@:
pop edi esi
 
mov dword[help_id],ecx
;return keyw[word_n];
 
.if_0e:
pop ecx ebx
ret