/* HLA Modification History: v1.22: Started maintaining this info here (was on Webster, previously). 7/5/2000- Corrected a problem with pass by result & val/result parameters in a nested function. 7/12/2000- Modified lookup so that it allocates the lower case ID on the stack rather than the heap. This cleaned up some unrelated (though not found yet) problems. Also added a kludge to the "Anyexpr:UndefID" production; removed a call to "FREE2" in order to solve a prgm crash defect. 7/13/2000- Corrected a defect in the array.index macro. It incorrectly checked for an array bounds violation in standard arrays. Added the ability to use TYPE names and anonymous variables in the array compile-time functions (e.g., @Arity, @NumElements, and @dim). 8/3/2000- Added #includeOnce directive to the language. 10/3/2000- Corrected a defect dealing with forward static constant references in class procedures, iterators, and methods. Also corrected a defect when "this." was followed by an undefined symbol (NULL pointer error). 10/5/2000- Fixed a defect in CopySymbols. It was not duplicating the StaticName field and this created problems with overridden methods during assembly (changes to the StaticName field were reflected in all methods that overrode the original method since they all shared the same static name). 10/10/2000- Fixed several defects related to dangling pointers. The Class code assumed that the "hidden" local symbol table entry for a procedure/method name had a unique StaticName field and this wasn't the case. Freeing this storage created problems. 10/13/2000- Modified ClassifyLookup routine to handle references of the form "this.XXXX" in compile-time functions. Also fixed a defect with FORWARD variable and type declarations (e.g., type XXX:FORWARD(YYY);). Previous code mistakenly assigned text "YYY" to XXX rather than "XXX" to YYY. 10/28/2000- Added support for MMX Instructions. 11/28/2000- Modified Namespaces to allow an extension of an existing namespace by simply specifying the existing namespace identifier in a new NAMESPACE..END block. Corrected a problem with the ALIGN directive in RECORD and UNION declarations. Also enhanced ALIGN in RECORDs and UNIONs: if it appears at the end of the record or union declaration, then HLA pads the record/union size to the next boundary specified by the ALIGN operand. Also corrected a defect dealing with the emission of record constants when the ALIGN directive was present in the record definition. Updated the time.timerec and date.daterec types in the datetime.hhf module to include aliases for the m/d/y and h:m:s fields (to make input a little easier). 12/2/2000 Fixed a problem with code generation when passing an indexed static variable by reference. Added GET macro to fileio namespace. Added fileio.append, fileio.rewind, fileio.seek, fileio.rSeek, fileio.Position, fileio.copy, fileio.move, fileio.truncate, fileio.size, fileio.delete, fileio.cd, and fileio.gwd functions to the standard library. ***** Version 1.22 Release Occurred Here ******** 12/8/2000 Corrected a problem with the code generation for the external __imp__MessageBoxA@16 declaration (used for exception handling). Changed "EXTERN" to "EXTERNDEF on output so you don't have to link with MS' library if you're writing a DLL or code that links with some other language (i.e., no HLA main program). ***** Version 1.23 Release Occurred Here ******** 12/14/2000 Added the @trace pseudo-variable to emit trace code in the HLA output as a sort of "poor-man's" debugging facility. Also cleaned up several other internal things inside HLA. Tweaked the GET and PUT macros in fileio. stdout, and stdin so that they do not emit trace calls in the macro expansion. 12/24/2000 Completed BITS module in the standard library and added it to the build. ***** Version 1.24 Release Occurred Here ******** 12/29/2000 Corrected problems with some MMX instructions (EMMS crashed and instrs did not support anonymous memory references). 12/30/2000 Added untyped pass by reference parameters (var x:var). Moved ?abstract exception handler out of main code (automatically generated by the compiler) and placed it in its own library routine (to allow user modification). Modified the compiler so that it doesn't automatically emit exception handling code. All the exception handling routines were added to the HLA Standard Library. Added the @exceptions pseudo-variable to control the emission of the exception handling code (if @exceptions is true, HLA calls the full exception handling package in the library, if false, HLA calls a minimal, truncated version). The work with exceptions was done to allow the user to write their own exception handling code. Fixed a problem with memory corruption when executing CMP( anonmem, &pointerconst); Modified the PEA instruction to emit better code. 1/1/2001 Corrected a defect in the compilation of anonymous memory objects passed as VAR parameters to a procedure. Added SEGMENT declaration section. 1/2/2001 Added #code, #static, #readonly, #storage, and #const directives to let the user rename the HLA segments. Modified the compiler to output ".link" files and modified HLA.C to use the .link files (they contain segment definitions). Did some internal clean up of the code. 1/3/2001 Got rid of anonymous union fields in datetime.hhf records. Changed segment names to _TEXT, _DATA, _BSS, readonly, and CONST. Mapped _TEXT to .text, _data to .data, _BSS to .bss, and CONST to .data during link. Changed segment alignment to PARA. Add "-m" option to HLA (create map file). 1/4/2001 Removed PEA and SET (extended syntax) instructions. 1/6/2001, 1/7/2001 Reorganized the HLAPARSE.BSN file, removing more than 30,000 lines of code (without any significant feature loss). Modified the build to allow more stack space at run-time. Modified the parsing of the string instructions. Changed SETcc and Jcc instruction parsing. ***** Version 1.25 Release Occurred Here ******** 2/1/2001 * Rewrote the boolean expression parser for HLA HLL statements. * Added Conjunction (AND), Disjunction (OR), and NOT (!) operators. * Modified the compiler to emit data and external/public declarations to separate files that the assembler can include during the assembly phase. * Changed the output segment declarations to use the "simplified segment directives" by default (to improve compatibility with other languages). * Began moving code generation statements from the Bison file to the "output.c" file in hopes of localizing the code generation to make it easier to emit code for other assemblers. * Added the TASM compatible output mode to HLA's code generator. * Corrected a defect dealing with duplicate symbols in the static section that were declared to be arrays. * Corrected several problems with passing parameters (especially constant array parameters). * Improved the efficiency of several parameter code generation sequences. * Eliminated several code generation sequences that would yield operands like "dword ptr (byte ptr xxxx)" in hopes of improving portability to other assemblers. * Removed a pair of extraneous pops from the u16ToStr function. * Completely redid the command line processing for HLA.EXE and HLAPARSE.EXE (many new command line options were added). * Modified the compiler to emit PUSHD and PUSHW instructions only with constant operands. * Began modifying the compiler to emit " ptr" before all memory operands (even if not strictly necessary). * Corrected a defect that erroneously produced an error if a local symbol was spelled the same as a global symbol except for alphabetic case. * Also corrected a defect dealing with errorneous errors if a record/union field was spelled the same as a global symbol except for case. * Corrected a defect associated with local/global symbol name conflict (case neutrality) between the parameters of an externally declared procedure that was defined locally and a global symbol. * Corrected a defect associated with the output of string objects in record constants. * Modified exception handler's call to MessageBox so that the window is always topmost. * Added a "constant folding" optimization on strings: HLA now only emits a single copy of each unique string to the *.consts.inc file. * Improved code generation when passing small array constants as parameters. * Started code generation for GAS and NASM assemblers. * Added CDECL, PASCAL, and STDCALL options to procedures. * Modified compile-time uns8, uns16, byte, and word functions to clear the H.O. bits of their operand. * Modified the compile time int8 and int16 instructions to set the H.O. bits of their operand if they are negative or clear the H.O. bits if they are positive. * Added anonymous records to unions. * Added support for "readonly undefID: pointer to userType; external;" * Added support for "readonly undefID: pointer to builtinType; external;" * Eliminated the DATA declaration section (use NOSTORAGE option on declarations in the STATIC section instead). * Replaced "long double" operations in C with calls to a real80 floating point package written in assembly to allow portability to other compilers (e.g., VC++ and GCC). * Corrected a defect with the comparison of two static constants (e.g., " &xyz = &xyz ") that didn't take into account the fact that HLA generates different internal names for each instance of the same static constant. * Changed "=" to "==" when checking for EOS in the @WSorEOS function. Ditto in @WSthenEOS. * Corrected the fact that HLA v1.25 did not report an error when you used an expression like << if(strvar = "" ) then >> which should be illegal (string constants are memory objects). * Corrected a defect in @peekWS - it was not returning the proper extracted string. Ditto for @EOS. * Made several corrections in the program where the code assumed that "isdigit" returned 0 or 1 (it returns 0/not 0). * Corrected a defect in counting lines in the #text..#endtext section. * Eliminated a spurious "PRINTF" from matchmemfunc. * Removed @memory pattern matching function (because it was never documented, it didn't work properly, and it was a lot of code). * Removed *isexpr for the same reasons as above. * Corrected a defect in the @IsMem function (it was erroneously calling FreeAdrs). * Corrected a defect that caused a seg fault when attempting to call the thunk associated with a pass by name or lazy evaluation parameter. * Corrected a problem when attempting to call an pass by name or pass by lazy parameter using an index after the name. * Corrected the problem with calling procedure pointers within a class (was indexing off EDI rather than ESI). * Fixed a defect that caused a seg fault when attempting to call a procedure pointer that was a class member with an index attached to it. * Corrected a system crash that occurs when the code attempts to call certain non-procedure objects. * Corrected a defect when calling a procedure indirectly through a variable declared with a type name. The procedure type had a parameter list. The code was not using the proper pointer to the procedure list in the symbol table. * Fixed a crash that occurs when calling a class procedure when using instruction composition. * Corrected a problem with the BOUND instruction complaining about a range error when the range was fine. * Moved BOUND instruction constant output from the ReadOnly segment to the constants segment. * Corrected a problem with checking for the bounds of a character value in a character set constant with a range of characters. * Corrected a defect with the addressing modes "[reg][const]", "[reg+reg*n][const]", and "[reg][reg*n][const]". * Corrected a segment fault that occured when passing parameters to a class procedure that doesn't exist. * Modified emitted labels to use a "$" prefix rather than a "?" prefix (to help with Gas compatibility). * Corrected a defect in the @Class compile-time function (it was not returning the class of the correct symbol). * Corrected a defect in the @size function when computing the size of an object involving type coercion. * Corrected a crash that occurred when attempting to use @typename on a register. * Fixed a type for tstralloc in the memory.hhf header file. * Corrected a defect in fdlcw to allow anonymous memory operands. * Corrected a problem with pat.zeroOrMorePat, pat.oneOrMorePat, and pat.pattern that prevented them from setting up EBX to properly extract their strings. * Corrected pat.zeroOrMorePat, pat.oneOrMorePat, and pat.pattern so that they actually work (changed their syntax to use multi-part macros, too). * Added bSize, wSize, dSize, and qSize functions to the standard library. * Corrected a defect in u8ToStr that caused it to modify the value of EDX on return. * Added -D (define) command line option. ***** Version 1.26 Release Occurred Here ******** ***** Skipped Version 1.27 because I accidentally released version 1.26 with the v1.27 version number ****** 7/21/2001 * Corrected bad spelling of putcSize procedure (was putcsize). 7/22/2001 * Corrected problem with underscore output in conv.dToStr procedure. * Corrected fputq to use the proper field width if underscores is true. * Corrected problem with underscore output in conv.qToStr procedure. * Added "fill" and "size" parameters to fputtb call. * Corrected problem with underscore output in conv.tbToStr procedure. 7/24/2001 * Fixed a problem that caused a crash when attempting to use a pointer to a record type (rather than the record type) in a type coercion operation. * Fixed the output of an array of pointers initialized with the NULL constant. * Corrected a code generation problem that occurred when passing a pointer as a var parameter and the base type of the pointer did not match the base type of the var parameter. 7/28/2001 * Modified error message for "missing colon" to suggest that the cause might be an undefined identifier. 9/12/2001 * Modified HLA.C to put quotes around user-supplied filenames in command line arguments to handle the case where the pathnames contained interior spaces. ***** Version 1.28 Release Occurred Here ******** 9/28/2001 * Corrected a defect in fileio.pute80 (it was pushing too many parameters in the call to conv.e80ToStr). * Added str.index2/str.rindex2 functions to the standard library. * Added str.chpos2/str.rchpos2 functions to the standard library. * Modified prototypes for string comparisons to use "AL" as the RETURNS value rather than EAX (for use in boolean expressions). * Modified the compiler to handle filenames that contain paths to a file (removed the paths from the "include" directive emitted by the compiler). * Added str.prefix/str.prefix2 functions to the standard library. 9/29/2001 * Added a check for NULL pointers to the cs.strToCset function. * Added a cs.strToCset2 procedure to the standard library. * Added a check for NULL pointers to the cs.removeStr function. * Added a cs.removeStr2 function to the standard library. * Added a check for NULL pointers to the cs.unionStr function. * Added a cs.unionStr2 function to the standard library. * Modified prototype for str.init to pass byte array as an untyped VAR parameter rather than BYTE. * Added conv._bsize function and modified the conv.bsize function to take a BYTE parameter. * Added conv._wsize function and modified the conv.wsize function to take a WORD parameter. * Added conv._dsize function and modified the conv.dsize function to take a DWORD parameter. * Added conv._i8size function and modified the conv.i8size function to take an int8 parameter. * Added conv._i16size function and modified the conv.i16size function to take an int16 parameter. * Added conv._i32size function and modified the conv.i32size function to take an int32 parameter. * Added conv._u8size function and modified the conv.u8size function to take an uns8 parameter. * Added conv._u16size function and modified the conv.u16size function to take an uns16 parameter. * Added conv._u32size function and modified the conv.u32size function to take an uns32 parameter. * Modified HLA.c to use only the ".link" file of the first ".HLA" source file appearing on the command line. ***** Version 1.29 Release Occurred Here ******** 9/29/2001 * Corrected an error in the "USAGE" message output of hla.c. 11/03/2001 * Corrected a defect associated with using INHERITS in records and classes (couldn't refer to types outside the record during the record's declaration). Corrected by duplicating inherited fields rather than just linking. * Added the OVERRIDES keyword to override inherited field declarations in the current record or class. ***** Version 1.30 Release Occurred Here ******** 11/04/2001 * Corrected a defect dealing with nested anonymous records and unions. * Allowed pointer constants as operands of user-defined pointer types in static and readonly sections, e.g., ptrType &ptrConst 12/04/2001 * Corrected a defect with Case Neutrality and updated several standard library and example program names that failed case neutrality. Probably reintroduced the defect the changes in HLA v1.25 attempted to correct, but that was a smaller problem. * Implemented a different solution to catch case-neutrality errors. 12/05/2001 * Corrected an assertion fault that occurred when attempting to access a field of a symbol that doesn't have any fields. 12/07/2001 * Corrected a problem with the computation of field offsets in anonymous records and unions. * Corrected a couple of defects with the way ALIGN worked in anonymous records and unions. 12/08/2001 * Corrected a problem with operator precedence in memory index expressions. Previously, [ebx-a+b] was calculated as [ebx-(a+b)]. Modified it to correctly compute it as [ebx + (-a) + b]. * Corrected a major defect in the str.cat standard library procedure (it was copying too much data when concatenating strings). 02/12/2002 * Modified str.substr and str.a_substr so that they properly zero- terminated the strings they extract. * Modified prototypes for str.tokenize and str.tokenize2 so that they use an untyped variable type for the destination array. 02/13/2002 * Corrected a defect that crashed HLA when passing an untyped VAR parameter as a parameter that is also an untyped var parameter. 02/16/2002 * Added "frame", "display", "alignstack", and "use" procedure options. Added #frame, #noframe, #display, #nodisplay, #alignstack, and #nostackalign directives. Added code to support "use" option and optimize certain parameter passing code sequences. * Modified "call ;" so that it allows undefined statement labels. * Added "label" declaration section to support forward referenced statement labels. * Changed "noalignstk" to "noalignstack" 02/17/2002 * Corrected a problem with macro parameter/local symbol lookup. * Cleaned up parameters to hundreds of function calls to allow compilation with GCC (preparation for port to Linux). 02/20/2002 * Corrected a defect in the way the exception handler record was built on the stack (affected coroutine operation). * PUSHD( &mem ); compiled incorrectly, fixed this. 02/21/2002 * Changed display, alignstack, frame, and use to @display, @alignstack, etc. Added @noalignstack, @nodisplay, etc. (left original reserved words, though they are depreciated). Also added @cdecl, @pascal, and @stdcall. * Added #openwrite, #write, #closewrite, #openread, and #closeread compile-time statements and the @read compile-time function. * Added #enter, #noenter, #leave, and #noleave directives. Also added @enter, @noenter, @leave, and @noleave procedure options. 03/07/2002 * Added "@{ numset }" numeric set for creating dword values as a set of bits. * Certain static array declarations with initializers weren't checking to make sure the array constant had the same number of elements as the declaration. Corrected this defect. * When there was a previous (external/forward) array declaration, the code did not check to make sure the number of elements were the same in the declaration and the definition. * Cleaned up the source code a little bit (merged common code). 03/08/2002 * Modified type checking to allow the assignment of an array of pointers to a dword array. * Modified HLL.HHF's SWITCH definition to specify the proper number of array elements in the jump table for the SWITCH statement. * Corrected a defect in _utoEvars.hla (numeric to English conversion tables). * Modified type checking to allow pointers and dwords to be compatible. * Corrected a type error in the str.strvar macro (strings.hhf). 03/09/2002 * Fixed a problem with compile time functions that allowed built-in type names as parameters (used to fail if inside a namespace). * Corrected some problems with namespace symbol table searches. ***** Version 1.32 Release Occurred Here ******** (note that 1.31 was an interim release) 03/15/2002 * Fixed a size computation that produced the wrong value when computing the size of an array that had been previously declared as external. * Modified definitions for NULL and NIL in memory.hhf so that they were of type DWORD rather than uns32 (to be compatible with pointer types). * Corrected a defect in the code generation for the "elseif" statement (bad target label emission). 03/17/2002 * Fixed a code generation problem with "intmul( mem, reg);" 03/20/2002 * Corrected a bug that crashed HLA if you passed an intermediate variable by reference without a base register. This fix also corrected a few other problems that occurred when there were errors passing a parameter to a procedure. * Modified assertion macro to emit filename and line number when an assertion fails. 03/22/2002 * Changed macro->#macro, keyword->#keyword, terminator->#terminator, and endmacro->#endmacro. Eliminated nodisplay, noframe, noenter, noleave, nostackalign, nostorage, use, display, etc. (must now use the options @nodisplay, @nostorage, @noframe, etc.). * Updated existing library and example code to eliminate references to the eliminated reserved words (above). * Corrected a code generation problem in "elseif(#{ stmts }#) then..." (was generating a bad label). * Corrected a bad external name (link problem) in the coroutines package. * Corrected code generation for pointers in the BSS segment. * Fixed a problem with LEA code generation. * Corrected a problem with comment emmission to the output file. 03/23/2002 * Did a range check on the upper and lower bounds of boolean expressions of the form "reg in lower..upper" and "reg not in lower..upper" 03/27/2002 * HLA was not parsing MMX Shift instructions correctly. Corrected HLA so that it now handles immediate shift constants correctly and does not allow a memory operand as the shift count. * Dropped the requirement of a semicolon (";") after the #endmacro to make #endmacro more in line with other compile-time statements (note that you can still put a semicolon there because semicolons are optional in the declaration section). * Added "external" clause to label declarations. 03/28/2002 * Corrected a problem with the processing of procedure parameters (crashed when certain types weren't correct; also had problems dealing with anonymous procedure parameter declarations). 03/29/2002 * Added support for the following instructions: arpl, clts, cmpxchg8b, hlt, invd, invlpg, lar, lds/les/lfs/lgs/lss (32-bit versions only), lidt, lgdt, lldt, lock.add, lock.adc, lock.and, lock.btc, lock.btr, lock.bts, lock.cmpxchg, lock.dec, lock.inc, lock.neg, lock.not, lock.or, lock.sbb, lock.sub, lock.xor, lock.xadd, and lock.xchg Note: LMSW and SMSW are obsolete 286 instructions and were left out of the above set 'by design.' 03/30/2002 * Added support for the following instructions: lsl, mov w/segregs 03/31/2002 * Added support for the following instructions: push segregs, rdmsr, rdpmc, rsm, sgdt, sidt, sldt, str, ud2, verr, verw, and wbinvd. 04/01/2002 * Added support for addressing modes of the forms: [reg32*scale], [reg32*scale+disp], and [reg32*scale][disp] (these modes are mainly useful in conjunction with the LEA instruction. 04/06/2002 * Removed #display/#nodisplay, #alignstack/#noalignstack, #frame/#noframe, #enter/#noenter, and #leave/#noleave statements and replaced them by the use of the compile- time variables @display, @nodisplay, @alignstack, @noalignstack, @frame, @noframe, @enter, @noenter, @leave, and @noleave. ***** Version 1.33 Release Occurred Here ******** 04/10/2002 * Corrected a problem with #ASM..#ENDASM not working properly in macros and #while loops. 04/11/2002 * Corrected a problem with the use of int32 values in array indexes in the compile-time language. 04/16/2002 * Corrected a defect in namespaces (wasn't properly checking for forward pointer references). * Added @returns, @forward, @external, and @align as synonyms for returns, forward, external, and align in preparation for eliminating the non-@ identifiers later on. * Added @locals function that returns fieldnames and local names for records, unions, and procedures/methods/iterators. * Corrected a problem with forward referenced pointers spanning namespace declarations. * Added filename field to RefListType so HLA could print the filename along with the line number when a forward pointer isn't resolved (the line number can be in a different file when the error message is finally displayed). * Removed support for ID`suffix symbols since "`" is used for a different purpose in HLA v2.0. 04/17/2002 * Added field alignment option to records. 04/19/2002 * Added lex level support to records and unions to eliminate a problem that occured when a nested record/union had a fieldname that was the same as the nesting record/union. * Corrected a problem with the @locals function and records/unions (was listing fieldnames in the reverse order). * Added '+=' and '-=' operators to compile-time language. ***** Version 1.34 Release Occurred Here ******** 04/22/2002 * Record constant parsing wasn't correctly reporting some type errors. Corrected this. * #print was printing byte, word, dword, etc., as decimal. Corrected this. * Added the ability to assign an arbitrary pointer constant to a string field of a record constant. * Complete workover (just short of a complete rewrite) of the record and union code in the compiler. HLA v1.34 changes broke a few things and the 1.34 modifications also exposed a *ton* of problems in the prior code. Hopefully, these changes have taken care of most of the problems. Major changes included handling negative starting offsets better, handling the alignment directives better, and properly counting fields better. 04/23/2002 * Added the ability to support record alignment and initial offset assignment in the same declaration ( e.g., x:record[4:4] :=4;) * Added the ability to specify record alignment option in an anonymous record nested within a union. * Eliminated the ability to create bare enumeration objects inside a record (e.g., x:record e:enum{a,b,c}; endrecord;) This was problematic because the enum constants became fields of the record and this creates problems down the road. It would have been a *big* pain to move the enum constants out of the record's field list, so I decided to drop this feature since it *never* gets used anyway (one can always create the enum type external to the record and make the field that enum type). * Added str.constant macro to the HLA Standard Library. ***** Version 1.35 Release Occurred Here ******** 04/23/2002 * Added @string:0 token to allow the initialization of NULL strings. 04/24/2002 * Removed @string:0 and replaced it with the more generic NULL token (useful for all pointer types, not just strings). Removed the declarations for NULL and NILL from the memory.hhf header file. Also cleaned up a lot of code to avoid printing "offset" or "offset32" (assembler-dependent) when specifying the NULL pointer as an operand (worked fine before, but just to be safe...). * Added @parms compile-time function that returns the number of parameter bytes for it's procedure operand. * Changed @locals to @localsyms (given @parms above, @locals suggests that it returns the number of bytes of local variables). * Corrected a (serious) defect where HLA was miscalculating the offsets of less-than-dword typed parameters. 04/29/2002 * Corrected a bug in the CMOVcc( mem,reg) instruction (wasn't comparing operand sizes properly). 04/30/2002 * Floating point instructions of the form "fadd()", "fsub()", "fmul()" etc were broken (required "faddp()", "subp()", "fmulp()", etc.). Corrected this problem. 05/01/2002 * Corrected a problem with @matchIntConst, @matchRealConst, and @matchNumericConst dealing with strings that did not end with the numeric value being checked. 05/02/2002 * Procedure pointer types were not correctly storing parameter/local variable information in the symbol table. This caused an assertion failure when creating instances of the procedure types. Corrected this problem. 05/04/2002 * Modified trim, a_trim, delspace, and a_delspace to remove tabs as well as spaces. ***** Version 1.37 Release Occurred Here ******** 05/08/2002 * Eliminated "copyright" message from HLA.EXE (since this is a public domain program). * Merged the ReadOnly and Const sections into the .text section in order to reduce EXE file size under Windows (this was already the case under Linux). 05/09/2002 * Corrected a defect with passing large parameters by value (calculated parameter size incorrectly). 05/10/2002 * Fixed several defects related to the declarations of labels in the label section. Also corrected lots of problems with external labels. * Corrected a defect concerning inherited fields in a record. * A few memory,const instructions weren't checking the memory operand size to verify it was 8, 16, or 32 bits. Corrected this. 05/14/2002 * Added the @basereg pseudo-variable that lets a programmer set the base register used for automatic (VAR) variables. (Default is EBP, only allows EBP and ESP.) * Corrected a defect in the "var := expr;" declaration (offset seemed to get stuck on the value of expr). * In record alignment syntax ("[max:min]") if the minimum value was greater than the maximum value, the code wasn't properly swapping the values. Corrected this. * In VAR section, a dcl of the form "p:pointer to procedure abc;" did not calculate the offset of the pointer variable properly. Corrected this. * Completely reworked the alignment options in the VAR section. Now they match the syntax and semantics of the alignment/offset assignment for records. * Corrected a problem with constant div and mod operators. They were not allowing 64-bit or 128-bit operands. * Corrected a defect in CoerceArrays that was overwriting symbol table information and causing type checking to fail. 05/15/2002 * Put in checks for decimal, binary, and hexadecimal overflow when processing numeric literal constants. * HLA was using the wrong "size" field when determining how many dwords to push for a constant actual parameter. Corrected this. * HLA was computing the size of a constant array element incorrectly. Corrected this. 05/17/2002 * Corrected a problem concerning the linenumber maintanence in the #while loop. * Allowed the use of any 16-byte or 8-byte value where LWord or QWord parameters are specified. * Corrected code emission for initialized LWord objects * Modified HLA to allow hex types to be passed as reference parameters as long as the formal parameter is the same size; also allowed any parameter the same size as the formal parameter to be passed by reference as long as the formal parameter is a hex type (byte, word, dword, qword, lword). * Corrected a defect whereby HLA was using the size of a reference parameter (four bytes) rather than the size of the base type to determine if it could pass a dword object in place of a four-byte object. * Corrected a type checking defect (int64 == uns64 wasn't being handled correctly). 05/18/2002 * Added the (desparately needed) #FOR loop to the compile-time language. Provided three forms: #for( v := s to e ), #for( v := s downto e ), and #for( v in expr ). 05/20/2002 * Implemented union constants in HLA. ***** Version 1.38 Release Occurred Here ******** 06/03/2002 * Implemented a hash table lookup function when dealing with namespaces to speed up compilations involving huge namespaces (e.g., Windows and Linux dcls). 06/04/2002 * Radically reworked the symbol table search code to speed it up a little bit (overall performance gain in HLA was about 25%). 06/05/2002 * Improved diagnostic message when the user doesn't pass enough parameters to a macro. 06/21/2002 * Parameter type checking was computing the size of a formal parameter incorrectly. Corrected this. * The -dID command line option didn't allow identifiers that contained digits. Corrected this. 07/07/2002 * Added additional UNICODE support ( u'c' and u"sss" plus support for UNICODE in the constant expression evaluator). * Added the use of the VAL keyword to specify that HLA should use an actual value of a reference parameter rather than taking the address of that actual parameter (e.g., for untyped reference parameters). * Corrected a problem with code emission for floating point instructions involving integer operands (needed to output size). ***** Version 1.39 Release Occurred Here ******** 08/15/2002 * Added support for hash table lookup in namespaces to speed up the assembler when processing large header files (e.g., Windows header files). 09/29/2002 * Corrected a problem with the WHILE statement when using the hybrid syntax (bad code generation because of illegal generated labels). * Added the ability to use the '&' (static address-of) operator on class procedures, methods, and iterators. 10/20/2002 * Corrected yet another code generation problem due to the boolean expression "file backup" kludge in the compiler. * Also fixed the str.eq and str.ne functions that didn't compute their values properly. ***** Version 1.40 Release Occurred Here ******** 11/28/2002 * Corrected a problem with bad offset computations in anonymous records appearing within anonymous unions. * Corrected anonymous unions to respect the ALIGN directive appearing immediately before the anon union. 11/29/2002 * More work getting offsets in anonymous unions and records to work properly. 12/1/2002 * Took out the "@use eax;" options from the standard library include files (because if someone specified EAX as a parameter the code would break). * Fixed _uns64Size function because it failed with 19 digit values. ***** Version 1.41 Release Occurred Here ******** 1/12/2003 * Fixed a minor problem with EmitExtern. In one place in the code it was using a symbol's TrueName rather than its StaticName (generally worked fine, but...). Also, redid the EmitExtern call to pass a symbol table entry rather than a string (now uses the StaticName field for the string). * Added code to emit extern/externdef declarations only if there is a reference to the symbol in the code (because some assemblers, like FASM, will tell the linker to link in some code containing an extrn symbol, even if you never reference the symbol). 1/15/2003 * Eliminated a couple of references to the "strings" and "cseg" sections in the exception handling code that resulted in shaving 8K off the size of the .EXE file. 2/1/2003 * Modified several standard library routines to correct defects. Allowed the use of EOF (as documented) to terminate numeric input values. Corrected a bug in fileio.gwd (wasn't saving path length properly and didn't calculate string overflow properly). * Incorporated corrections to frewind, fposition, fseek, frseek, and feoln in the Linux version of these library functions as as submitted by Mark de Wever. 2/4/2003 * Corrected a defect in @typename. It was not outputting "pointer to " for pointer types. 2/12/2003 * Fixed a type checking problem. Previously, HLA allowed you to (incorrectly) call a procedure field of a record via a pointer variable to that record object. * Corrected a problem with the LEA( reg, const ); stmt. * Noted the following defect: pointer to a type in a namespace, e.g., pointer to w.SomeType, fails because lookup isn't aware of the use of the w namespace. Can't fix this in current design. Work-around is to create a pointer type within the namespace. 2/18/2003 * Modified VAL operator in actual parameter list to allow the passing of some constant for a STRING parameter (passed by value). Modified the LoadIcon prototype in use32.hhf to specify a string name rather than a dword as the icon name parameter. 2/21/2003 * Corrected a defect with the output of a procedure pointer constant type (wasn't outputting anything). ***** Version 1.41 Release Occurred Here ******** 3/19/2003 * Corrected a problem with the hlatemp environment variable. Added a "\" to the end of the path if one wasn't supplied in the environment string. * Modified hla.exe to create a ????._link_ file with all the linker command line options because under WinXP the linker wasn't executing properly (not an HLA problem, but a workaround to a bug in BC++ or in windows XP). * Corrected a problem with some code that was (accidentally) taken out of HLA.FLX - wasn't handling end of _initialize_ and _finalize_ strings properly. * Corrected a code generation problem with thunks that must have slipped in during development of v1.42. **** Releases 1.42..1.46 occurred in quick succession here **** 4/02/2003 * Added support for SSE/SSE2 instruction set (not complete yet!) 4/12/2003 * Corrected a defect in the @offset operator. Supplying an undefined symbol crashed the assembler with an assert failure. * HLA had a defect where it would allow the emission of two VMTs for a class without reporting an error (though MASM would report a duplicate symbol error). Added code to track the emission of VMTs and emit an error if the user attempted to emit two copies of the same VMT. * Extended strings to allow labels upto 64 characters in length in the output code. 4/13/2003 * Added ~XXXX reserved word support to the lexer; added "reservedWords" array to allow the user to redefine reserved words without the "~" prefix. Added #ID(xxxx) and #RW(xxxx) items to the lexer. * Added endconst, endval, endtype, endvar, and endlabel reserved words. * Allowed the use of endlabel, endconst, endval, endtype, endvar, endstatic, endstorage, and endreadonly reserved words at the end of one of their declaration sections within an HLA declaration section. 4/15/2003 * Added compile speed statistics to HLAPARSE when operating in verbose mode * Fixed another minor problem with @offset (and undefined symbols). * Added support for Real128 (actually done earlier, but I forgot to mention it). * Fixed a problem with #FOR if the condition was false the first time through the loop. * Added support to emit WSTRING and WCHAR data to the output data files from the STATIC and READONLY sections. 4/18/2003 * Corrected a defect when calling an indirect pointer to a procedure that is a static field of some class. 4/23/2003 * Change macro local symbol construction to include the local symbol's name to make deciphering errors involving local symbols a little easier. * Corrected a defect in the construction of a #terminator local symbol table (it was not properly zero terminated) that prevented the use of global (to the macro) symbols within the macro invocation. 4/24/2003 * Added open-ended array declarations to const, value, "?", static, and readonly declarations. * Corrected a code generation problem dealing with the emission of initialized static array objects (when the base type is an array and you're explicitly extending the number of dimensions in the declaration). * Corrected a defect in #for( x in yyy ) -- it wasn't doing a deep copy on the values. ***** Version 1.47 Release Occurred Here ******** 4/28/2003 * Corrected a defect in an indexed call to a class' static procedure. 4/29/2003 * Corrected several minor code generation defects in parameter passing. 4/30/2003 * Added productions for "movd( mmx, reg32 );" and "movd( reg32, mmx );" instructions. * Corrected an unexpected case neutrality error when a class' field name is the same as some local name except for case. * Discovered bug (but cannot correct) objectName.macroname where macroname expands to some other method names - crashes the compiler. 5/02/2003 * Fixed a problem with #include. If the file didn't exist, didn't always report an error. * Corrected a kludge in the fileclass.hhf header file that broke while correcting other defects in HLA. ***** Version 1.48 Release Occurred Here ******** 5/10/2003 * Allowed the use of the VAL keyword prefix on an actual parameter if the actual parameter is a dword and is passed by something other than by value. 5/15/2003 * Modified declarations for w.FillConsoleOutputCharacter and w.FillConsoleOutputAttribute in kernel32.hhf. * Changed the definitions for w.STD_INPUT_HANDLE, w.STD_OUTPUT_HANDLE, and w.STD_ERROR_HANDLE (they were positive values and they needed to be negative). 5/24/2003 * Modified stdlib routines to use os.win32 and os.linux constants to determine the OS (used to use definition of _win32 or _linux for this purpose, but the os.xxx symbols are the proper way to do this). * Re-wrote the console library module to make it portable between Windows and Linux. 5/26/2003 * Added a fileio.flush function to the standard library. 6/2/2003 * Fixed a code generation problem with while/continue. * Eliminated a lot of extra symbols emitted by HLA for boolean expressions and control structures that use them. * Fixed a code generation with EXIT and EXITIF. 6/3/2003 * Corrected a defect in the #text..#endtext block (wasn't entering VAL object into the symbol table properly). * Added the ability to supply an array of strings to the @text function. ***** Version 1.49 Release Occurred Here ******** 6/10/2003 * Completely reorganized the windows header files (only a single w.hhf header file rather than multiple header files). Reorganized the LINUX header files. Added @fast option to most header files containing namespaces. * Eliminated the win32.hhf header file from the Include directory (placed a copy in only those subdirectories where it was absolutely needed). The intent is to phase out this header file over time. * Eliminated several junk files from the Include subdirectory. * Made several changes to the Iczelion files and other example code that reflects the changes made to the header files. * Changed the values in the hla.hhf header file to reflect changes in the enums.h header file. 6/12/2003 * Corrected a defect in the scanning of string constants that contain a quote character (doubled-up quote). * Continued changes to the code generator. *** versions 1.50..1.54 occurred here **** 8/12/2003 * Corrected a problem with FreeValues that was freeing the wrong objects when freeing arrays that were fields of a structure. * Corrected a code generation problem for arrays that were fields of a structure. *** Version 1.55 occurred here *** 8/14/2003 * Corrected a defect in static class procedures - was not cleaning up the symbol table properly before leaving. 8/20/2003 * Fixed a defect in the cs.unionstr2 stdlib procedure. * Fixed a defect in the cs.removestr2 stdlib procedure. * Fixed a defect in the date.datePlusMonths stdlib procedure. * Fixed a defect in the date.daysbetween stdlib procedure. 8/22/2003 * Fixed a big defect in the date.datePlusDays procedure. 9/3/2003 * Corrected a bug in the conv.e80ToStr function. * Made several additional changes to support the ability to call HLA Standard Library routines from MASM32. *** Version 1.56 occurred here *** 10/3/2003 * Corrected a defect in the processing of #ID and #RW. * Added memory-mapped file support to the standard library *** Version 1.56 occurred here *** 10/6/2003 * Added support for ex.InPageError and ex.NoMemory in excepts.hhf. Corrected lack of checking for several Win32 exception values in hwExcept.masm 10/7/2003 * Corrected the prototype for w.ScreenToClient in the w.hhf header file. *** Version 1.57 occurred here *** 10/13/2003 * Corrected a problem with the args module (BuildArgs under Linux) It was not correctly finding zero terminate strings in the cmdLn string (ECX value was bad). 10/15/2003 * Corrected a problem with the Julian Date conversion in the date module. *** Version 1.58 occurred here *** 10/17/2003 * Modified OutputVMT to emit "externdef" (or comparable) statements for each of the entries in the VMT. This allows some class to inherit fields from some other class whose methods and iterators are not defined in the current source module. 10/21/2003 * Corrected a problem with forward reference pointers that referred to a class type. * Corrected a problem with the -I option (for Linux). * Corrected a couple of places where the EXIT statement emitted Windows-specific code (even under Linux). * Corrected a defect in the constant-type conversion functions. 10/25/2003 * Added the "-r:responseFile" command-line option. * Corrected a defect with "extern" output for VMTs in classes. *** Version 1.59 was released here *** 10/30/2003 * Fixed #write so that if an error occurs the error message is written to "MsgOut" rather than to the file to which #write is writing data. * Modified the "-v" option to send all output to the standard output (rather than the default of stderr). * Fixed a problem with the parsing of response file lines to eliminate leading and trailing whitespace from each response line. * Eliminated a cascading error that occurs when you have an undefined object in a #print or #write statement. * Modified #print error messages to include #write in the error messages (as #write uses the same code). 11/18/2003 * Added the ability to print array and record constants with #print. 11/24/2003 * Corrected a problem in args.hla stdlib code. Wasn't handling '"' correctly on the command line. 11/25/2003 * Corrected the definition for w.INFINITE in the w.hhf file. * Corrected a defect in FreeValue affecting unions containing array constants. * Corrected defects in the str.ne and str.eq functions. 12/1/2003 * Added "::" label declarations to create global labels (e.g., lbl:: ). 12/3/2003 * Added support for FASM's new ALIGN directive. *** Version 1.60 was released here *** 12/29/2003 * Modified all the stdlib .hhf files to avoid a small error due to the use of FLEX (added a ';' after the initial #if( @defined(-)) statement). 1/5/2004 * Slight improvement to code generation for passing a local variable or parameter by reference to some other procedure. 1/14/2003 * Fixed a problem with the use of the '&' static address operator in record constants and when outputting static string constants. 1/23/2004 * Fixed a defect in the str.ieq function. 1/25/2004 * Fixed a defect dealing with the use of the VAL parameter override prefix and string/dword actual parameters. 2/1/2004 * Fixed a #include header file problem as required by Linux builds. 2/2/2004 * Added fileio.exists to the HLA Standard Library. * Corrected the spelling of several SSE instructions. *** Version 1.61 was released here *** 3/3/2004 * Modified #include and #includeonce so that they would look for an include file in the same directory as the .HLA file if the include file was not found (this is done *before* looking in the hlainc path). * Added lots of code to support the freeHLA project. * Modified "usage" screen in HLA.C to display information appropriate to build. 3/4/2004 * Fixed a minor code generator bug for FASM output (was emitting "XLAT", FASM wants "XLATB"). Also tweaked the code output to stop putting out the "codeAlign" macro (as FASM v1.51 and later supports a true align directive). * Modified HLA.C to run FASM/POLINK/PORC for the "freeHLA" version of the system. *** Version 1.63 was released here *** 5/20/2004 * Fixed a problem with several of the SIMD instructions that didn't allow register operands for both operands. *** Versions 1.64-1.65 were released here *** 6/18/2004 * Added code to use the path to HLAPARSE.EXE as the default root directories for the hlalib and hlainc environment variables if these environment variables are undefined. * Modified HLA to allow the use of @here as conditional jump operands. * Added an @external option to the VMT declaration to allow external access to the VMT for a class. * Corrected a defect that prevented HLA from recognizing nested records when one of the nested fields was an array of records. *** Version 1.66 was released here *** 6/18/2004 * Corrected a defect in str.substr that generated an exception if the destination string was at least as long as the source string (only needs to be as long as the substring will be). 6/24/2004 * Added "-x:filename" option to Windows version of HLA.EXE * Modified HLA under Linux to produce .o files and treat .a files as library files. *** Version 1.67 was released here *** 7/3/2004 * Corrected a problem with the "&" (address-of) operator not recognizing symbols defined in the forward symbol list (i.e., declared in a LABEL section). 7/6/2004 * Added arg.a_v, arg.a_cmdLn, arg.destroy, and arg.args to the HLA standard library. * Corrected a defect in arg.delete (wasn't freeing storage). * Fixed an error in the date.toString macro in the datetime.hhf header file. 7/10/2004 * Redid the fileio.eof function for Windows in yet another attempt to get it right. 7/12/2004 * Fixed a problem with class methods and iterators emitting an "extrn" directive in the extpub file, even though they were defined in the current source file. 7/20/2004 * Modified code generator for FASM to emit "xlatb" rather that "xlat" for the xlat instruction. 7/22/2004 * Corrected a defect dealing with constant/val objects appearing in records. They are counted as a field and in record constants the field count didn't match. 7/24/2004 * Corrected the definition of "nl" in stdio.hhf to use #$a for Linux and #$d #$a for Windows * Fixed a bug that crashed HLA if you had a comma without a last parameter in a macro parameter list. *** Version 1.68 was released here *** 8/16/2004 * Corrected a defect that crashed HLA when using a second occurrence of a namespace with the @fast option. * Rewrote the memory allocation routines for both Linux and Windows in the HLA stdlib. 8/17/2004 * Added several new exceptions to the system (dealing with memory management). * Added several new memory management routines, including mem.zalloc, mem.stat, mem.newref, mem.getref, str.newref, and str.getref. * Changed the behavior of mem.isInHeap. It now returns NULL or the pointer to the start of the block in the heap rather than just true/false. * Modified the str.talloc macro so it could be used with instruction composition. *** Version 1.69 was released here *** 8/18/2004 * Fixed bugs in str.free and str.realloc. * strToFlt wasn't preserving EAX, fixed this. 8/30/2004 * Added "FORWARD" declaration option to statement labels. * Fixed the use of "hlatmp" environment variable by HLAPARSE. 9/14/2004 * Corrected a defect in mem.alloc (wasn't preserving EDX and ECX across a call to w.VirtualAlloc). * Modified HLA.C to use the same environment variable for the HLA temporary directory as HLAPARSE.C (hlatmp). * Cleaned up some linux installation documentation. *** Version 1.70 was released here *** 9/20/2004 * Corrected a syntax error in the arrays.hhf header file (extra parentheses occuring in the test for floating-point types) 9/24/2004 * Fixed a problem with the indexing into REAL80 arrays in the arrays.hla module in the standard library. 9/26/2004 * Fixed a problem with the mem.isInHeap function. 10/18/2004 * Changed FASM output to use conditional assembly to "protect" extrn symbols in case the symbols weren't accessed in the file. *** Version 1.71 was released here *** 10/21/2004 * Modified symbol table initialization to properly include REAL80 type in the search. * Modified several of the zstring routines in the Standard Library to correct problems with access bytes beyond the end of a source string (when doing dword operations). * Fixed several code generation bugs in movdq2q, movss, movapd, movaps, movdqa, movdqu, movupd, movups, movntdq, movntpd, movntps, cvtpd2pi, movnti, and most of the other SSE/2 instructions. * Added GLOBAL and GLOBAL2 macros to FASM output to correct some duplicate symbol problems. *** Version 1.72 was released here *** 12/06/2004 * Corrected problems in error reporting for Linux versions of fileio.{write, puts, putssize, putc, and putcsize} 12/07/2004 * Removed a couple of debug print statements from the lexer that didn't belong in the production code. 12/08/2004 * Modified the list.itemInList iterator to preserve ESI across the FOREACH loop. * Corrected several NULL pointer problems in the compiler, particularly in sections dealing with an unexpected number of parameters. * Removed the "@fast" option from the str namespace because this namespace gets manipulated in several header files (incompatible with @fast operation). * Modified the fileio.{putc, putcsize, puts, putssize, and write} routines to include additional error checking (under Windows and Linux) *** Version 1.73 was released here *** 01/10/2005 * Corrected a problem in parameter parsing. Added a call to SavePosn to fix problem with function calls appearing in ELSEIF generating bad code. 01/11/2005 * Corrected a problem with HLA code generation for STDARG (and CDECL) parameters (good old SavePosn bug). * Fixed a problem with the Linux version of openNew (added o_trunc option to clean up an existing file). 01/15/2005 * Replaced all occurrences of "malloc" with "malloc2" and eliminated redundant asserts. * Corrected a defect that allocated zero bytes when processing a macros variable parameter list (allocation of zero bytes returns NULL, which messed up the code). * Replaced all occurrences of "free" with "free2" * Modified malloc2 and free2 to track heap usage, and only do an actual free operation if the object passed to free2 is truly on the heap. * Cleaned up code that back-tracked the output file (for things like handling boolean expressions and parameter lists). Converted a ton of "cut&paste" code to subroutine calls so there was only one point in the code where the backtracking needs to be maintained. * Modified HLA.C "usage" function to request user input in the middle of the output if the output is headed to the standard error device. (To keep the number of lines down to a small screenful.) * Modified the pushw and pushd instructions to emit "push word ..." and "push dword ..." for constants when emitting FASM code. *** Version 1.74 was released here *** 01/25/2005 * Fixed a defect in the computation of the size of an anonymous record inside an anonymous union, inside an actual record (wasn't computing the record size properly). 03/01/2005 * Fixed a defect in the case insensitive string comparisons routines (wrote a new stricmp routine for the HLA stdlib). 03/23/2005 * Corrected a problem with fileio.putl. It was not preserving EBX. * Modified rchpos2 so that it properly backed up one character before the index supplied before beginning the scan. 3/24/2005 * Fixed a problem with intmul (didn't allow 32-bit constant operands). * Fixed a problem with overrides in inherited records (didn't work, wasn't properly inheriting the fields from the ancestor record). * Cleaned up the AddFwdPtr function. * Corrected the fact that PUSHD didn't allow pointer constants (&lbl). 4/24/2005 * Fixed a problem with the fileio.truncate routine under Linux (had to swap parameters in a linux.lseek call). *** Version 1.76 was released here *** 5/7/2005 * Fixed a bug that allowed any size except byte objects (e.g., qword) in a memory-to-memory MOV instruction. 7/31/2005 * Fixed a bug in the Linux version of the BuildArgv routines (args module) that caused a crash because ESI was not initialized properly. 9/30/2005 * Made a quick correction to the code that outputs CDECL and STDCALL parameters to the ASM file to handle a recurring problem with that code. *** Version 1.77 was released here *** 10/8/2005 * Added @sort compile-time function. * Removed ';' after several #if statements in the HLA stdlib header files * Added HLA.lookupTable macro to the HLA.HHF header file * Added QSDemo.hla program to examples directory * Modified the switch/endswitch macro to use the new @sort function. 10/9/2005 * Modified SWITCH macro to allow use of bubble sort (for large case statements that have [nearly] sorted cases). * Moved lookupTable macro from HLA to ARRAYs module. *** Version 1.78 was released here *** 10/31/2005 * Modified code generation for method calls to avoid an instruction of the form "lea esi, [esi+0]" whenever invoking a method indirectly via the ESI register. * Fixed a problem with accessing static fields of a class that themselves have fields (e.g., static record objects within a class). * Corrected a problem with the w.getWindowText and GetDlgItemText macros in w.hhf. 11/1/2005 * Fixed a memory allocation bug associated with PUSHD( &symbol ); * Added missing VMTs to the font.hla example in the WPA folder. *** Version 1.79 was released here *** 11/2/2005 * Fixed a problem with pat.oneOrMorePat in patterns.hhf * Fixed a problem with tut23.hla in the Iczelion tutorials. * Fixed a problem with the stdout.put macro in the stdlib. 11/07/2005 * Tweaked @ptype to return the exact ptype of an object * Added @baseptype function to return the base type of an object * Tweaked @typename to produce better output. 11/09/2005 * Fixed rawLookup in symbol.c to properly search for field names of a class, record, or union within a Namespace (doesn't use only the hash of the global name). Previously, all identical field names hashed to the same symbol table entry rather than the one specific to the record, class, or union. 11/10/2005 * Added mem.realloc2 to the HLA Standard Library 11/16/2005 * Corrected a field in the w.hhf header file INPUT_RECORD type declaration (EventType must be a dword). 11/17/2005 * Created Windows versions of readkey, testkey, and peekKey. 1/18/3006- * Fixed a bug in conv.dToStr * Modified str.strRec fields to be dword rather than int32. 1/19/2006 * Eliminated semicolons after #includeonce in patterns.hhf, dtClass.hhf, and arrays.hhf *** Version 1.80 was released here *** 3/7/2006 * Major rewrite of the @ptype, @typename, and @baseptype functions. * Cleaned up stdout.put/fileio.put macro to reflect changes to @ptype. * Added @basetype function. * Fixed several bugs dealing with coerced types in stdout.put and fileio.put. * Modified @name to return an empty string for an invalid name object (previously, this generated an error). * Create the hla._put_ and hla.put macros to support user-written put macros * Rewrote stdout.put and fileio.put macros using the new hla.XXX macros. 3/8/2006 * Rewrote all the str.catXXXX routines to make the dest parameter the first parameter (for use by str.put) * Rewrote the str.put macro. Fixed the fact that it did an append rather than a store. * Added the str.put2 macro (appends) * Fixed several bugs in various str.catXXX routines * Added str.catu128, catu128Size, cati128, cati128Size, catl, and catlSize routines to the standard library. * Added str.catr32pad, catr64pad, and catr80pad to the stdlib. Modified existing catr32, catr64, and catr80 functions to use a space as the default padding character. * Modified tons of example code to compile with the new changes. *** Version 1.81 was released here *** 4/11/2006 * Corrected code generation for pusha and popa. 4/29/2006-4/30/2006 * Corrected code generation for pushw (signed constants outside the range 0..$ffff). * Modified the grammar to reject ESP as an index register. * Corrected a defect in the type checking associated with sldt. * Corrected a defect in the type checking associated with lsl. * Swapped the operands of the cmpXXss, cmpXXpd, cmpXXps, cmpss, cmppd, and cmpps instructions in order to match the syntax of other HLA compare instructions. * Added type checking to cmpXXss, cmpXXpd, and cmpXXps. * Cleaned up grammar for the following instructions: movq, pshufw, cmpXXss, cmpXXpd, cmpXXps, cmpps, cmppd, cmpss * Modified the following to support anonymous memory addresses: fbst, fbld, arpl, invlpg, lar, lds, les, lfs, lgs, lss, lgdt, lidt, sgdt, sidt, lldt, sldt, lsl, ltreg, streg, verr, verw, cmovXX, cmpxchg8b, fstcw * Added support for the following instructions (including manually encoding the opcodes): fldenv, fstenv, fnstenv, fsave, fnsave, frstor, pshufd, shufpd, shufps, psrldq, fisttp * Manually encoded the following instructions to support MASM6: cmpXXpd, cmpXXps, cmpss, cmppd, cmpps, psllw, pslld, psllq, psrlw, psrld, psrlq, psraw, psrad * Added standard support for the following instructions: smsw, lmsw 5/1/2006-5/6/2006 * Complete refactoring of the AnonMem and IndexAdrsMode productions * Generalized the addressing modes. * Refactored internal representation of registers. * Improved handling of instruction composition for MMX, XXM, and segment registers. * Corrected several minor bugs as encountered. * Increased the maximum allowable stack size (link option). * Modified CombineAddresses to swap the index and base registers if the index register is ESP, the scale is 1, and the base register is not ESP. * Added support for LSL( reg32, reg32 ); 5/7/2006 * Rearranged register translation table to match register encodings * Worked on generic instructoin test program 5/9/2006 * Fixed a bug in the str.put macro (removed extra push). * Modified HLA to emit the constant of "intmul( const, mem, reg);" as a signed integer string rather than unsigned (caused overflow with 16-bit operands if emitted as unsigned). 5/10/2006 * Modified code generator to not put out "*1" after an index register if the person didn't specify this in the HLA source code. This was done because MASM takes liberties with base/index register definitions if you don't explicitly provide a scale and this made testing HLA output difficult. * Reversed the operands on the xadd instruction (they were backwards) 5/11/2006 * Fixed several $$ defects (instruction composition) appearing in the code. * Added a kludge to convert 32-bit register operands for the LSL instruction to 16-bit registers when compiling output for FASM. 5/16/2006 * Modified LSL instruction to emit object code directly because of problems with MASM and FASM. * Modified RET to allow usage without parenthesis (e.g., ret; ). * Modified conditional jump instructions to allow parentheses around their operands (optionally). 5/17/2006 * Modified PUSHW and PUSHD to emit pushw and pushd under FASM. * Cleaned up code for CALL and JMP instructions. * Fixed a code generation bug in the MMX instructions with a 32-bit memory operand. 5/18/2006 * Added support for (or improved support for) addpd, addps, addsd, addss, addsubpd, addsubps, andpd, andps, andnpd, andnps, clflush, prefetcht0, prefetcht1, prefetcht2, and prefetchnta. This included direct encoding to support MASM6. * Fixed CMPSD so it works for SSE as well as strings. Eliminated old cmpsdp hack (which wasn't really used). * Binary encoded comisd and comiss for MASM6. * Implemented (and encoded) the following conversions: cvtdq2pd, cvtdq2ps, cvtpd2dq, cvtpd2pi, cvtpd2ps, cvtpi2pd, cvtpi2ps, cvtps2dq, cvtps2pd, cvtps2pi, cvtsd2si, cvtsd2ss, cvtsi2sd, cvtsi2ss, cvtss2sd, cvtss2si, cvttpd2pi, cvttpd2dq, cvttps2dq, cvttps2pi, cvttsd2si, cvttss2si * Implemented and binary encoded divss, divsd, divps, and divpd. * Implemented and binary encoded haddpd, haddps, hsubpd, hsubps, lddqu, monitor, pause, syscall, sysenter, sysexit, sysreturn, maskmovdqu, movhlps, movlhps, xorpd, ucomisd, sqrtsd, subsd, unpckhpd, and unpcklpd. * Added rsqrtps reserved word to lexer. * Corrected LAR syntax to correspond to Intel's. Fixed LSL to match LAR. * Fixed MOVD instruction. 5/19/2006 * Added support for the cmpXXsd instructions (including binary encoding) * Fixed problems with MOVD and MOVQ instructions. * Fixed minps. 5/20/2006 * Tracked down a memory allocation bug in boolean expressions. * Cleaned up a lot of bad pointer references in the code. * Fixed JMP instruction to allow all the same targets as CALL (e.g., made it possible to jump to a procedure declared in a namespace). * Corrected a defect with the code generation for 16-byte records, classes, and other 16-byte data objects. * Corrected a bad pointer reference in the classification routines. 5/21/2006-5/26/2006 * Fixed numerous encoding problems in the new code based on the results from the HLA test program. 5/26/2006 * Fixed @global:identifier to allow dotted names. 6/1/2006 * Optimized the xxxx.put macro to speed it up considerably. 6/10/2006 * Fixed environment variable stuff under Windows to search for hlalib.lib and include (correctly) if the HLAINC and HLALIB variables are not specified. * Fixed a couple of problems with the hlalibsrc/strings/makefile.linux makefile. * Took HLA off of Visual Source Safe and placed it under Subversion source code control. 6/11/2006 * Modified output to not emit a displacement value of zero in memory addressing modes because GAS will actually emit a zero displacement byte if you do this. 6/20/2006 * Modified HLA to use "dword ptr" rather than "fword ptr" when emitting lgdt instructions, and the like, to GAS. * For various floating-point instructions output to GAS, deleted the XXXX ptr operand before memory operands. *** Version 1.82 was released here *** 6/26/2006 * Corrected a bug in the #FOR loop. It was not properly clearing the upper 96 bits of the loop control variable. *** Version 1.83 was released here *** 6/28/2006 * Corrected a defect in the code generation of the "[reg*scale+disp]" addressing mode. *** Version 1.84 was released here *** 7/1/2006 * Corrected a but in the be_reg code that handled boolean expressions consisting of a single register emitted by instruction composition. *** Version 1.85 was released here *** 7/4/2006 * Corrected a defect in the fileio.exists function. It needed to be opened with sharing enabled for read/write. 7/10/2006 * Fixed a defect in the HLA.PUT macro (wasn't reporting type mismatch errors properly). 7/12/2006 * Rewrote str.a_catz (it was never actually written before, it was just the code for str.catz). 7/13/2006 * Added instrumention to malloc/free/realloc to track down memory-related bugs in the HLA compiler. * Corrected a bug where HLA was freeing some storage that was never allocated when processing register operands. 7/14/2006 * Corrected an issue with semicolons following #endmacro (removed the test for this and eliminated a "pushBackStr" call that wound up pushing a lot of extra junk onto the input stream. * Eliminated an extra #endif from the end of the arrays.hhf include file. * Corrected some memory allocation related bugs. 7/15/2006 * Completely rewrote the way macro parameters are handled. * Rewrote the way macros are recorded. * Eliminated several free2 calls on static storage that was not allocated via malloc2. *** Version 1.86 was released here *** 1/20/2007 * Added @system function. * Added @env function. * Modified -Dxxx command-line parameter to support the syntax -Dxxxx=yyyy to set a symbol to a string value. * Added the -lib: command-line parameter and fixed a problem with the -i: command-line parameter 1/21/2007 * Fixed a type checking problem with the @ptype function. * Added support for ZStrings throughout the code. * Fixed several bugs in the w.hhf header file. 1/27/2007 * Fixed a problem with error reporting. Errors occuring in macros that were defined in include files weren't properly displaying the filename when unstacking the macro stack. * Modified assembler to handle "push( edx:eax );" and "push( dx:ax );" (which emit two push instructions, each). * Added "string " option to macro parameter list. * Modified movsx and movzx to return destination register as the @returns value rather than the source operand. 1/28/2007 * Added support for "mov( mem64, edx:eax );", "mov( edx:eax, mem64);", and "mov( constant64, edx:eax );" pseudo-instructions (these emit two mov instructions, each). 1/29/2007 * Improved code generation for parameter passing in the case where an actual parameter is a register passed as a parameter from the another procedure. * Added the ability to pass edx:eax and dx:ax as parameters to functions. 2/6/2007 * Added the ability to specify string constants inside a cset constant (to streamline cset constant syntax). 2/12/2007 * Added the -level=x command-line parameter to support different language levels (high, medium, low, and very low). 2/25/2007 * Added #regex macros. * Added tons of pattern matching functions for use in #regex macros. * Added @match and @match2 function to support pattern matching with #regex macros. * Added #string..#endstring block. * Added #match..#endmatch block. *** Version 1.87 was released here *** 2/27/2007 * Corrected stricmp/strnicmp under Linux (replaced code with call to stdlib strcasecmp and strncasecmp functions). * Corrected problems with @matchString and @matchiString functions in the regular expression interpreter. *** Version 1.88 was released here *** 3/1/2007 * Eliminated #:id feature inside #asm..#endasm block (#asm is going away soon, too). 3/2/2007 * Cleaned up USAGE message output for HLAPARSE. * Modified HLAPARSE to default to -level=high. * Fixed a problem with the -p:path command-line option. * Added -LICENSE command line option (and text) * Corrected a problem with the -level command-line option (HLA.EXE) 3/5/2007 * Fixed a code generation for parameters when passing the address of a static object in a register. * Fixed a code generation bug that caused a type mismatch when emitting an array of primitive types (e.g., bytes). 3/6/2007 * Modified HLAPARSE so that it no longer automatically writes a .link file on each compile (will create the file if it does not exist or if the -@@ command-line option is specified). * Added the -@@ command line option to HLA and HLAPARSE to force the creation of a new .link file, even if one already exists. *** Version 1.89 was (sort of) released here *** 3/13/2007 * Corrected OutValue so that it would properly emit TBYTE array constants. 3/16/2007 * Fixed a problem with TASM code output. Wasn't generating code to push static addresses properly. * Changed "flat" to "FLAT" in TASM skeletal output code to prevent '/ml' option from generating errors. *** Version 1.89 was officially released here *** 3/23/2007 * Added support for segment prefixes 3/24/2007 * Cleaned up compiler code to reduce the amount of conditional assembly (used run-time variables instead), so as to better support using the internal FASM under Windows. * Fixed a FASM code generation bug that occured when using constants with floating-point instructions (e.g., fmul(2.0)). 3/27/2007 * Fixed definition of CanBeType in enums.h that broke when new types (e.g., zstring) were added. 3/28/2007 * Fixed a problem with the initialization of array element types for VAL objects. * Modified FASM code generation for Linux to output correct section headers. 3/31/2007 * Finished off use of Internal FASM version to generate object files directly. * Added -co, -cf, -cm, -ct, and -cg command-line parameters. *** Version 1.90 was released here *** 4/4/2007 * Modified doArrayList to allow an extra comma at the end of an array constant (cleans up a lot of array initialization using #for loops). * Fixed an assertion when MakeCompat was called with CSET operands. 4/6/2007 * Added code to force a "/" or "\" at the end if a temporary path specified on the HLAPARSE command line (so HLAPARSE no longer requires the trailing directory suffix character). * Cleaned up some directory separator code in HLA.EXE. 4/7/2007 * Fixed a defect in the path generation for the -obj: command-line parameter (didn't work right when using the internal version of FASM). * Added the hlalink environment variable. *** Version 1.91 was released here *** 4/22/2007 * Corrected several defects related to #xx character constants in HLA.FLX (wasn't indexing into yytext properly). * Fixed a filename problem with HLA.C that prevented it from passing object file names to the linker under Linux. *** Version 1.92 was released here *** 4/27/2007 * Fixed a code generation problem with hybrid parameters (wasn't emitting parameter code in the proper place -- wasn't properly restoring the start of each line after processing the hybrid parameter). * Fixed a problem with the HLAPARSE -P and -OBJ parameters (couldn't handle command-line parameters with spaces in the paths). 4/28/2007 * Added support for wildcard characters in filenames (windows only, Linux has always supported this). *** Version 1.92 was released here *** 5/2/2007 * Fixed a problem with the default ".hla" extension in Windows (new wildcard code was not defaulting to ".hla" if no suffix was present). *** Version 1.93 was released here *** 5/5/2007 * Fixed some problems with the HLAPARSE -OBJ command-line parameter * Fixed some problems with the HLAPARSE -P command-line parameter. 5/6/2007 * Tracked down several bugs in hFASM (internal FASM version). * Refactored some hFASM code. 5/7/2007 * Corrected a defect in hFASM (at "InstructionAssembled" label -- bad code appeared there). * Modified the output of the public, external, and equ outputs in FASM in order to reduce the number of sections in the OBJ file. 5/8/2007 * Tracked down several additional details with the "InstructionAssembled" problem. * Fixed a problem with the HLA wildcard expansion -- passed along filenames that FindFirstFile couldn't expand properly (e.g., .lib files that don't appear in the current directory). * Fixed a problem with conditional jump ranges in hFASM. * Converted a jcxz instruction to jeczx in the a_cat standard library routine. *** Version 1.94 was released here *** 5/9/2007 * Fixed a problem with "code" section in internal FASM under Linux. *** Version 1.94 for Linux was re-released here *** 5/11/2007 * Fixed several FASM code generation problems (sections). * Added statement composition capabilities to many memory operands. *** Version 1.95 was released here *** 5/18/2007 * Fixed several problems related to passing paths around on HLA and HLAPARSE command lines. * Fixed some problems associated with internal FASM and the production of OBJ files rather than ASM files. * Added the ability to specify full pathnames as HLA filenames. *** Version 1.96 was released here *** 5/23/2007 * Corrected a defect in the HLAPARSE outPath variable (was freeing storage that was not malloc'd). 7/25/2007 * Added HLAstdlibVersion constant to hla.hhf 7/26/2007 * Corrected a defect in the "classes" table used by setClassification. Brought it into sync with the SymClass data type in enums.h * Modified setClassification to properly return the symbol classification of a dotted name sequence. * Modified the CoercedMemory production in hlaparse.bsn to handle several additional address expressions involving record/union/class fields and indexed expressions. * Added "NULL" as a valid constant value for the classify production. 7/27/2007 * Added support for "@-functions" to the classify code. This allows testing of @pointer, @byte, @word, etc., in compile-time functions like @isconst and so on. 7/29/2007 * Modified PrintString in output.c so that it output string literals with a maximum of 64 characters per statement (MASM was complaining about statements being too long when outputing 256 character strings). 8/9/2007 * Modified PrintString in output.c to handle the case where a 64-character string was followed by a non-graphical char (which resulted in a MASM syntax error when HLA emitted an empty string). 8/14/2007 * Fixed an indexing problem with the @uppercase and @lowercase CTL functions. 8/16/2007 * Fixed a default path problem with header files including other header files when the header files appear in a directory other than the cwd. * Fixed a problem with nested coerced memory operands appearing in compile-time expressions. * Fixed a bad pointer problem that occured when reassigning data to an array VAL object. * Added "-code1st" command-line option and code to support it (to put the machine instructions before the read-only data in the source output file). 8/30/2007 * Improved code generation for certain byte parameters passed to procedures. If the parameter being passed was a byte parameter in an enclosing procedure, the code now just pushes a dword rather than going through the gymnastics to push a byte. * Did the same thing for word parameters being passed as parameters to another procedure. 8/31/2007 * Corrected a code generation problem when passing a tbyte constant as a value parameter (was only pushing 4 bytes previously). 9/10/2007 * Added support for classes and namespaces to @localsyms. *** Version 1.97 was released here *** 9/17/2007 * Added support for enums to @localsyms. 9/19/2007 * Corrected a defect in the classify function that prevented HLA from recognizing -1 or !1 as constant expressions. 9/21/2007 * Modified "PrintString" in output.c to use unsigned chars rather than (signed) chars, to avoid sign extension of character values greater than $7f. 9/24/2007 * Modified how _argv is saved under Linux. 9/29/2007 * Fixed a problem with processing record constants for objects that were really unions. *** Version 1.98 was released here *** 10/28/2007 * Corrected a problem with the output of 64-bit values to a GAS assembly language file. * Corrected a segmentation fault occuring in strcpylc when it reached the end of a page. * Corrected a type checking problem with enum values. *** Version 1.99 was released here *** 1/10/2008 * Fixed a problem with strcpylc accessing data beyond a page boundary. */