200 lines
3.9 KiB
PHP
200 lines
3.9 KiB
PHP
|
|
||
|
; flat editor core
|
||
|
; Copyright (c) 1999-2015, Tomasz Grysztar.
|
||
|
; All rights reserved.
|
||
|
|
||
|
init_editor_memory:
|
||
|
mov ecx,BLOCK_LENGTH
|
||
|
call get_memory
|
||
|
or eax,eax
|
||
|
jz memory_error
|
||
|
mov [editor_memory],eax
|
||
|
mov dword [eax],0
|
||
|
mov dword [eax+4],0
|
||
|
mov dword [eax+8],ebx
|
||
|
lea ebx,[eax+SEGMENT_LENGTH]
|
||
|
mov [unallocated_segments],ebx
|
||
|
mov [memory_search_segment],ebx
|
||
|
add eax,BLOCK_LENGTH
|
||
|
mov [unallocated_segments_end],eax
|
||
|
mov [memory_search_block],eax
|
||
|
mov [released_segments],0
|
||
|
call allocate_segment
|
||
|
mov [first_line],eax
|
||
|
mov [lines_count],1
|
||
|
mov [peak_line_length],0
|
||
|
mov [caret_line],eax
|
||
|
mov [caret_line_number],1
|
||
|
mov [window_line],eax
|
||
|
mov [window_line_number],1
|
||
|
mov edi,eax
|
||
|
xor eax,eax
|
||
|
mov ecx,SEGMENT_HEADER_LENGTH shr 2
|
||
|
rep stosd
|
||
|
mov eax,20202020h
|
||
|
mov ecx,SEGMENT_DATA_LENGTH shr 2
|
||
|
rep stosd
|
||
|
call allocate_segment
|
||
|
jc memory_shortage
|
||
|
mov [lengths_table],eax
|
||
|
mov edi,eax
|
||
|
xor eax,eax
|
||
|
mov ecx,SEGMENT_LENGTH shr 2
|
||
|
rep stosd
|
||
|
mov [caret_position],eax
|
||
|
mov [window_position],eax
|
||
|
mov [selection_line],eax
|
||
|
mov [undo_data],eax
|
||
|
mov [redo_data],eax
|
||
|
mov [search_data],eax
|
||
|
mov [editor_mode],eax
|
||
|
mov [unmodified_state],eax
|
||
|
clc
|
||
|
retn
|
||
|
memory_error:
|
||
|
stc
|
||
|
retn
|
||
|
|
||
|
reset_editor_memory:
|
||
|
mov esi,[editor_memory]
|
||
|
lea eax,[esi+SEGMENT_LENGTH]
|
||
|
mov [unallocated_segments],eax
|
||
|
mov [memory_search_segment],eax
|
||
|
lea eax,[esi+BLOCK_LENGTH]
|
||
|
mov [unallocated_segments_end],eax
|
||
|
mov [memory_search_block],eax
|
||
|
mov [released_segments],0
|
||
|
mov ebx,[esi]
|
||
|
release_blocks:
|
||
|
or ebx,ebx
|
||
|
jz release_done
|
||
|
push dword [ebx]
|
||
|
mov ebx,[ebx+8]
|
||
|
call release_memory
|
||
|
pop ebx
|
||
|
jmp release_blocks
|
||
|
release_done:
|
||
|
mov ebx,[editor_memory]
|
||
|
xor eax,eax
|
||
|
mov [ebx],eax
|
||
|
mov [undo_data],eax
|
||
|
mov [redo_data],eax
|
||
|
mov [search_data],eax
|
||
|
call allocate_segment
|
||
|
jc memory_shortage
|
||
|
mov [first_line],eax
|
||
|
mov [window_line],eax
|
||
|
mov [caret_line],eax
|
||
|
mov edi,eax
|
||
|
xor eax,eax
|
||
|
mov ecx,SEGMENT_HEADER_LENGTH shr 2
|
||
|
rep stosd
|
||
|
mov eax,20202020h
|
||
|
mov ecx,SEGMENT_DATA_LENGTH shr 2
|
||
|
rep stosd
|
||
|
xor eax,eax
|
||
|
mov [selection_line],eax
|
||
|
mov [peak_line_length],eax
|
||
|
mov [window_position],eax
|
||
|
inc eax
|
||
|
mov [window_line_number],eax
|
||
|
mov [caret_line_number],eax
|
||
|
mov [lines_count],eax
|
||
|
call allocate_segment
|
||
|
jc memory_shortage
|
||
|
mov [lengths_table],eax
|
||
|
mov edi,eax
|
||
|
xor eax,eax
|
||
|
mov ecx,SEGMENT_LENGTH shr 2
|
||
|
rep stosd
|
||
|
retn
|
||
|
|
||
|
release_editor_memory:
|
||
|
mov esi,[editor_memory]
|
||
|
release:
|
||
|
push dword [esi]
|
||
|
mov ebx,[esi+8]
|
||
|
call release_memory
|
||
|
pop esi
|
||
|
or esi,esi
|
||
|
jnz release
|
||
|
mov [editor_memory],0
|
||
|
retn
|
||
|
|
||
|
allocate_segment:
|
||
|
mov eax,[unallocated_segments]
|
||
|
cmp eax,[unallocated_segments_end]
|
||
|
je simple_allocation_failed
|
||
|
add [unallocated_segments],SEGMENT_LENGTH
|
||
|
clc
|
||
|
retn
|
||
|
simple_allocation_failed:
|
||
|
push ebx esi
|
||
|
mov ebx,[memory_search_block]
|
||
|
mov esi,[memory_search_segment]
|
||
|
cmp [released_segments],16
|
||
|
jb add_new_block
|
||
|
find_free_segment:
|
||
|
cmp esi,ebx
|
||
|
je find_in_next_block
|
||
|
cmp dword [esi],-1
|
||
|
je reuse_segment
|
||
|
add esi,SEGMENT_LENGTH
|
||
|
cmp esi,[memory_search_segment]
|
||
|
jne find_free_segment
|
||
|
add_new_block:
|
||
|
sub ebx,BLOCK_LENGTH
|
||
|
find_last_memory_block:
|
||
|
cmp dword [ebx],0
|
||
|
je allocate_more_memory
|
||
|
mov ebx,[ebx]
|
||
|
jmp find_last_memory_block
|
||
|
allocate_more_memory:
|
||
|
mov ecx,BLOCK_LENGTH
|
||
|
push ebx
|
||
|
call get_memory
|
||
|
pop esi
|
||
|
or eax,eax
|
||
|
jz allocation_failed
|
||
|
mov [esi],eax
|
||
|
mov dword [eax],0
|
||
|
mov [eax+4],esi
|
||
|
mov [eax+8],ebx
|
||
|
lea ebx,[eax+BLOCK_LENGTH]
|
||
|
mov [unallocated_segments_end],ebx
|
||
|
add eax,SEGMENT_LENGTH
|
||
|
lea ebx,[eax+SEGMENT_LENGTH]
|
||
|
mov [unallocated_segments],ebx
|
||
|
mov [released_segments],0
|
||
|
pop esi ebx
|
||
|
clc
|
||
|
retn
|
||
|
allocation_failed:
|
||
|
xor eax,eax
|
||
|
pop esi ebx
|
||
|
stc
|
||
|
retn
|
||
|
reuse_segment:
|
||
|
mov eax,esi
|
||
|
mov [memory_search_block],ebx
|
||
|
add esi,SEGMENT_LENGTH
|
||
|
mov [memory_search_segment],esi
|
||
|
dec [released_segments]
|
||
|
pop esi ebx
|
||
|
clc
|
||
|
retn
|
||
|
find_in_next_block:
|
||
|
sub ebx,BLOCK_LENGTH
|
||
|
mov esi,[ebx]
|
||
|
lea ebx,[esi+BLOCK_LENGTH]
|
||
|
or esi,esi
|
||
|
jnz find_free_segment
|
||
|
mov ebx,[editor_memory]
|
||
|
mov esi,ebx
|
||
|
add ebx,BLOCK_LENGTH
|
||
|
jmp find_free_segment
|
||
|
|
||
|
memory_shortage:
|
||
|
call undo_changes
|
||
|
jmp not_enough_memory
|