6757 lines
121 KiB
NASM
6757 lines
121 KiB
NASM
|
||
; flat assembler IDE for DOS/DPMI
|
||
; Copyright (c) 1999-2022, Tomasz Grysztar.
|
||
; All rights reserved.
|
||
|
||
format MZ
|
||
heap 0
|
||
stack stack_segment:stack_top-stack_bottom
|
||
entry loader:init
|
||
|
||
segment loader use16
|
||
|
||
init:
|
||
|
||
mov ax,3301h
|
||
xor dl,dl
|
||
int 21h
|
||
push ds cs
|
||
pop ds
|
||
mov ax,2524h
|
||
mov dx,dos_error_handler
|
||
int 21h
|
||
pop ds
|
||
|
||
mov ax,1A00h
|
||
xor bx,bx
|
||
int 10h
|
||
cmp al,1Ah
|
||
jne short no_vga
|
||
cmp bl,8
|
||
jne short no_vga
|
||
|
||
mov ax,1687h
|
||
int 2Fh
|
||
or ax,ax ; DPMI installed?
|
||
jnz short no_dpmi
|
||
test bl,1 ; 32-bit programs supported?
|
||
jz short no_dpmi
|
||
mov word [cs:mode_switch],di
|
||
mov word [cs:mode_switch+2],es
|
||
mov bx,si ; allocate memory for DPMI data
|
||
mov ah,48h
|
||
int 21h
|
||
jnc switch_to_protected_mode
|
||
init_failed:
|
||
call init_error
|
||
db 'DPMI initialization failed.',0Dh,0Ah,0
|
||
no_vga:
|
||
call init_error
|
||
db 'Color VGA adapter is required.',0Dh,0Ah,0
|
||
no_dpmi:
|
||
call init_error
|
||
db '32-bit DPMI services are not available.',0Dh,0Ah,0
|
||
init_error:
|
||
pop si
|
||
push cs
|
||
pop ds
|
||
display_error:
|
||
lodsb
|
||
test al,al
|
||
jz short error_finish
|
||
mov dl,al
|
||
mov ah,2
|
||
int 21h
|
||
jmp short display_error
|
||
error_finish:
|
||
mov ax,4CFFh
|
||
int 21h
|
||
dos_error_handler:
|
||
mov al,3
|
||
iret
|
||
switch_to_protected_mode:
|
||
mov es,ax
|
||
mov ds,[ds:2Ch]
|
||
mov ax,1
|
||
call far [cs:mode_switch] ; switch to protected mode
|
||
jc init_failed
|
||
mov cx,1
|
||
xor ax,ax
|
||
int 31h ; allocate descriptor for code
|
||
jc init_failed
|
||
mov si,ax
|
||
xor ax,ax
|
||
int 31h ; allocate descriptor for data
|
||
jc init_failed
|
||
mov di,ax
|
||
mov dx,cs
|
||
lar cx,dx
|
||
shr cx,8
|
||
or cx,0C000h
|
||
mov bx,si
|
||
mov ax,9
|
||
int 31h ; set code descriptor access rights
|
||
jc init_failed
|
||
mov dx,ds
|
||
lar cx,dx
|
||
shr cx,8
|
||
or cx,0C000h
|
||
mov bx,di
|
||
int 31h ; set data descriptor access rights
|
||
jc init_failed
|
||
mov ecx,main
|
||
shl ecx,4
|
||
mov dx,cx
|
||
shr ecx,16
|
||
mov ax,7
|
||
int 31h ; set data descriptor base address
|
||
jc init_failed
|
||
mov bx,si
|
||
int 31h ; set code descriptor base address
|
||
jc init_failed
|
||
mov cx,0FFFFh
|
||
mov dx,0FFFFh
|
||
mov ax,8 ; set segment limit to 4 GB
|
||
int 31h
|
||
jc init_failed
|
||
mov bx,di
|
||
int 31h
|
||
jc init_failed
|
||
mov ax,ds
|
||
mov ds,di
|
||
mov [main_selector],di
|
||
mov [psp_selector],es
|
||
mov [environment_selector],ax
|
||
cli
|
||
mov ss,di
|
||
mov esp,stack_top
|
||
sti
|
||
mov es,di
|
||
mov cx,1
|
||
xor ax,ax
|
||
int 31h ; allocate descriptor for BIOS data segment
|
||
jc init_failed
|
||
mov bx,ax
|
||
lar cx,[environment_selector]
|
||
shr cx,8
|
||
mov ax,9
|
||
int 31h ; set descriptor access rights
|
||
jc init_failed
|
||
xor cx,cx
|
||
mov dx,400h
|
||
mov ax,7
|
||
int 31h ; set base address of BIOS data segment
|
||
jc init_failed
|
||
xor cx,cx
|
||
mov dx,0FFh
|
||
mov ax,8
|
||
int 31h ; set limit of BIOS data segment
|
||
jc init_failed
|
||
mov fs,bx
|
||
mov [bios_selector],bx
|
||
mov cx,1
|
||
xor ax,ax
|
||
int 31h ; allocate descriptor for video segment
|
||
jc init_failed
|
||
mov bx,ax
|
||
lar cx,[environment_selector]
|
||
shr cx,8
|
||
mov ax,9
|
||
int 31h ; set descriptor access rights
|
||
jc init_failed
|
||
mov cx,0Bh
|
||
mov dx,8000h
|
||
mov ax,7
|
||
int 31h ; set base address of video segment
|
||
jc init_failed
|
||
xor cx,cx
|
||
mov dx,4000-1
|
||
mov ax,8
|
||
int 31h ; set limit of video segment
|
||
jc init_failed
|
||
mov gs,bx
|
||
mov [video_selector],bx
|
||
push si
|
||
push start
|
||
retf
|
||
|
||
mode_switch dd ?
|
||
|
||
segment main use32
|
||
|
||
start:
|
||
cld
|
||
|
||
call init_video
|
||
jc startup_failed
|
||
|
||
call init_editor_memory
|
||
jc startup_failed
|
||
|
||
xor eax,eax
|
||
mov [next_instance],eax
|
||
mov [previous_instance],eax
|
||
mov [file_path],eax
|
||
|
||
mov ecx,1000h
|
||
mov [line_buffer_size],ecx
|
||
call get_memory
|
||
or eax,eax
|
||
jz startup_failed
|
||
mov [line_buffer],eax
|
||
mov [line_buffer_handle],ebx
|
||
|
||
mov [stack_limit],stack_bottom
|
||
|
||
mov edi,upper_case_table
|
||
xor al,al
|
||
mov ecx,80h
|
||
prepare_case_table:
|
||
stosb
|
||
inc al
|
||
loop prepare_case_table
|
||
make_extended_case_table:
|
||
push eax
|
||
mov dl,al
|
||
mov ax,6520h
|
||
int 21h
|
||
mov al,[esp]
|
||
jc upper_case_character_ok
|
||
mov al,dl
|
||
upper_case_character_ok:
|
||
stosb
|
||
pop eax
|
||
inc al
|
||
jnz make_extended_case_table
|
||
mov esi,upper_case_table+'A'
|
||
mov edi,upper_case_table+'a'
|
||
mov ecx,26
|
||
rep movsb
|
||
xor al,al
|
||
mov edi,lower_case_table
|
||
prepare_lower_case_table:
|
||
stosb
|
||
inc al
|
||
jnz prepare_lower_case_table
|
||
mov esi,lower_case_table+'a'
|
||
mov edi,lower_case_table+'A'
|
||
mov ecx,26
|
||
rep movsb
|
||
mov eax,80h
|
||
xor edx,edx
|
||
make_lower_case_table:
|
||
mov dl,[upper_case_table+eax]
|
||
cmp al,dl
|
||
je lower_case_character_ok
|
||
cmp dl,80h
|
||
jb lower_case_character_ok
|
||
mov [lower_case_table+edx],al
|
||
lower_case_character_ok:
|
||
inc al
|
||
jnz make_lower_case_table
|
||
mov edi,characters
|
||
xor al,al
|
||
prepare_characters_table:
|
||
stosb
|
||
inc al
|
||
jnz prepare_characters_table
|
||
mov esi,characters+'a'
|
||
mov edi,characters+'A'
|
||
mov ecx,26
|
||
rep movsb
|
||
mov edi,characters
|
||
mov esi,symbol_characters+1
|
||
movzx ecx,byte [esi-1]
|
||
xor eax,eax
|
||
convert_table:
|
||
lodsb
|
||
mov byte [edi+eax],0
|
||
loop convert_table
|
||
mov [selected_character],'p'
|
||
|
||
call get_low_memory
|
||
|
||
push ds
|
||
mov ds,[environment_selector]
|
||
xor esi,esi
|
||
mov edi,ini_path
|
||
skip_environment:
|
||
lodsb
|
||
test al,al
|
||
jnz skip_environment
|
||
lodsb
|
||
test al,al
|
||
jnz skip_environment
|
||
add esi,2
|
||
copy_program_path:
|
||
lodsb
|
||
stosb
|
||
test al,al
|
||
jnz copy_program_path
|
||
pop ds
|
||
dec edi
|
||
mov edx,edi
|
||
find_extension_start:
|
||
cmp edi,ini_path
|
||
je attach_extension
|
||
cmp byte [edi-1],'.'
|
||
je replace_extension
|
||
cmp byte [edi-1],'/'
|
||
je attach_extension
|
||
dec edi
|
||
jmp find_extension_start
|
||
attach_extension:
|
||
mov edi,edx
|
||
mov al,'.'
|
||
stosb
|
||
replace_extension:
|
||
mov [ini_extension],edi
|
||
|
||
xor eax,eax
|
||
mov [ini_data],eax
|
||
mov [main_project_file],eax
|
||
mov [clipboard],eax
|
||
mov [current_operation],al
|
||
mov [find_flags],eax
|
||
mov [command_flags],al
|
||
|
||
call load_configuration
|
||
|
||
call update_positions
|
||
call switch_to_ide_screen
|
||
|
||
mov esi,81h
|
||
process_arguments:
|
||
push ds
|
||
mov ds,[psp_selector]
|
||
mov edi,filename_buffer
|
||
find_argument:
|
||
lodsb
|
||
cmp al,20h
|
||
je find_argument
|
||
cmp al,9
|
||
je find_argument
|
||
cmp al,22h
|
||
je quoted_argument
|
||
dec esi
|
||
copy_argument:
|
||
lodsb
|
||
cmp al,20h
|
||
je argument_end
|
||
cmp al,9
|
||
je argument_end
|
||
cmp al,0Dh
|
||
je argument_end
|
||
stosb
|
||
jmp copy_argument
|
||
quoted_argument:
|
||
lodsb
|
||
cmp al,0Dh
|
||
je argument_end
|
||
stosb
|
||
cmp al,22h
|
||
jne quoted_argument
|
||
lodsb
|
||
cmp al,22h
|
||
je quoted_argument
|
||
dec edi
|
||
argument_end:
|
||
dec esi
|
||
pop ds
|
||
cmp edi,filename_buffer
|
||
je main_loop
|
||
xor al,al
|
||
stosb
|
||
push esi
|
||
mov edx,filename_buffer
|
||
call load_file
|
||
pop esi
|
||
jmp process_arguments
|
||
|
||
main_loop:
|
||
|
||
call update_cursor
|
||
call update_screen
|
||
|
||
xor al,al
|
||
xchg [current_operation],al
|
||
mov [last_operation],al
|
||
mov [was_selection],1
|
||
mov eax,[selection_line]
|
||
or eax,eax
|
||
jz no_selection
|
||
cmp eax,[caret_line]
|
||
jne get_command
|
||
mov eax,[selection_position]
|
||
cmp eax,[caret_position]
|
||
jne get_command
|
||
no_selection:
|
||
mov [was_selection],0
|
||
mov eax,[caret_line]
|
||
mov [selection_line],eax
|
||
mov eax,[caret_position]
|
||
mov [selection_position],eax
|
||
mov eax,[caret_line_number]
|
||
mov [selection_line_number],eax
|
||
get_command:
|
||
call wait_for_input
|
||
cmp ah,1
|
||
je close_editor
|
||
jb character
|
||
cmp al,0Eh
|
||
je new_editor
|
||
cmp ah,94h
|
||
je switch_editor
|
||
cmp ah,0A5h
|
||
je switch_editor
|
||
cmp ah,3Bh
|
||
je open_help
|
||
cmp ah,3Ch
|
||
je save_current
|
||
cmp ah,55h
|
||
je save_as
|
||
cmp ah,3Eh
|
||
je open_file
|
||
cmp ah,3Fh
|
||
je goto
|
||
cmp ah,41h
|
||
je search
|
||
cmp ah,5Ah
|
||
je search_next
|
||
cmp ah,64h
|
||
je replace
|
||
cmp ah,43h
|
||
je compile_and_run
|
||
cmp ah,66h
|
||
je compile
|
||
cmp ah,65h
|
||
je build_symbols
|
||
cmp ah,5Ch
|
||
je assign_to_compiler
|
||
cmp ah,59h
|
||
je toggle_readonly
|
||
cmp ah,63h
|
||
je calculator
|
||
cmp ah,6Ch
|
||
je show_user_screen
|
||
cmp ah,44h
|
||
je options
|
||
cmp ah,3Dh
|
||
je search_next
|
||
test byte [fs:17h],1000b
|
||
jz no_alt
|
||
cmp ah,2Dh
|
||
je close_all
|
||
cmp ah,0Eh
|
||
je undo
|
||
cmp ah,0A3h
|
||
je disable_undo
|
||
cmp ah,98h
|
||
je scroll_up
|
||
cmp ah,0A0h
|
||
je scroll_down
|
||
cmp ah,9Bh
|
||
je scroll_left
|
||
cmp ah,9Dh
|
||
je scroll_right
|
||
no_alt:
|
||
or al,al
|
||
jz no_ascii
|
||
cmp al,0E0h
|
||
jne ascii
|
||
no_ascii:
|
||
cmp ah,4Bh
|
||
je left_key
|
||
cmp ah,4Dh
|
||
je right_key
|
||
cmp ah,48h
|
||
je up_key
|
||
cmp ah,50h
|
||
je down_key
|
||
cmp ah,47h
|
||
je home_key
|
||
cmp ah,4Fh
|
||
je end_key
|
||
cmp ah,77h
|
||
je screen_home
|
||
cmp ah,75h
|
||
je screen_end
|
||
cmp ah,73h
|
||
je word_left
|
||
cmp ah,74h
|
||
je word_right
|
||
cmp ah,8Dh
|
||
je word_left
|
||
cmp ah,91h
|
||
je word_right
|
||
cmp ah,49h
|
||
je pgup_key
|
||
cmp ah,51h
|
||
je pgdn_key
|
||
cmp ah,84h
|
||
je text_home
|
||
cmp ah,76h
|
||
je text_end
|
||
cmp ah,52h
|
||
je ins_key
|
||
cmp ah,0A2h
|
||
je switch_blocks
|
||
cmp ah,40h
|
||
je f6_key
|
||
cmp ah,93h
|
||
je block_delete
|
||
cmp ah,92h
|
||
je block_copy
|
||
cmp ah,53h
|
||
je del_key
|
||
cmp ah,78h
|
||
jb get_command
|
||
cmp ah,80h
|
||
ja get_command
|
||
sub ah,77h
|
||
movzx ecx,ah
|
||
jmp select_editor
|
||
ascii:
|
||
cmp al,7Fh
|
||
je word_back
|
||
cmp al,20h
|
||
jae character
|
||
cmp al,8
|
||
je backspace_key
|
||
cmp al,9
|
||
je tab_key
|
||
cmp al,0Dh
|
||
je enter_key
|
||
cmp al,19h
|
||
je ctrl_y_key
|
||
cmp al,1Ah
|
||
je undo
|
||
cmp al,18h
|
||
je block_cut
|
||
cmp al,3
|
||
je block_copy
|
||
cmp al,16h
|
||
je block_paste
|
||
cmp al,0Fh
|
||
je open_file
|
||
cmp al,13h
|
||
je save_current
|
||
cmp al,6
|
||
je search
|
||
cmp al,7
|
||
je goto
|
||
cmp al,1
|
||
je select_all
|
||
cmp al,2
|
||
je ascii_table
|
||
jmp get_command
|
||
character:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
cmp [was_selection],0
|
||
je no_selection_to_replace
|
||
call store_status_for_undo
|
||
test [editor_style],FES_SECURESEL
|
||
jnz character_undo_ok
|
||
push eax
|
||
call delete_block
|
||
pop eax
|
||
call put_character
|
||
call finish_edit
|
||
mov [selection_line],0
|
||
jmp text_modified
|
||
no_selection_to_replace:
|
||
mov [current_operation],20h
|
||
cmp [last_operation],20h
|
||
jne character_undopoint
|
||
mov edx,[unmodified_state]
|
||
cmp edx,[undo_data]
|
||
jne character_undo_ok
|
||
or [unmodified_state],-1
|
||
jmp character_undo_ok
|
||
character_undopoint:
|
||
call store_status_for_undo
|
||
character_undo_ok:
|
||
call put_character
|
||
call finish_edit
|
||
mov [selection_line],0
|
||
jmp text_modified
|
||
tab_key:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
call store_status_for_undo
|
||
cmp [was_selection],0
|
||
je tab_securesel
|
||
test [editor_style],FES_SECURESEL
|
||
jnz tab_securesel
|
||
call delete_block
|
||
tab_securesel:
|
||
call tabulate
|
||
mov [selection_line],0
|
||
call finish_edit
|
||
jmp text_modified
|
||
enter_key:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
call store_status_for_undo
|
||
cmp [was_selection],0
|
||
je enter_secureselection_ok
|
||
test [editor_style],FES_SECURESEL
|
||
jnz enter_secureselection_ok
|
||
call delete_block
|
||
enter_secureselection_ok:
|
||
call carriage_return
|
||
mov [selection_line],0
|
||
test [editor_mode],FEMODE_OVERWRITE
|
||
jnz text_modified
|
||
call finish_edit
|
||
jmp text_modified
|
||
backspace_key:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
test byte [fs:17h],100b
|
||
jnz replace
|
||
cmp [was_selection],0
|
||
je no_selection_to_clear
|
||
test [editor_style],FES_SECURESEL
|
||
jz block_delete
|
||
no_selection_to_clear:
|
||
cmp [caret_position],0
|
||
je line_back
|
||
mov [current_operation],8
|
||
cmp [last_operation],8
|
||
jne backspace_undopoint
|
||
mov edx,[unmodified_state]
|
||
cmp edx,[undo_data]
|
||
jne undo_back_ok
|
||
or [unmodified_state],-1
|
||
jmp undo_back_ok
|
||
backspace_undopoint:
|
||
call store_status_for_undo
|
||
undo_back_ok:
|
||
dec [caret_position]
|
||
call delete_character
|
||
call finish_edit
|
||
mov [selection_line],0
|
||
jmp text_modified
|
||
line_back:
|
||
test [editor_mode],FEMODE_OVERWRITE
|
||
jnz get_command
|
||
mov esi,[caret_line]
|
||
mov esi,[esi+4]
|
||
or esi,esi
|
||
jz get_command
|
||
call store_status_for_undo
|
||
mov [caret_line],esi
|
||
dec [caret_line_number]
|
||
call check_line_length
|
||
mov [caret_position],ecx
|
||
call cut_line_break
|
||
call finish_edit
|
||
mov [selection_line],0
|
||
jmp text_modified
|
||
word_back:
|
||
call store_status_for_undo
|
||
push [caret_position]
|
||
mov esi,[caret_line]
|
||
xor eax,eax
|
||
xchg eax,[esi+4]
|
||
push eax
|
||
call move_to_previous_word
|
||
pop eax
|
||
mov esi,[caret_line]
|
||
mov [esi+4],eax
|
||
pop ecx
|
||
sub ecx,[caret_position]
|
||
call delete_from_line
|
||
call finish_edit
|
||
jmp text_modified
|
||
del_key:
|
||
test byte [fs:17h],11b
|
||
jnz block_cut
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
cmp [was_selection],0
|
||
je no_selection_on_del
|
||
test [editor_style],FES_SECURESEL
|
||
jz block_delete
|
||
no_selection_on_del:
|
||
mov esi,[caret_line]
|
||
test [editor_mode],FEMODE_OVERWRITE
|
||
jnz delete_char
|
||
call check_line_length
|
||
cmp ecx,[caret_position]
|
||
ja delete_char
|
||
cmp dword [esi],0
|
||
je get_command
|
||
call store_status_for_undo
|
||
call cut_line_break
|
||
call finish_edit
|
||
mov [selection_line],0
|
||
jmp text_modified
|
||
delete_char:
|
||
mov [current_operation],0E0h
|
||
cmp [last_operation],0E0h
|
||
je undo_delete_ok
|
||
call store_status_for_undo
|
||
undo_delete_ok:
|
||
call delete_character
|
||
call finish_edit
|
||
mov [selection_line],0
|
||
jmp text_modified
|
||
ctrl_y_key:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
call store_status_for_undo
|
||
call remove_line
|
||
jmp text_modified
|
||
f6_key:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
call store_status_for_undo
|
||
call duplicate_line
|
||
jmp text_modified
|
||
left_key:
|
||
cmp [caret_position],0
|
||
jle text_modified
|
||
dec [caret_position]
|
||
jmp moved_caret
|
||
right_key:
|
||
mov eax,[caret_position]
|
||
cmp eax,[maximum_position]
|
||
jae text_modified
|
||
inc [caret_position]
|
||
jmp moved_caret
|
||
up_key:
|
||
call move_line_up
|
||
jmp moved_caret
|
||
down_key:
|
||
call move_line_down
|
||
jmp moved_caret
|
||
home_key:
|
||
mov [caret_position],0
|
||
jmp moved_caret
|
||
end_key:
|
||
call move_to_line_end
|
||
jmp moved_caret
|
||
screen_home:
|
||
mov eax,[window_line]
|
||
mov [caret_line],eax
|
||
mov eax,[window_line_number]
|
||
mov [caret_line_number],eax
|
||
jmp moved_caret
|
||
screen_end:
|
||
mov eax,[window_line_number]
|
||
add eax,[window_height]
|
||
dec eax
|
||
call find_line
|
||
mov [caret_line],esi
|
||
mov [caret_line_number],ecx
|
||
jmp moved_caret
|
||
pgup_key:
|
||
call move_page_up
|
||
jmp moved_caret
|
||
pgdn_key:
|
||
call move_page_down
|
||
jmp moved_caret
|
||
text_home:
|
||
mov eax,[first_line]
|
||
mov [caret_line],eax
|
||
mov [caret_line_number],1
|
||
jmp moved_caret
|
||
text_end:
|
||
or eax,-1
|
||
call find_line
|
||
mov [caret_line],esi
|
||
mov [caret_line_number],ecx
|
||
jmp moved_caret
|
||
word_left:
|
||
call move_to_previous_word
|
||
jmp moved_caret
|
||
word_right:
|
||
call get_caret_segment
|
||
call move_to_next_word
|
||
jmp moved_caret
|
||
scroll_left:
|
||
cmp [window_position],0
|
||
je main_loop
|
||
dec [window_position]
|
||
jmp moved_window
|
||
scroll_right:
|
||
inc [window_position]
|
||
jmp moved_window
|
||
scroll_up:
|
||
mov esi,[window_line]
|
||
mov esi,[esi+4]
|
||
or esi,esi
|
||
jz main_loop
|
||
mov [window_line],esi
|
||
dec [window_line_number]
|
||
jmp moved_window
|
||
scroll_down:
|
||
mov esi,[window_line]
|
||
find_next_window_line:
|
||
mov esi,[esi]
|
||
btr esi,0
|
||
jc find_next_window_line
|
||
or esi,esi
|
||
jz main_loop
|
||
mov [window_line],esi
|
||
inc [window_line_number]
|
||
jmp moved_window
|
||
ins_key:
|
||
and byte [fs:18h],not 80h
|
||
test byte [fs:17h],11b
|
||
jnz block_paste
|
||
switch_mode:
|
||
xor [editor_mode],FEMODE_OVERWRITE
|
||
jmp main_loop
|
||
switch_blocks:
|
||
xor [editor_mode],FEMODE_VERTICALSEL
|
||
jmp main_loop
|
||
block_delete:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
cmp [was_selection],0
|
||
je get_command
|
||
call store_status_for_undo
|
||
call delete_block
|
||
mov [selection_line],0
|
||
jmp operation_done
|
||
block_copy:
|
||
cmp [was_selection],0
|
||
je get_command
|
||
call copy_to_clipboard
|
||
jmp get_command
|
||
copy_to_clipboard:
|
||
cmp [clipboard],0
|
||
je allocate_clipboard
|
||
mov ebx,[clipboard_handle]
|
||
call release_memory
|
||
allocate_clipboard:
|
||
call get_block_length
|
||
inc ecx
|
||
call get_memory
|
||
mov [clipboard],eax
|
||
mov [clipboard_handle],ebx
|
||
or eax,eax
|
||
jz not_enough_memory
|
||
mov edi,[clipboard]
|
||
call copy_block
|
||
retn
|
||
block_cut:
|
||
cmp [was_selection],0
|
||
je get_command
|
||
call copy_to_clipboard
|
||
jmp block_delete
|
||
block_paste:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
call store_status_for_undo
|
||
cmp [was_selection],0
|
||
je paste_secureselection_ok
|
||
test [editor_style],FES_SECURESEL
|
||
jnz paste_secureselection_ok
|
||
call delete_block
|
||
paste_secureselection_ok:
|
||
mov esi,[clipboard]
|
||
or esi,esi
|
||
jz operation_done
|
||
call insert_block
|
||
jc paste_failed
|
||
test [editor_style],FES_SECURESEL
|
||
jz no_selection_after_paste
|
||
mov eax,[caret_line]
|
||
mov ecx,[caret_line_number]
|
||
mov edx,[caret_position]
|
||
xchg eax,[selection_line]
|
||
xchg ecx,[selection_line_number]
|
||
xchg edx,[selection_position]
|
||
mov [caret_line],eax
|
||
mov [caret_line_number],ecx
|
||
mov [caret_position],edx
|
||
jmp operation_done
|
||
no_selection_after_paste:
|
||
mov [selection_line],0
|
||
jmp operation_done
|
||
paste_failed:
|
||
call undo_changes
|
||
jmp operation_done
|
||
undo:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
test [editor_mode],FEMODE_NOUNDO
|
||
jnz enable_undo
|
||
test byte [fs:17h],11b
|
||
jnz redo
|
||
mov eax,[undo_data]
|
||
test eax,eax
|
||
jz get_command
|
||
call undo_changes
|
||
jmp operation_done
|
||
redo:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz get_command
|
||
mov eax,[redo_data]
|
||
test eax,eax
|
||
jz get_command
|
||
call redo_changes
|
||
jmp operation_done
|
||
enable_undo:
|
||
and [editor_mode],not FEMODE_NOUNDO
|
||
jmp main_loop
|
||
disable_undo:
|
||
call clear_redo_data
|
||
call clear_undo_data
|
||
or [editor_mode],FEMODE_NOUNDO
|
||
jmp operation_done
|
||
toggle_readonly:
|
||
xor [editor_mode],FEMODE_READONLY
|
||
jmp main_loop
|
||
select_all:
|
||
or eax,-1
|
||
call find_line
|
||
mov [caret_line],esi
|
||
mov [caret_line_number],ecx
|
||
call check_line_length
|
||
mov [caret_position],ecx
|
||
mov eax,1
|
||
call find_line
|
||
mov [selection_line],esi
|
||
mov [selection_line_number],ecx
|
||
mov [selection_position],0
|
||
jmp operation_done
|
||
ascii_table:
|
||
call ascii_table_window
|
||
jc main_loop
|
||
test al,al
|
||
jz main_loop
|
||
cmp al,1Ah
|
||
je main_loop
|
||
jmp character
|
||
|
||
moved_caret:
|
||
test byte [fs:17h],11b
|
||
jnz operation_done
|
||
mov [selection_line],0
|
||
jmp operation_done
|
||
text_modified:
|
||
cmp [was_selection],0
|
||
jne operation_done
|
||
mov [selection_line],0
|
||
operation_done:
|
||
call update_positions
|
||
call let_caret_appear
|
||
call update_window
|
||
jmp main_loop
|
||
moved_window:
|
||
call update_positions
|
||
cmp [was_selection],0
|
||
jne main_loop
|
||
mov [selection_line],0
|
||
jmp main_loop
|
||
|
||
new_editor:
|
||
call create_editor_instance
|
||
jmp main_loop
|
||
close_editor:
|
||
or [command_flags],8
|
||
jmp closing_loop
|
||
close_all:
|
||
and [command_flags],not 8
|
||
closing_loop:
|
||
mov eax,[undo_data]
|
||
cmp eax,[unmodified_state]
|
||
je do_close
|
||
mov esi,[file_path]
|
||
call get_file_title
|
||
mov ebx,esi
|
||
mov esi,_saving_question
|
||
mov eax,2 shl 24
|
||
mov ax,[message_box_colors]
|
||
mov [first_button],_yes
|
||
mov [second_button],_no
|
||
call message_box
|
||
cmp eax,1
|
||
jb main_loop
|
||
ja do_close
|
||
cmp [file_path],0
|
||
jne save_before_closing
|
||
call get_saving_path
|
||
jc main_loop
|
||
save_before_closing:
|
||
call save_file
|
||
jc main_loop
|
||
do_close:
|
||
call remove_editor_instance
|
||
jc shutdown
|
||
test [command_flags],8
|
||
jnz main_loop
|
||
call update_cursor
|
||
call update_screen
|
||
jmp closing_loop
|
||
switch_editor:
|
||
test byte [fs:17h],11b
|
||
jnz previous_editor
|
||
mov eax,[next_instance]
|
||
or eax,eax
|
||
jnz do_switch
|
||
mov eax,[previous_instance]
|
||
or eax,eax
|
||
jz get_command
|
||
find_first_editor:
|
||
mov ebx,[eax+SEGMENT_HEADER_LENGTH+previous_instance-editor_data]
|
||
or ebx,ebx
|
||
jz do_switch
|
||
mov eax,ebx
|
||
jmp find_first_editor
|
||
do_switch:
|
||
call switch_editor_instance
|
||
jmp main_loop
|
||
previous_editor:
|
||
mov eax,[previous_instance]
|
||
or eax,eax
|
||
jnz do_switch
|
||
mov eax,[next_instance]
|
||
or eax,eax
|
||
jz get_command
|
||
find_last_editor:
|
||
mov ebx,[eax+SEGMENT_HEADER_LENGTH+next_instance-editor_data]
|
||
or ebx,ebx
|
||
jz do_switch
|
||
mov eax,ebx
|
||
jmp find_last_editor
|
||
select_editor:
|
||
mov eax,[editor_memory]
|
||
mov edx,[previous_instance]
|
||
prepare_for_editor_counting:
|
||
or edx,edx
|
||
jz find_selected_editor
|
||
mov eax,edx
|
||
mov edx,[edx+SEGMENT_HEADER_LENGTH+previous_instance-editor_data]
|
||
jmp prepare_for_editor_counting
|
||
find_selected_editor:
|
||
dec ecx
|
||
jz selected_editor_found
|
||
mov eax,[eax+SEGMENT_HEADER_LENGTH+next_instance-editor_data]
|
||
or eax,eax
|
||
jz get_command
|
||
jmp find_selected_editor
|
||
selected_editor_found:
|
||
cmp eax,[editor_memory]
|
||
je get_command
|
||
jmp do_switch
|
||
show_user_screen:
|
||
call switch_to_user_screen
|
||
mov ah,10h
|
||
int 16h
|
||
call switch_to_ide_screen
|
||
jmp main_loop
|
||
|
||
save_current:
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz save_as
|
||
cmp [file_path],0
|
||
jne do_save
|
||
save_as:
|
||
call get_saving_path
|
||
jc main_loop
|
||
do_save:
|
||
call save_file
|
||
jmp main_loop
|
||
open_file:
|
||
mov esi,_open
|
||
call file_open_dialog
|
||
jc main_loop
|
||
call load_file
|
||
jmp main_loop
|
||
open_help:
|
||
mov edi,[ini_extension]
|
||
mov eax,'TXT'
|
||
stosd
|
||
mov edx,ini_path
|
||
call load_file
|
||
or [editor_mode],FEMODE_READONLY
|
||
jmp main_loop
|
||
goto:
|
||
call goto_dialog
|
||
jc main_loop
|
||
or edx,edx
|
||
jz goto_position_ok
|
||
dec edx
|
||
mov [caret_position],edx
|
||
mov [selection_position],edx
|
||
goto_position_ok:
|
||
or ecx,ecx
|
||
jz goto_line_ok
|
||
mov eax,ecx
|
||
call find_line
|
||
mov [caret_line],esi
|
||
mov [selection_line],esi
|
||
mov [caret_line_number],ecx
|
||
mov [selection_line_number],ecx
|
||
goto_line_ok:
|
||
call update_positions
|
||
call let_caret_appear
|
||
call update_window
|
||
jmp main_loop
|
||
search:
|
||
call find_dialog
|
||
jc main_loop
|
||
call find_first
|
||
jc not_found
|
||
call show_found_text
|
||
jmp main_loop
|
||
not_found:
|
||
call update_screen
|
||
mov edi,buffer+1000h
|
||
push edi
|
||
call get_search_text
|
||
jc main_loop
|
||
mov edi,buffer
|
||
mov esi,_not_found_after
|
||
test [search_flags],FEFIND_BACKWARD
|
||
jz make_not_found_message
|
||
mov esi,_not_found_before
|
||
make_not_found_message:
|
||
mov ebx,esp
|
||
call sprintf
|
||
pop eax
|
||
call release_search_data
|
||
mov esi,buffer
|
||
mov ebx,_find
|
||
movzx eax,[message_box_colors]
|
||
call message_box
|
||
jmp main_loop
|
||
show_found_text:
|
||
mov eax,[caret_position]
|
||
xchg eax,[selection_position]
|
||
mov [caret_position],eax
|
||
call update_positions
|
||
call let_caret_appear
|
||
call update_window
|
||
mov eax,[caret_position]
|
||
xchg eax,[selection_position]
|
||
mov [caret_position],eax
|
||
ret
|
||
replace:
|
||
call replace_dialog
|
||
jc main_loop
|
||
mov [replaces_count],0
|
||
push edi
|
||
call find_first
|
||
jc not_found
|
||
call store_status_for_undo
|
||
replace_loop:
|
||
test [command_flags],1
|
||
jz do_replace
|
||
call show_found_text
|
||
call let_caret_appear
|
||
call update_window
|
||
call update_screen
|
||
mov ebx,_replace
|
||
mov esi,_replace_prompt
|
||
mov eax,2 shl 24
|
||
mov ax,[message_box_colors]
|
||
mov [first_button],_yes
|
||
mov [second_button],_no
|
||
or [command_flags],80h
|
||
call message_box
|
||
and [command_flags],not 80h
|
||
cmp eax,1
|
||
jb replacing_finished
|
||
ja replace_next
|
||
do_replace:
|
||
push [caret_line_number]
|
||
push [caret_position]
|
||
call delete_block
|
||
pop edx ecx
|
||
cmp ecx,[caret_line_number]
|
||
jne simple_replace
|
||
cmp edx,[caret_position]
|
||
jne simple_replace
|
||
mov esi,[esp]
|
||
call insert_block
|
||
mov esi,[caret_line]
|
||
mov ecx,[caret_line_number]
|
||
mov edx,[caret_position]
|
||
xchg esi,[selection_line]
|
||
xchg ecx,[selection_line_number]
|
||
xchg edx,[selection_position]
|
||
mov [caret_line],esi
|
||
mov [caret_line_number],ecx
|
||
mov [caret_position],edx
|
||
jmp replace_done
|
||
simple_replace:
|
||
mov esi,[esp]
|
||
call insert_block
|
||
replace_done:
|
||
inc [replaces_count]
|
||
replace_next:
|
||
call find_next
|
||
jnc replace_loop
|
||
replacing_finished:
|
||
call release_search_data
|
||
call let_caret_appear
|
||
call update_window
|
||
call update_screen
|
||
mov edi,buffer
|
||
mov esi,_replaces_made
|
||
mov ebx,replaces_count
|
||
call sprintf
|
||
mov esi,buffer
|
||
mov ebx,_find
|
||
movzx eax,[message_box_colors]
|
||
call message_box
|
||
jmp main_loop
|
||
search_next:
|
||
cmp [search_data],0
|
||
je main_loop
|
||
call find_next
|
||
jc not_found
|
||
call show_found_text
|
||
jmp main_loop
|
||
build_symbols:
|
||
and [command_flags],not 2
|
||
or [command_flags],4
|
||
jmp do_compile
|
||
compile:
|
||
and [command_flags],not (2 or 4)
|
||
jmp do_compile
|
||
compile_and_run:
|
||
and [command_flags],not 4
|
||
or [command_flags],2
|
||
do_compile:
|
||
push [editor_memory]
|
||
mov eax,[main_project_file]
|
||
or eax,eax
|
||
jz got_main_file
|
||
call switch_editor_instance
|
||
got_main_file:
|
||
cmp [file_path],0
|
||
jne main_file_path_ok
|
||
call update_screen
|
||
call get_saving_path
|
||
jc main_loop
|
||
call update_screen
|
||
main_file_path_ok:
|
||
mov eax,[editor_memory]
|
||
push eax
|
||
mov edx,[previous_instance]
|
||
test edx,edx
|
||
jz save_all_files
|
||
mov eax,edx
|
||
find_first_to_save:
|
||
mov edx,[eax+SEGMENT_HEADER_LENGTH+previous_instance-editor_data]
|
||
or edx,edx
|
||
jz save_all_files
|
||
mov eax,edx
|
||
jmp find_first_to_save
|
||
save_all_files:
|
||
call switch_editor_instance
|
||
cmp [file_path],0
|
||
je save_next
|
||
mov eax,[undo_data]
|
||
cmp eax,[unmodified_state]
|
||
je save_next
|
||
call save_file
|
||
jc main_loop
|
||
save_next:
|
||
mov eax,[next_instance]
|
||
or eax,eax
|
||
jnz save_all_files
|
||
pop eax
|
||
call switch_editor_instance
|
||
mov edi,buffer+3000h
|
||
mov byte [edi],0
|
||
call get_current_directory
|
||
mov esi,[file_path]
|
||
mov edi,buffer
|
||
mov ebx,edi
|
||
copy_directory_path:
|
||
lodsb
|
||
or al,al
|
||
jz directory_path_ok
|
||
stosb
|
||
cmp al,'\'
|
||
jne copy_directory_path
|
||
mov ebx,edi
|
||
jmp copy_directory_path
|
||
directory_path_ok:
|
||
mov byte [ebx],0
|
||
mov esi,buffer
|
||
call go_to_directory
|
||
mov eax,[file_path]
|
||
mov [input_file],eax
|
||
mov [symbols_file],0
|
||
test [command_flags],4
|
||
jz symbols_file_name_ok
|
||
mov edi,buffer+2000h
|
||
mov [symbols_file],edi
|
||
mov esi,eax
|
||
xor ebx,ebx
|
||
copy_file_name:
|
||
lodsb
|
||
stosb
|
||
test al,al
|
||
jz file_name_copied
|
||
cmp al,'.'
|
||
jne copy_file_name
|
||
mov ebx,edi
|
||
jmp copy_file_name
|
||
file_name_copied:
|
||
test ebx,ebx
|
||
jz attach_fas_extension
|
||
mov edi,ebx
|
||
attach_fas_extension:
|
||
dec edi
|
||
mov eax,'.fas'
|
||
stosd
|
||
xor al,al
|
||
stosb
|
||
symbols_file_name_ok:
|
||
pop eax
|
||
call switch_editor_instance
|
||
mov cx,1000h
|
||
mov ah,1
|
||
int 10h
|
||
mov esi,_compile
|
||
mov cx,0316h
|
||
mov ah,[window_colors]
|
||
call draw_centered_window
|
||
add edi,2
|
||
mov [progress_offset],edi
|
||
mov eax,[memory_limit]
|
||
test eax,eax
|
||
jnz allocate_memory
|
||
mov ax,500h
|
||
mov edi,buffer
|
||
int 31h
|
||
mov eax,[edi]
|
||
allocate_memory:
|
||
mov ecx,eax
|
||
mov edx,eax
|
||
shr edx,2
|
||
sub eax,edx
|
||
mov [memory_end],eax
|
||
mov [additional_memory_end],edx
|
||
call get_memory
|
||
or eax,eax
|
||
jnz memory_allocated
|
||
mov eax,[additional_memory_end]
|
||
shl eax,1
|
||
cmp eax,4000h
|
||
jb not_enough_memory
|
||
jmp allocate_memory
|
||
get_current_directory:
|
||
mov ah,19h
|
||
int 21h
|
||
mov bl,al
|
||
mov dl,al
|
||
inc dl
|
||
xor esi,esi
|
||
mov ax,7147h
|
||
call dos_int
|
||
jnc got_current_directory
|
||
cmp ax,7100h
|
||
je get_current_directory_short
|
||
invalid_current_directory:
|
||
stc
|
||
ret
|
||
get_current_directory_short:
|
||
mov ah,47h
|
||
call dos_int
|
||
jc invalid_current_directory
|
||
got_current_directory:
|
||
cmp byte [buffer],0
|
||
je drive_prefix
|
||
cmp byte [buffer+1],':'
|
||
je copy_current_directory
|
||
cmp word [buffer],'\\'
|
||
je copy_current_directory
|
||
drive_prefix:
|
||
mov al,bl
|
||
add al,'A'
|
||
mov ah,':'
|
||
stosw
|
||
mov al,'\'
|
||
stosb
|
||
copy_current_directory:
|
||
mov esi,buffer
|
||
call copy_asciiz
|
||
clc
|
||
ret
|
||
go_to_directory:
|
||
cmp esi,buffer
|
||
je directory_path_ready
|
||
mov edi,buffer
|
||
call copy_asciiz
|
||
mov esi,buffer
|
||
directory_path_ready:
|
||
mov ah,0Eh
|
||
mov dl,[buffer]
|
||
sub dl,'A'
|
||
jc current_directory_ok
|
||
cmp dl,'Z'-'A'
|
||
jbe change_current_drive
|
||
sub dl,'a'-'A'
|
||
change_current_drive:
|
||
int 21h
|
||
xor dx,dx
|
||
mov ax,713Bh
|
||
call dos_int
|
||
cmp ax,7100h
|
||
jne current_directory_ok
|
||
mov ah,3Bh
|
||
call dos_int
|
||
current_directory_ok:
|
||
ret
|
||
memory_allocated:
|
||
mov [allocated_memory],ebx
|
||
mov [memory_start],eax
|
||
add eax,[memory_end]
|
||
mov [memory_end],eax
|
||
mov [additional_memory],eax
|
||
add [additional_memory_end],eax
|
||
xor eax,eax
|
||
mov [initial_definitions],eax
|
||
mov [output_file],eax
|
||
mov [display_length],eax
|
||
mov ax,204h
|
||
mov bl,9
|
||
int 31h
|
||
mov dword [keyboard_handler],edx
|
||
mov word [keyboard_handler+4],cx
|
||
mov ax,205h
|
||
mov bl,9
|
||
mov cx,cs
|
||
mov edx,aborting_handler
|
||
int 31h
|
||
mov eax,[fs:6Ch]
|
||
mov [start_time],eax
|
||
call preprocessor
|
||
call draw_progress_segment
|
||
call parser
|
||
call draw_progress_segment
|
||
call assembler
|
||
call draw_progress_segment
|
||
call formatter
|
||
call draw_progress_segment
|
||
mov ax,205h
|
||
mov bl,9
|
||
mov edx,dword [keyboard_handler]
|
||
mov cx,word [keyboard_handler+4]
|
||
int 31h
|
||
test [command_flags],2
|
||
jnz execute
|
||
mov esi,buffer+3000h
|
||
call go_to_directory
|
||
call show_display_buffer
|
||
call update_screen
|
||
mov edi,buffer
|
||
movzx eax,[current_pass]
|
||
inc eax
|
||
call number_as_text
|
||
mov eax,' pas'
|
||
stosd
|
||
mov eax,'ses,'
|
||
stosd
|
||
mov al,20h
|
||
stosb
|
||
mov eax,[fs:6Ch]
|
||
sub eax,[start_time]
|
||
mov ebx,100
|
||
mul ebx
|
||
mov ebx,182
|
||
div ebx
|
||
or eax,eax
|
||
jz show_bytes_count
|
||
xor edx,edx
|
||
mov ebx,10
|
||
div ebx
|
||
push edx
|
||
call number_as_text
|
||
mov al,'.'
|
||
stosb
|
||
pop eax
|
||
call number_as_text
|
||
mov eax,' sec'
|
||
stosd
|
||
mov eax,'onds'
|
||
stosd
|
||
mov ax,', '
|
||
stosw
|
||
show_bytes_count:
|
||
mov eax,[written_size]
|
||
call number_as_text
|
||
mov eax,' byt'
|
||
stosd
|
||
mov eax,'es.'
|
||
stosd
|
||
mov ebx,[allocated_memory]
|
||
call release_memory
|
||
mov esi,buffer
|
||
mov ebx,_compile
|
||
movzx eax,[message_box_colors]
|
||
mov [first_button],_ok
|
||
mov [second_button],_get_display
|
||
cmp [display_length],0
|
||
je show_compilation_summary
|
||
or eax,2 shl 24
|
||
show_compilation_summary:
|
||
call message_box
|
||
cmp eax,2
|
||
jb main_loop
|
||
cmp [clipboard],0
|
||
je get_display_to_clipboard
|
||
mov ebx,[clipboard_handle]
|
||
call release_memory
|
||
get_display_to_clipboard:
|
||
mov ecx,[display_length]
|
||
inc ecx
|
||
call get_memory
|
||
mov [clipboard_handle],ebx
|
||
mov [clipboard],eax
|
||
or eax,eax
|
||
jz not_enough_memory
|
||
xor esi,esi
|
||
mov edi,eax
|
||
mov ecx,[display_length]
|
||
push ds
|
||
mov ds,[low_memory_selector]
|
||
rep movsb
|
||
pop ds
|
||
xor al,al
|
||
stosb
|
||
jmp main_loop
|
||
execute:
|
||
mov edx,[output_file]
|
||
call adapt_path
|
||
mov ebx,[allocated_memory]
|
||
call release_memory
|
||
cmp [output_format],3
|
||
ja cannot_execute
|
||
call release_low_memory
|
||
call switch_to_user_screen
|
||
call close_video
|
||
mov edi,buffer+200h
|
||
lea edx,[edi-buffer]
|
||
mov ax,0D00h
|
||
stosw
|
||
lea esi,[edi-buffer]
|
||
xor al,al
|
||
stosb
|
||
mov al,20h
|
||
mov ecx,11
|
||
rep stosb
|
||
xor al,al
|
||
mov ecx,25
|
||
rep stosb
|
||
lea ebx,[edi-buffer]
|
||
xor eax,eax
|
||
stosw
|
||
mov ax,buffer_segment
|
||
shl eax,16
|
||
mov ax,dx
|
||
stosd
|
||
mov ax,si
|
||
stosd
|
||
stosd
|
||
mov ax,4B00h
|
||
xor dx,dx
|
||
call dos_int
|
||
mov esi,buffer+3000h
|
||
call go_to_directory
|
||
call init_video
|
||
jc startup_failed
|
||
call switch_to_ide_screen
|
||
call get_low_memory
|
||
jmp main_loop
|
||
cannot_execute:
|
||
mov esi,buffer+3000h
|
||
call go_to_directory
|
||
mov esi,_not_executable
|
||
mov ebx,_error
|
||
movzx eax,[error_box_colors]
|
||
call message_box
|
||
jmp main_loop
|
||
draw_progress_segment:
|
||
mov eax,[progress_offset]
|
||
mov ecx,4
|
||
draw_progress_filler:
|
||
mov byte [gs:eax],254
|
||
add eax,2
|
||
loop draw_progress_filler
|
||
mov [progress_offset],eax
|
||
ret
|
||
aborting_handler:
|
||
push eax
|
||
in al,60h
|
||
cmp al,1
|
||
jne no_abort
|
||
mov dword [esp+4],abort_compiling
|
||
mov word [esp+4+4],cs
|
||
no_abort:
|
||
pop eax
|
||
jmp pword [cs:keyboard_handler]
|
||
abort_compiling:
|
||
cli
|
||
mov ax,[cs:main_selector]
|
||
mov esp,stack_top
|
||
mov ss,ax
|
||
mov ds,ax
|
||
mov es,ax
|
||
mov fs,[bios_selector]
|
||
mov gs,[video_selector]
|
||
mov ax,205h
|
||
mov bl,9
|
||
mov edx,dword [keyboard_handler]
|
||
mov cx,word [keyboard_handler+4]
|
||
int 31h
|
||
sti
|
||
discard_keyboard_buffer:
|
||
mov ah,11h
|
||
int 16h
|
||
jz keyboard_buffer_ok
|
||
mov ah,10h
|
||
int 16h
|
||
jmp discard_keyboard_buffer
|
||
keyboard_buffer_ok:
|
||
mov ebx,[allocated_memory]
|
||
call release_memory
|
||
mov esi,buffer+3000h
|
||
call go_to_directory
|
||
jmp main_loop
|
||
assign_to_compiler:
|
||
mov eax,[editor_memory]
|
||
xchg eax,[main_project_file]
|
||
cmp eax,[editor_memory]
|
||
jne main_loop
|
||
mov [main_project_file],0
|
||
jmp main_loop
|
||
calculator:
|
||
call calculator_window
|
||
jmp main_loop
|
||
options:
|
||
push [editor_style]
|
||
call options_dialog
|
||
pop eax
|
||
jnc main_loop
|
||
mov [editor_style],eax
|
||
jmp main_loop
|
||
|
||
startup_failed:
|
||
mov esi,_startup_failed
|
||
error_message_loop:
|
||
lodsb
|
||
or al,al
|
||
jz error_message_ok
|
||
mov dl,al
|
||
mov ah,2
|
||
int 21h
|
||
jmp error_message_loop
|
||
error_message_ok:
|
||
mov ax,4C0Fh
|
||
int 21h
|
||
|
||
init_video:
|
||
call check_video_mode
|
||
mov bx,gs
|
||
movzx edx,byte [fs:4Ah]
|
||
mov [screen_width],edx
|
||
shl edx,1
|
||
mov [video_pitch],edx
|
||
movzx eax,byte [fs:84h]
|
||
inc eax
|
||
mov [screen_height],eax
|
||
imul edx,eax
|
||
push edx
|
||
dec edx
|
||
shld ecx,edx,16
|
||
mov ax,8
|
||
int 31h
|
||
jc video_init_failed
|
||
pop ecx
|
||
call get_memory
|
||
jc video_init_failed
|
||
mov [video_storage],eax
|
||
mov [video_storage_handle],ebx
|
||
clc
|
||
ret
|
||
video_init_failed:
|
||
stc
|
||
ret
|
||
check_video_mode:
|
||
test byte [fs:65h],110b
|
||
jnz set_video_mode
|
||
cmp byte [fs:4Ah],80
|
||
jb set_video_mode
|
||
ret
|
||
set_video_mode:
|
||
mov ax,3
|
||
int 10h
|
||
ret
|
||
close_video:
|
||
mov ebx,[video_storage_handle]
|
||
call release_memory
|
||
ret
|
||
switch_to_ide_screen:
|
||
call check_video_mode
|
||
xor esi,esi
|
||
mov edi,[video_storage]
|
||
mov ecx,[video_pitch]
|
||
imul ecx,[screen_height]
|
||
rep movs byte [es:edi],[gs:esi]
|
||
mov ah,3
|
||
xor bh,bh
|
||
int 10h
|
||
mov [stored_cursor],cx
|
||
mov [stored_cursor_position],dx
|
||
mov ah,0Fh
|
||
int 10h
|
||
mov [stored_page],bh
|
||
mov ax,0500h
|
||
int 10h
|
||
mov al,[fs:65h]
|
||
mov [stored_mode],al
|
||
mov ax,1003h
|
||
xor bx,bx
|
||
int 10h
|
||
mov eax,[screen_width]
|
||
mov [window_width],eax
|
||
mov eax,[screen_height]
|
||
sub eax,2
|
||
mov [window_height],eax
|
||
call update_window
|
||
ret
|
||
switch_to_user_screen:
|
||
push es gs
|
||
pop es
|
||
mov esi,[video_storage]
|
||
xor edi,edi
|
||
mov ecx,[video_pitch]
|
||
imul ecx,[screen_height]
|
||
rep movs byte [es:edi],[ds:esi]
|
||
mov ah,1
|
||
mov cx,[stored_cursor]
|
||
int 10h
|
||
mov ah,2
|
||
xor bh,bh
|
||
mov dx,[stored_cursor_position]
|
||
int 10h
|
||
mov ah,5
|
||
mov al,[stored_page]
|
||
int 10h
|
||
mov ax,1003h
|
||
xor bh,bh
|
||
mov bl,[stored_mode]
|
||
shr bl,5
|
||
and bl,1
|
||
int 10h
|
||
pop es
|
||
ret
|
||
|
||
create_editor_instance:
|
||
call flush_editor_data
|
||
mov esi,[editor_memory]
|
||
find_last_instance:
|
||
mov eax,[esi+SEGMENT_HEADER_LENGTH+next_instance-editor_data]
|
||
or eax,eax
|
||
jz attach_new_instance
|
||
mov esi,eax
|
||
jmp find_last_instance
|
||
attach_new_instance:
|
||
push esi
|
||
call init_editor_memory
|
||
pop esi
|
||
jc not_enough_memory
|
||
mov eax,[editor_memory]
|
||
xchg eax,[esi+SEGMENT_HEADER_LENGTH+next_instance-editor_data]
|
||
mov [next_instance],eax
|
||
mov [previous_instance],esi
|
||
xor eax,eax
|
||
mov [file_path],eax
|
||
flush_editor_data:
|
||
mov edi,[editor_memory]
|
||
test edi,edi
|
||
jz flush_ok
|
||
add edi,SEGMENT_HEADER_LENGTH
|
||
mov esi,editor_data
|
||
mov ecx,editor_data_size
|
||
rep movsb
|
||
flush_ok:
|
||
ret
|
||
switch_editor_instance:
|
||
call flush_editor_data
|
||
cmp eax,[editor_memory]
|
||
je editor_switch_ok
|
||
mov [editor_memory],eax
|
||
lea esi,[eax+SEGMENT_HEADER_LENGTH]
|
||
mov edi,editor_data
|
||
mov ecx,editor_data_size
|
||
rep movsb
|
||
editor_switch_ok:
|
||
call update_positions
|
||
ret
|
||
remove_editor_instance:
|
||
mov eax,[editor_memory]
|
||
xor eax,[main_project_file]
|
||
jnz main_project_file_ok
|
||
mov [main_project_file],eax
|
||
main_project_file_ok:
|
||
mov esi,[previous_instance]
|
||
mov edi,[next_instance]
|
||
mov eax,edi
|
||
or edi,edi
|
||
jz next_instance_links_ok
|
||
mov [edi+SEGMENT_HEADER_LENGTH+previous_instance-editor_data],esi
|
||
next_instance_links_ok:
|
||
or esi,esi
|
||
jz previous_instance_links_ok
|
||
mov [esi+SEGMENT_HEADER_LENGTH+next_instance-editor_data],edi
|
||
mov eax,esi
|
||
previous_instance_links_ok:
|
||
push eax
|
||
call release_editor_memory
|
||
mov eax,[file_path]
|
||
or eax,eax
|
||
jz file_path_released
|
||
mov ebx,[file_path_handle]
|
||
call release_memory
|
||
file_path_released:
|
||
pop eax
|
||
or eax,eax
|
||
jz no_instance_left
|
||
call switch_editor_instance
|
||
clc
|
||
ret
|
||
no_instance_left:
|
||
stc
|
||
ret
|
||
|
||
load_file:
|
||
push edx
|
||
push [editor_memory]
|
||
call get_full_pathname
|
||
push esi
|
||
call flush_editor_data
|
||
mov esi,[esp]
|
||
mov edx,[editor_memory]
|
||
prepare_to_scan_editors:
|
||
mov eax,[edx+SEGMENT_HEADER_LENGTH+previous_instance-editor_data]
|
||
or eax,eax
|
||
jz scan_editors
|
||
mov edx,eax
|
||
jmp prepare_to_scan_editors
|
||
scan_editors:
|
||
mov edi,[edx+SEGMENT_HEADER_LENGTH+file_path-editor_data]
|
||
or edi,edi
|
||
jz scan_next_editor
|
||
xor ecx,ecx
|
||
mov ebx,lower_case_table
|
||
compare_pathnames:
|
||
mov al,[esi+ecx]
|
||
xlatb
|
||
mov ah,al
|
||
mov al,[edi+ecx]
|
||
xlatb
|
||
cmp al,ah
|
||
jne scan_next_editor
|
||
or al,ah
|
||
jz file_found
|
||
inc ecx
|
||
jmp compare_pathnames
|
||
scan_next_editor:
|
||
mov edx,[edx+SEGMENT_HEADER_LENGTH+next_instance-editor_data]
|
||
or edx,edx
|
||
jnz scan_editors
|
||
mov eax,[undo_data]
|
||
sub eax,[unmodified_state]
|
||
or eax,[file_path]
|
||
jz open_in_current_instance
|
||
call create_editor_instance
|
||
open_in_current_instance:
|
||
pop esi
|
||
call use_pathname
|
||
mov edx,[file_path]
|
||
call open
|
||
jc load_failed
|
||
xor edx,edx
|
||
mov al,2
|
||
call lseek
|
||
push eax ebx
|
||
lea ecx,[eax+1]
|
||
call get_memory
|
||
or eax,eax
|
||
jz not_enough_memory
|
||
mov esi,eax
|
||
mov edi,ecx
|
||
pop ebx
|
||
xor edx,edx
|
||
xor al,al
|
||
call lseek
|
||
pop ecx
|
||
mov edx,esi
|
||
mov byte [edx+ecx],0
|
||
call read
|
||
jc load_failed
|
||
call close
|
||
push edi
|
||
call set_text
|
||
pop ebx
|
||
call release_memory
|
||
add esp,8
|
||
ret
|
||
file_found:
|
||
mov eax,edx
|
||
call switch_editor_instance
|
||
pop esi
|
||
add esp,8
|
||
ret
|
||
load_failed:
|
||
mov eax,[previous_instance]
|
||
or eax,[next_instance]
|
||
jnz cancel_instance
|
||
cancel_path_only:
|
||
xor ebx,ebx
|
||
xchg ebx,[file_path]
|
||
call release_memory
|
||
jmp editor_cancelled
|
||
cancel_instance:
|
||
mov eax,[editor_memory]
|
||
cmp eax,[esp]
|
||
je cancel_path_only
|
||
call remove_editor_instance
|
||
editor_cancelled:
|
||
pop eax
|
||
call switch_editor_instance
|
||
call update_screen
|
||
mov edi,buffer
|
||
mov esi,_loading_error
|
||
mov ebx,esp
|
||
call sprintf
|
||
pop eax
|
||
mov esi,buffer
|
||
mov ebx,_error
|
||
movzx eax,[error_box_colors]
|
||
call message_box
|
||
ret
|
||
get_full_pathname:
|
||
call adapt_path
|
||
sub edi,buffer
|
||
mov ax,7160h
|
||
xor cx,cx
|
||
xor si,si
|
||
stc
|
||
call dos_int
|
||
jnc got_full_pathname
|
||
mov ah,60h
|
||
call dos_int
|
||
jc full_pathname_exit
|
||
got_full_pathname:
|
||
lea esi,[buffer + edi]
|
||
cmp word [esi],'\\'
|
||
jne full_pathname_ok
|
||
cmp dword [esi+3],'.\A.'
|
||
jne full_pathname_ok
|
||
mov al,[esi+2]
|
||
mov ah,':'
|
||
add esi,5
|
||
mov [esi],ax
|
||
full_pathname_ok:
|
||
clc
|
||
full_pathname_exit:
|
||
ret
|
||
use_pathname:
|
||
mov edi,[file_path]
|
||
or edi,edi
|
||
jnz copy_pathname
|
||
mov ecx,1000h
|
||
push esi
|
||
call get_memory
|
||
pop esi
|
||
or eax,eax
|
||
jz not_enough_memory
|
||
mov edi,eax
|
||
mov [file_path],edi
|
||
mov [file_path_handle],ebx
|
||
copy_pathname:
|
||
lodsb
|
||
stosb
|
||
or al,al
|
||
jnz copy_pathname
|
||
ret
|
||
save_file:
|
||
mov edx,[file_path]
|
||
call create
|
||
jc file_creation_error
|
||
mov [file_handle],ebx
|
||
mov esi,[first_line]
|
||
mov edi,[line_buffer]
|
||
copy_text:
|
||
mov ecx,[esi+8]
|
||
lea eax,[edi+ecx]
|
||
mov edx,[line_buffer_size]
|
||
shr edx,1
|
||
sub eax,edx
|
||
cmp eax,[line_buffer]
|
||
ja flush_to_file
|
||
mov ebp,edi
|
||
xor edx,edx
|
||
push ecx
|
||
call copy_from_line
|
||
pop ecx
|
||
test [editor_style],FES_OPTIMALFILL
|
||
jz line_copied
|
||
cmp ecx,8
|
||
jb line_copied
|
||
push esi edi ecx
|
||
mov esi,ebp
|
||
mov edi,[line_buffer]
|
||
mov eax,[line_buffer_size]
|
||
shr eax,1
|
||
add edi,eax
|
||
push edi
|
||
mov ecx,[esp+4]
|
||
xor al,al
|
||
rep stosb
|
||
mov ecx,[esp+4]
|
||
mov edi,[esp]
|
||
call syntax_proc
|
||
pop ebx ecx edi
|
||
mov esi,ebp
|
||
mov edi,ebp
|
||
sub ebx,esi
|
||
xor edx,edx
|
||
optimal_fill:
|
||
lodsb
|
||
cmp al,20h
|
||
jne store_character
|
||
cmp byte [esi-1+ebx],0
|
||
jne store_character
|
||
mov eax,esi
|
||
sub eax,ebp
|
||
test eax,111b
|
||
jz store_tab
|
||
inc edx
|
||
mov al,20h
|
||
stosb
|
||
loop optimal_fill
|
||
jmp optimal_fill_done
|
||
store_tab:
|
||
mov al,20h
|
||
or edx,edx
|
||
jz store_character
|
||
sub edi,edx
|
||
mov al,9
|
||
store_character:
|
||
stosb
|
||
xor edx,edx
|
||
loop optimal_fill
|
||
optimal_fill_done:
|
||
pop esi
|
||
jmp line_copied
|
||
line_copied:
|
||
or esi,esi
|
||
jz flush_to_file
|
||
mov ax,0A0Dh
|
||
stosw
|
||
jmp copy_text
|
||
flush_to_file:
|
||
push esi
|
||
mov edx,[line_buffer]
|
||
mov ecx,edi
|
||
sub ecx,edx
|
||
mov ebx,[file_handle]
|
||
call write
|
||
jc file_writing_error
|
||
pop esi
|
||
mov edi,[line_buffer]
|
||
or esi,esi
|
||
jnz copy_text
|
||
mov ebx,[file_handle]
|
||
call close
|
||
mov eax,[undo_data]
|
||
mov [unmodified_state],eax
|
||
clc
|
||
ret
|
||
file_writing_error:
|
||
add esp,4
|
||
file_creation_error:
|
||
call update_screen
|
||
mov esi,_saving_error
|
||
mov ebx,_error
|
||
movzx eax,[error_box_colors]
|
||
call message_box
|
||
stc
|
||
ret
|
||
get_saving_path:
|
||
mov esi,_save_as
|
||
call file_open_dialog
|
||
jc saving_aborted
|
||
push edx
|
||
cmp byte [edx+ecx-1],'\'
|
||
je save_in_new_directory
|
||
call open
|
||
pop edx
|
||
jc saving_allowed
|
||
push edx
|
||
call close
|
||
call update_screen
|
||
mov edi,buffer
|
||
mov esi,_overwrite_question
|
||
mov ebx,esp
|
||
call sprintf
|
||
mov esi,buffer
|
||
mov ebx,_save_as
|
||
mov eax,2 shl 24
|
||
mov ax,[message_box_colors]
|
||
mov [first_button],_yes
|
||
mov [second_button],_no
|
||
call message_box
|
||
pop edx
|
||
cmp eax,1
|
||
jb saving_aborted
|
||
je saving_allowed
|
||
call update_screen
|
||
jmp get_saving_path
|
||
save_in_new_directory:
|
||
mov byte [edx+ecx-1],0
|
||
call update_screen
|
||
mov edi,buffer
|
||
mov esi,_directory_question
|
||
mov ebx,esp
|
||
call sprintf
|
||
mov esi,buffer
|
||
mov ebx,_save_as
|
||
mov eax,2 shl 24
|
||
mov ax,[message_box_colors]
|
||
mov [first_button],_yes
|
||
mov [second_button],_no
|
||
call message_box
|
||
pop esi
|
||
cmp eax,1
|
||
jb saving_aborted
|
||
jne saving_directory_ok
|
||
mov edi,buffer
|
||
call copy_asciiz
|
||
mov ax,7139h
|
||
xor edx,edx
|
||
call dos_int
|
||
jnc new_directory_created
|
||
cmp ax,7100h
|
||
jne error_creating_directory
|
||
mov ah,39h
|
||
call dos_int
|
||
jc error_creating_directory
|
||
new_directory_created:
|
||
mov ax,713Bh
|
||
call dos_int
|
||
jnc saving_directory_ok
|
||
cmp ax,7100h
|
||
jne error_creating_directory
|
||
mov ah,3Bh
|
||
call dos_int
|
||
jc error_creating_directory
|
||
saving_directory_ok:
|
||
call update_screen
|
||
jmp get_saving_path
|
||
error_creating_directory:
|
||
call update_screen
|
||
mov esi,_directory_error
|
||
mov ebx,_error
|
||
movzx eax,[error_box_colors]
|
||
call message_box
|
||
jmp saving_directory_ok
|
||
saving_allowed:
|
||
call get_full_pathname
|
||
jc invalid_saving_path
|
||
call use_pathname
|
||
clc
|
||
ret
|
||
invalid_saving_path:
|
||
call update_screen
|
||
mov esi,_invalid_path
|
||
mov ebx,_error
|
||
movzx eax,[error_box_colors]
|
||
call message_box
|
||
saving_aborted:
|
||
stc
|
||
ret
|
||
|
||
load_configuration:
|
||
call load_ini_file
|
||
xor eax,eax
|
||
mov [memory_limit],eax
|
||
mov al,100
|
||
mov [passes_limit],ax
|
||
mov ebx,_section_compiler
|
||
mov esi,_key_compiler_memory
|
||
call get_ini_int
|
||
jc memory_setting_ok
|
||
cmp eax,1 shl (32-10)
|
||
jae memory_setting_ok
|
||
shl eax,10
|
||
mov [memory_limit],eax
|
||
memory_setting_ok:
|
||
mov esi,_key_compiler_passes
|
||
call get_ini_int
|
||
jc passes_setting_ok
|
||
test eax,eax
|
||
jz passes_setting_ok
|
||
cmp eax,10000h
|
||
ja passes_setting_ok
|
||
mov [passes_limit],ax
|
||
passes_setting_ok:
|
||
mov ebx,_section_options
|
||
mov esi,_key_options_securesel
|
||
call get_ini_int
|
||
jc securesel_init_ok
|
||
and [editor_style],not FES_SECURESEL
|
||
test eax,eax
|
||
jz securesel_init_ok
|
||
or [editor_style],FES_SECURESEL
|
||
securesel_init_ok:
|
||
mov esi,_key_options_autobrackets
|
||
call get_ini_int
|
||
jc autobrackets_init_ok
|
||
and [editor_style],not FES_AUTOBRACKETS
|
||
test eax,eax
|
||
jz autobrackets_init_ok
|
||
or [editor_style],FES_AUTOBRACKETS
|
||
autobrackets_init_ok:
|
||
mov esi,_key_options_autoindent
|
||
call get_ini_int
|
||
jc autoindent_init_ok
|
||
and [editor_style],not FES_AUTOINDENT
|
||
test eax,eax
|
||
jz autoindent_init_ok
|
||
or [editor_style],FES_AUTOINDENT
|
||
autoindent_init_ok:
|
||
mov esi,_key_options_smarttabs
|
||
call get_ini_int
|
||
jc smarttabs_init_ok
|
||
and [editor_style],not FES_SMARTTABS
|
||
test eax,eax
|
||
jz smarttabs_init_ok
|
||
or [editor_style],FES_SMARTTABS
|
||
smarttabs_init_ok:
|
||
mov esi,_key_options_optimalfill
|
||
call get_ini_int
|
||
jc optimalfill_init_ok
|
||
and [editor_style],not FES_OPTIMALFILL
|
||
test eax,eax
|
||
jz optimalfill_init_ok
|
||
or [editor_style],FES_OPTIMALFILL
|
||
optimalfill_init_ok:
|
||
mov ebx,_section_colors
|
||
mov esi,_key_color_text
|
||
call get_ini_int
|
||
jc color_text_init_ok
|
||
and al,0Fh
|
||
and [text_colors],0F0h
|
||
or [text_colors],al
|
||
color_text_init_ok:
|
||
mov esi,_key_color_background
|
||
call get_ini_int
|
||
jc color_background_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and [text_colors],0Fh
|
||
or [text_colors],al
|
||
color_background_init_ok:
|
||
mov esi,_key_color_seltext
|
||
call get_ini_int
|
||
jc color_seltext_init_ok
|
||
and al,0Fh
|
||
and [selection_colors],0F0h
|
||
or [selection_colors],al
|
||
color_seltext_init_ok:
|
||
mov esi,_key_color_selbackground
|
||
call get_ini_int
|
||
jc color_selbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and [selection_colors],0Fh
|
||
or [selection_colors],al
|
||
color_selbackground_init_ok:
|
||
mov esi,_key_color_symbols
|
||
call get_ini_int
|
||
jc color_symbols_init_ok
|
||
mov [symbol_color],al
|
||
color_symbols_init_ok:
|
||
mov esi,_key_color_numbers
|
||
call get_ini_int
|
||
jc color_numbers_init_ok
|
||
mov [number_color],al
|
||
color_numbers_init_ok:
|
||
mov esi,_key_color_strings
|
||
call get_ini_int
|
||
jc color_strings_init_ok
|
||
mov [string_color],al
|
||
color_strings_init_ok:
|
||
mov esi,_key_color_comments
|
||
call get_ini_int
|
||
jc color_comments_init_ok
|
||
mov [comment_color],al
|
||
color_comments_init_ok:
|
||
mov esi,_key_color_statustext
|
||
call get_ini_int
|
||
jc color_statustext_init_ok
|
||
and al,0Fh
|
||
and [status_colors],0F0h
|
||
or [status_colors],al
|
||
color_statustext_init_ok:
|
||
mov esi,_key_color_statusbackground
|
||
call get_ini_int
|
||
jc color_statusbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and [status_colors],0Fh
|
||
or [status_colors],al
|
||
color_statusbackground_init_ok:
|
||
mov esi,_key_color_wintext
|
||
call get_ini_int
|
||
jc color_wintext_init_ok
|
||
and al,0Fh
|
||
and [window_colors],0F0h
|
||
or [window_colors],al
|
||
color_wintext_init_ok:
|
||
mov esi,_key_color_winbackground
|
||
call get_ini_int
|
||
jc color_winbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and [window_colors],0Fh
|
||
or [window_colors],al
|
||
color_winbackground_init_ok:
|
||
mov esi,_key_color_msgtext
|
||
call get_ini_int
|
||
jc color_msgtext_init_ok
|
||
and al,0Fh
|
||
and byte [message_box_colors+1],0F0h
|
||
or byte [message_box_colors+1],al
|
||
color_msgtext_init_ok:
|
||
mov esi,_key_color_msgbackground
|
||
call get_ini_int
|
||
jc color_msgbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and byte [message_box_colors+1],0Fh
|
||
or byte [message_box_colors+1],al
|
||
color_msgbackground_init_ok:
|
||
mov esi,_key_color_msgseltext
|
||
call get_ini_int
|
||
jc color_msgseltext_init_ok
|
||
and al,0Fh
|
||
and byte [message_box_colors],0F0h
|
||
or byte [message_box_colors],al
|
||
color_msgseltext_init_ok:
|
||
mov esi,_key_color_msgselbackground
|
||
call get_ini_int
|
||
jc color_msgselbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and byte [message_box_colors],0Fh
|
||
or byte [message_box_colors],al
|
||
color_msgselbackground_init_ok:
|
||
mov esi,_key_color_errtext
|
||
call get_ini_int
|
||
jc color_errtext_init_ok
|
||
and al,0Fh
|
||
and byte [error_box_colors+1],0F0h
|
||
or byte [error_box_colors+1],al
|
||
color_errtext_init_ok:
|
||
mov esi,_key_color_errbackground
|
||
call get_ini_int
|
||
jc color_errbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and byte [error_box_colors+1],0Fh
|
||
or byte [error_box_colors+1],al
|
||
color_errbackground_init_ok:
|
||
mov esi,_key_color_errseltext
|
||
call get_ini_int
|
||
jc color_errseltext_init_ok
|
||
and al,0Fh
|
||
and byte [error_box_colors],0F0h
|
||
or byte [error_box_colors],al
|
||
color_errseltext_init_ok:
|
||
mov esi,_key_color_errselbackground
|
||
call get_ini_int
|
||
jc color_errselbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and byte [error_box_colors],0Fh
|
||
or byte [error_box_colors],al
|
||
color_errselbackground_init_ok:
|
||
mov esi,_key_color_boxtext
|
||
call get_ini_int
|
||
jc color_boxtext_init_ok
|
||
and al,0Fh
|
||
and [box_colors],0F0h
|
||
or [box_colors],al
|
||
color_boxtext_init_ok:
|
||
mov esi,_key_color_boxbackground
|
||
call get_ini_int
|
||
jc color_boxbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and [box_colors],0Fh
|
||
or [box_colors],al
|
||
color_boxbackground_init_ok:
|
||
mov esi,_key_color_boxseltext
|
||
call get_ini_int
|
||
jc color_boxseltext_init_ok
|
||
and al,0Fh
|
||
and byte [box_selection_colors],0F0h
|
||
or byte [box_selection_colors],al
|
||
color_boxseltext_init_ok:
|
||
mov esi,_key_color_boxselbackground
|
||
call get_ini_int
|
||
jc color_boxselbackground_init_ok
|
||
and al,0Fh
|
||
shl al,4
|
||
and byte [box_selection_colors],0Fh
|
||
or byte [box_selection_colors],al
|
||
color_boxselbackground_init_ok:
|
||
ret
|
||
load_ini_file:
|
||
cmp [ini_data],0
|
||
je open_ini_file
|
||
mov ebx,[ini_data_handle]
|
||
call release_memory
|
||
open_ini_file:
|
||
mov edi,[ini_extension]
|
||
mov eax,'INI'
|
||
stosd
|
||
mov edx,ini_path
|
||
call open
|
||
jc no_ini_file
|
||
xor edx,edx
|
||
mov al,2
|
||
call lseek
|
||
push eax
|
||
xor edx,edx
|
||
xor al,al
|
||
call lseek
|
||
mov ecx,[esp]
|
||
add ecx,800h
|
||
push ebx
|
||
call get_memory
|
||
mov [ini_data],eax
|
||
mov [ini_data_handle],ebx
|
||
pop ebx ecx
|
||
test eax,eax
|
||
jz ini_loaded
|
||
mov edx,eax
|
||
mov byte [edx+ecx],1Ah
|
||
mov [ini_data_length],ecx
|
||
call read
|
||
call close
|
||
ret
|
||
no_ini_file:
|
||
mov ecx,800h
|
||
call get_memory
|
||
mov [ini_data],eax
|
||
test eax,eax
|
||
jz ini_loaded
|
||
mov byte [eax],1Ah
|
||
mov [ini_data_length],0
|
||
ini_loaded:
|
||
ret
|
||
get_ini_value:
|
||
mov edi,esi
|
||
mov esi,[ini_data]
|
||
test esi,esi
|
||
jz ini_value_not_found
|
||
call find_ini_block
|
||
jc ini_value_not_found
|
||
call find_ini_value
|
||
ret
|
||
ini_value_not_found:
|
||
stc
|
||
ret
|
||
find_ini_block:
|
||
lodsb
|
||
cmp al,20h
|
||
je find_ini_block
|
||
cmp al,9
|
||
je find_ini_block
|
||
cmp al,'['
|
||
jne look_for_ini_block_in_next_line
|
||
find_block_name:
|
||
lodsb
|
||
cmp al,20h
|
||
je find_block_name
|
||
cmp al,9
|
||
je find_block_name
|
||
dec esi
|
||
mov edx,ebx
|
||
compare_block_name_char:
|
||
lodsb
|
||
mov ah,[edx]
|
||
inc edx
|
||
cmp al,']'
|
||
je end_of_block_name
|
||
cmp al,20h
|
||
je end_of_block_name
|
||
cmp al,9
|
||
je end_of_block_name
|
||
cmp al,1Ah
|
||
je end_of_block_name
|
||
cmp al,0Dh
|
||
je end_of_block_name
|
||
cmp al,0Ah
|
||
je end_of_block_name
|
||
or ah,ah
|
||
jz look_for_ini_block_in_next_line
|
||
sub ah,al
|
||
jz compare_block_name_char
|
||
jns block_name_char_case_insensitive
|
||
neg ah
|
||
sub al,20h
|
||
block_name_char_case_insensitive:
|
||
cmp ah,20h
|
||
jne look_for_ini_block_in_next_line
|
||
cmp al,41h
|
||
jb look_for_ini_block_in_next_line
|
||
cmp al,5Ah
|
||
jna compare_block_name_char
|
||
look_for_ini_block_in_next_line:
|
||
dec esi
|
||
call find_next_ini_line
|
||
cmp byte [esi],1Ah
|
||
jne find_ini_block
|
||
stc
|
||
ret
|
||
end_of_block_name:
|
||
test ah,ah
|
||
jnz look_for_ini_block_in_next_line
|
||
cmp al,']'
|
||
je end_of_block_name_ok
|
||
cmp al,20h
|
||
je find_block_name_closing_bracket
|
||
cmp al,9
|
||
jne look_for_ini_block_in_next_line
|
||
find_block_name_closing_bracket:
|
||
lodsb
|
||
jmp end_of_block_name
|
||
end_of_block_name_ok:
|
||
call find_next_ini_line
|
||
clc
|
||
ret
|
||
find_next_ini_line:
|
||
lodsb
|
||
cmp al,0Dh
|
||
je line_ending
|
||
cmp al,0Ah
|
||
je line_ending
|
||
cmp al,1Ah
|
||
jne find_next_ini_line
|
||
dec esi
|
||
ret
|
||
line_ending:
|
||
lodsb
|
||
cmp al,0Dh
|
||
je line_ending
|
||
cmp al,0Ah
|
||
je line_ending
|
||
dec esi
|
||
ret
|
||
find_ini_value:
|
||
lodsb
|
||
cmp al,20h
|
||
je find_ini_value
|
||
cmp al,9
|
||
je find_ini_value
|
||
cmp al,0Dh
|
||
je next_ini_value
|
||
cmp al,0Ah
|
||
je next_ini_value
|
||
dec esi
|
||
cmp al,1Ah
|
||
je no_ini_value_found
|
||
cmp al,'['
|
||
je no_ini_value_found
|
||
mov edx,edi
|
||
compare_value_name_char:
|
||
lodsb
|
||
mov ah,[edx]
|
||
inc edx
|
||
cmp al,'='
|
||
je end_of_value_name
|
||
cmp al,20h
|
||
je end_of_value_name
|
||
cmp al,9
|
||
je end_of_value_name
|
||
cmp al,1Ah
|
||
je end_of_value_name
|
||
cmp al,0Dh
|
||
je end_of_value_name
|
||
cmp al,0Ah
|
||
je end_of_value_name
|
||
or ah,ah
|
||
jz next_ini_value
|
||
sub ah,al
|
||
jz compare_value_name_char
|
||
jns value_name_char_case_insensitive
|
||
neg ah
|
||
sub al,20h
|
||
value_name_char_case_insensitive:
|
||
cmp ah,20h
|
||
jne next_ini_value
|
||
cmp al,41h
|
||
jb next_ini_value
|
||
cmp al,5Ah
|
||
jna compare_value_name_char
|
||
next_ini_value:
|
||
dec esi
|
||
call find_next_ini_line
|
||
cmp byte [esi],1Ah
|
||
jne find_ini_value
|
||
no_ini_value_found:
|
||
stc
|
||
ret
|
||
end_of_value_name:
|
||
test ah,ah
|
||
jnz next_ini_value
|
||
cmp al,'='
|
||
je ini_value_found
|
||
cmp al,20h
|
||
je find_ini_value_start
|
||
cmp al,9
|
||
jne next_ini_value
|
||
find_ini_value_start:
|
||
lodsb
|
||
jmp end_of_value_name
|
||
ini_value_found:
|
||
xor ecx,ecx
|
||
find_value_length:
|
||
cmp byte [esi+ecx],0Dh
|
||
je value_length_found
|
||
cmp byte [esi+ecx],0Ah
|
||
je value_length_found
|
||
cmp byte [esi+ecx],1Ah
|
||
je value_length_found
|
||
inc ecx
|
||
jmp find_value_length
|
||
value_length_found:
|
||
clc
|
||
ret
|
||
get_ini_int:
|
||
call get_ini_value
|
||
jc no_ini_int
|
||
push ebx
|
||
call atoi
|
||
pop ebx
|
||
ret
|
||
no_ini_int:
|
||
stc
|
||
ret
|
||
atoi:
|
||
lodsb
|
||
cmp al,20h
|
||
je atoi
|
||
cmp al,9
|
||
je atoi
|
||
mov bl,al
|
||
xor eax,eax
|
||
xor edx,edx
|
||
cmp bl,'-'
|
||
je atoi_digit
|
||
cmp bl,'+'
|
||
je atoi_digit
|
||
dec esi
|
||
atoi_digit:
|
||
mov dl,[esi]
|
||
sub dl,30h
|
||
jc atoi_done
|
||
cmp dl,9
|
||
ja atoi_done
|
||
mov ecx,eax
|
||
shl ecx,1
|
||
jc atoi_overflow
|
||
shl ecx,1
|
||
jc atoi_overflow
|
||
add eax,ecx
|
||
shl eax,1
|
||
jc atoi_overflow
|
||
js atoi_overflow
|
||
add eax,edx
|
||
jc atoi_overflow
|
||
inc esi
|
||
jmp atoi_digit
|
||
atoi_overflow:
|
||
stc
|
||
ret
|
||
atoi_done:
|
||
cmp bl,'-'
|
||
jne atoi_sign_ok
|
||
neg eax
|
||
atoi_sign_ok:
|
||
clc
|
||
ret
|
||
update_ini_value:
|
||
mov ebp,edx
|
||
mov esi,[ini_data]
|
||
test esi,esi
|
||
jz cannot_update_ini
|
||
call find_ini_block
|
||
jc create_ini_block
|
||
call find_ini_value
|
||
jc create_ini_value
|
||
mov edi,esi
|
||
mov esi,ebp
|
||
jecxz place_for_ini_value_exhausted
|
||
copy_value_to_ini:
|
||
lodsb
|
||
test al,al
|
||
jz shift_rest_of_ini_down
|
||
stosb
|
||
loop copy_value_to_ini
|
||
place_for_ini_value_exhausted:
|
||
cmp byte [esi],0
|
||
jne shift_rest_of_ini_up
|
||
ret
|
||
shift_rest_of_ini_down:
|
||
lea esi,[edi+ecx]
|
||
neg ecx
|
||
xchg ecx,[ini_data_length]
|
||
add [ini_data_length],ecx
|
||
inc ecx
|
||
add ecx,[ini_data]
|
||
sub ecx,esi
|
||
rep movsb
|
||
ret
|
||
shift_rest_of_ini_up:
|
||
push esi edi
|
||
mov edi,esi
|
||
xor al,al
|
||
or ecx,-1
|
||
repne scasb
|
||
neg ecx
|
||
sub ecx,2
|
||
mov esi,[ini_data]
|
||
add esi,[ini_data_length]
|
||
mov edi,esi
|
||
add edi,ecx
|
||
add [ini_data_length],ecx
|
||
mov ebp,ecx
|
||
mov ecx,esi
|
||
sub ecx,[esp]
|
||
inc ecx
|
||
std
|
||
rep movsb
|
||
cld
|
||
pop edi esi
|
||
mov ecx,ebp
|
||
rep movsb
|
||
ret
|
||
cannot_update_ini:
|
||
ret
|
||
create_ini_block:
|
||
push edi
|
||
mov edi,[ini_data]
|
||
mov ecx,[ini_data_length]
|
||
add edi,ecx
|
||
jecxz make_ini_block_header
|
||
mov ax,0A0Dh
|
||
stosw
|
||
make_ini_block_header:
|
||
mov al,'['
|
||
stosb
|
||
mov esi,ebx
|
||
call copy_str
|
||
mov al,']'
|
||
stosb
|
||
mov ax,0A0Dh
|
||
stosw
|
||
pop esi
|
||
append_ini_value:
|
||
call copy_str
|
||
mov al,'='
|
||
stosb
|
||
mov esi,ebp
|
||
call copy_str
|
||
mov ax,0A0Dh
|
||
stosw
|
||
mov ecx,edi
|
||
sub ecx,[ini_data]
|
||
mov [ini_data_length],ecx
|
||
mov al,1Ah
|
||
stosb
|
||
ret
|
||
copy_str:
|
||
lodsb
|
||
test al,al
|
||
jz str_copied
|
||
stosb
|
||
jmp copy_str
|
||
str_copied:
|
||
ret
|
||
create_ini_value:
|
||
cmp esi,[ini_data]
|
||
je ini_value_placement_ok
|
||
dec esi
|
||
mov al,[esi]
|
||
cmp al,20h
|
||
je create_ini_value
|
||
cmp al,9
|
||
je create_ini_value
|
||
cmp al,0Dh
|
||
je create_ini_value
|
||
cmp al,0Ah
|
||
je create_ini_value
|
||
inc esi
|
||
find_place_for_ini_value:
|
||
mov al,[esi]
|
||
lodsb
|
||
cmp al,0Ah
|
||
je ini_value_placement_ok
|
||
cmp al,1Ah
|
||
je value_at_end_of_ini
|
||
cmp al,0Dh
|
||
jne find_place_for_ini_value
|
||
cmp byte [esi],0Ah
|
||
jne ini_value_placement_ok
|
||
inc esi
|
||
ini_value_placement_ok:
|
||
push edi esi
|
||
xor al,al
|
||
or ecx,-1
|
||
repne scasb
|
||
mov edi,ebp
|
||
repne scasb
|
||
neg ecx
|
||
mov edi,ecx
|
||
mov ecx,esi
|
||
neg ecx
|
||
mov esi,[ini_data]
|
||
add esi,[ini_data_length]
|
||
add [ini_data_length],edi
|
||
add edi,esi
|
||
add ecx,esi
|
||
inc ecx
|
||
std
|
||
rep movsb
|
||
cld
|
||
pop edi esi
|
||
call copy_str
|
||
mov al,'='
|
||
stosb
|
||
mov esi,ebp
|
||
call copy_str
|
||
mov ax,0A0Dh
|
||
stosw
|
||
ret
|
||
value_at_end_of_ini:
|
||
xchg esi,edi
|
||
mov ax,0A0Dh
|
||
stosw
|
||
jmp append_ini_value
|
||
|
||
shutdown:
|
||
call switch_to_user_screen
|
||
call load_ini_file
|
||
cmp [ini_data],0
|
||
je exit
|
||
mov ebx,_section_options
|
||
mov edi,_key_options_securesel
|
||
test [editor_style],FES_SECURESEL
|
||
setnz al
|
||
add al,'0'
|
||
mov edx,line_buffer
|
||
mov byte [edx+1],0
|
||
mov [edx],al
|
||
call update_ini_value
|
||
mov edi,_key_options_autobrackets
|
||
test [editor_style],FES_AUTOBRACKETS
|
||
setnz al
|
||
add al,'0'
|
||
mov edx,line_buffer
|
||
mov [edx],al
|
||
call update_ini_value
|
||
mov edi,_key_options_autoindent
|
||
test [editor_style],FES_AUTOINDENT
|
||
setnz al
|
||
add al,'0'
|
||
mov edx,line_buffer
|
||
mov [edx],al
|
||
call update_ini_value
|
||
mov edi,_key_options_smarttabs
|
||
test [editor_style],FES_SMARTTABS
|
||
setnz al
|
||
add al,'0'
|
||
mov edx,line_buffer
|
||
mov [edx],al
|
||
call update_ini_value
|
||
mov edi,_key_options_optimalfill
|
||
test [editor_style],FES_OPTIMALFILL
|
||
setnz al
|
||
add al,'0'
|
||
mov edx,line_buffer
|
||
mov [edx],al
|
||
call update_ini_value
|
||
mov edx,ini_path
|
||
call create
|
||
jc exit
|
||
mov edx,[ini_data]
|
||
mov ecx,[ini_data_length]
|
||
call write
|
||
call close
|
||
exit:
|
||
mov ax,4C00h
|
||
int 21h
|
||
|
||
; Positioning
|
||
|
||
update_positions:
|
||
mov eax,[screen_width]
|
||
mov [window_width],eax
|
||
mov eax,[screen_height]
|
||
sub eax,2
|
||
mov [window_height],eax
|
||
call update_window
|
||
ret
|
||
update_cursor:
|
||
xor bh,bh
|
||
mov edx,[caret_position]
|
||
sub edx,[window_position]
|
||
jc cursor_out_of_sight
|
||
cmp edx,[window_width]
|
||
jae cursor_out_of_sight
|
||
mov eax,[caret_line_number]
|
||
sub eax,[window_line_number]
|
||
jc cursor_out_of_sight
|
||
cmp eax,[window_height]
|
||
jae cursor_out_of_sight
|
||
inc al
|
||
mov dh,al
|
||
mov ah,2
|
||
int 10h
|
||
test [editor_mode],FEMODE_OVERWRITE
|
||
jnz block_cursor
|
||
mov ah,1
|
||
mov cx,0D0Eh
|
||
int 10h
|
||
ret
|
||
block_cursor:
|
||
mov ah,1
|
||
mov cx,000Fh
|
||
int 10h
|
||
ret
|
||
cursor_out_of_sight:
|
||
mov ah,1
|
||
mov cx,1000h
|
||
int 10h
|
||
ret
|
||
|
||
; Text drawing
|
||
|
||
update_screen:
|
||
call update_title_bar
|
||
mov eax,[peak_line_length]
|
||
xor edx,edx
|
||
mov ebx,SEGMENT_DATA_LENGTH
|
||
div ebx
|
||
inc eax
|
||
mul ebx
|
||
shl eax,1
|
||
mov ecx,eax
|
||
cmp [line_buffer],0
|
||
je line_buffer_reallocate
|
||
cmp ecx,[line_buffer_size]
|
||
jbe line_buffer_ok
|
||
mov [line_buffer],0
|
||
push ecx
|
||
mov ebx,[line_buffer_handle]
|
||
call release_memory
|
||
pop ecx
|
||
line_buffer_reallocate:
|
||
mov [line_buffer_size],ecx
|
||
call get_memory
|
||
or eax,eax
|
||
jz memory_shortage
|
||
mov [line_buffer],eax
|
||
mov [line_buffer_handle],ebx
|
||
line_buffer_ok:
|
||
mov esi,[window_line]
|
||
mov edx,[window_line_number]
|
||
mov eax,[video_pitch]
|
||
mov [screen_offset],eax
|
||
mov edi,[line_buffer]
|
||
prepare_line:
|
||
add esi,SEGMENT_HEADER_LENGTH
|
||
mov ecx,SEGMENT_DATA_LENGTH
|
||
rep movsb
|
||
mov esi,[esi-SEGMENT_LENGTH]
|
||
btr esi,0
|
||
jc prepare_line
|
||
push esi edx
|
||
mov ecx,edi
|
||
mov esi,[line_buffer]
|
||
sub ecx,esi
|
||
push ecx
|
||
mov al,[text_colors]
|
||
and al,0Fh
|
||
rep stosb
|
||
mov esi,[line_buffer]
|
||
mov ecx,[esp]
|
||
lea edi,[esi+ecx]
|
||
call syntax_proc
|
||
line_prepared:
|
||
mov edi,screen_row_buffer
|
||
mov ecx,[window_width]
|
||
mov al,20h
|
||
mov ah,[text_colors]
|
||
rep stosw
|
||
pop ecx
|
||
mov esi,[line_buffer]
|
||
lea ebx,[esi+ecx]
|
||
add esi,[window_position]
|
||
add ebx,[window_position]
|
||
sub ecx,[window_position]
|
||
jbe text_drawing_ok
|
||
mov edi,screen_row_buffer
|
||
cmp ecx,[window_width]
|
||
jbe draw_text
|
||
mov ecx,[window_width]
|
||
draw_text:
|
||
movsb
|
||
mov al,[text_colors]
|
||
and al,0F0h
|
||
or al,[ebx]
|
||
stosb
|
||
inc ebx
|
||
loop draw_text
|
||
text_drawing_ok:
|
||
mov edi,screen_row_buffer
|
||
cmp [selection_line],0
|
||
je selection_marked
|
||
mov eax,[selection_line_number]
|
||
cmp eax,[caret_line_number]
|
||
jne mark_multiline_selection
|
||
cmp eax,[esp]
|
||
jne selection_marked
|
||
mark_simple_selection:
|
||
mov eax,[selection_position]
|
||
mov ecx,[caret_position]
|
||
cmp eax,ecx
|
||
jbe simple_selection_boundaries_ok
|
||
xchg eax,ecx
|
||
simple_selection_boundaries_ok:
|
||
sub ecx,[window_position]
|
||
jbe selection_marked
|
||
sub eax,[window_position]
|
||
jae simple_selection_start_ok
|
||
xor eax,eax
|
||
simple_selection_start_ok:
|
||
cmp ecx,[window_width]
|
||
jbe simple_selection_length_ok
|
||
mov ecx,[window_width]
|
||
simple_selection_length_ok:
|
||
sub ecx,eax
|
||
jbe selection_marked
|
||
lea edi,[screen_row_buffer+eax*2]
|
||
draw_selection:
|
||
inc edi
|
||
mov al,[selection_colors]
|
||
stosb
|
||
loop draw_selection
|
||
jmp selection_marked
|
||
mark_multiline_selection:
|
||
test [editor_mode],FEMODE_VERTICALSEL
|
||
jnz mark_vertical_selection
|
||
mov eax,[selection_line_number]
|
||
mov ebx,[selection_position]
|
||
mov edx,[caret_line_number]
|
||
mov ebp,[caret_position]
|
||
cmp eax,edx
|
||
jbe multiline_selection_boundaries_ok
|
||
xchg eax,edx
|
||
xchg ebx,ebp
|
||
multiline_selection_boundaries_ok:
|
||
mov edi,screen_row_buffer
|
||
mov ecx,[window_width]
|
||
cmp eax,[esp]
|
||
ja selection_marked
|
||
je mark_selection_start
|
||
cmp edx,[esp]
|
||
ja draw_selection
|
||
jb selection_marked
|
||
mark_selection_end:
|
||
cmp ebp,[window_position]
|
||
jbe selection_marked
|
||
sub ebp,[window_position]
|
||
cmp ecx,ebp
|
||
jbe draw_selection
|
||
mov ecx,ebp
|
||
jmp draw_selection
|
||
mark_selection_start:
|
||
sub ebx,[window_position]
|
||
jbe draw_selection
|
||
sub ecx,ebx
|
||
jbe selection_marked
|
||
lea edi,[edi+ebx*2]
|
||
jmp draw_selection
|
||
mark_vertical_selection:
|
||
mov eax,[selection_line_number]
|
||
mov edx,[caret_line_number]
|
||
sub eax,[esp]
|
||
jz mark_simple_selection
|
||
sub edx,[esp]
|
||
jz mark_simple_selection
|
||
xor eax,edx
|
||
js mark_simple_selection
|
||
selection_marked:
|
||
push es gs
|
||
pop es
|
||
mov esi,screen_row_buffer
|
||
mov edi,[screen_offset]
|
||
mov ecx,[window_width]
|
||
shr ecx,1
|
||
rep movsd
|
||
setc cl
|
||
rep movsw
|
||
mov eax,[window_width]
|
||
shl eax,1
|
||
sub edi,eax
|
||
add edi,[video_pitch]
|
||
mov [screen_offset],edi
|
||
pop es
|
||
pop edx esi
|
||
inc edx
|
||
mov eax,edx
|
||
sub eax,[window_line_number]
|
||
cmp eax,[window_height]
|
||
jae screen_ok
|
||
mov edi,[line_buffer]
|
||
or esi,esi
|
||
jnz prepare_line
|
||
push esi edx
|
||
push [window_position]
|
||
jmp line_prepared
|
||
screen_ok:
|
||
call update_status_bar
|
||
ret
|
||
|
||
syntax_proc:
|
||
mov ebx,characters
|
||
xor edx,edx
|
||
scan_syntax:
|
||
lodsb
|
||
check_character:
|
||
cmp al,20h
|
||
je syntax_space
|
||
cmp al,3Bh
|
||
je syntax_comment
|
||
mov ah,al
|
||
xlatb
|
||
or al,al
|
||
jz syntax_symbol
|
||
or edx,edx
|
||
jnz syntax_neutral
|
||
cmp ah,27h
|
||
je syntax_string
|
||
cmp ah,22h
|
||
je syntax_string
|
||
cmp ah,24h
|
||
je syntax_pascal_hex
|
||
cmp ah,39h
|
||
ja syntax_neutral
|
||
cmp ah,30h
|
||
jae syntax_number
|
||
syntax_neutral:
|
||
or edx,-1
|
||
inc edi
|
||
loop scan_syntax
|
||
jmp syntax_done
|
||
syntax_space:
|
||
xor edx,edx
|
||
inc edi
|
||
loop scan_syntax
|
||
jmp syntax_done
|
||
syntax_symbol:
|
||
mov al,[symbol_color]
|
||
stosb
|
||
xor edx,edx
|
||
loop scan_syntax
|
||
jmp syntax_done
|
||
syntax_pascal_hex:
|
||
cmp ecx,1
|
||
je syntax_neutral
|
||
mov al,[esi]
|
||
mov ah,al
|
||
xlatb
|
||
or al,al
|
||
jz syntax_neutral
|
||
cmp ah,24h
|
||
jne syntax_number
|
||
cmp ecx,2
|
||
je syntax_neutral
|
||
mov al,[esi+1]
|
||
xlatb
|
||
or al,al
|
||
jz syntax_neutral
|
||
syntax_number:
|
||
mov al,[number_color]
|
||
stosb
|
||
loop number_character
|
||
jmp syntax_done
|
||
number_character:
|
||
lodsb
|
||
mov ah,al
|
||
xlatb
|
||
xchg al,ah
|
||
or ah,ah
|
||
jz check_character
|
||
cmp al,20h
|
||
je check_character
|
||
cmp al,3Bh
|
||
je check_character
|
||
mov al,[number_color]
|
||
stosb
|
||
loop number_character
|
||
jmp syntax_done
|
||
syntax_string:
|
||
mov al,[string_color]
|
||
stosb
|
||
dec ecx
|
||
jz syntax_done
|
||
lodsb
|
||
cmp al,ah
|
||
jne syntax_string
|
||
mov al,[string_color]
|
||
stosb
|
||
dec ecx
|
||
jz syntax_done
|
||
lodsb
|
||
cmp al,ah
|
||
je syntax_string
|
||
xor edx,edx
|
||
jmp check_character
|
||
process_comment:
|
||
lodsb
|
||
cmp al,20h
|
||
jne syntax_comment
|
||
inc edi
|
||
loop process_comment
|
||
jmp syntax_done
|
||
syntax_comment:
|
||
mov al,[comment_color]
|
||
stosb
|
||
loop process_comment
|
||
syntax_done:
|
||
ret
|
||
|
||
; Status drawing
|
||
|
||
update_status_bar:
|
||
mov edi,screen_row_buffer
|
||
mov al,20h
|
||
mov ecx,[screen_width]
|
||
rep stosb
|
||
mov edi,screen_row_buffer+256
|
||
mov eax,'Row '
|
||
stosd
|
||
mov eax,[caret_line_number]
|
||
call number_as_text
|
||
mov al,'/'
|
||
stosb
|
||
mov eax,[lines_count]
|
||
call number_as_text
|
||
mov eax,', Co'
|
||
stosd
|
||
mov eax,'lumn'
|
||
stosd
|
||
mov al,' '
|
||
stosb
|
||
mov eax,[caret_position]
|
||
inc eax
|
||
call number_as_text
|
||
mov al,'/'
|
||
stosb
|
||
mov eax,[maximum_position]
|
||
inc eax
|
||
call number_as_text
|
||
mov ecx,edi
|
||
mov esi,screen_row_buffer+256
|
||
sub ecx,esi
|
||
mov eax,[screen_width]
|
||
lea edi,[screen_row_buffer+eax-1]
|
||
sub edi,ecx
|
||
mov byte [edi-2],0B3h
|
||
lea ebx,[edi-11]
|
||
rep movsb
|
||
mov edi,ebx
|
||
sub ebx,2
|
||
test [editor_mode],FEMODE_READONLY
|
||
jnz readonly_status
|
||
mov eax,[undo_data]
|
||
cmp eax,[unmodified_state]
|
||
je editor_status_ok
|
||
mov eax,'Modi'
|
||
stosd
|
||
mov eax,'fied'
|
||
stosd
|
||
jmp editor_status_ok
|
||
readonly_status:
|
||
dec ebx
|
||
dec edi
|
||
mov eax,'Read'
|
||
stosd
|
||
mov al,'-'
|
||
stosb
|
||
mov eax,'only'
|
||
stosd
|
||
editor_status_ok:
|
||
mov byte [ebx],0B3h
|
||
push ebx
|
||
mov edi,screen_row_buffer+1
|
||
xor eax,eax
|
||
mov edx,[previous_instance]
|
||
count_preceding_instances:
|
||
inc eax
|
||
or edx,edx
|
||
jz preceding_instances_count_ok
|
||
mov edx,[edx+SEGMENT_HEADER_LENGTH+previous_instance-editor_data]
|
||
jmp count_preceding_instances
|
||
preceding_instances_count_ok:
|
||
push eax
|
||
call number_as_text
|
||
mov al,'/'
|
||
stosb
|
||
pop eax
|
||
mov edx,[next_instance]
|
||
count_following_instances:
|
||
or edx,edx
|
||
jz following_instances_count_ok
|
||
inc eax
|
||
mov edx,[edx+SEGMENT_HEADER_LENGTH+next_instance-editor_data]
|
||
jmp count_following_instances
|
||
following_instances_count_ok:
|
||
call number_as_text
|
||
inc edi
|
||
mov al,'-'
|
||
stosb
|
||
inc edi
|
||
pop ecx
|
||
sub ecx,edi
|
||
mov esi,[file_path]
|
||
call get_file_title
|
||
print_file_title:
|
||
lodsb
|
||
or al,al
|
||
jz editor_title_ok
|
||
stosb
|
||
loop print_file_title
|
||
editor_title_ok:
|
||
push es gs
|
||
pop es
|
||
mov edi,[video_pitch]
|
||
mov eax,[screen_height]
|
||
dec eax
|
||
imul edi,eax
|
||
mov esi,screen_row_buffer
|
||
mov ecx,[screen_width]
|
||
mov ah,[status_colors]
|
||
draw_status_bar:
|
||
lodsb
|
||
stosw
|
||
loop draw_status_bar
|
||
pop es
|
||
ret
|
||
get_file_title:
|
||
or esi,esi
|
||
jz untitled
|
||
mov ebx,esi
|
||
find_file_name:
|
||
lodsb
|
||
or al,al
|
||
jz file_title_ok
|
||
cmp al,'\'
|
||
jne find_file_name
|
||
mov ebx,esi
|
||
jmp find_file_name
|
||
file_title_ok:
|
||
mov esi,ebx
|
||
ret
|
||
untitled:
|
||
mov esi,_untitled
|
||
ret
|
||
update_title_bar:
|
||
mov edi,screen_row_buffer
|
||
mov al,20h
|
||
mov ecx,[screen_width]
|
||
sub ecx,10+1
|
||
rep stosb
|
||
mov al,0B3h
|
||
stosb
|
||
mov esi,_caption
|
||
mov edi,screen_row_buffer+1
|
||
draw_caption:
|
||
lodsb
|
||
or al,al
|
||
jz caption_ok
|
||
stosb
|
||
jmp draw_caption
|
||
caption_ok:
|
||
mov edx,[main_project_file]
|
||
or edx,edx
|
||
jz main_file_title_ok
|
||
mov al,20h
|
||
stosb
|
||
mov al,'-'
|
||
stosb
|
||
mov al,20h
|
||
stosb
|
||
mov esi,[file_path]
|
||
cmp edx,[editor_memory]
|
||
je get_main_file_title
|
||
mov esi,[edx+SEGMENT_HEADER_LENGTH+file_path-editor_data]
|
||
get_main_file_title:
|
||
call get_file_title
|
||
mov ecx,[screen_width]
|
||
add ecx,screen_row_buffer-14
|
||
sub ecx,edi
|
||
print_main_file_title:
|
||
lodsb
|
||
or al,al
|
||
jz main_file_title_ok
|
||
stosb
|
||
loop print_main_file_title
|
||
main_file_title_ok:
|
||
push es gs
|
||
pop es
|
||
xor edi,edi
|
||
mov esi,screen_row_buffer
|
||
mov ecx,[screen_width]
|
||
sub ecx,10
|
||
mov ah,[status_colors]
|
||
draw_title_bar:
|
||
lodsb
|
||
stosw
|
||
loop draw_title_bar
|
||
pop es
|
||
call update_clock
|
||
ret
|
||
update_clock:
|
||
mov edi,[screen_width]
|
||
mov ecx,10
|
||
sub edi,ecx
|
||
shl edi,1
|
||
mov al,[status_colors]
|
||
prepare_clock_colors:
|
||
mov [gs:edi+(ecx-1)*2+1],al
|
||
loop prepare_clock_colors
|
||
mov ah,2Ch
|
||
int 21h
|
||
mov [gs:edi],byte 20h
|
||
mov al,ch
|
||
aam
|
||
add ax,'00'
|
||
mov [gs:edi+1*2],ah
|
||
mov [gs:edi+2*2],al
|
||
mov [gs:edi+3*2],byte ':'
|
||
mov al,cl
|
||
aam
|
||
add ax,'00'
|
||
mov [gs:edi+4*2],ah
|
||
mov [gs:edi+5*2],al
|
||
mov [gs:edi+6*2],byte ':'
|
||
mov al,dh
|
||
aam
|
||
add ax,'00'
|
||
mov [gs:edi+7*2],ah
|
||
mov [gs:edi+8*2],al
|
||
mov [gs:edi+9*2],byte 20h
|
||
ret
|
||
wait_for_input:
|
||
call update_clock
|
||
mov ah,11h
|
||
int 16h
|
||
jz wait_for_input
|
||
mov ah,10h
|
||
int 16h
|
||
test ax,ax
|
||
jz wait_for_input
|
||
ret
|
||
number_as_text:
|
||
push ebx
|
||
mov ecx,1000000000
|
||
xor edx,edx
|
||
xor bl,bl
|
||
number_loop:
|
||
div ecx
|
||
push edx
|
||
cmp ecx,1
|
||
je store_digit
|
||
or bl,bl
|
||
jnz store_digit
|
||
or al,al
|
||
jz digit_ok
|
||
not bl
|
||
store_digit:
|
||
add al,'0'
|
||
stosb
|
||
digit_ok:
|
||
mov eax,ecx
|
||
xor edx,edx
|
||
mov ecx,10
|
||
div ecx
|
||
mov ecx,eax
|
||
pop eax
|
||
or ecx,ecx
|
||
jnz number_loop
|
||
pop ebx
|
||
ret
|
||
sprintf:
|
||
lodsb
|
||
cmp al,'%'
|
||
je format_parameter
|
||
stosb
|
||
or al,al
|
||
jnz sprintf
|
||
ret
|
||
format_parameter:
|
||
lodsb
|
||
mov edx,[ebx]
|
||
add ebx,4
|
||
cmp al,'s'
|
||
je insert_string
|
||
cmp al,'d'
|
||
je insert_number
|
||
or al,al
|
||
jnz sprintf
|
||
dec esi
|
||
jmp sprintf
|
||
insert_number:
|
||
push esi
|
||
mov eax,edx
|
||
call number_as_text
|
||
pop esi
|
||
jmp sprintf
|
||
insert_string:
|
||
push esi
|
||
mov esi,edx
|
||
string_insertion_loop:
|
||
lodsb
|
||
or al,al
|
||
jz string_insertion_ok
|
||
stosb
|
||
jmp string_insertion_loop
|
||
string_insertion_ok:
|
||
pop esi
|
||
jmp sprintf
|
||
|
||
; Windows
|
||
|
||
message_box:
|
||
push eax ebx
|
||
xor ebp,ebp
|
||
mov edi,buffer+200h
|
||
mov dl,[esp+4+3]
|
||
or dl,dl
|
||
jnz calculate_buttons_width
|
||
mov dl,1
|
||
mov [first_button],_ok
|
||
calculate_buttons_width:
|
||
mov [buttons_width],0
|
||
mov eax,[first_button]
|
||
call add_button_width
|
||
dec dl
|
||
jz buttons_width_ok
|
||
add [buttons_width],2
|
||
mov eax,[second_button]
|
||
call add_button_width
|
||
jmp buttons_width_ok
|
||
add_button_width:
|
||
push edi
|
||
mov edi,eax
|
||
xor al,al
|
||
or ecx,-1
|
||
repne scasb
|
||
neg cl
|
||
add cl,6-2
|
||
add [buttons_width],cl
|
||
pop edi
|
||
ret
|
||
buttons_width_ok:
|
||
mov al,[buttons_width]
|
||
mov [message_width],al
|
||
start_message_line:
|
||
mov ebx,edi
|
||
mov edx,edi
|
||
mov ecx,[screen_width]
|
||
sub ecx,14
|
||
mov eax,[screen_height]
|
||
sub eax,7
|
||
inc ebp
|
||
cmp ebp,eax
|
||
jae message_prepared
|
||
copy_message:
|
||
lodsb
|
||
stosb
|
||
cmp al,20h
|
||
jne message_character_ok
|
||
mov edx,edi
|
||
message_character_ok:
|
||
cmp byte [esi],0
|
||
je message_prepared
|
||
loop copy_message
|
||
cmp edx,ebx
|
||
je split_word
|
||
lea eax,[edx-1]
|
||
mov ecx,[screen_height]
|
||
sub ecx,7
|
||
inc ebp
|
||
cmp ebp,ecx
|
||
je cut_message
|
||
mov byte [eax],0Ah
|
||
sub eax,ebx
|
||
mov ebx,edx
|
||
mov ecx,[screen_width]
|
||
lea ecx,[ecx-14+ebx]
|
||
sub ecx,edi
|
||
cmp al,[message_width]
|
||
jbe copy_message
|
||
mov [message_width],al
|
||
jmp copy_message
|
||
cut_message:
|
||
mov edi,eax
|
||
jmp message_prepared
|
||
split_word:
|
||
mov eax,[screen_width]
|
||
sub eax,14
|
||
mov [message_width],al
|
||
mov al,0Ah
|
||
stosb
|
||
jmp start_message_line
|
||
message_prepared:
|
||
mov eax,edi
|
||
sub eax,ebx
|
||
cmp al,[message_width]
|
||
jbe message_width_ok
|
||
mov [message_width],al
|
||
message_width_ok:
|
||
xor al,al
|
||
stosb
|
||
mov ecx,ebp
|
||
mov ch,cl
|
||
add ch,6
|
||
mov cl,[message_width]
|
||
add cl,8
|
||
pop esi
|
||
mov ah,[esp+1]
|
||
call draw_centered_window
|
||
mov esi,buffer+200h
|
||
add edi,2*2
|
||
draw_message:
|
||
xor ecx,ecx
|
||
add edi,[video_pitch]
|
||
draw_message_row:
|
||
lodsb
|
||
or al,al
|
||
jz message_drawn
|
||
cmp al,0Ah
|
||
je draw_message
|
||
mov byte [gs:edi+ecx*2],al
|
||
inc ecx
|
||
jmp draw_message_row
|
||
message_drawn:
|
||
add edi,[video_pitch]
|
||
add edi,[video_pitch]
|
||
mov cx,1000h
|
||
mov ah,1
|
||
int 10h
|
||
movzx eax,[message_width]
|
||
sub al,[buttons_width]
|
||
and al,not 1
|
||
add edi,eax
|
||
cmp byte [esp+3],2
|
||
jae two_button_message
|
||
pop eax
|
||
mov ah,al
|
||
mov esi,[first_button]
|
||
call draw_button
|
||
wait_for_ok:
|
||
call wait_for_input
|
||
cmp ah,1
|
||
je message_aborted
|
||
cmp al,20h
|
||
je message_ok
|
||
cmp al,0Dh
|
||
jne wait_for_ok
|
||
message_ok:
|
||
mov eax,1
|
||
ret
|
||
message_aborted:
|
||
xor eax,eax
|
||
ret
|
||
two_button_message:
|
||
pop edx
|
||
xor cl,cl
|
||
test edx,10000h
|
||
jnz two_button_loop
|
||
mov cl,-1
|
||
two_button_loop:
|
||
push edi
|
||
mov al,dl
|
||
and al,cl
|
||
mov ah,cl
|
||
not ah
|
||
and ah,dh
|
||
or ah,al
|
||
mov esi,[first_button]
|
||
call draw_button
|
||
add edi,2*2
|
||
mov al,dh
|
||
and al,cl
|
||
mov ah,cl
|
||
not ah
|
||
and ah,dl
|
||
or ah,al
|
||
mov esi,[second_button]
|
||
call draw_button
|
||
push ecx edx
|
||
call wait_for_input
|
||
pop edx ecx edi
|
||
cmp ah,1
|
||
je message_aborted
|
||
cmp al,9
|
||
je two_button_switch
|
||
cmp ah,0Fh
|
||
je two_button_switch
|
||
cmp ah,4Bh
|
||
je two_button_switch
|
||
cmp ah,4Dh
|
||
je two_button_switch
|
||
cmp ah,48h
|
||
je two_button_switch
|
||
cmp ah,50h
|
||
je two_button_switch
|
||
cmp al,0Dh
|
||
je button_selected
|
||
cmp al,20h
|
||
je button_selected
|
||
mov ebx,lower_case_table
|
||
xlatb
|
||
mov ah,al
|
||
mov esi,[first_button]
|
||
mov al,[esi]
|
||
xlatb
|
||
cmp al,ah
|
||
je message_ok
|
||
mov esi,[second_button]
|
||
mov al,[esi]
|
||
xlatb
|
||
cmp al,ah
|
||
je message_second_choice
|
||
jmp two_button_loop
|
||
button_selected:
|
||
or cl,cl
|
||
jnz message_ok
|
||
message_second_choice:
|
||
mov eax,2
|
||
ret
|
||
two_button_switch:
|
||
not cl
|
||
jmp two_button_loop
|
||
draw_button:
|
||
push es gs
|
||
pop es
|
||
mov al,'['
|
||
stosw
|
||
mov al,20h
|
||
stosw
|
||
stosw
|
||
draw_button_label:
|
||
lodsb
|
||
or al,al
|
||
jz button_label_ok
|
||
stosw
|
||
jmp draw_button_label
|
||
button_label_ok:
|
||
mov al,20h
|
||
stosw
|
||
stosw
|
||
mov al,']'
|
||
stosw
|
||
pop es
|
||
ret
|
||
draw_centered_window:
|
||
mov dl,byte [screen_width]
|
||
sub dl,cl
|
||
shr dl,1
|
||
mov dh,byte [screen_height]
|
||
sub dh,ch
|
||
shr dh,1
|
||
test [command_flags],80h
|
||
jz draw_window
|
||
mov ebx,[caret_line_number]
|
||
sub ebx,[window_line_number]
|
||
add ebx,3
|
||
cmp bl,dh
|
||
jbe draw_window
|
||
mov al,dh
|
||
add al,ch
|
||
add al,3
|
||
cmp al,bl
|
||
jb draw_window
|
||
mov dh,bl
|
||
movzx edi,ch
|
||
add edi,ebx
|
||
add edi,2
|
||
cmp edi,[screen_height]
|
||
jb draw_window
|
||
sub dh,ch
|
||
sub dh,4
|
||
draw_window:
|
||
push es gs
|
||
pop es
|
||
movzx edi,dh
|
||
imul edi,[video_pitch]
|
||
movzx ebx,dl
|
||
shl ebx,1
|
||
add edi,ebx
|
||
movzx edx,ch
|
||
movzx ecx,cl
|
||
sub ecx,4
|
||
sub edx,2
|
||
push ecx edi
|
||
mov al,' '
|
||
stos word [edi]
|
||
mov al,'<27>'
|
||
stos word [edi]
|
||
mov al,'<27>'
|
||
stos word [edi]
|
||
dec ecx
|
||
mov al,' '
|
||
stos word [edi]
|
||
dec ecx
|
||
draw_title:
|
||
lods byte [esi]
|
||
or al,al
|
||
jz title_ok
|
||
stos word [edi]
|
||
loop draw_title
|
||
jmp finish_upper_border
|
||
title_ok:
|
||
mov al,' '
|
||
stos word [edi]
|
||
dec ecx
|
||
jz finish_upper_border
|
||
mov al,'<27>'
|
||
rep stos word [edi]
|
||
finish_upper_border:
|
||
mov al,'<27>'
|
||
stos word [edi]
|
||
mov al,' '
|
||
stos word [edi]
|
||
pop edi ecx
|
||
add edi,[video_pitch]
|
||
lea ebp,[edi+2*2]
|
||
draw_window_lines:
|
||
push ecx edi
|
||
mov al,' '
|
||
stos word [edi]
|
||
mov al,'<27>'
|
||
stos word [edi]
|
||
mov al,' '
|
||
rep stos word [edi]
|
||
mov al,'<27>'
|
||
stos word [edi]
|
||
mov al,' '
|
||
stos word [edi]
|
||
mov byte [es:edi+1],8
|
||
mov byte [es:edi+3],8
|
||
pop edi ecx
|
||
add edi,[video_pitch]
|
||
dec edx
|
||
jnz draw_window_lines
|
||
push ecx edi
|
||
mov al,' '
|
||
stos word [edi]
|
||
mov al,'<27>'
|
||
stos word [edi]
|
||
mov al,'<27>'
|
||
rep stos word [edi]
|
||
mov al,'<27>'
|
||
stos word [edi]
|
||
mov al,' '
|
||
stos word [edi]
|
||
mov byte [es:edi+1],8
|
||
mov byte [es:edi+3],8
|
||
pop edi ecx
|
||
mov eax,[video_pitch]
|
||
lea edi,[edi+eax+2*2+1]
|
||
mov al,8
|
||
add ecx,4
|
||
finish_bottom_shadow:
|
||
stos byte [edi]
|
||
inc edi
|
||
loop finish_bottom_shadow
|
||
mov edi,ebp
|
||
mov eax,edi
|
||
cdq
|
||
idiv [video_pitch]
|
||
sar edx,1
|
||
mov dh,al
|
||
pop es
|
||
ret
|
||
create_edit_box:
|
||
mov byte [ebx],1
|
||
mov [ebx+1],al
|
||
mov [ebx+2],dx
|
||
mov [ebx+4],ecx
|
||
xor eax,eax
|
||
mov [ebx+8],eax
|
||
mov [ebx+12],eax
|
||
lea edi,[ebx+16]
|
||
xor ecx,ecx
|
||
or esi,esi
|
||
jz edit_box_text_ok
|
||
init_edit_box_text:
|
||
lodsb
|
||
or al,al
|
||
jz edit_box_text_ok
|
||
stosb
|
||
inc ecx
|
||
cmp cx,[ebx+6]
|
||
jb init_edit_box_text
|
||
edit_box_text_ok:
|
||
mov [ebx+8],cx
|
||
mov [ebx+12],cx
|
||
xor al,al
|
||
stosb
|
||
test byte [ebx+1],1
|
||
jz draw_edit_box
|
||
set_edit_box_focus:
|
||
push ebx
|
||
mov ah,1
|
||
mov cx,0D0Eh
|
||
int 10h
|
||
pop ebx
|
||
jmp draw_edit_box
|
||
kill_edit_box_focus:
|
||
mov word [ebx+10],0
|
||
push ebx
|
||
mov ah,1
|
||
mov cx,1000h
|
||
int 10h
|
||
pop ebx
|
||
draw_edit_box:
|
||
test byte [ebx+1],1
|
||
jz edit_box_position_ok
|
||
mov ax,[ebx+10]
|
||
sub ax,[ebx+12]
|
||
jae edit_box_position_correction
|
||
movzx ax,byte [ebx+4]
|
||
add ax,[ebx+10]
|
||
sub ax,2
|
||
sub ax,[ebx+12]
|
||
jae edit_box_position_ok
|
||
edit_box_position_correction:
|
||
sub [ebx+10],ax
|
||
edit_box_position_ok:
|
||
push es gs
|
||
pop es
|
||
movzx edi,byte [ebx+3]
|
||
imul edi,[video_pitch]
|
||
movzx eax,byte [ebx+2]
|
||
lea edi,[edi+eax*2]
|
||
mov al,20h
|
||
cmp word [ebx+10],0
|
||
je edit_box_left_edge_ok
|
||
mov al,1Bh
|
||
edit_box_left_edge_ok:
|
||
mov ah,[box_colors]
|
||
stosw
|
||
movzx eax,word [ebx+10]
|
||
lea esi,[ebx+16+eax]
|
||
movzx ebp,byte [ebx+4]
|
||
sub ebp,2
|
||
mov edx,[ebx+12]
|
||
cmp dx,[ebx+14]
|
||
jbe draw_edit_box_before_selection
|
||
ror edx,16
|
||
draw_edit_box_before_selection:
|
||
movzx ecx,dx
|
||
sub cx,[ebx+10]
|
||
jbe draw_edit_box_selection
|
||
mov ah,[box_colors]
|
||
call draw_edit_box_part
|
||
draw_edit_box_selection:
|
||
mov ax,dx
|
||
sub ax,cx
|
||
shr edx,16
|
||
mov cx,dx
|
||
sub cx,ax
|
||
jbe draw_edit_box_after_selection
|
||
mov ah,[box_selection_colors]
|
||
test byte [ebx+1],1
|
||
jnz edit_box_selection_visible
|
||
mov ah,[box_colors]
|
||
edit_box_selection_visible:
|
||
call draw_edit_box_part
|
||
draw_edit_box_after_selection:
|
||
mov ah,[box_colors]
|
||
mov cx,[ebx+8]
|
||
sub cx,dx
|
||
jbe draw_edit_box_ending
|
||
call draw_edit_box_part
|
||
draw_edit_box_ending:
|
||
mov ecx,ebp
|
||
mov al,20h
|
||
rep stosw
|
||
movzx edx,word [ebx+8]
|
||
lea edx,[ebx+16+edx]
|
||
cmp esi,edx
|
||
jae edit_box_right_edge_ok
|
||
mov al,1Ah
|
||
edit_box_right_edge_ok:
|
||
stosw
|
||
test byte [ebx+1],1
|
||
jz edit_box_cursor_ok
|
||
mov dx,[ebx+2]
|
||
inc dl
|
||
mov ax,[ebx+12]
|
||
sub ax,[ebx+10]
|
||
add dl,al
|
||
mov ah,2
|
||
push ebx
|
||
mov bh,0
|
||
int 10h
|
||
pop ebx
|
||
edit_box_cursor_ok:
|
||
pop es
|
||
ret
|
||
draw_edit_box_part:
|
||
or bp,bp
|
||
jz edit_box_part_ok
|
||
cmp cx,bp
|
||
jbe edit_box_part_length_ok
|
||
mov cx,bp
|
||
edit_box_part_length_ok:
|
||
sub bp,cx
|
||
draw_edit_box_character:
|
||
lodsb
|
||
stosw
|
||
loopw draw_edit_box_character
|
||
edit_box_part_ok:
|
||
ret
|
||
set_box_focus:
|
||
or byte [ebx+1],1
|
||
mov cl,[ebx]
|
||
cmp cl,1
|
||
jb set_check_box_focus
|
||
je set_edit_box_focus
|
||
cmp cl,2
|
||
je draw_list_box
|
||
ret
|
||
kill_box_focus:
|
||
and byte [ebx+1],not 1
|
||
mov cl,[ebx]
|
||
cmp cl,1
|
||
je kill_edit_box_focus
|
||
cmp cl,2
|
||
je draw_list_box
|
||
ret
|
||
update_box:
|
||
cmp byte [ebx],0
|
||
je update_check_box
|
||
ret
|
||
process_box_command:
|
||
mov cl,[ebx]
|
||
cmp cl,1
|
||
jb check_box_command
|
||
je edit_box_command
|
||
cmp cl,2
|
||
je list_box_command
|
||
stc
|
||
ret
|
||
edit_box_command:
|
||
cmp al,0E0h
|
||
jne edit_box_ascii_code
|
||
cmp ah,4Bh
|
||
je edit_box_left_key
|
||
cmp ah,4Dh
|
||
je edit_box_right_key
|
||
cmp ah,47h
|
||
je edit_box_home_key
|
||
cmp ah,4Fh
|
||
je edit_box_end_key
|
||
cmp ah,53h
|
||
je edit_box_delete
|
||
cmp ah,52h
|
||
je edit_box_insert
|
||
cmp ah,93h
|
||
je edit_box_ctrl_delete
|
||
cmp ah,92h
|
||
je edit_box_ctrl_insert
|
||
edit_box_unknown_command:
|
||
stc
|
||
ret
|
||
edit_box_ascii_code:
|
||
cmp al,8
|
||
je edit_box_backspace
|
||
cmp al,18h
|
||
je edit_box_cut_block
|
||
cmp al,3
|
||
je edit_box_ctrl_insert
|
||
cmp al,16h
|
||
je edit_box_paste_block
|
||
cmp al,20h
|
||
jb edit_box_unknown_command
|
||
test byte [ebx+1],100b
|
||
jz edit_box_ascii_code_ok
|
||
cmp al,30h
|
||
jb edit_box_command_done
|
||
cmp al,39h
|
||
ja edit_box_command_done
|
||
edit_box_ascii_code_ok:
|
||
mov dx,word [ebx+12]
|
||
cmp dx,word [ebx+14]
|
||
je edit_box_character
|
||
push eax
|
||
call edit_box_delete_block
|
||
pop eax
|
||
edit_box_character:
|
||
call edit_box_insert_character
|
||
jc edit_box_command_done
|
||
jmp edit_box_no_selection
|
||
edit_box_delete:
|
||
test byte [fs:17h],11b
|
||
jnz edit_box_cut_block
|
||
mov dx,word [ebx+12]
|
||
cmp dx,word [ebx+14]
|
||
jne edit_box_ctrl_delete
|
||
cmp dx,[ebx+8]
|
||
je edit_box_command_done
|
||
inc dx
|
||
mov [ebx+14],dx
|
||
jmp edit_box_ctrl_delete
|
||
edit_box_backspace:
|
||
mov dx,[ebx+12]
|
||
cmp dx,word [ebx+14]
|
||
jne edit_box_ctrl_delete
|
||
or dx,dx
|
||
jz edit_box_command_done
|
||
dec word [ebx+12]
|
||
mov [ebx+14],dx
|
||
edit_box_ctrl_delete:
|
||
call edit_box_delete_block
|
||
jmp edit_box_no_selection
|
||
edit_box_ctrl_insert:
|
||
call edit_box_copy_block
|
||
jmp edit_box_command_done
|
||
edit_box_cut_block:
|
||
call edit_box_copy_block
|
||
call edit_box_delete_block
|
||
jmp edit_box_no_selection
|
||
edit_box_insert_character:
|
||
test byte [ebx+1],100b
|
||
jz edit_box_character_allowed
|
||
cmp al,30h
|
||
jb edit_box_disallowed_character
|
||
cmp al,39h
|
||
ja edit_box_disallowed_character
|
||
edit_box_character_allowed:
|
||
movzx ecx,word [ebx+8]
|
||
cmp cx,[ebx+6]
|
||
je edit_box_full
|
||
lea edi,[ebx+16+ecx]
|
||
lea esi,[edi-1]
|
||
sub cx,[ebx+12]
|
||
std
|
||
rep movsb
|
||
cld
|
||
stosb
|
||
inc word [ebx+8]
|
||
inc word [ebx+12]
|
||
edit_box_disallowed_character:
|
||
clc
|
||
ret
|
||
edit_box_full:
|
||
stc
|
||
ret
|
||
edit_box_delete_block:
|
||
movzx eax,word [ebx+12]
|
||
lea esi,[ebx+16+eax]
|
||
movzx eax,word [ebx+14]
|
||
lea edi,[ebx+16+eax]
|
||
movzx eax,word [ebx+8]
|
||
lea ecx,[ebx+16+eax]
|
||
cmp esi,edi
|
||
jae edit_box_shift_rest_of_line
|
||
xchg esi,edi
|
||
edit_box_shift_rest_of_line:
|
||
sub ecx,esi
|
||
mov eax,edi
|
||
rep movsb
|
||
mov ecx,esi
|
||
sub ecx,edi
|
||
sub [ebx+8],cx
|
||
sub eax,ebx
|
||
sub eax,16
|
||
mov [ebx+12],ax
|
||
mov [ebx+14],ax
|
||
ret
|
||
edit_box_copy_block:
|
||
movzx ecx,word [ebx+12]
|
||
movzx edx,word [ebx+14]
|
||
cmp ecx,edx
|
||
je edit_box_block_copied
|
||
ja edit_box_block_start_ok
|
||
xchg ecx,edx
|
||
edit_box_block_start_ok:
|
||
sub ecx,edx
|
||
lea esi,[ebx+16+edx]
|
||
push ebx esi ecx
|
||
cmp [clipboard],0
|
||
je edit_box_allocate_clipboard
|
||
mov ebx,[clipboard_handle]
|
||
call release_memory
|
||
edit_box_allocate_clipboard:
|
||
mov ecx,[esp]
|
||
inc ecx
|
||
call get_memory
|
||
mov [clipboard],eax
|
||
mov [clipboard_handle],ecx
|
||
or eax,eax
|
||
jz not_enough_memory
|
||
mov edi,eax
|
||
pop ecx esi ebx
|
||
rep movsb
|
||
xor al,al
|
||
stosb
|
||
edit_box_block_copied:
|
||
ret
|
||
edit_box_insert:
|
||
test byte [fs:17h],11b
|
||
jz edit_box_command_done
|
||
edit_box_paste_block:
|
||
call edit_box_delete_block
|
||
mov esi,[clipboard]
|
||
or esi,esi
|
||
jz edit_box_command_done
|
||
edit_box_insert_block:
|
||
lodsb
|
||
or al,al
|
||
jz edit_box_no_selection
|
||
cmp al,0Dh
|
||
je edit_box_no_selection
|
||
push esi
|
||
call edit_box_insert_character
|
||
pop esi
|
||
jnc edit_box_insert_block
|
||
jmp edit_box_no_selection
|
||
edit_box_left_key:
|
||
cmp word [ebx+12],0
|
||
je edit_box_no_selection
|
||
dec word [ebx+12]
|
||
jmp edit_box_moved_cursor
|
||
edit_box_right_key:
|
||
mov ax,[ebx+8]
|
||
cmp [ebx+12],ax
|
||
je edit_box_no_selection
|
||
inc word [ebx+12]
|
||
jmp edit_box_moved_cursor
|
||
edit_box_home_key:
|
||
mov word [ebx+12],0
|
||
jmp edit_box_moved_cursor
|
||
edit_box_end_key:
|
||
mov ax,[ebx+8]
|
||
mov [ebx+12],ax
|
||
jmp edit_box_moved_cursor
|
||
edit_box_moved_cursor:
|
||
test byte [fs:17h],11b
|
||
jnz edit_box_redraw
|
||
edit_box_no_selection:
|
||
mov ax,[ebx+12]
|
||
mov [ebx+14],ax
|
||
edit_box_redraw:
|
||
call draw_edit_box
|
||
edit_box_command_done:
|
||
movzx eax,word [ebx+8]
|
||
mov byte [ebx+16+eax],0
|
||
clc
|
||
ret
|
||
create_list_box:
|
||
mov byte [ebx],2
|
||
mov [ebx+1],al
|
||
mov [ebx+2],dx
|
||
mov [ebx+4],ecx
|
||
xor eax,eax
|
||
mov [ebx+8],eax
|
||
mov [ebx+12],esi
|
||
draw_list_box:
|
||
mov ax,[ebx+8]
|
||
sub ax,[ebx+10]
|
||
jb list_box_adjust_up
|
||
movzx dx,byte [ebx+5]
|
||
sub ax,dx
|
||
jb list_box_adjustments_ok
|
||
inc ax
|
||
add [ebx+10],ax
|
||
jmp list_box_adjustments_ok
|
||
list_box_adjust_up:
|
||
add [ebx+10],ax
|
||
list_box_adjustments_ok:
|
||
movzx edi,byte [ebx+3]
|
||
imul edi,[video_pitch]
|
||
movzx ecx,byte [ebx+2]
|
||
lea edi,[edi+ecx*2]
|
||
movzx edx,word [ebx+10]
|
||
push es gs
|
||
pop es
|
||
draw_list_box_row:
|
||
mov ah,[box_colors]
|
||
movzx ecx,byte [ebx+4]
|
||
cmp dx,[ebx+6]
|
||
jae draw_empty_list_box_row
|
||
mov esi,[ebx+12]
|
||
mov esi,[esi+edx*4]
|
||
test byte [ebx+1],1
|
||
jz list_box_row_colors_ok
|
||
cmp dx,[ebx+8]
|
||
jne list_box_row_colors_ok
|
||
mov ah,[box_selection_colors]
|
||
list_box_row_colors_ok:
|
||
sub ecx,2
|
||
mov al,20h
|
||
stosw
|
||
draw_list_box_item:
|
||
lodsb
|
||
test al,al
|
||
jnz draw_list_box_item_character
|
||
dec esi
|
||
mov al,20h
|
||
draw_list_box_item_character:
|
||
stosw
|
||
loop draw_list_box_item
|
||
mov al,20h
|
||
cmp byte [esi],0
|
||
je list_box_item_ending
|
||
mov al,1Ah
|
||
list_box_item_ending:
|
||
stosw
|
||
jmp list_box_row_drawn
|
||
draw_empty_list_box_row:
|
||
mov al,20h
|
||
rep stosw
|
||
list_box_row_drawn:
|
||
inc edx
|
||
mov ax,dx
|
||
sub ax,[ebx+10]
|
||
cmp al,[ebx+5]
|
||
jae list_box_drawn
|
||
add edi,[video_pitch]
|
||
movzx ecx,byte [ebx+4]
|
||
shl ecx,1
|
||
sub edi,ecx
|
||
jmp draw_list_box_row
|
||
list_box_drawn:
|
||
pop es
|
||
ret
|
||
list_box_command:
|
||
cmp ah,48h
|
||
je list_box_up_key
|
||
cmp ah,50h
|
||
je list_box_down_key
|
||
cmp ah,47h
|
||
je list_box_home_key
|
||
cmp ah,4Fh
|
||
je list_box_end_key
|
||
cmp ah,49h
|
||
je list_box_pgup_key
|
||
cmp ah,51h
|
||
je list_box_pgdn_key
|
||
stc
|
||
ret
|
||
list_box_home_key:
|
||
xor eax,eax
|
||
mov [ebx+8],ax
|
||
jmp list_box_redraw
|
||
list_box_end_key:
|
||
mov ax,[ebx+6]
|
||
dec ax
|
||
mov [ebx+8],ax
|
||
jmp list_box_redraw
|
||
list_box_pgup_key:
|
||
movzx ax,byte [ebx+5]
|
||
sub [ebx+8],ax
|
||
jae list_box_redraw
|
||
mov word [ebx+8],0
|
||
jmp list_box_redraw
|
||
list_box_pgdn_key:
|
||
movzx ax,byte [ebx+5]
|
||
add [ebx+8],ax
|
||
mov ax,[ebx+6]
|
||
dec ax
|
||
cmp [ebx+8],ax
|
||
jbe list_box_redraw
|
||
mov [ebx+8],ax
|
||
jmp list_box_redraw
|
||
list_box_up_key:
|
||
mov ax,[ebx+8]
|
||
sub ax,1
|
||
jc list_box_command_done
|
||
dec word [ebx+8]
|
||
jmp list_box_redraw
|
||
list_box_down_key:
|
||
mov ax,[ebx+8]
|
||
inc ax
|
||
cmp ax,[ebx+6]
|
||
jae list_box_command_done
|
||
mov [ebx+8],ax
|
||
list_box_redraw:
|
||
call draw_list_box
|
||
list_box_command_done:
|
||
clc
|
||
ret
|
||
create_check_box:
|
||
mov byte [ebx],0
|
||
mov [ebx+1],al
|
||
mov [ebx+2],dx
|
||
mov [ebx+4],cl
|
||
mov [ebx+8],ebp
|
||
mov [ebx+12],edi
|
||
movzx edx,byte [ebx+3]
|
||
imul edx,[video_pitch]
|
||
movzx ecx,byte [ebx+2]
|
||
lea edx,[edx+ecx*2]
|
||
mov al,'['
|
||
test byte [ebx+1],2
|
||
jz draw_check_box_left_bracket
|
||
mov al,'('
|
||
draw_check_box_left_bracket:
|
||
mov byte [gs:edx],al
|
||
add edx,2
|
||
mov al,20h
|
||
test byte [ebx+1],2
|
||
jnz set_up_radio_initial_state
|
||
test [edi],ebp
|
||
jz draw_check_box_initial_state
|
||
mov al,'+'
|
||
jmp draw_check_box_initial_state
|
||
set_up_radio_initial_state:
|
||
cmp [edi],ebp
|
||
jne draw_check_box_initial_state
|
||
mov al,7
|
||
draw_check_box_initial_state:
|
||
mov byte [gs:edx],al
|
||
add edx,2
|
||
mov al,']'
|
||
test byte [ebx+1],2
|
||
jz draw_check_box_right_bracket
|
||
mov al,')'
|
||
draw_check_box_right_bracket:
|
||
mov byte [gs:edx],al
|
||
add edx,2*2
|
||
movzx ecx,byte [ebx+4]
|
||
draw_check_box_text:
|
||
lodsb
|
||
or al,al
|
||
jz check_box_text_ok
|
||
mov [gs:edx],al
|
||
add edx,2
|
||
loop draw_check_box_text
|
||
check_box_text_ok:
|
||
test byte [ebx+1],1
|
||
jnz set_check_box_focus
|
||
ret
|
||
set_check_box_focus:
|
||
push ebx
|
||
mov ah,2
|
||
mov dx,[ebx+2]
|
||
inc dl
|
||
xor bh,bh
|
||
int 10h
|
||
mov ah,1
|
||
mov cx,0D0Eh
|
||
int 10h
|
||
pop ebx
|
||
ret
|
||
check_box_command:
|
||
cmp al,20h
|
||
je switch_check_box_state
|
||
stc
|
||
ret
|
||
switch_check_box_state:
|
||
mov edi,[ebx+12]
|
||
mov eax,[ebx+8]
|
||
test byte [ebx+1],2
|
||
jnz set_radio_state
|
||
xor [edi],eax
|
||
call update_check_box
|
||
clc
|
||
ret
|
||
set_radio_state:
|
||
mov [edi],eax
|
||
call update_check_box
|
||
clc
|
||
ret
|
||
update_check_box:
|
||
movzx edx,byte [ebx+3]
|
||
imul edx,[video_pitch]
|
||
movzx ecx,byte [ebx+2]
|
||
lea edx,[edx+(ecx+1)*2]
|
||
mov edi,[ebx+12]
|
||
mov eax,[ebx+8]
|
||
test byte [ebx+1],2
|
||
jnz redraw_radio
|
||
test [edi],eax
|
||
mov al,20h
|
||
jz check_box_state_ok
|
||
mov al,'+'
|
||
check_box_state_ok:
|
||
mov byte [gs:edx],al
|
||
ret
|
||
redraw_radio:
|
||
cmp [edi],eax
|
||
mov al,20h
|
||
jne radio_state_ok
|
||
mov al,7
|
||
radio_state_ok:
|
||
mov byte [gs:edx],al
|
||
ret
|
||
|
||
init_common_dialog:
|
||
xor eax,eax
|
||
mov [boxes_count],eax
|
||
mov [current_box],eax
|
||
ret
|
||
register_box_in_dialog:
|
||
mov eax,[boxes_count]
|
||
inc [boxes_count]
|
||
mov [boxes+eax*4],ebx
|
||
test byte [ebx+1],1
|
||
jz box_registered
|
||
mov [current_box],eax
|
||
box_registered:
|
||
ret
|
||
common_dialog_loop:
|
||
call wait_for_input
|
||
cmp ah,1
|
||
je common_dialog_aborted
|
||
cmp al,0Dh
|
||
je common_dialog_ok
|
||
cmp al,9
|
||
je common_dialog_cycle_boxes
|
||
cmp ah,0Fh
|
||
je common_dialog_reverse_cycle_boxes
|
||
mov edx,[current_box]
|
||
mov ebx,[boxes+edx*4]
|
||
call process_box_command
|
||
jnc common_dialog_command_processed
|
||
cmp ah,48h
|
||
je common_dialog_previous_box
|
||
cmp ah,50h
|
||
je common_dialog_next_box
|
||
cmp ah,4Bh
|
||
je common_dialog_previous_box
|
||
cmp ah,4Dh
|
||
je common_dialog_next_box
|
||
jmp common_dialog_loop
|
||
common_dialog_command_processed:
|
||
xor edx,edx
|
||
update_boxes:
|
||
mov ebx,[boxes+edx*4]
|
||
push edx
|
||
call update_box
|
||
pop edx
|
||
inc edx
|
||
cmp edx,[boxes_count]
|
||
jb update_boxes
|
||
mov eax,[common_dialog_callback]
|
||
test eax,eax
|
||
jz common_dialog_loop
|
||
call eax
|
||
jmp common_dialog_loop
|
||
common_dialog_next_box:
|
||
mov edx,[current_box]
|
||
lea eax,[edx+1]
|
||
cmp eax,[boxes_count]
|
||
je common_dialog_loop
|
||
mov [current_box],eax
|
||
jmp common_dialog_switch_box
|
||
common_dialog_previous_box:
|
||
mov edx,[current_box]
|
||
or edx,edx
|
||
jz common_dialog_loop
|
||
dec [current_box]
|
||
jmp common_dialog_switch_box
|
||
common_dialog_cycle_boxes:
|
||
mov edx,[current_box]
|
||
inc [current_box]
|
||
mov eax,[current_box]
|
||
cmp eax,[boxes_count]
|
||
jb common_dialog_switch_box
|
||
mov [current_box],0
|
||
jmp common_dialog_switch_box
|
||
common_dialog_reverse_cycle_boxes:
|
||
mov edx,[current_box]
|
||
sub [current_box],1
|
||
jnc common_dialog_switch_box
|
||
mov eax,[boxes_count]
|
||
add [current_box],eax
|
||
common_dialog_switch_box:
|
||
mov ebx,[boxes+edx*4]
|
||
call kill_box_focus
|
||
mov edx,[current_box]
|
||
mov ebx,[boxes+edx*4]
|
||
call set_box_focus
|
||
jmp common_dialog_loop
|
||
common_dialog_ok:
|
||
clc
|
||
ret
|
||
common_dialog_aborted:
|
||
stc
|
||
ret
|
||
get_entered_number:
|
||
xor edx,edx
|
||
get_digit:
|
||
lodsb
|
||
or al,al
|
||
jz entered_number_ok
|
||
sub al,30h
|
||
movzx eax,al
|
||
imul edx,10
|
||
add edx,eax
|
||
jmp get_digit
|
||
entered_number_ok:
|
||
ret
|
||
draw_static:
|
||
lodsb
|
||
or al,al
|
||
jz fill_static
|
||
mov [gs:edi],al
|
||
add edi,2
|
||
loop draw_static
|
||
ret
|
||
fill_static:
|
||
mov byte [gs:edi],20h
|
||
add edi,2
|
||
loop fill_static
|
||
dec esi
|
||
ret
|
||
|
||
file_open_dialog:
|
||
push esi
|
||
mov edi,buffer+3000h
|
||
mov byte [edi],0
|
||
call get_current_directory
|
||
cmp byte [edi-2],'\'
|
||
je browser_startup_path_ok
|
||
mov word [edi-1],'\'
|
||
browser_startup_path_ok:
|
||
xor eax,eax
|
||
mov [file_list_buffer_handle],eax
|
||
call make_list_of_files
|
||
pop esi
|
||
mov dx,0308h
|
||
mov cl,35h
|
||
mov ch,byte [screen_height]
|
||
sub ch,7
|
||
mov ah,[window_colors]
|
||
call draw_window
|
||
push edx
|
||
mov eax,[video_pitch]
|
||
mov edx,[screen_height]
|
||
sub edx,11
|
||
imul edx,eax
|
||
lea edx,[edi+edx+8*2]
|
||
mov [current_box],edx
|
||
lea edi,[edi+eax+2*2]
|
||
mov esi,_file
|
||
mov ecx,5
|
||
call draw_static
|
||
mov ebx,filename_buffer
|
||
xor esi,esi
|
||
mov ecx,27h + 256 shl 16
|
||
mov edx,[esp]
|
||
add dx,0108h
|
||
mov al,1
|
||
call create_edit_box
|
||
mov ebx,boxes
|
||
mov esi,[file_list]
|
||
mov ecx,[file_list_buffer_top]
|
||
sub ecx,esi
|
||
shl ecx,16-2
|
||
mov cl,27h
|
||
mov ch,byte [screen_height]
|
||
sub ch,15
|
||
pop edx
|
||
add dx,0308h
|
||
xor al,al
|
||
call create_list_box
|
||
call draw_browser_path
|
||
file_input_loop:
|
||
call wait_for_input
|
||
cmp ah,1
|
||
je filename_aborted
|
||
cmp al,0Dh
|
||
je filename_accepted
|
||
cmp ah,0Fh
|
||
je activate_file_browser
|
||
cmp ah,50h
|
||
je activate_file_browser
|
||
mov ebx,filename_buffer
|
||
call process_box_command
|
||
jmp file_input_loop
|
||
activate_file_browser:
|
||
mov ebx,filename_buffer
|
||
call kill_box_focus
|
||
mov ebx,boxes
|
||
call set_box_focus
|
||
call update_file_input
|
||
file_browser_loop:
|
||
call wait_for_input
|
||
cmp ah,1
|
||
je filename_aborted
|
||
cmp al,0Dh
|
||
je filename_accepted
|
||
cmp ah,0Fh
|
||
je activate_file_input
|
||
cmp ah,4Bh
|
||
je activate_file_input
|
||
cmp al,8
|
||
je go_to_parent_directory
|
||
mov ebx,boxes
|
||
push dword [ebx+8]
|
||
call process_box_command
|
||
pop eax
|
||
cmp ax,[ebx+8]
|
||
je file_browser_loop
|
||
call update_file_input
|
||
jmp file_browser_loop
|
||
go_to_parent_directory:
|
||
cmp byte [buffer+3000h+3],0
|
||
je file_browser_loop
|
||
mov edi,buffer
|
||
mov eax,'..'
|
||
stosd
|
||
jmp browser_chdir
|
||
filename_accepted:
|
||
mov edx,filename_buffer+16
|
||
movzx eax,word [edx-16+8]
|
||
test eax,eax
|
||
jz got_filename
|
||
cmp byte [edx+eax-1],'\'
|
||
je browser_path_entered
|
||
cmp byte [edx+eax-1],':'
|
||
jne got_filename
|
||
browser_path_entered:
|
||
mov esi,edx
|
||
mov edi,buffer
|
||
copy_path_to_browse:
|
||
lodsb
|
||
stosb
|
||
test al,al
|
||
jnz copy_path_to_browse
|
||
cmp word [buffer+1],':'
|
||
je browser_directory_ok
|
||
cmp byte [edi-2],'\'
|
||
jne browser_chdir
|
||
mov byte [edi-2],0
|
||
browser_chdir:
|
||
xor dx,dx
|
||
mov ax,713Bh
|
||
call dos_int
|
||
jnc browser_directory_ok
|
||
cmp ax,7100h
|
||
jne file_list_selection_ok
|
||
mov ah,3Bh
|
||
call dos_int
|
||
jc file_list_selection_ok
|
||
browser_directory_ok:
|
||
cmp byte [buffer+1],':'
|
||
jne browser_drive_ok
|
||
mov dl,[buffer]
|
||
sub dl,'A'
|
||
cmp dl,'Z'-'A'
|
||
jbe browser_change_drive
|
||
sub dl,'a'-'A'
|
||
browser_change_drive:
|
||
mov ah,0Eh
|
||
int 21h
|
||
browser_drive_ok:
|
||
push 0
|
||
cmp dword [buffer],'..'
|
||
jne name_to_select_ok
|
||
mov edi,buffer+3000h
|
||
mov al,'\'
|
||
or ecx,-1
|
||
find_last_directory_name:
|
||
mov esi,edi
|
||
repne scasb
|
||
cmp byte [edi],0
|
||
jne find_last_directory_name
|
||
lea ecx,[edi-1]
|
||
sub ecx,esi
|
||
mov edi,buffer+400h
|
||
mov [esp],ecx
|
||
mov ebx,upper_case_table
|
||
get_name_to_select:
|
||
lodsb
|
||
xlatb
|
||
stosb
|
||
loop get_name_to_select
|
||
name_to_select_ok:
|
||
mov edi,buffer+3000h
|
||
call get_current_directory
|
||
jc browser_drive_invalid
|
||
cmp byte [edi-2],'\'
|
||
je browser_new_path_ok
|
||
mov word [edi-1],'\'
|
||
browser_new_path_ok:
|
||
call make_list_of_files
|
||
call draw_browser_path
|
||
mov ebx,filename_buffer
|
||
xor eax,eax
|
||
mov [ebx+8],eax
|
||
mov [ebx+12],eax
|
||
mov [ebx+16],al
|
||
mov ebx,boxes
|
||
mov esi,[file_list]
|
||
mov [ebx+12],esi
|
||
mov ecx,[file_list_buffer_top]
|
||
sub ecx,esi
|
||
shr ecx,2
|
||
mov [ebx+6],cx
|
||
xor eax,eax
|
||
mov [ebx+8],eax
|
||
mov eax,esi
|
||
pop edx
|
||
find_name_to_select:
|
||
cmp eax,[file_list_buffer_top]
|
||
je file_list_selection_ok
|
||
mov esi,[eax]
|
||
add esi,2
|
||
mov edi,buffer+400h
|
||
mov ecx,edx
|
||
repe cmpsb
|
||
je select_directory
|
||
add eax,4
|
||
jmp find_name_to_select
|
||
select_directory:
|
||
sub eax,[file_list]
|
||
shr eax,2
|
||
mov [ebx+8],ax
|
||
file_list_selection_ok:
|
||
test byte [filename_buffer+1],1
|
||
jnz activate_file_input
|
||
jmp activate_file_browser
|
||
browser_drive_invalid:
|
||
mov dl,[buffer+3000h]
|
||
sub dl,'A'
|
||
cmp dl,'Z'-'A'
|
||
jbe browser_restore_drive
|
||
sub dl,'a'-'A'
|
||
browser_restore_drive:
|
||
mov ah,0Eh
|
||
int 21h
|
||
pop eax
|
||
jmp file_list_selection_ok
|
||
got_filename:
|
||
cmp [filename_buffer+16],0
|
||
je file_input_loop
|
||
call release_list_of_files
|
||
mov edx,filename_buffer+16
|
||
movzx ecx,word [filename_buffer+8]
|
||
clc
|
||
ret
|
||
filename_aborted:
|
||
call release_list_of_files
|
||
stc
|
||
ret
|
||
activate_file_input:
|
||
mov ebx,boxes
|
||
call kill_box_focus
|
||
mov ebx,filename_buffer
|
||
call set_box_focus
|
||
jmp file_input_loop
|
||
update_file_input:
|
||
mov ebx,boxes
|
||
mov esi,[ebx+12]
|
||
movzx eax,word [ebx+8]
|
||
mov esi,[esi+eax*4]
|
||
mov ah,[esi]
|
||
add esi,2
|
||
mov edi,filename_buffer+16
|
||
copy_file_item:
|
||
lodsb
|
||
stosb
|
||
test al,al
|
||
jnz copy_file_item
|
||
cmp ah,[browser_symbols+2]
|
||
je file_item_copied
|
||
cmp ah,[browser_symbols+3]
|
||
je file_item_copied
|
||
mov byte [edi-1],'\'
|
||
stosb
|
||
file_item_copied:
|
||
mov ecx,edi
|
||
sub ecx,1+filename_buffer+16
|
||
mov ebx,filename_buffer
|
||
mov [ebx+8],cx
|
||
mov [ebx+12],cx
|
||
xor eax,eax
|
||
mov [ebx+10],ax
|
||
mov [ebx+14],ax
|
||
call draw_edit_box
|
||
ret
|
||
draw_browser_path:
|
||
mov edi,[current_box]
|
||
mov esi,buffer+3000h
|
||
mov ecx,27h
|
||
call draw_static
|
||
add edi,[video_pitch]
|
||
sub edi,27h*2
|
||
mov ecx,27h
|
||
call draw_static
|
||
ret
|
||
make_list_of_files:
|
||
cmp [file_list_buffer_handle],0
|
||
je default_buffer_for_file_list
|
||
mov edi,[file_list_buffer_top]
|
||
mov ecx,[file_list_buffer_size]
|
||
sub edi,ecx
|
||
jmp init_file_list
|
||
default_buffer_for_file_list:
|
||
mov edi,buffer+1000h
|
||
mov ecx,2000h
|
||
init_file_list:
|
||
lea ebx,[edi+ecx]
|
||
mov [file_list_buffer_top],ebx
|
||
mov ah,1Ah
|
||
xor edx,edx
|
||
call dos_int
|
||
mov ah,19h
|
||
int 21h
|
||
mov dl,al
|
||
mov ah,0Eh
|
||
int 21h
|
||
movzx ecx,al
|
||
mov dword [buffer],'A:'
|
||
list_drives:
|
||
push ecx edi
|
||
mov ax,290Ch
|
||
xor esi,esi
|
||
mov di,10h
|
||
call dos_int
|
||
pop edi
|
||
inc al
|
||
jz try_next_drive
|
||
cmp byte [buffer],'B'
|
||
jne add_drive
|
||
test byte [fs:10h],11000000b
|
||
jz try_next_drive
|
||
add_drive:
|
||
sub ebx,4
|
||
mov [ebx],edi
|
||
mov esi,buffer
|
||
mov ax,2004h
|
||
stosw
|
||
movsw
|
||
movsb
|
||
try_next_drive:
|
||
inc byte [buffer]
|
||
pop ecx
|
||
loop list_drives
|
||
mov [file_list],ebx
|
||
mov [file_list_buffer],edi
|
||
cmp byte [buffer+3000h],0
|
||
je file_list_made
|
||
mov edi,buffer
|
||
mov eax,'*.*'
|
||
stosd
|
||
mov ax,714Eh
|
||
mov cx,31h
|
||
xor esi,esi
|
||
xor edx,edx
|
||
mov di,10h
|
||
call dos_int
|
||
mov ebx,eax
|
||
jnc long_file_names_list
|
||
mov ah,4Eh
|
||
mov cx,31h
|
||
xor edx,edx
|
||
call dos_int
|
||
jc file_list_made
|
||
short_file_names_list:
|
||
sub [file_list],4
|
||
mov edx,[file_list]
|
||
mov edi,[file_list_buffer]
|
||
cmp edi,edx
|
||
jae not_enough_memory_for_list
|
||
mov [edx],edi
|
||
mov esi,buffer+1Eh
|
||
test byte [esi-1Eh+15h],10h
|
||
jnz short_directory_name
|
||
mov ebx,lower_case_table
|
||
mov ax,2003h
|
||
stosw
|
||
jmp copy_short_file_name
|
||
short_directory_name:
|
||
mov ebx,upper_case_table
|
||
cmp word [esi],'..'
|
||
je short_parent_directory
|
||
cmp byte [esi],'.'
|
||
je short_directory_to_hide
|
||
mov ax,2002h
|
||
stosw
|
||
jmp copy_short_file_name
|
||
short_parent_directory:
|
||
cmp byte [buffer+3000h+3],0
|
||
je short_directory_to_hide
|
||
mov ax,2001h
|
||
stosw
|
||
copy_short_file_name:
|
||
lodsb
|
||
xlat byte [ebx]
|
||
cmp edi,[file_list]
|
||
jae not_enough_memory_for_list
|
||
stosb
|
||
test al,al
|
||
jnz copy_short_file_name
|
||
short_file_name_copied:
|
||
mov [file_list_buffer],edi
|
||
mov ah,4Fh
|
||
call dos_int
|
||
jnc short_file_names_list
|
||
jmp file_list_made
|
||
short_directory_to_hide:
|
||
add [file_list],4
|
||
jmp short_file_name_copied
|
||
not_enough_memory_for_long_file_name:
|
||
pop ebx
|
||
mov ax,71A1h
|
||
call dos_int
|
||
not_enough_memory_for_list:
|
||
cmp [file_list_buffer_handle],0
|
||
jne really_not_enough_memory_for_list
|
||
mov ax,500h
|
||
mov edi,buffer
|
||
int 31h
|
||
mov ecx,[edi]
|
||
cmp ecx,2000h
|
||
jbe really_not_enough_memory_for_list
|
||
cmp ecx,100000h
|
||
jbe allocate_buffer_for_file_list
|
||
mov ecx,100000h
|
||
allocate_buffer_for_file_list:
|
||
mov [file_list_buffer_size],ecx
|
||
call get_memory
|
||
or eax,eax
|
||
jz really_not_enough_memory_for_list
|
||
mov [file_list_buffer_handle],ebx
|
||
mov edi,eax
|
||
mov ecx,[file_list_buffer_size]
|
||
jmp init_file_list
|
||
really_not_enough_memory_for_list:
|
||
add [file_list],4
|
||
jmp file_list_made
|
||
long_file_names_list:
|
||
push ebx
|
||
sub [file_list],4
|
||
mov edx,[file_list]
|
||
mov edi,[file_list_buffer]
|
||
cmp edi,edx
|
||
jae not_enough_memory_for_long_file_name
|
||
mov [edx],edi
|
||
mov esi,buffer+10h+2Ch
|
||
test byte [esi-2Ch],10h
|
||
jnz long_directory_name
|
||
mov ax,2003h
|
||
stosw
|
||
mov ebx,lower_case_table
|
||
jmp copy_long_file_name
|
||
long_directory_to_hide:
|
||
add [file_list],4
|
||
jmp long_file_name_copied
|
||
long_directory_name:
|
||
mov ebx,upper_case_table
|
||
cmp byte [esi],'.'
|
||
jne long_directory_show
|
||
cmp byte [esi+1],0
|
||
je long_directory_to_hide
|
||
cmp word [esi+1],'.'
|
||
jne long_directory_show
|
||
cmp byte [buffer+3000h+3],0
|
||
je long_directory_to_hide
|
||
mov ax,2001h
|
||
stosw
|
||
jmp copy_long_file_name
|
||
long_directory_show:
|
||
mov ax,2002h
|
||
stosw
|
||
copy_long_file_name:
|
||
lodsb
|
||
xlatb
|
||
cmp edi,[file_list]
|
||
jae not_enough_memory_for_long_file_name
|
||
stosb
|
||
test al,al
|
||
jnz copy_long_file_name
|
||
long_file_name_copied:
|
||
mov [file_list_buffer],edi
|
||
pop ebx
|
||
mov ax,714Fh
|
||
xor esi,esi
|
||
mov di,10h
|
||
call dos_int
|
||
jnc long_file_names_list
|
||
mov ax,71A1h
|
||
call dos_int
|
||
file_list_made:
|
||
mov edx,[file_list_buffer_top]
|
||
sub edx,[file_list]
|
||
shr edx,2
|
||
mov ebp,edx
|
||
sort_file_list:
|
||
shr ebp,1
|
||
jz file_list_sorted
|
||
mov ebx,ebp
|
||
sorting_iteration:
|
||
cmp ebx,edx
|
||
jae sort_file_list
|
||
mov eax,ebx
|
||
place_into_right_blocks:
|
||
cmp eax,ebp
|
||
jb sort_next_offset
|
||
push edx
|
||
mov edx,eax
|
||
sub eax,ebp
|
||
push eax
|
||
mov esi,[file_list]
|
||
lea eax,[esi+eax*4]
|
||
lea edx,[esi+edx*4]
|
||
mov esi,[eax]
|
||
mov edi,[edx]
|
||
mov ecx,257
|
||
repe cmpsb
|
||
jbe exchange_ok
|
||
mov esi,[eax]
|
||
xchg esi,[edx]
|
||
mov [eax],esi
|
||
exchange_ok:
|
||
pop eax edx
|
||
jmp place_into_right_blocks
|
||
sort_next_offset:
|
||
inc ebx
|
||
jmp sorting_iteration
|
||
file_list_sorted:
|
||
mov esi,[file_list]
|
||
mov ebx,browser_symbols
|
||
make_browser_symbols:
|
||
cmp esi,[file_list_buffer_top]
|
||
je file_list_done
|
||
mov edx,[esi]
|
||
mov al,[edx]
|
||
dec al
|
||
xlatb
|
||
mov [edx],al
|
||
add esi,4
|
||
jmp make_browser_symbols
|
||
file_list_done:
|
||
ret
|
||
release_list_of_files:
|
||
mov ebx,[file_list_buffer_handle]
|
||
test ebx,ebx
|
||
jz list_of_files_released
|
||
call release_memory
|
||
list_of_files_released:
|
||
ret
|
||
goto_dialog:
|
||
mov esi,_position
|
||
mov dx,080Bh
|
||
mov cx,0719h
|
||
mov ah,[window_colors]
|
||
call draw_window
|
||
push edx
|
||
push edi
|
||
mov eax,[video_pitch]
|
||
lea edi,[edi+eax+5*2]
|
||
mov esi,_row
|
||
mov ecx,4
|
||
call draw_static
|
||
pop edi
|
||
mov eax,[video_pitch]
|
||
lea eax,[eax*3]
|
||
lea edi,[edi+eax+2*2]
|
||
mov esi,_column
|
||
mov ecx,7
|
||
call draw_static
|
||
call init_common_dialog
|
||
mov edi,buffer+200h
|
||
mov esi,edi
|
||
mov eax,[caret_line_number]
|
||
call number_as_text
|
||
xor al,al
|
||
stosb
|
||
mov dx,[esp]
|
||
mov ebx,buffer
|
||
mov ecx,9 + 7 shl 16
|
||
add dx,010Ah
|
||
mov al,101b
|
||
call create_edit_box
|
||
call register_box_in_dialog
|
||
mov edi,buffer+200h
|
||
mov esi,edi
|
||
mov eax,[caret_position]
|
||
inc eax
|
||
call number_as_text
|
||
xor al,al
|
||
stosb
|
||
pop edx
|
||
mov ebx,buffer+100h
|
||
mov ecx,9 + 7 shl 16
|
||
add dx,030Ah
|
||
mov al,100b
|
||
call create_edit_box
|
||
call register_box_in_dialog
|
||
mov [common_dialog_callback],0
|
||
call common_dialog_loop
|
||
jc goto_dialog_done
|
||
mov esi,buffer+16
|
||
call get_entered_number
|
||
mov ecx,edx
|
||
mov esi,buffer+100h+16
|
||
call get_entered_number
|
||
clc
|
||
goto_dialog_done:
|
||
ret
|
||
find_dialog:
|
||
push [find_flags]
|
||
mov esi,_find
|
||
mov dx,050Dh
|
||
mov cx,0A36h
|
||
mov ah,[window_colors]
|
||
call draw_window
|
||
push edx
|
||
mov eax,[video_pitch]
|
||
lea edi,[edi+eax+2*2]
|
||
mov esi,_text_to_find
|
||
mov ecx,13
|
||
call draw_static
|
||
call init_common_dialog
|
||
call get_word_at_caret
|
||
mov edi,[line_buffer]
|
||
mov esi,[caret_line]
|
||
call copy_from_line
|
||
xor al,al
|
||
stosb
|
||
mov dx,[esp]
|
||
mov ebx,buffer
|
||
mov esi,[line_buffer]
|
||
mov ecx,32 + 1000 shl 16
|
||
add dx,0110h
|
||
mov al,1
|
||
call create_edit_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+800h
|
||
mov esi,_case_sensitive
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_CASESENSITIVE
|
||
add dx,0310h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+810h
|
||
mov esi,_whole_words
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_WHOLEWORDS
|
||
add dx,0410h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+820h
|
||
mov esi,_backward
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_BACKWARD
|
||
add dx,0510h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
pop edx
|
||
mov ebx,buffer+830h
|
||
mov esi,_search_in_whole_text
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_INWHOLETEXT
|
||
add dx,0610h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov [common_dialog_callback],0
|
||
call common_dialog_loop
|
||
pop eax
|
||
jc find_dialog_aborted
|
||
mov esi,buffer+16
|
||
mov eax,[find_flags]
|
||
clc
|
||
ret
|
||
find_dialog_aborted:
|
||
mov [find_flags],eax
|
||
ret
|
||
replace_dialog:
|
||
push [find_flags]
|
||
mov esi,_replace
|
||
mov dx,050Dh
|
||
mov cx,0D36h
|
||
mov ah,[window_colors]
|
||
call draw_window
|
||
push edx
|
||
push edi
|
||
mov eax,[video_pitch]
|
||
lea edi,[edi+eax+2*2]
|
||
mov esi,_text_to_find
|
||
mov ecx,13
|
||
call draw_static
|
||
pop edi
|
||
mov eax,[video_pitch]
|
||
imul eax,3
|
||
lea edi,[edi+eax+6*2]
|
||
mov esi,_new_text
|
||
mov ecx,9
|
||
call draw_static
|
||
call init_common_dialog
|
||
call get_word_at_caret
|
||
mov edi,[line_buffer]
|
||
mov esi,[caret_line]
|
||
call copy_from_line
|
||
xor al,al
|
||
stosb
|
||
mov dx,[esp]
|
||
mov ebx,buffer
|
||
mov esi,[line_buffer]
|
||
mov ecx,32 + 1000 shl 16
|
||
add dx,0110h
|
||
mov al,1
|
||
call create_edit_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+400h
|
||
xor esi,esi
|
||
mov ecx,32 + 1000 shl 16
|
||
add dx,0310h
|
||
xor al,al
|
||
call create_edit_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+800h
|
||
mov esi,_case_sensitive
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_CASESENSITIVE
|
||
add dx,0510h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+810h
|
||
mov esi,_whole_words
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_WHOLEWORDS
|
||
add dx,0610h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+820h
|
||
mov esi,_backward
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_BACKWARD
|
||
add dx,0710h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+830h
|
||
mov esi,_replace_in_whole_text
|
||
mov edi,find_flags
|
||
mov ebp,FEFIND_INWHOLETEXT
|
||
add dx,0810h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
pop edx
|
||
mov ebx,buffer+840h
|
||
mov esi,_prompt
|
||
mov edi,command_flags
|
||
mov ebp,1
|
||
add dx,0910h
|
||
mov cl,18h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov [common_dialog_callback],0
|
||
call common_dialog_loop
|
||
pop eax
|
||
jc replace_dialog_aborted
|
||
mov esi,buffer+16
|
||
mov edi,buffer+400h+16
|
||
mov eax,[find_flags]
|
||
clc
|
||
ret
|
||
replace_dialog_aborted:
|
||
mov [find_flags],eax
|
||
ret
|
||
options_dialog:
|
||
mov esi,_options
|
||
mov dx,0616h
|
||
mov cx,0922h
|
||
mov ah,[window_colors]
|
||
call draw_window
|
||
push edx
|
||
call init_common_dialog
|
||
mov ebx,buffer
|
||
mov esi,_secure_selection
|
||
mov edi,editor_style
|
||
mov ebp,FES_SECURESEL
|
||
add dx,0102h
|
||
mov cl,16h
|
||
mov al,1
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+10h
|
||
mov esi,_auto_brackets
|
||
mov edi,editor_style
|
||
mov ebp,FES_AUTOBRACKETS
|
||
add dx,0202h
|
||
mov cl,16h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+20h
|
||
mov esi,_auto_indent
|
||
mov edi,editor_style
|
||
mov ebp,FES_AUTOINDENT
|
||
add dx,0302h
|
||
mov cl,16h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov dx,[esp]
|
||
mov ebx,buffer+30h
|
||
mov esi,_smart_tabs
|
||
mov edi,editor_style
|
||
mov ebp,FES_SMARTTABS
|
||
add dx,0402h
|
||
mov cl,16h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
pop edx
|
||
mov ebx,buffer+40h
|
||
mov esi,_optimal_fill
|
||
mov edi,editor_style
|
||
mov ebp,FES_OPTIMALFILL
|
||
add dx,0502h
|
||
mov cl,16h
|
||
xor al,al
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov [common_dialog_callback],0
|
||
jmp common_dialog_loop
|
||
ascii_table_window:
|
||
mov esi,_ascii_table
|
||
mov dx,0616h
|
||
mov cx,0C24h
|
||
mov ah,[window_colors]
|
||
call draw_window
|
||
push edx
|
||
mov ah,[window_colors]
|
||
xor al,al
|
||
mov edx,8
|
||
draw_ascii_table:
|
||
mov ecx,32
|
||
draw_ascii_row:
|
||
mov [gs:edi],ax
|
||
add edi,2
|
||
inc al
|
||
loop draw_ascii_row
|
||
add edi,[video_pitch]
|
||
sub edi,32*2
|
||
dec edx
|
||
jnz draw_ascii_table
|
||
mov ecx,32
|
||
draw_ascii_table_border:
|
||
mov byte [gs:edi+(ecx-1)*2],'<27>'
|
||
loop draw_ascii_table_border
|
||
add edi,[video_pitch]
|
||
push edi
|
||
mov ah,1
|
||
mov cx,000Fh
|
||
int 10h
|
||
ascii_table_update:
|
||
mov dl,[selected_character]
|
||
mov dh,dl
|
||
and dl,11111b
|
||
shr dh,5
|
||
add dx,word [esp+4]
|
||
mov ah,2
|
||
xor bh,bh
|
||
int 10h
|
||
mov edi,screen_row_buffer+10h
|
||
mov eax,'Dec:'
|
||
stosd
|
||
mov al,20h
|
||
stosb
|
||
movzx eax,[selected_character]
|
||
call number_as_text
|
||
mov al,20h
|
||
stosb
|
||
mov eax,'Hex:'
|
||
stosd
|
||
mov al,20h
|
||
stosb
|
||
mov al,[selected_character]
|
||
shr al,4
|
||
cmp al,10
|
||
sbb al,69h
|
||
das
|
||
stosb
|
||
mov al,[selected_character]
|
||
and al,0Fh
|
||
cmp al,10
|
||
sbb al,69h
|
||
das
|
||
stosb
|
||
xor al,al
|
||
stosb
|
||
sub edi,30+1
|
||
mov esi,edi
|
||
mov eax,'Char'
|
||
stosd
|
||
mov eax,'acte'
|
||
stosd
|
||
mov eax,'r: '
|
||
stosd
|
||
mov ecx,screen_row_buffer+10h
|
||
sub ecx,edi
|
||
mov al,20h
|
||
rep stosb
|
||
mov edi,[esp]
|
||
add edi,1*2
|
||
mov ecx,30
|
||
call draw_static
|
||
mov edi,[esp]
|
||
mov al,[selected_character]
|
||
mov [gs:edi+12*2],al
|
||
ascii_table_loop:
|
||
call wait_for_input
|
||
or ah,ah
|
||
jz pure_ascii_char
|
||
cmp ah,48h
|
||
je ascii_table_up
|
||
cmp ah,50h
|
||
je ascii_table_down
|
||
cmp ah,4Bh
|
||
je ascii_table_left
|
||
cmp ah,4Dh
|
||
je ascii_table_right
|
||
cmp ah,1
|
||
je ascii_table_exit
|
||
cmp al,0E0h
|
||
je ascii_table_loop
|
||
cmp al,13
|
||
je ascii_table_done
|
||
cmp al,2
|
||
je ascii_table_done
|
||
cmp al,20h
|
||
jb ascii_table_loop
|
||
pure_ascii_char:
|
||
mov [selected_character],al
|
||
jmp ascii_table_update
|
||
ascii_table_exit:
|
||
pop eax eax
|
||
stc
|
||
ret
|
||
ascii_table_done:
|
||
pop eax eax
|
||
mov al,[selected_character]
|
||
clc
|
||
ret
|
||
ascii_table_up:
|
||
cmp [selected_character],20h
|
||
jb ascii_table_loop
|
||
sub [selected_character],20h
|
||
jmp ascii_table_update
|
||
ascii_table_down:
|
||
cmp [selected_character],0E0h
|
||
jae ascii_table_loop
|
||
add [selected_character],20h
|
||
jmp ascii_table_update
|
||
ascii_table_left:
|
||
test [selected_character],11111b
|
||
jz ascii_table_loop
|
||
dec [selected_character]
|
||
jmp ascii_table_update
|
||
ascii_table_right:
|
||
mov al,[selected_character]
|
||
inc al
|
||
test al,11111b
|
||
jz ascii_table_loop
|
||
mov [selected_character],al
|
||
jmp ascii_table_update
|
||
calculator_window:
|
||
mov [results_selection],0
|
||
mov esi,_calculator
|
||
mov dx,0602h
|
||
mov cx,0B4Ch
|
||
mov ah,[window_colors]
|
||
call draw_window
|
||
push edi edx
|
||
mov eax,[video_pitch]
|
||
lea edi,[edi+eax+2*2]
|
||
mov esi,_expression
|
||
mov ecx,11
|
||
call draw_static
|
||
mov eax,[video_pitch]
|
||
lea eax,[eax*3]
|
||
mov edi,[esp+4]
|
||
lea edi,[edi+eax+2*2]
|
||
mov esi,_result
|
||
mov ecx,65
|
||
call draw_static
|
||
call init_common_dialog
|
||
mov ebx,buffer
|
||
xor esi,esi
|
||
mov ecx,56 + 1000 shl 16
|
||
mov dx,[esp]
|
||
add dx,010Eh
|
||
mov al,1
|
||
call create_edit_box
|
||
call register_box_in_dialog
|
||
mov ebx,buffer+2000h
|
||
mov esi,_null
|
||
mov edi,results_selection
|
||
xor ebp,ebp
|
||
mov dx,[esp]
|
||
add dx,0402h
|
||
mov cl,18h
|
||
mov al,2
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov ebx,buffer+2010h
|
||
mov esi,_null
|
||
mov edi,results_selection
|
||
mov ebp,1
|
||
mov dx,[esp]
|
||
add dx,0502h
|
||
mov cl,18h
|
||
mov al,2
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov ebx,buffer+2020h
|
||
mov esi,_null
|
||
mov edi,results_selection
|
||
mov ebp,2
|
||
mov dx,[esp]
|
||
add dx,0602h
|
||
mov cl,18h
|
||
mov al,2
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
mov ebx,buffer+2030h
|
||
mov esi,_null
|
||
mov edi,results_selection
|
||
mov ebp,3
|
||
mov dx,[esp]
|
||
add dx,0702h
|
||
mov cl,18h
|
||
mov al,2
|
||
call create_check_box
|
||
call register_box_in_dialog
|
||
pop edx edi
|
||
mov eax,[video_pitch]
|
||
lea edi,[edi+eax*4+6*2]
|
||
mov [results_offset],edi
|
||
mov [common_dialog_callback],calculate_result
|
||
calculator_loop:
|
||
call common_dialog_loop
|
||
jc close_calculator
|
||
mov esi,[results_offset]
|
||
mov eax,[results_selection]
|
||
imul eax,[video_pitch]
|
||
add esi,eax
|
||
mov edi,buffer+16
|
||
copy_result:
|
||
lods byte [gs:esi]
|
||
cmp al,20h
|
||
je result_ready
|
||
stosb
|
||
inc esi
|
||
jmp copy_result
|
||
result_ready:
|
||
mov ecx,edi
|
||
sub ecx,buffer+16
|
||
mov ebx,buffer
|
||
mov [ebx+8],cx
|
||
mov [ebx+12],cx
|
||
xor eax,eax
|
||
mov [ebx+10],ax
|
||
mov [ebx+14],ax
|
||
cmp [current_box],0
|
||
jne activate_expression_box
|
||
call draw_edit_box
|
||
jmp calculator_loop
|
||
activate_expression_box:
|
||
mov edx,[current_box]
|
||
mov ebx,[boxes+edx*4]
|
||
call kill_box_focus
|
||
mov [current_box],0
|
||
mov ebx,buffer
|
||
call set_box_focus
|
||
jmp calculator_loop
|
||
close_calculator:
|
||
ret
|
||
calculate_result:
|
||
mov esi,buffer+16
|
||
movzx eax,word [buffer+8]
|
||
lea edi,[esi+eax]
|
||
xor eax,eax
|
||
stosb
|
||
mov [progress_offset],eax
|
||
mov [hash_tree],eax
|
||
mov [macro_status],al
|
||
mov [symbols_file],eax
|
||
not eax
|
||
mov [source_start],eax
|
||
mov eax,buffer+1000h
|
||
mov [memory_end],eax
|
||
mov [labels_list],eax
|
||
mov [resume_esp],esp
|
||
mov [resume_eip],calculator_error
|
||
call convert_line
|
||
push edi
|
||
call convert_expression
|
||
cmp byte [esi],0
|
||
jne invalid_expression
|
||
mov al,')'
|
||
stosb
|
||
pop esi
|
||
mov [error_line],0
|
||
mov [current_line],-1
|
||
mov [value_size],0
|
||
call calculate_expression
|
||
cmp [error_line],0
|
||
je present_result
|
||
jmp [error]
|
||
present_result:
|
||
mov ebp,edi
|
||
cmp byte [ebp+13],0
|
||
je result_in_64bit_composite_range
|
||
test byte [ebp+7],80h
|
||
jnz result_in_64bit_composite_range
|
||
mov esi,_null
|
||
mov edi,[results_offset]
|
||
add edi,[video_pitch]
|
||
mov ecx,65
|
||
push edi
|
||
call draw_static
|
||
pop edi
|
||
add edi,[video_pitch]
|
||
mov ecx,65
|
||
push edi
|
||
call draw_static
|
||
pop edi
|
||
add edi,[video_pitch]
|
||
mov ecx,65
|
||
call draw_static
|
||
jmp present_decimal
|
||
result_in_64bit_composite_range:
|
||
mov eax,[ebp]
|
||
mov edx,[ebp+4]
|
||
mov edi,buffer+3000h
|
||
mov word [edi],'b'
|
||
make_binary_number:
|
||
mov bl,'0'
|
||
shrd eax,edx,1
|
||
adc bl,0
|
||
dec edi
|
||
mov [edi],bl
|
||
shr edx,1
|
||
jnz make_binary_number
|
||
test eax,eax
|
||
jnz make_binary_number
|
||
mov esi,edi
|
||
mov eax,[video_pitch]
|
||
mov edi,[results_offset]
|
||
lea edi,[edi+eax*2]
|
||
mov ecx,65
|
||
call draw_static
|
||
mov ecx,[ebp]
|
||
mov edx,[ebp+4]
|
||
mov edi,buffer+3000h
|
||
mov word [edi],'o'
|
||
make_octal_number:
|
||
mov al,cl
|
||
and al,111b
|
||
add al,'0'
|
||
dec edi
|
||
mov [edi],al
|
||
shrd ecx,edx,3
|
||
shr edx,3
|
||
jnz make_octal_number
|
||
test ecx,ecx
|
||
jnz make_octal_number
|
||
mov esi,edi
|
||
mov eax,[video_pitch]
|
||
mov edi,[results_offset]
|
||
lea eax,[eax*3]
|
||
add edi,eax
|
||
mov ecx,65
|
||
call draw_static
|
||
mov ecx,[ebp]
|
||
mov edx,[ebp+4]
|
||
mov edi,buffer+3000h
|
||
mov word [edi],'h'
|
||
make_hexadecimal_number:
|
||
mov al,cl
|
||
and al,0Fh
|
||
cmp al,10
|
||
sbb al,69h
|
||
das
|
||
dec edi
|
||
mov [edi],al
|
||
shrd ecx,edx,4
|
||
shr edx,4
|
||
jnz make_hexadecimal_number
|
||
test ecx,ecx
|
||
jnz make_hexadecimal_number
|
||
cmp al,'A'
|
||
jb hexadecimal_number_ok
|
||
dec edi
|
||
mov byte [edi],'0'
|
||
hexadecimal_number_ok:
|
||
mov esi,edi
|
||
mov eax,[video_pitch]
|
||
mov edi,[results_offset]
|
||
lea edi,[edi+eax]
|
||
mov ecx,65
|
||
call draw_static
|
||
present_decimal:
|
||
mov edi,buffer+3000h
|
||
mov byte [edi],0
|
||
mov ecx,10
|
||
xor bl,bl
|
||
cmp byte [ebp+13],0
|
||
je make_decimal_number
|
||
mov bl,'-'
|
||
mov eax,[ebp]
|
||
mov edx,[ebp+4]
|
||
not eax
|
||
not edx
|
||
add eax,1
|
||
adc edx,0
|
||
mov [ebp],eax
|
||
mov [ebp+4],edx
|
||
or eax,edx
|
||
jnz make_decimal_number
|
||
dec edi
|
||
mov byte [edi],'6'
|
||
mov dword [ebp],99999999h
|
||
mov dword [ebp+4],19999999h
|
||
make_decimal_number:
|
||
mov eax,[ebp+4]
|
||
xor edx,edx
|
||
div ecx
|
||
mov [ebp+4],eax
|
||
mov eax,[ebp]
|
||
div ecx
|
||
mov [ebp],eax
|
||
add dl,'0'
|
||
dec edi
|
||
mov [edi],dl
|
||
or eax,[ebp+4]
|
||
jnz make_decimal_number
|
||
test bl,bl
|
||
jz decimal_number_ok
|
||
dec edi
|
||
mov [edi],bl
|
||
decimal_number_ok:
|
||
mov esi,edi
|
||
mov edi,[results_offset]
|
||
mov ecx,65
|
||
call draw_static
|
||
ret
|
||
calculator_error:
|
||
mov ebx,[video_pitch]
|
||
mov ebp,[results_offset]
|
||
mov edx,4
|
||
clear_results:
|
||
mov ecx,65
|
||
mov edi,ebp
|
||
call fill_static
|
||
add ebp,ebx
|
||
dec edx
|
||
jnz clear_results
|
||
ret
|
||
|
||
; Memory allocation
|
||
|
||
get_memory:
|
||
push esi edi
|
||
mov ebx,ecx
|
||
shr ebx,16
|
||
mov ax,501h
|
||
int 31h
|
||
jc dpmi_allocation_failed
|
||
mov ax,bx
|
||
shl eax,16
|
||
mov ax,cx
|
||
mov edx,main
|
||
shl edx,4
|
||
sub eax,edx
|
||
mov bx,si
|
||
shl ebx,16
|
||
mov bx,di
|
||
pop edi esi
|
||
ret
|
||
dpmi_allocation_failed:
|
||
xor eax,eax
|
||
pop edi esi
|
||
ret
|
||
release_memory:
|
||
push esi edi
|
||
mov esi,ebx
|
||
shr esi,16
|
||
mov di,bx
|
||
mov ax,502h
|
||
int 31h
|
||
pop edi esi
|
||
ret
|
||
get_low_memory:
|
||
mov ax,100h
|
||
mov bx,-1
|
||
int 31h
|
||
movzx eax,bx
|
||
shl eax,4
|
||
mov [low_memory_size],eax
|
||
mov ax,100h
|
||
int 31h
|
||
mov [low_memory_selector],dx
|
||
jnc low_memory_ok
|
||
xor edx,edx
|
||
mov [low_memory_size],edx
|
||
low_memory_ok:
|
||
ret
|
||
release_low_memory:
|
||
cmp [low_memory_size],0
|
||
je low_memory_ok
|
||
mov ax,101h
|
||
mov dx,[low_memory_selector]
|
||
int 31h
|
||
ret
|
||
|
||
; File operations
|
||
|
||
dos_int:
|
||
push 0
|
||
push 0
|
||
push 0
|
||
pushw buffer_segment
|
||
pushw buffer_segment
|
||
stc
|
||
pushfw
|
||
push eax
|
||
push ecx
|
||
push edx
|
||
push ebx
|
||
push 0
|
||
push ebp
|
||
push esi
|
||
push edi
|
||
mov ax,300h
|
||
mov bx,21h
|
||
xor cx,cx
|
||
mov edi,esp
|
||
push es ss
|
||
pop es
|
||
int 31h
|
||
pop es
|
||
mov edi,[esp]
|
||
mov esi,[esp+4]
|
||
mov ebp,[esp+8]
|
||
mov ebx,[esp+10h]
|
||
mov edx,[esp+14h]
|
||
mov ecx,[esp+18h]
|
||
mov ah,[esp+20h]
|
||
sahf
|
||
mov eax,[esp+1Ch]
|
||
lea esp,[esp+32h]
|
||
ret
|
||
open:
|
||
push esi edi
|
||
call adapt_path
|
||
mov ax,716Ch
|
||
mov bx,100000b
|
||
mov dx,1
|
||
xor cx,cx
|
||
xor si,si
|
||
call dos_int
|
||
jnc open_done
|
||
cmp ax,7100h
|
||
je old_open
|
||
stc
|
||
jmp open_done
|
||
old_open:
|
||
mov ax,3D00h
|
||
xor dx,dx
|
||
call dos_int
|
||
open_done:
|
||
mov bx,ax
|
||
pop edi esi
|
||
ret
|
||
adapt_path:
|
||
mov esi,edx
|
||
mov edi,buffer
|
||
copy_path:
|
||
lodsb
|
||
cmp al,'/'
|
||
jne path_char_ok
|
||
mov al,'\'
|
||
path_char_ok:
|
||
stosb
|
||
or al,al
|
||
jnz copy_path
|
||
ret
|
||
create:
|
||
push esi edi
|
||
call adapt_path
|
||
mov ax,716Ch
|
||
mov bx,100001b
|
||
mov dx,10010b
|
||
xor cx,cx
|
||
xor si,si
|
||
xor di,di
|
||
call dos_int
|
||
jnc create_done
|
||
cmp ax,7100h
|
||
je old_create
|
||
stc
|
||
jmp create_done
|
||
old_create:
|
||
mov ah,3Ch
|
||
xor cx,cx
|
||
xor dx,dx
|
||
call dos_int
|
||
create_done:
|
||
mov bx,ax
|
||
pop edi esi
|
||
ret
|
||
write:
|
||
push edx esi edi ebp
|
||
mov ebp,ecx
|
||
mov esi,edx
|
||
write_loop:
|
||
mov ecx,1000h
|
||
sub ebp,1000h
|
||
jnc do_write
|
||
add ebp,1000h
|
||
mov ecx,ebp
|
||
xor ebp,ebp
|
||
do_write:
|
||
push ecx
|
||
mov edi,buffer
|
||
shr ecx,2
|
||
rep movsd
|
||
mov ecx,[esp]
|
||
and ecx,11b
|
||
rep movsb
|
||
pop ecx
|
||
mov ah,40h
|
||
xor dx,dx
|
||
call dos_int
|
||
or ebp,ebp
|
||
jnz write_loop
|
||
pop ebp edi esi edx
|
||
ret
|
||
read:
|
||
push edx esi edi ebp
|
||
mov ebp,ecx
|
||
mov edi,edx
|
||
read_loop:
|
||
mov ecx,1000h
|
||
sub ebp,1000h
|
||
jnc do_read
|
||
add ebp,1000h
|
||
mov ecx,ebp
|
||
xor ebp,ebp
|
||
do_read:
|
||
push ecx
|
||
mov ah,3Fh
|
||
xor dx,dx
|
||
call dos_int
|
||
cmp ax,cx
|
||
jne eof
|
||
mov esi,buffer
|
||
mov ecx,[esp]
|
||
shr ecx,2
|
||
rep movsd
|
||
pop ecx
|
||
and ecx,11b
|
||
rep movsb
|
||
or ebp,ebp
|
||
jnz read_loop
|
||
read_done:
|
||
pop ebp edi esi edx
|
||
ret
|
||
eof:
|
||
pop ecx
|
||
stc
|
||
jmp read_done
|
||
close:
|
||
mov ah,3Eh
|
||
int 21h
|
||
ret
|
||
lseek:
|
||
mov ah,42h
|
||
mov ecx,edx
|
||
shr ecx,16
|
||
int 21h
|
||
pushf
|
||
shl edx,16
|
||
popf
|
||
mov dx,ax
|
||
mov eax,edx
|
||
ret
|
||
|
||
; Other functions needed by assembler core
|
||
|
||
get_environment_variable:
|
||
push esi edi
|
||
mov ebx,_section_environment
|
||
call get_ini_value
|
||
pop edi ebx
|
||
jnc found_value_in_ini
|
||
push ds
|
||
mov ds,[environment_selector]
|
||
xor esi,esi
|
||
compare_variable_names:
|
||
mov edx,ebx
|
||
compare_name_char:
|
||
lodsb
|
||
mov ah,[es:edx]
|
||
inc edx
|
||
cmp al,'='
|
||
je end_of_variable_name
|
||
or ah,ah
|
||
jz next_variable
|
||
sub ah,al
|
||
jz compare_name_char
|
||
cmp ah,20h
|
||
jne next_variable
|
||
cmp al,41h
|
||
jb next_variable
|
||
cmp al,5Ah
|
||
jna compare_name_char
|
||
next_variable:
|
||
lodsb
|
||
or al,al
|
||
jnz next_variable
|
||
cmp byte [esi],0
|
||
jne compare_variable_names
|
||
pop ds
|
||
ret
|
||
end_of_variable_name:
|
||
or ah,ah
|
||
jnz next_variable
|
||
copy_variable_value:
|
||
lodsb
|
||
cmp edi,[es:memory_end]
|
||
jae out_of_memory
|
||
stosb
|
||
or al,al
|
||
jnz copy_variable_value
|
||
dec edi
|
||
pop ds
|
||
ret
|
||
found_value_in_ini:
|
||
lea eax,[edi+ecx]
|
||
cmp eax,[memory_end]
|
||
jae out_of_memory
|
||
rep movsb
|
||
ret
|
||
make_timestamp:
|
||
mov ah,2Ah
|
||
int 21h
|
||
push dx cx
|
||
movzx ecx,cx
|
||
mov eax,ecx
|
||
sub eax,1970
|
||
mov ebx,365
|
||
mul ebx
|
||
mov ebp,eax
|
||
mov eax,ecx
|
||
sub eax,1969
|
||
shr eax,2
|
||
add ebp,eax
|
||
mov eax,ecx
|
||
sub eax,1901
|
||
mov ebx,100
|
||
div ebx
|
||
sub ebp,eax
|
||
mov eax,ecx
|
||
xor edx,edx
|
||
sub eax,1601
|
||
mov ebx,400
|
||
div ebx
|
||
add ebp,eax
|
||
movzx ecx,byte [esp+3]
|
||
mov eax,ecx
|
||
dec eax
|
||
mov ebx,30
|
||
mul ebx
|
||
add ebp,eax
|
||
cmp ecx,8
|
||
jbe months_correction
|
||
mov eax,ecx
|
||
sub eax,7
|
||
shr eax,1
|
||
add ebp,eax
|
||
mov ecx,8
|
||
months_correction:
|
||
mov eax,ecx
|
||
shr eax,1
|
||
add ebp,eax
|
||
cmp ecx,2
|
||
pop cx
|
||
jbe day_correction_ok
|
||
sub ebp,2
|
||
test ecx,11b
|
||
jnz day_correction_ok
|
||
xor edx,edx
|
||
mov eax,ecx
|
||
mov ebx,100
|
||
div ebx
|
||
or edx,edx
|
||
jnz day_correction
|
||
mov eax,ecx
|
||
mov ebx,400
|
||
div ebx
|
||
or edx,edx
|
||
jnz day_correction_ok
|
||
day_correction:
|
||
inc ebp
|
||
day_correction_ok:
|
||
pop dx
|
||
movzx eax,dl
|
||
dec eax
|
||
add eax,ebp
|
||
mov ebx,24
|
||
mul ebx
|
||
push eax
|
||
mov ah,2Ch
|
||
int 21h
|
||
pop eax
|
||
push dx
|
||
movzx ebx,ch
|
||
add eax,ebx
|
||
mov ebx,60
|
||
mul ebx
|
||
movzx ebx,cl
|
||
add eax,ebx
|
||
mov ebx,60
|
||
mul ebx
|
||
pop bx
|
||
movzx ebx,bh
|
||
add eax,ebx
|
||
adc edx,0
|
||
ret
|
||
display_block:
|
||
mov edi,[display_length]
|
||
mov eax,[display_length]
|
||
add eax,ecx
|
||
cmp eax,[low_memory_size]
|
||
ja not_enough_memory
|
||
mov [display_length],eax
|
||
push es
|
||
mov es,[low_memory_selector]
|
||
rep movsb
|
||
pop es
|
||
ret
|
||
|
||
; Error handling
|
||
|
||
not_enough_memory:
|
||
call update_screen
|
||
mov esi,_memory_error
|
||
mov ebx,_error
|
||
movzx eax,[error_box_colors]
|
||
call message_box
|
||
mov esp,stack_top
|
||
jmp main_loop
|
||
|
||
fatal_error:
|
||
cmp [progress_offset],0
|
||
je error_outside_compiler
|
||
pop esi
|
||
mov esp,stack_top
|
||
push esi
|
||
mov ax,205h
|
||
mov bl,9
|
||
mov edx,dword [keyboard_handler]
|
||
mov cx,word [keyboard_handler+4]
|
||
int 31h
|
||
mov ebx,[allocated_memory]
|
||
call release_memory
|
||
call update_screen
|
||
show_error_summary:
|
||
mov esi,buffer+3000h
|
||
call go_to_directory
|
||
mov esi,_assembler_error
|
||
mov edi,buffer
|
||
mov ebx,esp
|
||
call sprintf
|
||
mov esi,buffer
|
||
mov ebx,_compile
|
||
movzx eax,[error_box_colors]
|
||
mov [first_button],_ok
|
||
mov [second_button],_get_display
|
||
cmp [display_length],0
|
||
je show_compilation_summary
|
||
or eax,2000000h
|
||
jmp show_compilation_summary
|
||
assembler_error:
|
||
cmp [progress_offset],0
|
||
je error_outside_compiler
|
||
pop esi
|
||
mov esp,stack_top
|
||
push esi
|
||
mov ax,205h
|
||
mov bl,9
|
||
mov edx,dword [keyboard_handler]
|
||
mov cx,word [keyboard_handler+4]
|
||
int 31h
|
||
and [output_file],0
|
||
call show_display_buffer
|
||
call update_screen
|
||
mov ebx,[current_line]
|
||
find_error_origin:
|
||
test dword [ebx+4],80000000h
|
||
jz error_origin_found
|
||
mov ebx,[ebx+8]
|
||
jmp find_error_origin
|
||
error_origin_found:
|
||
mov esi,[ebx]
|
||
mov edi,filename_buffer
|
||
copy_error_file:
|
||
lodsb
|
||
stosb
|
||
or al,al
|
||
jnz copy_error_file
|
||
push dword [ebx+4]
|
||
mov ebx,[allocated_memory]
|
||
call release_memory
|
||
mov edx,filename_buffer
|
||
call load_file
|
||
show_error_line:
|
||
pop eax
|
||
call find_line
|
||
xor eax,eax
|
||
mov [selection_line],esi
|
||
mov [selection_line_number],ecx
|
||
mov [selection_position],eax
|
||
mov [caret_position],eax
|
||
push esi
|
||
lea edi,[esi+SEGMENT_HEADER_LENGTH]
|
||
lea ebp,[esi+SEGMENT_LENGTH]
|
||
mov ebx,characters
|
||
xor edx,edx
|
||
check_for_more_lines:
|
||
call peek_character
|
||
jc no_more_lines
|
||
cmp al,3Bh
|
||
je no_more_lines
|
||
mov ah,al
|
||
xlatb
|
||
or al,al
|
||
jz symbol
|
||
or edx,edx
|
||
jnz neutral
|
||
cmp ah,27h
|
||
je quoted
|
||
cmp ah,22h
|
||
je quoted
|
||
neutral:
|
||
or edx,-1
|
||
jmp check_for_more_lines
|
||
peek_character:
|
||
cmp edi,ebp
|
||
je peek_next_segment
|
||
mov al,[edi]
|
||
inc edi
|
||
clc
|
||
ret
|
||
peek_next_segment:
|
||
mov esi,[esi]
|
||
btr esi,0
|
||
lea edi,[esi+SEGMENT_HEADER_LENGTH]
|
||
lea ebp,[esi+SEGMENT_LENGTH]
|
||
jc peek_character
|
||
stc
|
||
ret
|
||
symbol:
|
||
cmp ah,'\'
|
||
je backslash
|
||
xor edx,edx
|
||
jmp check_for_more_lines
|
||
quoted:
|
||
call peek_character
|
||
jc no_more_lines
|
||
cmp al,ah
|
||
jne quoted
|
||
call peek_character
|
||
jc no_more_lines
|
||
cmp al,ah
|
||
je quoted
|
||
dec edi
|
||
xor edx,edx
|
||
jmp check_for_more_lines
|
||
backslash:
|
||
call peek_character
|
||
jc more_lines
|
||
cmp al,20h
|
||
je backslash
|
||
cmp al,3Bh
|
||
jne no_more_lines
|
||
comment:
|
||
mov esi,[esi]
|
||
btr esi,0
|
||
jc comment
|
||
more_lines:
|
||
or esi,esi
|
||
jz last_line
|
||
inc ecx
|
||
mov [esp],esi
|
||
jmp check_for_more_lines
|
||
last_line:
|
||
pop [caret_line]
|
||
mov [caret_line_number],ecx
|
||
mov eax,[maximum_position]
|
||
mov [caret_position],eax
|
||
jmp error_line_highlighted
|
||
no_more_lines:
|
||
or esi,esi
|
||
jz last_line
|
||
pop eax
|
||
inc ecx
|
||
mov [caret_line],esi
|
||
mov [caret_line_number],ecx
|
||
error_line_highlighted:
|
||
call let_caret_appear
|
||
mov eax,[caret_line]
|
||
xchg eax,[selection_line]
|
||
mov [caret_line],eax
|
||
mov eax,[caret_line_number]
|
||
xchg eax,[selection_line_number]
|
||
mov [caret_line_number],eax
|
||
mov eax,[caret_position]
|
||
xchg eax,[selection_position]
|
||
mov [caret_position],eax
|
||
call let_caret_appear
|
||
call update_window
|
||
call update_screen
|
||
jmp show_error_summary
|
||
error_outside_compiler:
|
||
mov esp,[resume_esp]
|
||
jmp [resume_eip]
|
||
|
||
; Assembler core
|
||
|
||
include '..\..\errors.inc'
|
||
include '..\..\symbdump.inc'
|
||
include '..\..\preproce.inc'
|
||
include '..\..\parser.inc'
|
||
include '..\..\exprpars.inc'
|
||
include '..\..\assemble.inc'
|
||
include '..\..\exprcalc.inc'
|
||
include '..\..\formats.inc'
|
||
include '..\..\x86_64.inc'
|
||
include '..\..\avx.inc'
|
||
|
||
; Assembler constants
|
||
|
||
include '..\..\tables.inc'
|
||
include '..\..\messages.inc'
|
||
include '..\..\version.inc'
|
||
|
||
; String constants
|
||
|
||
_caption db 'flat assembler ',VERSION_STRING,0
|
||
_copyright db 'Copyright (c) 1999-2022, Tomasz Grysztar',0
|
||
|
||
_null db 0
|
||
_untitled db 'Untitled',0
|
||
_compile db 'Compile',0
|
||
_error db 'Error',0
|
||
_ok db 'OK',0
|
||
_yes db 'Yes',0
|
||
_no db 'No',0
|
||
_get_display db 'Get display to clipboard',0
|
||
_open db 'Open',0
|
||
_save_as db 'Save as',0
|
||
_file db 'File:',0
|
||
_position db 'Position',0
|
||
_row db 'Row:',0
|
||
_column db 'Column:',0
|
||
_find db 'Find',0
|
||
_replace db 'Replace',0
|
||
_text_to_find db 'Text to find:',0
|
||
_new_text db 'New text:',0
|
||
_expression db 'Expression:',0
|
||
_result db 'Result:',0
|
||
_case_sensitive db 'Case sensitive',0
|
||
_whole_words db 'Whole words',0
|
||
_backward db 'Backward search',0
|
||
_search_in_whole_text db 'Search in whole text',0
|
||
_replace_in_whole_text db 'Replace in whole text',0
|
||
_prompt db 'Prompt on replace',0
|
||
_options db 'Editor options',0
|
||
_secure_selection db 'Secure selection',0
|
||
_auto_brackets db 'Automatic brackets',0
|
||
_auto_indent db 'Automatic indents',0
|
||
_smart_tabs db 'Smart tabulation',0
|
||
_optimal_fill db 'Optimal fill on saving',0
|
||
_ascii_table db 'ASCII table',0
|
||
_calculator db 'Calculator',0
|
||
|
||
_startup_failed db 'Failed to allocate required memory.',0
|
||
_memory_error db 'Not enough memory to complete this operation.',0
|
||
_loading_error db 'Could not load file %s.',0
|
||
_saving_error db 'Could not write file to disk.',0
|
||
_not_executable db 'Cannot execute this kind of file.',0
|
||
_saving_question db 'File was modified. Save it now?',0
|
||
_overwrite_question db 'File %s already exists. Do you want to replace it?',0
|
||
_directory_question db 'Directory %s does not exist. Do you want to create it now?',0
|
||
_directory_error db 'Failed to create the directory.',0
|
||
_invalid_path db 'Invalid path.',0
|
||
_not_found_after db 'Text %s not found after current position.',0
|
||
_not_found_before db 'Text %s not found before current position.',0
|
||
_replace_prompt db 'Replace this occurence?',0
|
||
_replaces_made db '%d replaces made.',0
|
||
_assembler_error db 'Error: %s.',0
|
||
|
||
_section_environment db 'Environment',0
|
||
_section_compiler db 'Compiler',0
|
||
_key_compiler_memory db 'Memory',0
|
||
_key_compiler_passes db 'Passes',0
|
||
_section_options db 'Options',0
|
||
_key_options_securesel db 'SecureSelection',0
|
||
_key_options_autobrackets db 'AutoBrackets',0
|
||
_key_options_autoindent db 'AutoIndent',0
|
||
_key_options_smarttabs db 'SmartTabs',0
|
||
_key_options_optimalfill db 'OptimalFill',0
|
||
_section_colors db 'Colors',0
|
||
_key_color_text db 'Text',0
|
||
_key_color_background db 'Background',0
|
||
_key_color_seltext db 'SelectionText',0
|
||
_key_color_selbackground db 'SelectionBackground',0
|
||
_key_color_symbols db 'Symbols',0
|
||
_key_color_numbers db 'Numbers',0
|
||
_key_color_strings db 'Strings',0
|
||
_key_color_comments db 'Comments',0
|
||
_key_color_statustext db 'StatusText',0
|
||
_key_color_statusbackground db 'StatusBackground',0
|
||
_key_color_wintext db 'WindowText',0
|
||
_key_color_winbackground db 'WindowBackground',0
|
||
_key_color_msgtext db 'MessageText',0
|
||
_key_color_msgbackground db 'MessageBackground',0
|
||
_key_color_msgseltext db 'MessageSelectionText',0
|
||
_key_color_msgselbackground db 'MessageSelectionBackground',0
|
||
_key_color_errtext db 'ErrorText',0
|
||
_key_color_errbackground db 'ErrorBackground',0
|
||
_key_color_errseltext db 'ErrorSelectionText',0
|
||
_key_color_errselbackground db 'ErrorSelectionBackground',0
|
||
_key_color_boxtext db 'BoxText',0
|
||
_key_color_boxbackground db 'BoxBackground',0
|
||
_key_color_boxseltext db 'BoxSelectionText',0
|
||
_key_color_boxselbackground db 'BoxSelectionBackground',0
|
||
|
||
; Configuration
|
||
|
||
editor_style dd FES_AUTOINDENT+FES_SMARTTABS+FES_SECURESEL+FES_OPTIMALFILL
|
||
|
||
text_colors db 87h
|
||
selection_colors db 7Fh
|
||
symbol_color db 0Fh
|
||
number_color db 0Ah
|
||
string_color db 0Ch
|
||
comment_color db 3
|
||
status_colors db 2Fh
|
||
window_colors db 3Fh
|
||
box_colors db 1Fh
|
||
box_selection_colors db 9Fh
|
||
message_box_colors dw 3F1Fh
|
||
error_box_colors dw 4E6Eh
|
||
|
||
; Other constants
|
||
|
||
browser_symbols db 18h,09h,07h,0F0h
|
||
|
||
; Editor core
|
||
|
||
include '..\memory.inc'
|
||
include '..\navigate.inc'
|
||
include '..\edit.inc'
|
||
include '..\blocks.inc'
|
||
include '..\search.inc'
|
||
include '..\undo.inc'
|
||
|
||
; Editor constants
|
||
|
||
SEGMENT_LENGTH = 160
|
||
BLOCK_LENGTH = 1024 * SEGMENT_LENGTH
|
||
SEGMENT_HEADER_LENGTH = 16
|
||
SEGMENT_DATA_LENGTH = SEGMENT_LENGTH - SEGMENT_HEADER_LENGTH
|
||
|
||
FEMODE_OVERWRITE = 1
|
||
FEMODE_VERTICALSEL = 2
|
||
FEMODE_NOUNDO = 4
|
||
FEMODE_READONLY = 8
|
||
|
||
FEFIND_CASESENSITIVE = 1
|
||
FEFIND_WHOLEWORDS = 2
|
||
FEFIND_BACKWARD = 4
|
||
FEFIND_INWHOLETEXT = 8
|
||
|
||
FES_AUTOINDENT = 0001h
|
||
FES_AUTOBRACKETS = 0002h
|
||
FES_SMARTTABS = 0004h
|
||
FES_SECURESEL = 0008h
|
||
FES_OPTIMALFILL = 0010h
|
||
|
||
include '..\version.inc'
|
||
|
||
; Editor data
|
||
|
||
editor_data:
|
||
|
||
next_instance dd ?
|
||
previous_instance dd ?
|
||
file_path dd ?
|
||
file_path_handle dd ?
|
||
|
||
include '..\variable.inc'
|
||
|
||
editor_data_size = $ - editor_data
|
||
|
||
if editor_data_size > SEGMENT_DATA_LENGTH
|
||
err
|
||
end if
|
||
|
||
lower_case_table db 100h dup ?
|
||
upper_case_table db 100h dup ?
|
||
|
||
; Assembler core data
|
||
|
||
include '..\..\variable.inc'
|
||
|
||
; Interface specific data
|
||
|
||
psp_selector dw ?
|
||
environment_selector dw ?
|
||
main_selector dw ?
|
||
bios_selector dw ?
|
||
video_selector dw ?
|
||
|
||
screen_width dd ?
|
||
screen_height dd ?
|
||
video_pitch dd ?
|
||
|
||
video_storage dd ?
|
||
video_storage_handle dd ?
|
||
stored_cursor dw ?
|
||
stored_cursor_position dw ?
|
||
stored_page db ?
|
||
stored_mode db ?
|
||
|
||
low_memory_size dd ?
|
||
low_memory_selector dw ?
|
||
|
||
last_operation db ?
|
||
current_operation db ?
|
||
was_selection db ?
|
||
|
||
line_buffer dd ?
|
||
line_buffer_size dd ?
|
||
line_buffer_handle dd ?
|
||
screen_offset dd ?
|
||
screen_row_buffer db 512 dup ?
|
||
|
||
clipboard dd ?
|
||
clipboard_handle dd ?
|
||
|
||
main_project_file dd ?
|
||
memory_limit dd ?
|
||
allocated_memory dd ?
|
||
start_time dd ?
|
||
progress_offset dd ?
|
||
keyboard_handler dp ?
|
||
display_length dd ?
|
||
|
||
find_flags dd ?
|
||
replaces_count dd ?
|
||
selected_character db ?
|
||
command_flags db ?
|
||
message_width db ?
|
||
buttons_width db ?
|
||
first_button dd ?
|
||
second_button dd ?
|
||
|
||
file_handle dd ?
|
||
filename_buffer db 17+256 dup ?
|
||
|
||
ini_data dd ?
|
||
ini_data_handle dd ?
|
||
ini_data_length dd ?
|
||
ini_extension dd ?
|
||
ini_path db 260 dup ?
|
||
|
||
file_list dd ?
|
||
file_list_buffer dd ?
|
||
file_list_buffer_top dd ?
|
||
file_list_buffer_handle dd ?
|
||
file_list_buffer_size dd ?
|
||
|
||
current_box dd ?
|
||
boxes_count dd ?
|
||
boxes dd 16 dup ?
|
||
common_dialog_callback dd ?
|
||
|
||
resume_esp dd ?
|
||
resume_eip dd ?
|
||
results_offset dd ?
|
||
results_selection dd ?
|
||
|
||
segment buffer_segment
|
||
|
||
buffer = (buffer_segment-main) shl 4
|
||
|
||
db 4000h dup ?
|
||
|
||
segment stack_segment
|
||
|
||
stack_bottom = (stack_segment-main) shl 4
|
||
|
||
db 4000h dup ?
|
||
|
||
stack_top = stack_bottom + $
|