asm_dip/toolchain/fasmw17332/SOURCE/IDE/FASMW/FASM.INC
2024-11-24 23:13:28 -05:00

468 lines
8.5 KiB
Plaintext

; flat assembler interface for Win32 IDE
; Copyright (c) 1999-2022, Tomasz Grysztar.
; All rights reserved.
flat_assembler:
mov [initial_definitions],0
mov edx,[esp+4]
invoke GetFullPathName,edx,1000h,path_buffer,param_buffer
or eax,eax
jz exit_program
mov esi,path_buffer
mov [input_file],esi
mov [symbols_file],0
test [command_flags],2
jz symbols_file_name_ok
mov edi,path_buffer+1000h
mov [symbols_file],edi
mov ecx,eax
rep movsb
mov ecx,eax
xor al,al
stosb
sub edi,2
mov ebx,edi
mov al,'.'
std
repne scasb
cld
je attach_fas_extension
mov edi,ebx
attach_fas_extension:
inc edi
mov eax,'.fas'
stosd
xor al,al
stosb
symbols_file_name_ok:
mov [hfile],0
invoke GlobalAlloc,GMEM_MOVEABLE,1
mov [hmem_display],eax
invoke GlobalLock,[hmem_display]
mov byte [eax],0
invoke GlobalUnlock,[hmem_display]
mov [display_size],1
mov [error_data_size],0
mov [allocated_memory],0
mov eax,[compiler_memory]
shl eax,10
jz out_of_memory
allocate_memory:
mov edx,eax
shr edx,2
mov ecx,eax
sub ecx,edx
mov [memory_end],ecx
mov [additional_memory_end],edx
invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE
or eax,eax
jnz memory_allocated
mov eax,[additional_memory_end]
shl eax,1
cmp eax,4000h
jb out_of_memory
jmp allocate_memory
memory_allocated:
mov [allocated_memory],eax
mov [memory_start],eax
mov [code_start],eax
add eax,[memory_end]
mov [memory_end],eax
mov [additional_memory],eax
add [additional_memory_end],eax
mov [tagged_blocks],0
mov eax,esp
and eax,not 0FFFh
add eax,1000h-10000h
mov [stack_limit],eax
invoke PostMessage,[hwnd_progress],PBM_SETPOS,0,0
invoke SetThreadPriority,[hthread],[compiler_priority]
invoke GetTickCount
mov [start_time],eax
mov [preprocessing_done],0
call preprocessor
invoke PostMessage,[hwnd_progress],PBM_SETPOS,1,0
or [preprocessing_done],-1
call parser
invoke PostMessage,[hwnd_progress],PBM_SETPOS,2,0
call assembler
invoke PostMessage,[hwnd_progress],PBM_SETPOS,3,0
call formatter
invoke PostMessage,[hwnd_progress],PBM_SETPOS,4,0
call show_display_buffer
invoke GetTickCount
sub eax,[start_time]
mov [total_time],eax
mov esi,[output_file]
mov edi,path_buffer
copy_executable_name:
lodsb
stosb
or al,al
jnz copy_executable_name
xor al,al
exit_program:
movzx eax,al
push eax
mov eax,[allocated_memory]
or eax,eax
jz memory_ok
invoke VirtualFree,eax,0,MEM_RELEASE
mov [allocated_memory],0
memory_ok:
mov eax,[hfile]
or eax,eax
jz handle_ok
invoke CloseHandle,eax
handle_ok:
invoke PostMessage,[hwnd_compiler],WM_COMMAND,IDOK,0
call [ExitThread]
get_environment_variable:
invoke GetEnvironmentVariable,esi,string_buffer,1000h
mov ecx,[memory_end]
sub ecx,edi
cmp ecx,1000h
jbe get_local_variable
mov ecx,1000h
get_local_variable:
invoke GetPrivateProfileString,_section_environment,esi,string_buffer,edi,ecx,ini_path
add edi,eax
cmp edi,[memory_end]
jae out_of_memory
retn
open:
mov ebx,edx
invoke WaitForSingleObject,[mutex],-1
invoke CreateFile,ebx,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
cmp eax,-1
je file_error
mov [hfile],eax
mov ebx,eax
clc
retn
file_error:
stc
retn
create:
mov ebx,edx
invoke WaitForSingleObject,[mutex],-1
invoke CreateFile,ebx,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
cmp eax,-1
je file_error
mov ebx,eax
clc
retn
write:
invoke WriteFile,ebx,edx,ecx,bytes_count,0
or eax,eax
jz file_error
clc
retn
read:
mov ebp,ecx
invoke ReadFile,ebx,edx,ecx,bytes_count,0
or eax,eax
jz file_error
cmp ebp,[bytes_count]
jne file_error
clc
retn
close:
cmp ebx,[hfile]
jne close_handle
mov [hfile],0
close_handle:
invoke CloseHandle,ebx
invoke ReleaseMutex,[mutex]
retn
lseek:
movzx eax,al
invoke SetFilePointer,ebx,edx,0,eax
cmp eax,-1
je file_error
clc
retn
display_block:
push edi
push ecx
add ecx,[display_size]
invoke GlobalReAlloc,[hmem_display],ecx,GMEM_MOVEABLE
or eax,eax
jz out_of_memory
mov [hmem_display],eax
invoke GlobalLock,[hmem_display]
add eax,[display_size]
lea edi,[eax-1]
pop ecx
add [display_size],ecx
rep movsb
xor al,al
stosb
invoke GlobalUnlock,[hmem_display]
pop edi
retn
fatal_error:
cmp [hthread],0
je error_outside_compiler
pop [error_message]
error_with_no_source:
mov al,0FFh
jmp exit_program
assembler_error:
cmp [hthread],0
je error_outside_compiler
call show_display_buffer
pop [error_message]
mov ebx,[current_line]
test ebx,ebx
jz error_with_no_source
xor ecx,ecx
get_error_lines:
mov eax,[ebx]
cmp byte [eax],0
je get_next_error_line
test byte [ebx+7],80h
jz error_lines_ok
inc ecx
mov edx,ebx
find_definition_origin:
mov edx,[edx+12]
test byte [edx+7],80h
jnz find_definition_origin
mov eax,[edx+4]
and eax,7FFFFFFFh
push eax
mov edx,[edx]
push edx
get_next_error_line:
mov ebx,[ebx+8]
jmp get_error_lines
error_lines_ok:
inc ecx
mov eax,[ebx+4]
and eax,7FFFFFFFh
push eax
mov edx,[ebx]
push edx
mov ebx,ecx
inc ecx
shl ecx,3
mov [error_data_size],ecx
invoke GlobalAlloc,GMEM_MOVEABLE,ecx
mov [hmem_error_data],eax
invoke GlobalLock,[hmem_error_data]
mov [eax],ebx
invoke GlobalUnlock,[hmem_error_data]
xor ebx,ebx
store_error_lines:
pop edx
invoke GetFullPathName,edx,1000h,path_buffer,param_buffer
inc eax
mov esi,eax
add eax,[error_data_size]
invoke GlobalReAlloc,[hmem_error_data],eax,GMEM_MOVEABLE
invoke GlobalLock,[hmem_error_data]
mov edi,eax
add edi,[error_data_size]
mov ecx,esi
mov esi,path_buffer
rep movsb
pop edx
mov [eax+8+ebx*8+4],edx
sub edi,eax
xchg [error_data_size],edi
mov [eax+8+ebx*8],edi
mov esi,[eax]
invoke GlobalUnlock,[hmem_error_data]
inc ebx
cmp ebx,esi
jb store_error_lines
mov edi,[additional_memory]
cmp [preprocessing_done],0
jne error_in_preprocessed
xor al,al
stosb
jmp instruction_converted
error_in_preprocessed:
mov esi,[current_line]
add esi,16
xor dl,dl
convert_instruction:
lodsb
cmp al,1Ah
je copy_symbol
cmp al,22h
je copy_symbol
cmp al,3Bh
je ignore_preprocessor_symbols
stosb
or al,al
jz instruction_converted
xor dl,dl
jmp convert_instruction
copy_symbol:
or dl,dl
jz space_ok
mov byte [edi],20h
inc edi
space_ok:
cmp al,22h
je quoted
lodsb
movzx ecx,al
rep movsb
or dl,-1
jmp convert_instruction
quoted:
mov al,27h
stosb
lodsd
mov ecx,eax
jecxz quoted_copied
copy_quoted:
lodsb
stosb
cmp al,27h
jne quote_ok
stosb
quote_ok:
loop copy_quoted
quoted_copied:
mov al,27h
stosb
or dl,-1
jmp convert_instruction
ignore_preprocessor_symbols:
xor al,al
stosb
instruction_converted:
sub edi,[additional_memory]
mov ebx,[error_data_size]
lea eax,[ebx+edi]
invoke GlobalReAlloc,[hmem_error_data],eax,GMEM_MOVEABLE
invoke GlobalLock,[hmem_error_data]
mov ecx,edi
mov [eax+4],ebx
lea edi,[eax+ebx]
mov esi,[additional_memory]
rep movsb
invoke GlobalUnlock,[hmem_error_data]
mov al,2
jmp exit_program
error_outside_compiler:
mov esp,[resume_esp]
jmp [resume_eip]
make_timestamp:
invoke GetSystemTime,systime
movzx ecx,[systime.wYear]
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,[systime.wMonth]
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
jbe day_correction_ok
sub ebp,2
movzx ecx,word [systime.wYear]
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:
movzx eax,[systime.wDay]
dec eax
add eax,ebp
mov ebx,24
mul ebx
movzx ecx,[systime.wHour]
add eax,ecx
mov ebx,60
mul ebx
movzx ecx,[systime.wMinute]
add eax,ecx
mov ebx,60
mul ebx
movzx ecx,[systime.wSecond]
add eax,ecx
adc edx,0
retn
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'
include '..\..\tables.inc'
include '..\..\messages.inc'
section '.bss' readable writeable
include '..\..\variable.inc'
allocated_memory dd ?
start_time dd ?
total_time dd ?
display_size dd ?
error_message dd ?
error_data_size dd ?
preprocessing_done db ?