;----------------------------------------------------------------------------- func save_file ;////////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- mov esi,tb_opensave.text mov edi,f_info.path movzx ecx,[tb_opensave.length] mov [f_info.length],ecx cld rep movsb mov byte[edi],0 mov esi,[cur_editor.Lines] xor ebx,ebx mov ecx,[cur_editor.Lines.Count] @@: call get_real_length add ebx,eax movzx eax,word[esi] lea esi,[esi+eax+4] loop @b mov eax,[cur_editor.Lines.Count] shl eax,1 lea eax,[eax+ebx+1024] call mem.Alloc push eax mov esi,[cur_editor.Lines] mov edi,eax .new_string: call save_string cmp dword[esi],0 jne .new_string pop eax sub edi,eax add edi,-2 ; minus last CRLF .systree_save: mov [f_info70+0],2 mov [f_info70+12],edi mov [f_info70+16],eax mov byte[f_info70+20],0 mov [f_info70+21],f_info.path mcall 70,f_info70 call set_status_fs_error or eax,eax jnz .exit.2 .exit: mov [cur_editor.Modified],0 clc ret .exit.2: stc ret endf ;----------------------------------------------------------------------------- func save_string ;//////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- movzx ecx,word[esi] test dword[esi],0x00010000 jz @f or dword[esi],0x00020000 @@: add esi,4 @@: cmp byte[esi+ecx-1],' ' jne @f loop @b @@: jecxz .endcopy xor edx,edx mov ebx,edx mov ah,dl .next_char: mov al,[esi+ebx] inc ebx test [options],OPTS_OPTIMSAVE jz .put test ah,00000001b jnz .char cmp al,'"' jne @f xor ah,00000100b jmp .char @@: cmp al,"'" jne @f xor ah,00000010b jmp .char @@: test ah,00000110b jnz .char cmp al,';' jne @f test ah,00000001b jnz .char xor ah,00000001b jmp .char @@: cmp al,' ' jne .char inc edx test ebx,ATABW-1 jnz @f dec edx jle .put mov al,9 xor edx,edx jmp .put .char: or edx,edx jz .put push ecx eax mov ecx,edx mov al,' ' rep stosb pop eax ecx xor edx,edx .put: stosb @@: loop .next_char .endcopy: mov eax,0x0A0D stosw movzx eax,word[esi-4] add esi,eax;[esi-4] ret endf func set_status_fs_error push eax mov esi,s_fs_error @@: dec eax js @f movzx ecx,byte[esi] lea esi,[esi+ecx+1] jmp @b @@: inc esi mov [s_status],esi pop eax call draw_statusbar ret endf ;----------------------------------------------------------------------------- func load_file ;////////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- cmp [tb_opensave.length],0 jne @f stc ret @@: mov esi,tb_opensave.text mov edi,f_info.path movzx ecx,[tb_opensave.length] mov [f_info.length],ecx cld rep movsb mov byte[edi],0 xor eax,eax mov [f_info70+0],5 mov [f_info70+4],eax mov [f_info70+8],eax mov [f_info70+12],eax mov [f_info70+16],file_info mov byte[f_info70+20],al mov [f_info70+21],f_info.path mcall 70,f_info70 mov [f_info70+0],0 mov eax,dword[file_info.Size] mov [f_info70+12],eax call mem.Alloc mov [f_info70+16],eax mcall 70,f_info70 call set_status_fs_error mov esi,[f_info70+16] xchg eax,ebx test ebx,ebx je .file_found cmp ebx,6 ;// ATV driver fix (6 instead of 5) je .file_found mov eax,[f_info70+16] call mem.Free stc ret .file_found: mov ecx,eax cmp [tab_bar.Items.Count],1 jne @f cmp [cur_editor.FilePath],'/' je @f cmp [cur_editor.Modified],0 jne @f mov ebp,cur_editor jmp .lp1 @@: inc [do_not_draw] call create_tab dec [do_not_draw] .lp1: push ecx esi edi mov esi,tb_opensave.text lea edi,[ebp+TABITEM.Editor.FilePath] movzx ecx,[tb_opensave.length] cld rep movsb mov byte[edi],0 lea edi,[ebp+TABITEM.Editor.FilePath] movzx ecx,[tb_opensave.length] inc ecx @@: dec ecx jz @f cmp byte[edi+ecx-1],'/' jne @b @@: mov [ebp+TABITEM.Editor.FileName],ecx call flush_cur_tab pop edi esi ecx call load_from_memory mov eax,[f_info70+16] call mem.Free xor eax,eax mov [cur_editor.TopLeft.Y],eax mov [cur_editor.TopLeft.X],eax mov [cur_editor.Caret.X],eax mov [cur_editor.Caret.Y],eax mov [cur_editor.SelStart.X],eax mov [cur_editor.SelStart.Y],eax mov [cur_editor.Modified],al mov [cur_editor.AsmMode],al lea ebx,[cur_editor.FilePath] mov eax,ebx call strlen mov ecx,dword[ebx+eax-3] or ecx,0x202020 cmp ecx,'asm' jne @f inc [cur_editor.AsmMode] jmp .nocol @@: cmp ecx,'inc' jne .nocol inc [cur_editor.AsmMode] .nocol: call update_caption clc ret endf ;----------------------------------------------------------------------------- func load_from_memory ;/////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- ; ECX = data length ; ESI = data pointer ; EBP = EDITOR* ;----------------------------------------------------------------------------- call get_lines_in_file mov [ebp+EDITOR.Lines.Count],eax lea edx,[ebx+ecx] imul ebx,eax,14 add ebx,edx mov eax,[ebp+EDITOR.Lines] mov [ebp+EDITOR.Lines.Size],ebx call mem.ReAlloc mov [ebp+EDITOR.Lines],eax mov [ebp+EDITOR.Columns.Count],0 mov edi,eax mov edx,ecx .next_line: mov ebx,edi add edi,4 .next_char: or edx,edx jle .exit lodsb dec edx cmp al,13 je .CR cmp al,10 je .LF cmp al,9 je .TB cmp al,0 je .exit stosb jmp .next_char .exit: mov ecx,10 mov al,' ' rep stosb lea eax,[edi-4] sub eax,ebx mov [ebx],eax mov dword[ebx+eax+4],0 sub eax,10 jnz @f inc eax @@: cmp eax,[ebp+EDITOR.Columns.Count] jbe @f mov [ebp+EDITOR.Columns.Count],eax @@: mov [ebp+EDITOR.Modified],0 ret .CR: cmp byte[esi],10 jne .LF lodsb dec edx .LF: mov ecx,10 mov al,' ' rep stosb lea eax,[edi-4] sub eax,ebx mov [ebx],eax add eax,-10 cmp eax,[ebp+EDITOR.Columns.Count] jbe .next_line mov [ebp+EDITOR.Columns.Count],eax jmp .next_line .TB: lea eax,[edi-4] sub eax,ebx mov ecx,eax add ecx,ATABW and ecx,not(ATABW-1) sub ecx,eax mov al,' ' rep stosb jmp .next_char endf