diff --git a/DOC_EN.TXT b/DOC_EN.TXT new file mode 100644 index 0000000..ddcd17e --- /dev/null +++ b/DOC_EN.TXT @@ -0,0 +1,45 @@ +Description of functions inside FASM.DLL + +fasm_GetVersion() + Returns double word containg major version in lower 16 bits, and minor version in the higher 16 bits. + +fasm_Assemble(lpSource,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe) + Assembles the given source, using the provided memory block as a free storage space(which is also to contain generated output). + The lpSource should contain a pointer to zero-ended source text(pansichar). + The lpMemory should be a pointer to the memory block and cbMemorySize should contain its size. In the beginning of this memory block the FASM_STATE(TFASM_STATE in Delphi) structure will reside. The assembler doesn't allocate any memory beside this block, if it is not enough for its purposes, the function return FASM_OUT_OF_MEMORY. + The nPassesLimit should be a value in range from 1 to 65536, defining the maximum number of passes the assembler can perform in order to generate the code(the recommended value is 100). If the limit is reached, the function return FASM_CANNOT_GENERATE_CODE. + The hDisplayPipe should contain handle of the pipe, to which the output of DISPLAY directives will be written. If this parameter is 0, all the display will get discarded. + If the assembly is successful, function returns FASM_OK value and fills the output_data and output_length fields of the FASM_STATE structure(which resides at the beginning of provided memory block). + If the assembly failed, function returns one of the other general conditions/errors codes(see "General errors and conditions" in Fasm4Delphi.pas). If if error code is FASM_ERROR, it means that an error caused by a specific place in source occured, then the error_code and error_line fields of FASM_STATE are filled, first one with detailed error code(see "Error codes for FASM_ERROR condition" in Fasm4Delphi.pas), and the second one with pointer to a structure containing data about line that caused the error(see "TLINE_HEADER" in Fasm4Delphi.pas). + +fasm_AssembleFile(lpSourceFile,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe) + This function performs identically to fasm_Assemble, except that it takes the lpSourceFile parameter in place of lpSource, and it shall contain the pointer to zero-ended path to file containing the source to assemble(pansichar). + +******************************************** +Description of structures used in FASM.DLL + + The following structure resides at the beginning of memory block provided to the fasm_Assemble function. The condition field contains the same value as the one returned by function. + When function returns FASM_OK condition, the output_length and output_data fields are filled - with pointer to generated output(somewhere within the provided memory block) and the count of bytes stored there. + When function returns FASM_ERROR, the error_code is filled with the code of specific error(see "Error codes for FASM_ERROR condition" in Fasm4Delphi.pas) that happened and error_line is a pointer to the LINE_HEADER structure, providing information about the line that caused the error. + +TFASM_STATE=record + condition:Int32; + case byte of + 0:(error_code:Int32; + error_line:PLINE_HEADER;); + 1:(output_length:cardinal; + output_data:pointer;); +end; + + The following structure has two variants - it either defines the line that was loaded directly from source, or the line that was generated by macroinstruction. First case has the highest bit of line_number set to 0, while the second case has this bit set. + In the first case, the file_path field contains pointer to the path of source file(empty string if it's the source that was provided directly to fasm_Assemble function), the line_number is the number of line within that file(starting from 1) and the file_offset field contains the offset within the file where the line starts. + In the second case the macro_calling_line field contains the pointer to LINE_HEADER structure for the line which called the macroinstruction, and the macro_line field contains the pointer to LINE_HEADER structure for the line within the definition of macroinstruction, which generated this one. + +TLINE_HEADER=record + file_path:PAnsiChar; + line_number:cardinal; + case byte of + 0:(file_offset:cardinal); + 1:(macro_calling_line:^TLINE_HEADER; + macro_line:^TLINE_HEADER;); +end; \ No newline at end of file diff --git a/DOC_JP.TXT b/DOC_JP.TXT new file mode 100644 index 0000000..caee2f1 Binary files /dev/null and b/DOC_JP.TXT differ diff --git a/DOC_RU.TXT b/DOC_RU.TXT new file mode 100644 index 0000000..516b02d --- /dev/null +++ b/DOC_RU.TXT @@ -0,0 +1,45 @@ +Описание функций FASM.DLL + +fasm_GetVersion() + Возвращает двойное слово(dword) содержащее основную чать версии в младших 16 битах, и подверсию в сташих 16 битах. + +fasm_Assemble(lpSource,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe) + Ассемблирует переданный исходный код, используя переданный блок памяти как рабочее пространство(вывод также будет находиться в нём). + lpSource должен содержать указатель на оканчивающийся нулём(zero-ended?ansi string) исходный код(pansichar). + lpMemory должен содержать указатель на блок памяти,а cbMemorySize должен содержать его размер. Вначале этого блока будет создана структура FASM_STATE(TFASM_STATE в Delphi). Ассемблер не выделяет память вне этого блока, еси её недостаточно функция вернёт FASM_OUT_OF_MEMORY. + nPassesLimit должен быть в диапозоне от 1 до 65536. Он задёт максимальное количество проходов, которые ассемблер может выполнить во время генерации кода (рекомендованая величина 100). Если лимит достигнут, вуткция вернёт FASM_CANNOT_GENERATE_CODE. + hDisplayPipe должен содержать handle pipe'а, в котрорый будет записан вывод на экран. Если это праметр равен 0, весь вывод будет отброшен. + Если ассемблирование пройдёт удачно, функция вернёт FASM_OK и заполнит output_data и output_length в структуре FASM_STATE (которая находится в начале выделнного блока памяти). + Если ассемблирование неудалось, функция вернёт один из других основных кодов ошибок(см. "General errors and conditions" в Fasm4Delphi.pas). Если код ошибки - FASM_ERROR, это значит что ошибка произошла в определённом месте кода, тогда поля error_code and error_line FASM_STATE'а будут заполнены, первое из них будет содержать детальный код ошибки(см. "Error codes for FASM_ERROR condition" в Fasm4Delphi.pas),а вторая - указатель(pointer) на структуру содержащую информацию о строке в котрой произошла ошибка(см. "TLINE_HEADER" в Fasm4Delphi.pas). + +fasm_AssembleFile(lpSourceFile,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe) + Эта функция работает идентично fasm_Assemble, но в отличии от неё принимает параметр lpSourceFile вместо lpSource. Этот параметр должен содержать указатель(pointer) на оканчивающийся нулём(zero-ended?ansi string) путь до файла содержащего исходный код для ассемблироания(pansichar). + +******************************************** +Описание структур используемых FASM.DLL + + Следующая структура находится в начале блока памяти передаваемого в fasm_Assemble. Поле condition содержит тоже значение которое возвращается функцией. + Когда функция возвращает FASM_OK, поля output_length и output_data заполнены указателем(pointer) на результат ассемблирования(он находится внутри блока памяти) и длинной этого блока памяти соответственно. + Когда функция возвращает FASM_ERROR - error_code содержит детальный код ошибки(см. "Error codes for FASM_ERROR condition" в Fasm4Delphi.pas), а error_line - указатель(pointer) на структуру LINE_HEADER, передающую информацию о строке в которой произошла ошибка. + +TFASM_STATE=record + condition:Int32; + case byte of + 0:(error_code:Int32; + error_line:PLINE_HEADER;); + 1:(output_length:cardinal; + output_data:pointer;); +end; + + Следующая структура имеет два варианта - она либо определяет линию, котрая была загружена непосредственно из исходного кода, либо линию,которая была сгенерирована макроинструкцией. В первом случае старший бит line_number'а установлен в 0, в товремя как во втором этот бит установлен в 1. + В превом случае, поле file_path содержит указатель(pointer) на путь до файла с исходным кодом(пустая строка означает, что это исходный код переданный в fasm_Assemble), line_number - номер линии в этом файле(считая с 1), а поле file_offset содержит смешение в файле, на котопом начинается линия. + Во вторм случае поле macro_calling_line содержит указатель(pointer) на структуру TLINE_HEADER для линии, которую вызывает макроинструкция, а поле macro_line содержит указатель(pointer) на структуру TLINE_HEADER для линии, в которой находится макро инструкция, указывающая на текущую. + +TLINE_HEADER=record + file_path:PAnsiChar; + line_number:cardinal; + case byte of + 0:(file_offset:cardinal); + 1:(macro_calling_line:^TLINE_HEADER; + macro_line:^TLINE_HEADER;); +end; \ No newline at end of file diff --git a/FPCTests/fpcunitproject1.lps b/FPCTests/fpcunitproject1.lps index 9c90b9b..fe6d19e 100644 --- a/FPCTests/fpcunitproject1.lps +++ b/FPCTests/fpcunitproject1.lps @@ -8,20 +8,19 @@ - + - + - @@ -33,14 +32,9 @@ - - - - - - - - - + + + + diff --git a/README.md b/README.md deleted file mode 100644 index 5107c1a..0000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -п»їHeaders FASMDll for Delphi/Free Pascal. -Заголовки FASMDll для Delphi/Free Pascal. -Donate: -https://money.yandex.ru/to/410014959153552 \ No newline at end of file diff --git a/Source/Fasm4Delphi.pas b/Source/Fasm4Delphi.pas index 6704693..597f0f9 100644 --- a/Source/Fasm4Delphi.pas +++ b/Source/Fasm4Delphi.pas @@ -1,58 +1,7 @@ unit Fasm4Delphi platform; {Delphi Translation&Tests:Artyom Gavrilov,Vlad Untkin. - -From FASMDLL.TXT: - -Short description of functions inside FASM.DLL - - -fasm_GetVersion() - - Returns double word containg major version in lower 16 bits, - and minor version in the higher 16 bits. - -fasm_Assemble(lpSource,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe) - - Assembles the given source, using the provided memory block as a free - storage space (which is also to contain generated output). - - The lpSource should contain a pointer to zero-ended source text. - - The lpMemory should be a pointer to the memory block and cbMemorySize - should contain its size. In the beginning of this memory block the - FASM_STATE structure will reside (as defined in FASM.ASH). The assembler - doesn't allocate any memory beside this block, if it is not enough for - its purposes, the function returns with FASM_OUT_OF_MEMORY state. - - The nPassesLimit should be a value in range from 1 to 65536, defining - the maximum number of passes the assembler can perform in order to - generate the code (the recommended value is 100). If the limit is reached, - the function returns with state FASM_CANNOT_GENERATE_CODE. - - The hDisplayPipe should contain handle of the pipe, to which the output - of DISPLAY directives will be written. If this parameter is NULL, all - the display will get discarded. - - If the assembly is successful, function returns FASM_OK value and fills - the output_data and output_length fields of the FASM_STATE structure - (which resides at the beginning of provided memory block) with pointer - to the generated output and count of bytes stored there. - - If the assembly failed, function returns one of the other general - conditions as defined in FASM.ASH. If the condition returned is FASM_ERROR, - it means that an error caused by a specific place in source occured, - then the error_code and error_line fields of FASM_STATE are filled, - first one with detailed error code as defined in FASM.ASH, and the second - one with pointer to a structure containing data about line that caused - the error. - -fasm_AssembleFile(lpSourceFile,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe) - - This function performs identically to fasm_Assemble, except that it takes - the lpSourceFile parameter in place of lpSource, and it shall contain the - pointer to zero-ended path to file containing the source to assemble. -} + Donate:https://money.yandex.ru/to/410014959153552} interface @@ -72,7 +21,7 @@ type case byte of 0:(file_offset:cardinal); 1:(macro_calling_line:^TLINE_HEADER; - macro_line:^TLINE_HEADER;); + macro_line:^TLINE_HEADER;); end; PLINE_HEADER=^TLINE_HEADER; {$EXTERNALSYM TLINE_HEADER} @@ -84,7 +33,7 @@ type error_line:PLINE_HEADER;); 1:(output_length:cardinal; output_data:pointer; ); - end; + end; PFASM_STATE=^TFASM_STATE; {$EXTERNALSYM TFASM_STATE} @@ -93,59 +42,59 @@ const // General errors and conditions - FASM_OK =0; //FASM_STATE points to output - FASM_WORKING =1; - FASM_ERROR =2; //FASM_STATE contains error code - FASM_INVALID_PARAMETER =-1; - FASM_OUT_OF_MEMORY =-2; - FASM_STACK_OVERFLOW =-3; - FASM_SOURCE_NOT_FOUND =-4; + FASM_OK =0; //FASM_STATE points to output + FASM_WORKING =1; + FASM_ERROR =2; //FASM_STATE contains error code + FASM_INVALID_PARAMETER =-1; + FASM_OUT_OF_MEMORY =-2; + FASM_STACK_OVERFLOW =-3; + FASM_SOURCE_NOT_FOUND =-4; FASM_UNEXPECTED_END_OF_SOURCE =-5; - FASM_CANNOT_GENERATE_CODE =-6; + FASM_CANNOT_GENERATE_CODE =-6; FASM_FORMAT_LIMITATIONS_EXCEDDED =-7; - FASM_WRITE_FAILED =-8; - FASM_INVALID_DEFINITION =-9; + FASM_WRITE_FAILED =-8; + FASM_INVALID_DEFINITION =-9; //Error codes for FASM_ERROR condition - FASMERR_FILE_NOT_FOUND =-101; - FASMERR_ERROR_READING_FILE =-102; - FASMERR_INVALID_FILE_FORMAT =-103; - FASMERR_INVALID_MACRO_ARGUMENTS =-104; - FASMERR_INCOMPLETE_MACRO =-105; - FASMERR_UNEXPECTED_CHARACTERS =-106; - FASMERR_INVALID_ARGUMENT =-107; - FASMERR_ILLEGAL_INSTRUCTION =-108; - FASMERR_INVALID_OPERAND =-109; - FASMERR_INVALID_OPERAND_SIZE =-110; - FASMERR_OPERAND_SIZE_NOT_SPECIFIED =-111; - FASMERR_OPERAND_SIZES_DO_NOT_MATCH =-112; - FASMERR_INVALID_ADDRESS_SIZE =-113; - FASMERR_ADDRESS_SIZES_DO_NOT_AGREE =-114; + FASMERR_FILE_NOT_FOUND =-101; + FASMERR_ERROR_READING_FILE =-102; + FASMERR_INVALID_FILE_FORMAT =-103; + FASMERR_INVALID_MACRO_ARGUMENTS =-104; + FASMERR_INCOMPLETE_MACRO =-105; + FASMERR_UNEXPECTED_CHARACTERS =-106; + FASMERR_INVALID_ARGUMENT =-107; + FASMERR_ILLEGAL_INSTRUCTION =-108; + FASMERR_INVALID_OPERAND =-109; + FASMERR_INVALID_OPERAND_SIZE =-110; + FASMERR_OPERAND_SIZE_NOT_SPECIFIED =-111; + FASMERR_OPERAND_SIZES_DO_NOT_MATCH =-112; + FASMERR_INVALID_ADDRESS_SIZE =-113; + FASMERR_ADDRESS_SIZES_DO_NOT_AGREE =-114; FASMERR_DISALLOWED_COMBINATION_OF_REGISTERS =-115; - FASMERR_LONG_IMMEDIATE_NOT_ENCODABLE =-116; - FASMERR_RELATIVE_JUMP_OUT_OF_RANGE =-117; - FASMERR_INVALID_EXPRESSION =-118; - FASMERR_INVALID_ADDRESS =-119; - FASMERR_INVALID_VALUE =-120; - FASMERR_VALUE_OUT_OF_RANGE =-121; - FASMERR_UNDEFINED_SYMBOL =-122; - FASMERR_INVALID_USE_OF_SYMBOL =-123; - FASMERR_NAME_TOO_LONG =-124; - FASMERR_INVALID_NAME =-125; - FASMERR_RESERVED_WORD_USED_AS_SYMBOL =-126; - FASMERR_SYMBOL_ALREADY_DEFINED =-127; - FASMERR_MISSING_END_QUOTE =-128; - FASMERR_MISSING_END_DIRECTIVE =-129; - FASMERR_UNEXPECTED_INSTRUCTION =-130; - FASMERR_EXTRA_CHARACTERS_ON_LINE =-131; - FASMERR_SECTION_NOT_ALIGNED_ENOUGH =-132; - FASMERR_SETTING_ALREADY_SPECIFIED =-133; - FASMERR_DATA_ALREADY_DEFINED =-134; - FASMERR_TOO_MANY_REPEATS =-135; - FASMERR_SYMBOL_OUT_OF_SCOPE =-136; - FASMERR_USER_ERROR =-140; - FASMERR_ASSERTION_FAILED =-141; + FASMERR_LONG_IMMEDIATE_NOT_ENCODABLE =-116; + FASMERR_RELATIVE_JUMP_OUT_OF_RANGE =-117; + FASMERR_INVALID_EXPRESSION =-118; + FASMERR_INVALID_ADDRESS =-119; + FASMERR_INVALID_VALUE =-120; + FASMERR_VALUE_OUT_OF_RANGE =-121; + FASMERR_UNDEFINED_SYMBOL =-122; + FASMERR_INVALID_USE_OF_SYMBOL =-123; + FASMERR_NAME_TOO_LONG =-124; + FASMERR_INVALID_NAME =-125; + FASMERR_RESERVED_WORD_USED_AS_SYMBOL =-126; + FASMERR_SYMBOL_ALREADY_DEFINED =-127; + FASMERR_MISSING_END_QUOTE =-128; + FASMERR_MISSING_END_DIRECTIVE =-129; + FASMERR_UNEXPECTED_INSTRUCTION =-130; + FASMERR_EXTRA_CHARACTERS_ON_LINE =-131; + FASMERR_SECTION_NOT_ALIGNED_ENOUGH =-132; + FASMERR_SETTING_ALREADY_SPECIFIED =-133; + FASMERR_DATA_ALREADY_DEFINED =-134; + FASMERR_TOO_MANY_REPEATS =-135; + FASMERR_SYMBOL_OUT_OF_SCOPE =-136; + FASMERR_USER_ERROR =-140; + FASMERR_ASSERTION_FAILED =-141; {$IFDEF FasmStaticLink} function fasm_GetVersion:TFasmVersion;stdcall;external FASMDLLName; @@ -175,7 +124,7 @@ procedure LoadFASM(Name:string=FASMDLLName); begin if &Library<>0 then FreeFasm; -{$IFDEF FPC} +{$IFDEF FPC} &Library:=LoadLibrary(PChar(Name)); Pointer(fasm_GetVersion):=GetProcAddress(&Library,'fasm_GetVersion'); Pointer(fasm_Assemble):=GetProcAddress(&Library,'fasm_Assemble'); @@ -196,7 +145,7 @@ fasm_GetVersion:=nil; fasm_Assemble:=nil; fasm_AssembleFile:=nil; &Library:=0; -end; +end; {$ENDIF} end. diff --git a/Tests/Tester.dproj b/Tests/Tester.dproj index 31127ce..4383883 100644 --- a/Tests/Tester.dproj +++ b/Tests/Tester.dproj @@ -1,7 +1,7 @@ п»ї {4DB29771-5426-49E7-B0D8-B77F95D4EDCE} - 18.2 + 18.3 None Tester.dpr True