HLA Historical Archive

Descriptions of changes found in older versoins

Web Site Hits Since
Jan 1, 2000
Last Updated On
Sun, Dec 8, 2002

WEBster
NAVIGATOR


Webster Home
HLA Page
DOS Assembly
Assembly Links
Christian Resources
HLA Basic
RatC for C / C++ Programmers
Software Engineering


This site is maintained by Randall Hyde. Comments and suggestions should be sent to rhyde@cs.ucr.edu


This site is always ad free!

Version Date Description
Version 1.36

Windows Files:

N/A

Linux Files:

N/A

5/06/2002 This was an interim release needed to continue work on the HLA compiler (since the compiler is partially written in HLA). This version is offered only in executable form as a fall-back for v1.37 in the event there are problems with HLA v1.37 that you can't work around.

This version corrects the floating point bugs, the CMOVcc bug, and the @cdecl parameter offset problems found in HLA v1.36.

Version 1.35

Windows Files:

N/A

Linux Files:

N/A

04/23/2002 This was, more or less, an emergency release. Changes made to records and unions in HLA v1.34 introduced some defects and greatly exposed many existing defects. Therefore, the RECORD and UNION code was almost completely rewritten for the v1.35 release. In addition to correcting these defects, there were a few new features added to this release, including:

Allowing the use of the "&" (address-of) operator to initialize a string field in a record constant (note that pointers are untyped, so you can put the address of anything into a string field, but it really should be the address of a string object). Added the "str.constant" macro to the strings.hhf module so you could create string constant objects (whose address you could take with "&" and use to initialize a string field in a record constant). #print was previously printing byte, word, dword, etc., fields as unsigned; changed this so it would print those values using hexadecimal notation. Added the ability to support the record alignment and initial offset options in the same record (e.g., x:record[4:4] := 4;). Added the ability to support record alignment within an anonymous record in a union. Eliminated the ability to directly declare enum lists within a record or uinon (one can always create the type outside the record/union, so this feature was never used; it was eliminated because it created some really big logical problems in the compiler).

Also added zipped versions of the HTML documentation for those who prefer HTML over PDF. Note, however, that the PDF version of the documentation is much better and easier to read. The HTML version, however, is roughly half the size (zipped) and downloads faster.

Version 1.34

Windows Files:

N/A

Linux Files:

N/A

04/21/2002 *** Because of massive defects in the record code, I have removed the v1.34 release. Please download the v1.35 (or newer) release or download the v1.33 release if you need an older version ***

Corrected a problem with #asm..#endasm not working properly in macros and #while loops. Corrected a problem with the use of int32 constants when used as array indicies in the compile-time language. Corrected a forward reference problem in namespaces. Added @returns, @forward, @external, and @align as synonyms for returns, forward, external, and align (looking forward to HLA v2.0 syntax). Added @locals compile-time function. Corrected a problem with forward referenced pointer types that span a namespace declaration. Added filename field to RefListType (internal HLA type) so that HLA can print the filename along with the line number when displaying an error about a forward referenced pointer. Removed support for identifier suffixes use the '`' symbol. Added field alignment option to records. Added lex level support to record and union symbols to resolve a problem with nested records and unions. Added "+=" and "-=" compile-time operators for use with scalar compile-time variables.

Version 1.33

Windows Files:

N/A

Linux Files:

N/A

04/08/2002 Here is another version of HLA with a massive number of changes. This version will definitely break some source code out there (the necessary changes are minor, but may occur frequently in source code; you will need to change any "nodisplay", "noframe", "noalignstk", and "nostorage" directives to "@nodisplay", "@noframe", "@noalignstack", and "@nostorage" respectively and you will need to change macro/keyword/terminator/endmacro to #macro/#keyword/#terminator/#endmacro). A few new reserved words (which may break existing code that uses them as identifiers) may also create some problems. Fortunately, most of this stuff is rather advanced, so it won't affect the average HLA user.

Changes:

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). Fixed a code generation problem with "intmul( mem, reg);" 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.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. 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" 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. 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). 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, lsl, mov w/segregs, push segregs, rdmsr, rdpmc, rsm, sgdt, sidt, sldt, str, ud2, verr, verw, and wbinvd Note: LMSW and SMSW are obsolete 286 instructions and were left out of the above set 'by design.' 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. 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.32

Windows Files:

N/A

Linux Files:

N/A

3/1/2002 Here is another version of HLA with a massive number of changes. The biggest news is:

HLA Now Runs Under Linux !

(by popular demand.)

The really cool thing here is that carefully written console application will compile and run unchanged on either OS. As of version 1.32, the Linux version of HLA is *experimental*, and there are a few known problems, but by and large it is functional enough to do some real work. HLA/Windows and HLA/Linux both share the exact same source code, so the version numbers (and enhancements) of both versions will remain in phase.

As is becoming common in these description sections, I must warn you that HLA has gone through massive changes since v1.30 in order to support Linux and all the new major enhancements. Although the port to Linux uncovered many latent defects in the system, undoubtedly it introduced some new ones, as well. Just be aware of this. Here are the (recorded) enhancements for v1.32:

Added Gas source output capability (default for Linux, -sg for Windows). User can now select Gas as the assembler to process the HLA output file (presumably, when using the Gas source output option). Note that both of the above are defaults under Linux. Corrected a defect dealing with anonymous records and unions. Allowed pointer constants as operands of user-defined pointer types. Corrected several problems with HLA's case neutrality ID algorithm. Cleaned up some assertions that were firing when attempting to access a field of a non-structured object. Corrected a defect in the computation of field offsets in anonymous records and structures. Corrected a problem with the ALIGN directive in anonymous records and unions. Corrected a problem with precedence in memory address expressions. Corrected a defect in the str.cat library function (copying too much data). Corrected str.substr and str.a_substr so that they properly zero terminate the strings they extract. Modified prototypes for str.tokenize and str.tokenize2 to allow untyped reference parameters. Corrected a defect that crashed HLA when passing an untyped var parameter as a parameter. Added @frame, @noframe, @display, @nodisplay, @alignstack, @noalignstack, and @use procedure options. Added #frame, #noframe, #display, #nodisplay, #alignstack, and #noalignstack directives. Modified the "call" instruction to support calls to statement labels. Added "label" declaration section to declare forward-referenced statement labels (inter-procedure references). Changed "noalignstk" to "noalignstack" (this may break some existing code). Corrected a problem with macro/local symbol lookup. Corrected a defect in the way the structured exception handler was built on the stack. Corrected a defect in the code emission for PUSHD. Added #openwrite, #write, #closewrite, #openread, @read, and #closeread directives and function for compile-time file I/O. Added #enter, #noenter, #leave, and #noleave directives along with the @enter, @noenter, @leave, and @noleave procedure options. Added the "linux.hhf" header module to the standard library; also supplied HLA Standard Library "wrapper" functions for most Linux system calls. Ported the HLA Standard Library over to Linux (except Console, Timer, Date/Time, and Win32). Added "@{ numeric_set }" literal constants. Corrected a defect dealing with type checking of static array constants. Cleaned up the compiler source code quite a bit. Allowed the assignment of an array of pointers to a dword array. Corrected a problem with the declaration of the jump table in the SWITCH macro (hll.hhf). Corrected a defect in the numeric-to-English conversion tables. Modified type checking to make dwords and pointers compatible. Corrected a type error in the str.strvar macro (strings.hhf). Fixed a problem that wouldn't allow the use of built-in type names in a compile-time function. Corrected some defects in namespace symbol table searches.

Version 1.31 1/1/2002 Interim (no general release, see v1.32 for changes)
Version 1.30

N/A

11/04/2001 Added the OVERRIDES keyword to allow the override of data fields in a RECORD or CLASS.

Corrected a defect associated with searching for names in records and classes that inherit fields from another class or record.

Corrected some other miscellaneous defects.

Version 1.29

N/A

9/29/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. 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.

Note: new documentation with this release describes several new standard library functions that are available.

Version 1.28

N/A

9/14/2001 Corrected spelling of the putcSize procedure (was putcsize previously). Corrected problem with underscore output in conv.dToStr procedure. Corrected underscore output in fputq. Corrected underscore output in conv.qToStr. Added "fill" and "size" parameters to fputtb call. Corrected underscore output in conv.tbToStr procedure. Fixed a problem with using pointers to a record type in a type coercion operation. Fixed the code output of an array of pointers initialized with the NULL constant. Corrected a problem that occurs 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. Modified error message output for "missing colon" to suggest that the cause may be an undefined identifier. Modified HLA.C to enclose command line parameters (it passes to HLAPARSE, ML, RC, and LINK) with quotes in case a pathname contains a space.
Version 1.27 N/A This version doesn't exist. The v1.26 release was accidentally labeled "v1.27" so I skipped v1.27. (Actually, we could claim that v1.26 was skipped, but I'm not going to change my documentation to reflect this more logical approach.)
Version 1.26

N/A

7/4/2001 This version represents yet another massive overhaul of the compiler code. Indeed, there are far too many modifications to list here. See this link for details.

The documentation was *vastly* improved for v1.26. It now has a table of contents and an index so you can actually find things. It was reorganized so that you don't have to look in four different places (and four different files) to find everything you want to know about some feature in the language.

There are several big user-visible changes including a rewrite of the boolean expression parser , the ability to produce TASM compatible output, a rewritten command line option processor, and the emission of multiple files during compilation, and support for PASCAL, CDECL, and STDCALL calling conventions.

HLA v1.26 adds many new command line options. Use the "-?" option to see the new command line options (or read the HLA documentation). Note that some options have changed, so you may have to modify existing makefiles when switching over to HLA v1.26 from an earlier version.

The new boolean expression parser now supports conjunction (AND), disjunction (OR), and negation (NOT) in boolean expressions within HLA's high level control structures. See the HLAHLL documentation for more details on this feature.

HLA now provides a command line option to let you specify that it produce TASM-compatible assembly language output. This option was added so that HLA users could more easily link their HLA object files with Borland Delphi programs (which is not happy with OBJ files produced by anything other than TASM). It is not intended for general use, though there is no reason you can't produce standalone assembly programs via TASM.

Warning: since TASM output is a relatively new feature to HLA, it has not had the benefit of years of testing like the MASM compatible output format. There are going to be some problems. So you should using the MASM-compatible output format whenever you are not producing files to link with Delphi programs. Please report any bugs you find in the TASM-output file to rhyde@cs.ucr.edu. Note that MASM will not assemble TASM-compatible output files (and vice versa).

Procedure declarations now support the PASCAL (default), CDECL, and STDCALL calling conventions. The Pascal calling convention is the standard HLA parameter passing scheme; CDECL and STDCALL reverse the order of the parameters on the stack. CDECL also tells HLA procedures to leave the parameter data on the stack, it is the caller's responsibility to remove parameter data.

HLA now writes all the external and public declarations to a separate file; it also writes the variable declarations for each of the standard segments (static/data, readonly, code, bss, and constants) to separate files. This cleans up the compiler output file tremendously and makes it easier to modify HLA to produce code for different assemblers. If you have makefiles (or batch files) that clean up HLA files after a compilation, you will need to modify those files to delete the new files that HLA creates.

Here are some minor features that were added in v1.26 that are also visible to the end programmer:

Added support for an untyped VAR parameter using the VAR reserved word.

In addition to the above major changes (visible to the end programmer), HLA also contains several other improvements as well. This include the following:

Output code uses the "simplified segment directives" whereever possible; this improves compatibility when linking HLA code with other languages. Began reorganizing the compiler code that does code emission with the hope of being able to port HLA to other assemblers (e.g., TASM and Gas). Began moving the code output statements to the "output.c" file so that third parties could more easily modify HLA to produce output for different assemblers (note that this process is far from complete at this point). Modified the code that emits EXTERNDEF declarations to ensure that it only emits unique EXTERNDEF statements (needed for compatibility with TASM). Corrected a defect dealing with the use of array constants in a STATIC declaration section. Corrected several problems with passing arrays as parameters. Optimized parameter passing code for several types of parameters. Cleaned up code that wound up emitting operands like "dword ptr (word ptr xxxx)" (legal in MASM, but other assemblers have a problem with this). Corrected a defect in the u16ToStr Standard Library function. Modified the compiler to emit PUSHD and PUSHW only for constant operands (uses "PUSH word ptr XXXX" and "PUSH dword ptr xxxx" for memory operands). Modified compiler to emit "type PTR" before all memory operands. Corrected a defect that produced an erroneous error if you spelled a local symbol the same as a global symbol except for alphabetic case. Corrected a defect having to do with the output of a string object in a record constant. Modified exception handler's call to MessageBox to ensure that the Window is always TopMost when an error occurs. Added a constant folding optimization to emit only a single occurrence of each unique string constant in the program. Added @optstrings pseudo-variable to control the optimization of string constants. Completely redid the code generation algorithms in HLA to make it easier to port HLA to other assemblers (this will have a significant effect on the stability of HLA, see the warning below).

Warning: There was a massive reorganization of the HLA compiler source code between versions 1.25 and 1.26. A change of this magnatude will have an effect on the stability of the system, both positive and negative. Those who are wary of the effect of such changes may want to stick with v1.24 for a while until the system settles down a bit (of course, if you're encountering problems with v1.24 or v1.25...). Do not go back to v1.25, see the warning below; either go with v1.26 or v1.24.

Version 1.25

N/A

1/8/2001 Corrected a couple of defects in the MMX instructions: (1) allowed anonymous memory references (e.g., [edi]), (2) Allowed MOVQ(mmi, mmi); Fixed a bug in the compilation of the EMMS instruciton (crashed the system). Added untyped pass by reference parameters to procedures. Modified compiler so it doesn't generate the exception handling code as part of the main program; moved the exception handling code into the HLA Standard Library (to allow user modification). Added the @exceptions compile-time variable to give the programmer control over the choice of complete or weak exception handling code. Corrected a defect in the CMP instruction that caused memory corruption during compilation. Eliminated the PEA instruction. Eliminated extended syntax for the SETcc instructions. Corrected a defect that caused HLA to crash when attempting to pass an anonymous memory object as a reference parameter to a procedure. Removed PEA instruction. Removed extended syntax SET instructions. Added user-definable segments and modified the compiler to produce ".link" files (for use by MS link). Added the #code, #readonly, #static, #storage, and #const directives to let the user rename HLA segments (for use when linking with other code). Did some internal cleanup. Changed segment names that HLA uses to conform with Microsoft's standard usage. Modified the @byte compile-time function to accept real and cset constants; also applied better range checking to the second parameter (i.e., you don't get to access the third byte of a char object). Modified the build to increase the stack size at (compiler) run-time (HLA was crashing in certain instances due to a stack overflow). Reorganized the source code (see below) to correct a bunch of problems and reduce the size of the executable (down from a high of about 2.4 MB in v1.23 to just over 1 MB in this version). Modified JT and JF code generation (no more macros for these guys in the MASM file).

Warning: There was a massive reorganization of the HLA compiler source code between versions 1.24 and 1.25. This resulted in the elimination of over 30,000 lines of source code from the HLA parser file. A change of this magnatude will have an effect on the stability of the system, both positive and negative. Those who are wary of the effect of such changes may want to stick with v1.24 for a while until the system settles down a bit (of course, if you're encountering problems with v1.24...).

Version 1.24

N/A

12/24/2000 Corrected a problem in Bison that caused HLA to generate bad code. Added @trace pseudo-variable, modified GET and PUT macros in stdin, stdout, and fileio to limit the emission of @trace within these macros. Completed BITS module in the standard library.
Version 1.23

N/A

12/7/2000 Minor update to correct a code emission fault (was generating "extern __imp__MessageBoxA@16", now it generates "externdef __imp__MessageBoxA@16"). This corrected a problem with linking HLA UNITs to other languages and with generating DLLs (and other code that doesn't have an HLA main program). Note, only the executables are present in this release. Get all the other (unchanged) files from the v1.22 release).
Version 1.22

N/A

12/5/2000 New test files for this release start with "T26.HLA".

Modified boolean expressions of the form "reg = 0" and "reg <> 0" to generate a TEST instruction rather than a CMP instruction. Modified exception handler code to open a dialog box rather than write the exception message to the standard output device. Allowed the use of "@xxxxx" suffixes on identifier names as comments (generally for specifying type information). Corrected some problems with static symbol forward references in a forward declared (or external) procedure. Fixed a defect with the #WHILE statement when the corresponding boolean expression wasn't on the same source line as the #WHILE. Updated test files due to change in assembly output. Handled a small problem with type checking on record fields dealing with pointers and static pointer constants. Fixed a defect in the code emission for an external procedure pointer. Fixed a defect in the code emission of external array objects. Added the nostorage option to the STATIC, READONLY, and STORAGE sections. Combined STRINGS and READONLY segments, combined DATA and BSSSEG segments (total program reduction was 8K for small programs). Corrected a crash that occurred if two pointer definitions were mutually recursive. Corrected a problem with code generation of certain operands with a "byte", "word", or "dword" size override. Cleaned up some forward declarations in the source file. Added str.init function. Putu8 was not preserving EAX, corrected this. Added str.catXXXX functions to the strings library module. Added str.put macro to the strings module. Corrected a major defect in the @size compile-time function. Corrected defects in the chars.toLower and chars.toUpper routines. Corrected a defect in the compilation of the BSR/BSF instructions. Added a kludge to prevent a seg fault if the user has a bad record constant. Corrected problems with pass by result & val./result parameters in a nested function. Fixed a problem with lower case identifiers in the symbol table lookup code. Corrected a defect in the standard library array.index macro. Added #includeonce directive. Fixed a problem with static forward constant declarations in class objects. Fixed a problem the "THIS" when followed by an undefined object. Fixed a defect dealing with static names in classes. Fixed several dangling pointer problems. Fixed a problem with FORWARD variable declarations. Added support for MMX instructions. Modified NAMESPACE declarations to allow the extension of a name space via multiple namespace blocks. Corrected a problem with ALIGN directive in RECORDS. Added ability to pad RECORD length using ALIGN directive. Corrected a defect dealing with the emission of RECORD constants to the code when an ALIGN directive was present. Updated time.timerec and date.daterec data structures to allow uns8 access to fields. Fixed a code generation problem when passing an indexed static variable by reference. Added fileio.get macro. Added several new functions to the fileio module: append, rewind, seek, rSeek, Position, copy, move, truncate, size, delete, cd, gwd, and mkdir.

Version 1.21

N/A

5/23/2000 New test files for this release start with "T16.HLA".

Improved error messages for RECORD errors. Added "in <reg>" clause to parameter list (e.g., procedure x( i:uns32 in eax );) Added code to disallow "[]" after a local symbol list in a macro declaration (common code with macro parameters created this problem). Fixed a problem with arrays.index (it didn't compute base type properly). Allow constant zero (e.g., NULL) for use as a pointer constant. Corrected a defect in the grammar for the "align(const);" production in the procedure options (didn't allow the semicolon at the end). Corrected several defects in the code generation for valres and result parameters; also improved the code generation for passing these parameters. Dealt with an infinite loop that occurred if a class procedure was redeclared. Checked for declaration of class method or iterator at the wrong lex level. Added "isInHeap" and "strIsInHeap" functions to the memory management module in the Standard Library. Added @curObject compile-time function to return the last class/object name. Fixed a defect in the output of the VMT related to abstract methods. Modified parameter passing mechanism to pass static and automatic pointer variables as VAR parameters, automatically dereferencing the pointer object. Added LISTS module to the standard library. Added ASSERT macro to the EXCEPTS.hhf exception handling module. Added array index checking to the array.index macro. Added the ex.ArrayBounds exception to the exception handling package. Massive overhaul on the compile-time symbol table functions (e.g., @ptype, @type, @size, @IsConstExpr). Added @IsExpr compile-time function to the system. Modified JT and JF so they now accept "#{ statements }#" sequences. Corrected a defect in the parameter list of a forward-declared procedure that generated a syntax error if a symbol had been previously declared outside the parameter list. Fixed a problem with passing procedures as a parameter other than by value. Added more error checking to parameter type/size matching code. Corrected a defect in the compile time string translation function (dangling pointer). Modified the compile-time BYTE(x), WORD(x), and DWORD(x) functions to translate string operands in hexadecimal format rather than decimal format. Modified the SWITCH macro in HLL.HHF to complain if the user supplied two identical case values. Corrected a defect in the code generation for "cmp( reg. anonmem)" and "cmp( anonmem,reg)" instructions.

Version 1.20

(No Longer Available On-Line)

04/06/2000 New test files for this release started with "T11.HLA".

Corrected a defect dealing with negative DUP values; e.g., "x:uns32[4] := -4 DUP [0];" crashed the system. Fixed HLA not allowing the comparison of enum constants in a const expr. Corrected a defect in @matchStr and @matchiStr so that it would not modify the input string if it didn't match the test string. Added stdin.peekc to the Standard Library. Added several new examples and added some new documentation to the system.

Version 1.19

(No Longer Available On-Line)

03/30/2000 Began writing formal test code for the HLA compiler. Fixed lots of little defects in the code related to the changes made in v1.18 (too many to really enumerate here). Began writing formal test procedures for HLA (and fixing bugs as they were encountered).
Version 1.18

(No Longer Available On-Line)

03/02/2000 Taking the address of a non-static object with the "&" operator now reports an error. Corrected several dangling pointer references in built-in compiler functions. Added support for "name:forward(name);" forward declarations in type, const, val, var, static, readonly, data, and storage sections. Added support for "_initialize_" string. Added support for "_finalize_" string. Corrected a defect in the @size function (it did not return the size of a type ID correctly). Corrected a defect related to the use of external symbols and recursive calls of externally declared procedures. Corrected defects in IsLower and IsUpper library routines. Modified pat._success_ macro so it doesn't wipe out the EAX register. Fixed defects in console.InsertLn, console.InsertLines, and console.DeleteLn. Fixed defects in some stdlib routines. Added new compile-time pattern matching functions to the language (too many to list here, see the documentation). Added #text..#endtext blocks. Fixed definition of str.tokenize in the documentation file (old version with src/dest reversed). Fixed a defect that occurred when accessing an element of an array that was a field of a record.
Version 1.17:

(No longer available on-line)

02/11/2000 Added ability to use "!" operator in front of flag token (i.e., !@c, !@z, etc.). Broke up the CSET module into separate files to reduce executable sizes. Also broke up the STDOUT, STDIN, CONV, DATETIME, MATH, STRINGS, and FILEIO modules. Fixed a defect that did not allow DWORD variables to be treated as POINTER objects. Added code to force the user to put a semicolon after certain HLA Standard Library macro invocations, including stdin.get, stdout.put, pat.endmatch, fileio.put, and some others. Fixed some problems with procedure pointer variables. Added "RETURNS" clause to procedure pointer variables. Added ability to use external procedure pointer variables. Added ability to specify a memory variable in boolean expressions of the form "mem in x..y" and "mem not in x..y" (previous code only allowed registers). Added ability to use a CSET constant expression as the second operand to the BT instruction (assumes the first operand is REG16 or REG32). Fixed a problem with #while loops; they were pushing an extra character onto the lexer stack and this cause a lexer stack overflow if the loop interation count was really high. Fixed a bug in the while loop that caused it to skip from the end of a nested while loop immediately into the outer while loop without processing statements after #endwhile (e.g., in a macro). Added SNOBOL4-like str.replace procedure (transliteration). Modified routines in CONV module to require the "conv." prefix. Also, modified certain routines whose name begins with an Uppercase character to follow the HLA Standard Library convention of beginning with a lower case alpha char. These last two modifications will, undoubtedly, break some code that's out there. Added conv.roman and conv.a_roman routines. Added numeric to english conversion routines. Fixed a defect dealing with subscripted array objects not being treated as an object of the array's base type. Corrected a Dangling Pointer defect in the symbol table routines that created problems during recursive procedure calls. Fixed a defect in IF{stmts} ..ELSEIF( expr) ... ENDIF; code generation. Added "BITS" module to the standard library (includes cnt, reverseX, mergeX, and nibblesX routines). Added the coroutines library module and modified the compiler to generate coroutine-fiendly code. Fixed a defect that prevented taking the address of a previously declared procedure with the "&" operator. Corrected a defect in the handling of the #asm..#endasm section so that it now counts lines properly during compilation. Fixed a defect in fileio.putsSize (this also affects stdout.putsSize); it didn't handle field widths less than the length of the string in a proper fashion. Split the distribution into two pieces: executables and source (standard library source code). Corrected a problem with forward declarations in a program (procedures and other program units at lower lex levels thought that the forward declarations were within their scope).
Version 1.16

(No longer available on-line)

01/17/2000 Corrected a defect that didn't allow method calls from a function via "this.methodname()" invocation; translated "this." to (type classname [esi])." to solve this problem. Improved error reporting by adding productions to handle missing semicolons, commas, parentheses, brackets, and other special symbols. Added readonly..endreadonly section to code segment. Added a production to allow dropping the "()" after an implied addressing mode instruction (e.g., "nop") if a ";" follows the instruction. Added VMT declaration to STATIC and READONLY segments to allow the user to specify the emission of the virtual method table.
version 1.15

(No longer available on-line)

01/07/2000 Pass by reference parameters allowed bare registers. Corrected this defect so that it now prints an error message. Corrected errant instructions in the Standard Library that took advantage of this defect. Modified pass by name and pass by lazy eval parameter syntax; thunks for the actual parameters are surrounded by "thunk #{" and "}#" rather than "thunk(" and ")". Changed syntax for thunk assignment to be "thunk name := #{ stmts }#;" rather than "set name := code( stmts );" Changed hybrid parameter sequence to "#{ stmts }#" from "code( stmts)". Modified HLL statements to use "#{stmts}#" rather than "{stmts}" for statements like "IF({stmts})then..." (it's now "IF( #{stmts}# ) then..." Corrected a defect that occured when passing a reference parameter by reference to another procedure when the base type is an array. Added ability to use register type coercion (e.g., "(type int32 eax)" with all instructions (This was a *major* change to the code!). Added ability to use "[reg][reg][disp]" in addition to [reg+reg+disp]" (plus all the other possible combinations) in addressing modes. Fixed a defect with the data type of external arrays of non-primitive types. Had to eliminate expansion of macros and text objects in #if and #while statements. Unfortunately, this means that the _for and _foreach macros in HLL.HHF had to be removed. This eliminated a bug that caused HLA to crash if there were too many #if, #elseif, or #while statements in a macro.

AS PROMISED IN THE DOCUMENTATION:

Eliminated all the stdio functions that did not have the "stdin." or "stdout." prefix. Also changed the file I/O routines to require a "fileio." prefix.

This will probably break lots of existing code.

Changed several routines that returned a byte or word in EAX to return that value in AL or AX (as appropriate). Examples include stdin.get, stdin.geth, etc. Added "SET(boolexpr,reg/mem);" form of the SETcc instructions. Eliminated the three-operand form of the SETcc instructions. Began reworking the Standard Library code, breaking up the large source files into separate files for each function (to reduce the size of HLA executables by linking in only the necessary routines). Cleaned up several of the symbol table functions (@elements, @size, @NumElements, etc.) and added @IsMem and @IsType functions to the system. Fixed some conversion problems with the built-in transcendental functions. Added the datetime library module to the system.

Version 1.14

(No longer available on-line)

01/01/2000 Fixed problem with uninitialized real variables in Static section. Added ability to use anonymous memory locations in HLL boolean expressions. Added range expressions to IF, WHILE, REPEAT..UNTIL, EXITIF, BREAKIF, and CONTINUEIF statements. Added ability to specify statements like "IF({stmts})then" in addition to "IF{stmts}" (added to better support macro parameters). Fixed a defect associated with looking up forward referenced pointers in forward-declared procedures. Fixed a few subtle defects in IF..THEN..ELSEIF..ELSE..ENDIF code generation. Added "reg not in const..const" form to boolean expressions. Added JT and JF pseudo-instructions. Fixed a defect in the code generation for the BOUND instruction (operand size problem). Reimplimented HLA exception handling using Windows Structured Exception Handling; added hardware exception handling capabilities as well as the appropriate constants in excepts.hhf. Added @bound and @into compile time variables to control the code generation for the BOUND and INTO instructions. Corrected a defect in the type checking of DWORD, WORD, and BYTE constant expressions. Changed CONTEXT..ENDCONTEXT to BEGIN..END. Also modified EXIT and EXITIF to allow leaving (nested) procedures. Eliminated the RETURN statement since EXIT and EXITIF now do the same job (and more). Added RDTSC instruction support. Added ability to pass any sized value parameter. Cleaned up type and size checking of value and reference parameters. Added NOALIGNSTK procedure option. Eliminated the "=" in ENUM declarations. Added code to differentiate arrays from array elements in expressions and parameter lists. Added support for CPUID instruction. Added support for Pentium Pro (and later) CMOVcc instructions. Added support for floating point conditional move (FCMOVcc) instructions. Added support for the floating point FCOMI, FCOMIP, FUCOMI, and FUCOMIP instructions. Defined "NULL" and "nil" constants in memory.hhf (both are set to zero). Fixed a defect in the operand size for DIV, IDIV, etc. Added the @ElementSize compile-time function. Added the following macros to HLA.HHF: IsUns, IsInt, IsHex, IsNumber, IsOrdinal, IsNumeric. Modified BT, BTS, BTR, and BTC instructions to accept a CSET object as the memory operand. Added the CS.COMPLEMENT function to the cset library. Added STRINGS segment to memory model in order to prevent problems when writing record constants (that contain string fields) to the READONLY segment. Added code to automatically copy Pass by Value/Result parameters on entry and exit from a procedure/method/iterator; also added code to copy Pass By Result parameters on exits from these program units. Added CHARS module to the HLA Standard Library (includes routines like chars.toUpper, chars.isAlpha, etc.) Added @EVAL built-in function. Fixed a minor defect that confused built-in function identifiers with user identifiers in macro parameters. Added the str.strvar macro to allocate static strings. Fixed a minor defect with the DUP operator - it only allowed UNS32 sizes, now it allows any positive integer type. Changed str.length from a macro to a procedure (for compatibility reasons); added str.mlength to replace old macro version. Fixed a defect in the label generating logic for the "WHILE( reg in const..const) do" statement. Added a new boolean expression format to the HLL statements; now you can specify "reg8 in cset" and "reg8 not in cset" to check to see if a character is (or is not) a member of a character set. Corrected a defect in the stdin.get macro; it didn't properly recognize the types of objects that included indexed addressing modes.
Version 1.13

(No longer available on-line)

11/30/99 Corrected a defect with respect to string constant emission to the MASM file - properly output string constants so they consume a multiple of four bytes as required by certain library routines. Started putting string constants into a new "readonly" segment so programs cannot overwrite string constants at run-time. Added "storage" and "readonly" sections to data declarations. Added "align" directive to static and automatic variable sections. Also added align as a statement in the code section. Also added align as a procedure declaration option. Fixed a defect that caused forward static references to be ignored in class procedures were present in the source. There was a problem if a static variable took the address of another static variable that hadn't been declared yet but there was a global static variable with the same name; previously, it took the address of the global variable; now it takes the address of the local variable (that hasn't yet been defined). Changed the syntax of data pseudo-opcodes within the data declaration section. Added the ability to use data pseudo-opcodes within the static and readonly sections. Modified the LEA instruction to allow the user to swap the operands, if desired.
Version 1.12

(No longer available on-line)

11/11/99 Added @IsfReg, @IsReg8, @IsReg16, and @IsReg32 compile time functions. Modified @class to return false if something other than an ID is passed as a parameter. Cleaned up the other symbol table functions (@...) to better handle errors. Fixed a defect that occured when accessing a field of an array of records. Fixed another pesky defect dealing the line number reporting in error messages (#while loops weren't working properly). Added @linenumber function.
Version 1.11

(No longer available on-line)

11/09/99 Fixed some lingering bugs in the library code as a result of changing the external names. Added "@global:id" syntax to allow accessing non-local identifiers while defining a namespace (admittedly a kludge). Fixed a weird bug that generated an error if you accessed a field of a record when there was a local variable (outside the record) with the same name, but spelled with a different case. Changed grammar to catch certain local symbol redefinitions. Fixed a defect concerning passing character set constants (didn't check formal parameter for type mismatch). Corrected a defect occuring when passing an undefined symbol as a procedure parameter. Added the console library. Modified HLA.EXE to set aside a default stack and heap of 4MB. Added the for..endfor statement to the language (removed it from the stdlib). Added a DLL example and documentation for writing DLLs in HLA.
Version 1.10

(No longer available on-line)

11/04/99 Added "!" operator before register and memory operands in boolean expression inside IF, WHILE, REPEAT/UNTIL, etc. Modified boolean expressions to allow statement composition producing just a register or memory operand. Changed "if(code(stmts)) then" to "if{ stmts }". Recoded "while( boolexpr )" statement to emit test for loop termination at the bottom of the loop rather than at the top of the loop (more efficient). Modified "while(code(stmts)) do" to become "while{stmts}". Added "exitif{stmts} lbl;" form to context..endcontext statement. Added "breakif{ stmts };" statement. Added "continueif{ stmts };" statement. Changed the HHF files for most of the standard library routines to use (hopefully system-wide) unique external names for most library routines.
Version 1.9

(No longer available on-line)

11/02/99 Fixed a bug in the memory-to-memory move pseudo-instruction (now it allows anonymous memory references and doesn't allow 8-bit operands). Added "continue" and "continueif" HLL statements. Fixed a bug in the try..endtry statement (incorrectly popped stuff off the stack). Added anyexception and uprotected sections to try..endtry. Modified stdin routines to automatically flush the input line if they raise an exception. Added FlushInput routine to the stdin module. Modified documentation for ReadLn so that it correctly describes ReadLn's behavoir (it used to describe FlushInput's behavoir). Modified #while to process macro and text ID's while recording text so that a macro or text object could generate the corresponding #endwhile. Added to @tostring:identifier construct to allow the redefinition of text constants. Added the hll.hhf (high level language statements) module to the Standard Library (provides the run-time control structure definitions for a for loop, and a switch/case statement; also provides the compile-time _for and _foreachparm loops). Added optional C/C++ syntax capability to the switch statement. Fixed some bugs in the constant processing code as well as several memory leaks. Added pat.UpToStr and pat.UpToiStr to the pattern matching library. Added pat.a_extract routine. Renamed most of the pattern matching functions. Fixed a bug in the evaluation of non-local VAL objects when using the "?" assignment statement. Fixed several problems with the file I/O "put" macro in the standard I/O library. Fixed a problem in the pat.extract routine (wasn't zero terminating the string). Modified the compiler to allow access to macros and other class objects when using a pointer to a class variable. Fixed a defect in the code generation of the pat.alternate macro. Fixed a bug in the str.index function.
Version 1.8

(No longer available on-line)

10/28/99 Fixed a bug in the #while processor (could not handle nested #whiles correctly). Corrected a defect in the output of dword arrays initialized with static pointer constants. Wrote some additional test code including a file comparison routine to compare the output of two assemblies during testing. Added pat.MatchToStr and pat.MatchToiStr to the pattern matching library. Fixed an error in arg.v() in the args library.
Version 1.7

(No longer available on-line)

10/26/99 Began writing formal regression test code. Corrected defect in constant array coercion code. Fixed a bug in the code that processes macro parameters so that it would consider anything inside a pair of parentheses to be a single parameter. Added the math library module. Added the args (command line arguments) library module. Fixed a couple of minor bugs in the compiler
Version 1.6

(No longer available on-line)

10/21/99 Added the Tables module to the Standard Library. Fixed a problem with calling a procedure pointer that was a non-local variable. Added "eof" method to the file class. Fixed a few other small bugs in the compiler.
Version 1.5

(No longer available on-line)

10/19/99 Fixed the problem with recursive macro calls. Fixed problems with line number reporting in error messages (involving macros). Fixed several other little bugs in the compiler. Added the random number generation package to the library. Added the pattern matching routines to the library.

Warning: In this version, the "string.hhf" header file name was changed to "strings.hhf". This may affect code that you've already written.

Version 1.4

(No longer available on-line)

10/14/99 Fixed a duplicate symbol error in win32.hhf. Changed win32 namespace name from "w" to"win". Eliminated duplicated constants in the stdio.hhf and win32.hhf header files. Fixed several bugs in the standard library and the compiler. Implemented external iterators and added iterators to classes.
Version 1.3

(No longer available on-line)

10/12/99 Fixed lots of bugs in the standard library. Corrected several bugs in the compiler. Implemented external directive for static variables and removed "public" keyword from the compiler. Warning: there were a large number of changes between versions 1.2 and 1.3. Undoubtedly, some new bugs where introduced in previously working sections of the compiler.
Version 1.2

(No longer available on-line)

10/07/99 Fixed lots of bugs in the compiler and standard library. Also split the documentation up into three pieces. Primary compiler defects included accessing certain fields of records, unions, and classes at the wrong offset in an activation record. This code represents the first time many of the standard library routines were even tried (much less, tested). Hence there were many changes to the standard library (too numerous to mention here). Also added several new example files.
Version 1.1

(No longer available on-line)

10/01/99 Initial release on the internet (version 1.0 had been previously released to UCR Students).