Initall commit
This commit is contained in:
199
fasmw172/SOURCE/IDE/MEMORY.INC
Normal file
199
fasmw172/SOURCE/IDE/MEMORY.INC
Normal file
@@ -0,0 +1,199 @@
|
||||
|
||||
; 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
|
||||
Reference in New Issue
Block a user