       This file lists the changes in each version of MAX from the 
       previous release.  It also has the story of how MAX came to be.
       
				V 3.1
				
	1. Some error checking was added near the beginning of the
	   assembly process.  One-line error messages are given in
	   two colors.  Assembly stops so you can fix the errors.
	   Some of these errors were not found by DEBUG in previous
	   releases, so there was no error message for those errors.  
	   This change makes converting code written for other
	   assemblers dozens of times easier and faster!  The files
	   ERR1.ASM and ERR2.ASM were added to demonstrate some of the 
	   possible errors.  The file ERRORS.ASM was renamed to 
	   ERR3.ASM and updated.

	2. MAX now handles two label references in one line, so you
	   can now have lines like the following:
		      MOVWO VAR1, OFFSET VAR2
	   In some cases, lines like the above would not generate an
	   error message in previous releases.

	3. There was a bug in the DUP routine when it was used with
	   more than one character.  This sometimes created long lines 
	   that were truncated by DEBUG, sometimes without beeping.  
	   That fouled up the address estimate, causing "short jump" 
	   errors (fixed).  The Word and address estimators were also 
	   improved.

	4. When the string "dup" was buried in a byte variable name, 
	   the line was deleted. (fixed).
	
	5. Negative numbers can now be used in DW lines.  Example:
							  DW 0-1

	6. The label list is now sent to a file ending with .LST, so
	   you can examine it or print it out at any time.

	7. The first parts of MAX 3.1 were rewritten in assembly 
	   language (using MAX).  This made it dozens of times faster 
	   at finding certain errors.  A consequence of the rewrite 
	   is that INCLUDE files are now assembled at the end of the 
	   main file in order of their occurrence.  IN V3.0 they would 
	   have been placed in the exact point where they were used.  
	   Now you don't need to be smart about where you put them, 
	   but if you want a buffer at the end of the program, it will 
	   have to be in the last INCLUDE.  Another consequence is
	   that the maximum length of labels and names was reduced to 
	   24 characters, but you can have up to 500 of them now.

	8. A monochrome version is no longer supplied.  The program is                                
	   now in sections run by the batch file MAX.BAT.  A second
	   batch file MAX1500.BAT runs an alternate version with 1500
	   lines maximum.  That version has more string space than the
	   2000 line version.  The files INSTALL.TXT and INSTALL.BAT
	   were added.
	   
	9. When a line referenced it's own label, an endless loop of                                
	   correcting addresses occurred (fixed).  For example, the
	   following line now works: { Start:mov sp,offset start -1 }

				* * *

				V 3.0

	1. The concept of separating lines into fields was dumped.
	   This allowed the maximum number of lines to increase to
	   2000 and the number of labels to increase to 450.  It
	   also allowed the long forms of byte and word instructions
	   to be used.  For example: MOV BYTE PTR VARBL,1 
	   The speed also increased.
	
	2. There was a problem when a label was followed by more than
	   one tab character. (fixed)

	3. A line with a segment override in the middle (incorrect
	   for MAX) was interpreted as a label.  If that "label"
	   matched another line, that other line was modified.  Now
	   the line with the incorrect syntax results in an error.

	4. A line like { CALL [variable] } errored.  Now it works.

	5. MAX now works with Binary numbers for easier use of bit-
	   wise instructions like AND and OR.  A consequence of this
	   change is that HEX numbers must now end with (H) if they
	   contain a (B), otherwise a HEX number with a (B) in it 
	   would be treated as a Binary number.  It is ironic that I 
	   must change ASCII character representations of binary 
	   numbers to decimal, then to HEX, just to get them to binary!

	6. The number converter is now prevented from changing labels
	   with numbers in them (or references to them).  This allowed
	   a simplification of some code.  A consequence is that HEX
	   numbers must always begin with 0 to 9, so some files that
	   worked with V2.X may need to be tweeked a little.

	7. The label list is now printed in 3 columns instead of one.
	   The diplaying of file contents was discontinued.

	8. Lines with the strings ORG or INCLUDE in quotes were 
	   deleted.  (fixed) 
	
	9. Single and double quote characters can now be used in non-
	   DB quotes.  For example, the following lines can now be 
	   used:     mov ax,'"'
		     cmp ax,"'"

	10. The example file DISK.ASM was added to the package.  The 
	    documentation was updated.

				* * *

				V 2.12

	1. A problem occurred when a variable name was a fractional 
	   part of another variable name.  The shorter name was used
	   in lines with indirect addressing when it was before the
	   longer name in the program. (fixed)

	2. Square brackets were added to the equate "rules" decided
	   upon in Version 2.11 below, so an equate can work inside
	   square brackets again.

	3. An error occurred when a label was a fractional part of
	   a direct address reference. (fixed) 

				* * *

				V 2.11

	1. A problem occurred when an equate was a fractional part of
	   a variable name.  Now replacement of the equated item does
	   not occur unless there is a space, a comma, or nothing in
	   the spaces immediately to the left and right of the equated
	   item.  For example, no change will occur in the second line
	   below:
			DISK EQU [2C]
			MOV DISK1,AX
				
				* * *

				V 2.1                  

	1.  A string to be printed out would not print anything after
	    a semicolon (;).  (fixed)
	
	2.  A string to be printed out with printed quotes containing
	    a number would not print correctly.  (fixed)

	3.  MAX now handles converting multiple ascii characters to
	    their HEX codes instead of just one.  Example:
			mov ax,'az'     ; ok now

	4.  The assembly process is more visible on the screen, with
	    the name of the created file printed out at the end.
	    The speed of some subroutines was improved.

	5.  MAX now tolerates spaces after the label colon, and after
	    a comma, for better compatibility with existing code and
	    programmer's style.

	6.  An EQUate that contained the letters EQU resulted in an
	    error message like: "Illegal Function Call In line ...".
	    (fixed)

	7.  Segment overrides had to be behind a label unless they were
	    on a separate line.  They showed up on the label list if 
	    put on a separate line (still).  Now they can be used 
	    without a label.  
	   
	8.  A colon could not be used in non-db quotes.  Now it can.

	9.  You can now use a colon after a variable name if you like
	    (DB & DW lines).

	10. The JMP instruction was unintentionally limited to a range
	    of 3837 bytes (FFFh).  Now it's FFFFh as DEBUG allowed.

	11. Some code could result in an endless loop of pumping thru
	    DEBUG.  (fixed)

	12. There was a flaw in the word estimator.  It resulted in 
	    "short jump" errors (jz,jnz etc.) after a large chunk of
	    word data (DW XXXX DUP (0)). (fixed) 
	
	13. The address estimator was improved to lower the number of
	    times some files get pumped through DEBUG, and hence 
	    speed up the assembly process.
	
	14. DB strings that contained (=) were interpreted as equates
	    and deleted.  (fixed)
	
	15. MAX now handles 68 math coprocessor instructions 
	    (registered version only). 

	16. There were bad and obsolete examples in the .DOC file 
	    (sorry).  It was improved and expanded, and the files 
	    8088.max, 8087.max, and tutor.txt were added.  The example 
	    files were updated.

				* * *

				V 2.0 
		       
	1. EQUates now work on any part of a line (you can have
	   multiple EQUates on one line).  This required a major
	   reorganization of the software.

	2. An EQUate with the same name as a label caused results 
	   that were unpredictable.  (fixed) 
	   
	3. "Short jump" errors were reduced.  (Files with a lot of
	   DBs may not have assembled).  Errors showed up on the 
	   short jump instructions like JNZ.   

	4. You can now print out quotation marks in your text. Use
	   double quotes around text with single quotes, and single
	   quotes around text with double quotes.

	5. Colors were strange after exiting MAX. (fixed)

	6. There was a problem with DB strings that contained a word
	   the same as a label, and a ([).  (fixed)

	7. The label list contained EQUates that were not used 
	   anywhere in the code.  (ok now)

	8. Assemble times were reduced.  See the DOC file for details.

	9. The maximum number of lines of code was increased from 810
	   to 970.  The maximum number of labels & names is 200.

	10. The Decimal to HEX converter now works on all of the line,
	    so label references with numbers in them don't need an H 
	    at the end.

	11. Spaces are now allowed in place of commas in DB lines  
	    for compatibility with other assemblers.

	12. The DOC file and example files were updated.

				* * *

				V 1.1 

	1. Prints in color after INCLUDE and prints errors in red.

	2. Lowercase was not converted to uppercase after a DB 
	   string. (fixed)

	3. All consecutive spaces except one were deleted in a DB 
	   string. (fixed)

	4. Ascii characters 60 to 64 can now be used in an EQUate
	   or label.

	5. The tab character (ascii 9) can now be used in place of
	   spaces.

	6. Source code files with less than a 3 letter extension
	   caused an object file with a wrong name to be created. 
	   (fixed)

	7. You can now have as many EQUates as you want. Version
	   1.0 was limited to 15.

	8. Now works with programs that prevent overwrite of files
	   (such as 4DOS).

	9. MAX now handles 810 lines. The BRUN20.EXE program is no 
	   longer needed. 
	   
	10. The documentation and example programs are updated.
	
				* * *
				
HOW MAX CAME TO BE
------------------
	I, the author of MAX, was introduced to assembly language
	programming several years ago, but never did much with it.  
	I wanted to brush up when I got a PC compatible.  I was also
	disappointed with the limitations of BASIC on these machines,
	having used a more powerful one.  Assembly language would
	give me all the power built in to the machine.  I read some
	books on assembly language programming.  One of these was 
	"Peter Norton's Assembly Language Book For The IBM PC".  The 
	last half or two thirds of the book teaches you by having you 
	write a disk utility.  
	
	I had an assembler that I had typed in from a magazine listing.  
	It ran under GWBASIC.  It looked interesting, but had some real 
	problems.  The magazine gave it no promises, and I soon found 
	out why.  It appeared to hang up, but while I was reading the 
	"documentation" it came alive again!  After a lot of effort, I 
	got it working reasonably well.  It had been writing over some 
	of the DOS system.  I'll refer to it as the "m" assembler.  I 
	also got a super fast assembler whose name starts with an "a" 
	and ends with the year it was written.  I'll refer to it as 
	the "a" assembler.  It's documentation was really hard to 
	"wade through".

	I started through the book using both assemblers "in parallel".
	It soon became apparent that the "m" assembler had a lot of
	unwritten "rules" as well as the documented ones.  I did some
	experiments to discover them.  One of the first I learned was
	that it required the line numbers created by GWBASIC editor.
	The "a" assembler would not tolerate the line numbers, so I
	had to have two separate listings.  The "m" assembler was not
	at all compatible with others anyway.

	I had many problems along the way.  Neither assembler would
	handle the LEA instuction.  I got around that by using OFFSET.
	I made some modifications to the "m" assembler as I went along.
	I disliked the way the "a" assembler reported errors.  They
	were inserted into the program listing, and were hard to 
	understand.  This caused more frustrated searching through the 
	documentation.  I also disliked the scheme it used to replace
	INCLUDE.  I didn't know what order the files were being 
	assembled in.

	I noticed that the assembly time for the "m" assembler was
	going up exponentially as the number of lines increased.  
	About half way through the project the assemble time was over 
	30 minutes (on an 8Mhz 8088).  At that point I abandoned the 
	"m" assembler in favor of the "a" assembler.  About three 
	fourths of the way through, the "a" assembler reported an 
	error on a line that I couldn't resolve.  By then I was quite 
	comfortable with the assembler, but it was no use.  The "a" 
	assembler had confused a byte variable with a word variable.  
	It was the end of the line.

	By then there were too many changes to consider going back to
	the "m" assembler.  Also, I expected the assembly time to be
	well over an hour.  At that point I decided to write my own
	assembler (MAX), hoping to give it the best features of both. 
	I kept improving MAX until it would handle the Norton file.  
	After more than two years, MAX 1.0 was ready.  

	MAX was slow compared to the "a" assembler, but much faster 
	than the "m" assembler.  I guess this is the story of the 
	snail, the tortise, and the hare.  The tortise got there, the 
	hare laid down on the job, and the snail is dead!
