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!