468 lines
8.5 KiB
Plaintext
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 ?
|