
                   README.TXT File

           Release Notes for the Microsoft(R) MASM
        Professional Development System, Version 6.14

     (C) Copyright 1997, Microsoft Corporation.  All rights reserved.

     This document contains release notes for the Microsoft MASM 
     Professional Development System, version 6.14. The information in 
     this document and in the Microsoft Advisor (on-line help) is more 
     up-to-date than that in the manuals.

     The printed documentation for MASM 6.11 has not changed from MASM 
     6.10. MASM 6.14 is being released as a patch for users of MASM 6.11.
     The MASM 6.11 installation disks provide several important files that 
     include new or updated information for this release. They are:

     README.TXT =====> Contains patch installation instructions, 
                       documentation errata, system requirements, information 
                       and tips on using MASM 6.1x, and known assembler bugs.

     CV.TXT =========> Contains release notes for Microsoft CodeView(TM).

     ERRMSG.TXT =====> Contains updated information on 32-bit Linker errors,
                       ML error messages, and Microsoft DOSXNT MS-DOS 
		       Extender error messages.

     SAMPLES.TXT ====> Contains information about MASM samples for MS-DOS 
                       and Microsoft Windows 3.1.

     NTSAMPLE.TXT ===> Contains information about MASM samples for 
                       Microsoft Windows NT.

     SUPPORT.TXT ====> Contains updated Microsoft Product Support policies.
  
     Information on new processor instructions can be found in the
     following locations:

     Intel(R) Pentium(R)
        ====> In PENTIUM.TXT installed with MASM 6.11

     Intel(R) MMX(TM)
        ====> On the World Wide Web at
                http://www.intel.com/drg/mmx/manuals/prm/prm.htm

     AMD(R) 3D Technology
        ====> On the World Wide Web at
                http://www.amd.com/swdev/swdev.html

     Intel(R) Internet Streaming SIMD Extensions
        ====> On the World Wide Web at
                http://developer.intel.com/design/PentiumIII/manuals/

======================< README.TXT Table of Contents >=====================

     Part 1: Patch Installation
     --------------------------

     Part 2: Documentation Errata
     ----------------------------

     Part 3: System Requirements
     ---------------------------

     Part 4: Tips for Using MASM 6.1x
     --------------------------------
	     - ALIAS directive
	     - Assembling Files Generated by Compiler
	     - Building 32-Bit Applications
	       - 32-Bit Linking
	       - GROUP Directive and Flat-Model Programming
	       - Structure Packing Issues for Mixed Language Programming
	       - /WIN32 Switch for H2INC
	     - CD-ROM Not a Valid Target
	     - CMP Instruction Encoding
	     - Debugging MASM Applications under Visual C++, 32-Bit 
	       Edition, or Fortran PowerStation, 32-Bit Edition      
	     - INVOKE Command
	     - Multi-File Assembly with MASM.EXE
	     - NMAKE and NMAKER
	     - Response Files
	     - SAMPLES.TXT and NTSAMPLE.TXT
	     - Using MASM 6.x Structures
	     - Visual C++ 1.0/Fortran PowerStation 1.0 Compatibility
	     - Working with MASM 5.1 Code
	     - Working With Microsoft BASIC Far Strings
	     - .FPO directive new to MASM 6.11a

     Part 5: Known Assembler Bugs
     ----------------------------
	     - Expression Order in High-Level Conditionals
	     - Hexadecimal Constants
	     - Initializing Nested Structures
	     - Span-Dependent Expressions used in Macros
	     - Span-Dependent Equates in Macros and EXTERNDEF ABS
	     - Span-Dependent Text Equates
	     - STRUCT and RECORD Initialization

     Part 6: What Has Been Fixed in 6.11d?
     -------------------------------------

     Part 7: What Has Been Fixed in 6.12?
     -------------------------------------

     Part 8: What Has Been Fixed in 6.14?
     ---------------------------------------

     Part 9: What Has Been Added up to 6.14?
     ---------------------------------------

====================< Part 1: Patch Installation >=========================

     1. Make backup copies of the files affected by the patch.  These 
        files are all in the MASM bin directory (for example, 
        C:\MASM611\BIN).  The following files will be affected:

        ML.EXE
        ML.ERR
        H2INC.EXE
        H2INC.ERR
        WIN.INC

     2. Change to your MASM 6.11 root directory.  For example:

        C:
        CD \MASM611

     3. Copy the patch files to your MASM 6.11 root directory.  
        The patch files are:

        PATCH.EXE
        PATCH.RTD
        PATCH.RTP

     4. Run the patch program by typing:

        PATCH

        The patch program indicates its actions as it runs.  When the 
        patch has been successfully completed, you can delete the patch 
        files.

     5. Copy H2INC.EXE and H2INC.ERR from the patch diskette to your 
        \masm611\bin directory. 

     6. Copy WIN.INC from the patch diskette to your \masm611\include
        directory. 

     If you have trouble:
     -----------------------

     If you have problems installing this patch: 

     - Check to be sure that you have all three patch files: 
       PATCH.EXE, PATCH.RTP, and PATCH.RTD.

     - Make sure you have the correct version of the files to be updated.  
       This patch will only patch files from MASM 6.11, 6.11a, or 6.11d.

     If, after checking these possibilities, you still have problems, 
     please contact Microsoft Product Support.

====================< Part 2: Documentation Errata >=======================

     Environment and Tools, Page xxiii: Microsoft Support Services
     -------------------------------------------------------------
     Microsoft Support Services information has been updated. See
     SUPPORT.TXT, in the directory in which you installed MASM, for
     the most current Microsoft support information and policies.
     
     
     Environment and Tools, Page 582: LIB Command Line Sample
     --------------------------------------------------------
     The following example, as it appears on page 582, is incorrect:

     LIB FIRST +SECOND, , THIRD

     It should instead read:

     LIB THIRD +FIRST +SECOND

     
     Environment and Tools, Page 649, 651: _syscall and __syscall
     ------------------------------------------------------------
     The H2INC documentation on pages 649 and 651 lists _syscall and
     __syscall as C keywords recognized by H2INC. These are not recognized,
     and should be removed.

     
     Environment and Tools, Page 819: Error Message A2156
     ----------------------------------------------------
     The value range given for the first parameter of the PAGE directive
     is incorrect; "...either 0 or a value in the range of 10-255" should
     read "...either 0 or a value in the range of 14-255."
     
     
     Reference, Page 12: ML Command-line Options /Cu and /Cx
     -------------------------------------------------------
     /Cu is not the default command-line option, but is indicated as such
     in the MASM 6.10 Reference. Instead, /Cx should be indicated as the 
     default.
     
     
     Reference, Page 98: LEA is no longer optimized
     ----------------------------------------------
     The MASM 6.10 Reference indicates that the LEA instruction is
     encoded as a MOV when the source operand is a direct memory address.

     In response to programmer requests, MASM 6.1x no longer performs this 
     optimization automatically.  The optimization can be performed by 
     using the OPATTR operator, as shown in the following macro:

	  MOVLEA MACRO Dest, Symbol
	  IF (OPATTR(Symbol)) AND 08h
	       MOV Dest, OFFSET Symbol
	  ELSE
	       LEA Dest, Symbol
	  ENDIF
	  ENDM

     
     Programmer's Guide, Page 156: Using an Emulator Library
     -------------------------------------------------------
     The sample code demonstrating floating-point instructions served
     by an emulator contains the directive .STARTUP. This directive
     should be removed.

     
     Programmer's Guide, Page 202: User-Defined Epilogues & Prologues
     ----------------------------------------------------------------
     The documentation for user-defined epilogue and prologue code reads
     "Your macro function must return the parmbytes parameter."  It
     should read "...the localbytes parameter."

     
     Programmer's Guide, Page 323: The C++/MASM Interface
     ----------------------------------------------------
     The second sentence in the third paragraph reads: "The linkage 
     specification applies only to called routines, not to external
     variables." It should read "The linkage specification applies to
     called routines and external variables." The last sentence in the
     same paragraph should be removed.
     
     
     Help for Runtime Error R6921
     ----------------------------
     The on-line help for runtime error R6921 reads "...Possibly the
     CONFIG.SYS file contained a line such as DEVICE=C:\OS\MM386.EXE..."
     The file name should read "C:\DOS\EMM386.EXE".

=================< Part 3: MASM 6.14 System Requirements >=================

     The following are system requirements for Microsoft MASM 6.14:

     - Personal computer using a 386 or higher processor running Windows
       95, Windows 98, or Windows NT version 3.51 or later.
     - 4 MB of available memory.
     - Hard disk with 10 MB available space.
     - One 3.5" high-density (1.44 MB) disk drive (3.5" low-density (720K) 
       or 5.25" high-density (1.2 MB) disks available separately with 
       coupon enclosed).

     To target Windows 3.1, you need one of the following:

     - Microsoft Windows Software Development Kit (SDK) 3.1.
     - Microsoft Visual C++ Development System, Standard or Professional 
       Edition.

     To target Windows NT, you need one of the following:

     - Microsoft Windows NT Software Development Kit (SDK).
     - Microsoft Visual C++ Development System, 32-Bit Edition.

====================< Part 4: Tips for Using MASM 6.1x >===================
     
     ALIAS directive
     ---------------
     The ALIAS directive is not included in the printed documentation
     for MASM 6.10. The ALIAS directive can be used for creating 
     libraries that allow the linker (LINK) to map an old function to 
     a new function. 

     Syntax:    ALIAS  <alias> = <actual-name>

     where alias is the alternate or alias name, and actual-name is
     the actual name of the function or procedure. The angle brackets
     are required.


     Assembling Files Generated by Compilers
     ---------------------------------------
     Many compilers support assembly-language output.  If you experience
     difficulty assembling the output of such compilers, you may need to
     assemble using the /Zm option.  In some cases (for instance, if the
     compiler inserts nondelimited comments or page numbers) it may be 
     necessary to edit the assembly-language output by hand.


     Building 32-bit Applications
     ----------------------------
     Following are a number of items you should keep in mind when
     building 32-bit applications with MASM 6.1x. Examples of how to 
     create 32-bit applications can be found in the \SAMPLES\NTSAMPLE 
     subdirectory of the directory in which you installed MASM.

	  32-bit Linking
	  --------------
	  When you are creating a 32-bit application, you must link 
	  separately with a 32-bit linker. To prepare your object files 
	  for 32-bit linking, assemble using the following switches:
	  
	  - /c (assembles without linking)
	  - /coff (causes object files to be created in Windows NT-
	    compatible common object file format)
	    
	  After assembling, link with your 32-bit linker. Refer to the 
	  documentation included with your particular 32-bit linker for 
	  specific information and instructions. In addition, the sample
	  Windows NT applications in \SAMPLES\NTSAMPLE demonstrate the use 
	  of /c, /coff, and a 32-bit linker.

	  GROUP Directive and Flat-Model Programming
	  ------------------------------------------
	  The GROUP directive has no effect when used in 32-bit flat-model
	  programming. It is recommended that you not use the GROUP 
	  directive when programming in flat model. Using the GROUP 
	  directive with /coff will result in an error.

	  Structure Packing Issues for Mixed Language Programming
	  -------------------------------------------------------
	  Microsoft MASM uses /Zp1 as it's default setting for structure 
	  packing; this means that structures are not packed. Other 
	  languages may use other default settings for packing. For 
	  example, Microsoft C/C++ compilers prior to Visual C++ 32-bit 
	  edition use /Zp2; Visual C++ 32-bit edition uses /Zp8 as the 
	  default. Modules built using different structure packing may not 
	  be able to share structure data items, so care must be taken 
	  when using structures in mixed language programs.

	  The packing size is a maximum, not a fixed, packing value. This 
	  means that a member must have a size equal to or larger than the 
	  packing limit before any packing is done. 

	  /WIN32 Switch for H2INC
	  -----------------------
	  Use the /WIN32 switch with H2INC to convert C header files to 
	  NT-compatible MASM include files. When you use the /WIN32 switch,
	  C int data types are converted to the 4-byte assembler equivalent
	  DWORD (signed int data types are converted to SDWORD). Without 
	  the /WIN32 switch, H2INC converts int data types to 2-byte WORD 
	  (and signed int data types to SWORD).

    
     CD-ROM Not a Valid Target
     -------------------------
     A CD-ROM drive is not a valid installation target for MASM 6.11. Setup
     may incorrectly list a CD-ROM drive on the target drive list. 


     CMP Instruction Encoding
     ------------------------
     MASM 6.1x uses a different encoding for the CMP <reg8>,<reg8> 
     instruction than MASM 6.0 did.  There is no difference in length or 
     processor timing.

     
     Debugging MASM Applications under Visual C++, 32-bit Edition, 
     or Fortran PowerStation, 32-bit Edition
     -------------------------------------------------------------
     When debugging a pure MASM application under the 32-bit editions of
     Visual C++ or Fortran PowerStation, you must link in the library 
     file (.LIB) provided with these high-level languages (LIBC.LIB in 
     Visual C++, LIBF.LIB with Fortran PowerStation). If you do not use 
     the .LIB file included in the high-level language, you will receive 
     an "Access Violation" error message when you attempt to run a MASM 
     application in either the 32-bit Visual C++ or 32-bit Fortran 
     PowerStation integrated development environment.
     
     
     INVOKE Command
     --------------
     The MASM 6.x INVOKE command does not support transferring control
     between 16-bit and 32-bit code segments. When the assembler
     encounters an INVOKE command in a 16-bit segment, it assumes
     that the procedure being invoked is also in a 16-bit segment; if
     the assembler encounters an INVOKE in a 32-bit segment, it assumes
     that the invoked procedure is also in a 32-bit segment.

     To avoid this problem, push the necessary parameters on the stack
     and make the appropriate call instead of using INVOKE.


     Multi-File Assembly with MASM.EXE
     ---------------------------------
     When assembling multiple files with MASM.EXE, you must terminate the
     command-line with a semi-colon or a comma (for example, MASM *.asm;). 
     Failure to do this may cause the program to appear to hang if you are 
     running Microsoft Windows NT. If this does occur, you can terminate 
     the program with Ctrl+C.
     

     NMAKE and NMAKER
     ----------------
     MASM 6.11 includes two versions of the NMAKE project management 
     utility.  NMAKER.EXE is a real-mode version of the utility.  
     NMAKE.EXE is a driver program which first loads the MS-DOS extender 
     DOSXNT into memory, and then runs NMAKER.EXE.  Using the NMAKE.EXE 
     driver will result in faster build times.  Some development tools 
     from other manufacturers may be incompatible with NMAKE.EXE.  If you 
     encounter incompatibilities, use NMAKER.EXE instead.


     Response Files
     --------------
     Information on response files is not included in the MASM 6.10 manuals;
     however, this information can be found in "ML Command Line Options" 
     in On-line help.
     
     
     SAMPLES.TXT and NTSAMPLE.TXT
     ----------------------------
     SAMPLES.TXT contains information about the MASM samples for 
     MS-DOS/Windows; NTSAMPLE.TXT contains information about the 
     samples given for MASM for Windows NT. Both files include 
     information about additional tools you may need to build some 
     of the samples. If you choose to install the sample code during the 
     setup process, both SAMPLES.TXT and NTSAMPLE.TXT are included. 
     SAMPLES.TXT can be found in the \MASM611\SAMPLES subdirectory;
     NTSAMPLE.TXT can be found in the \MASM611\SAMPLES\NTSAMPLE
     subdirectory.


     Using MASM 6.x Structures
     -------------------------
     MASM 6.x supports a more powerful syntax for structure definition 
     and usage than previous versions of MASM.  This more powerful 
     syntax is enabled by default.  To use the older syntax, issue 
     the OPTION OLDSTRUCTS directive (see Appendix A of the MASM
     Programmer's Guide for more information).

     Note: use of nested structures requires the new MASM 6.x syntax.
     If you use nested structures, the OPTION OLDSTRUCTS directive will
     be ignored for the structure which is nested.


     Visual C++ 1.0/Fortran PowerStation 1.0 Compatibility
     -----------------------------------------------------
     There are specific steps you must take to use MASM 6.1x with 
     Microsoft Visual C++ 1.0 or Microsoft Fortran PowerStation 1.0.  
     If you wish to do mixed language programming with these products, it 
     is recommended that:

     - You install Visual C++/Fortran PowerStation and MASM 6.1x in 
       separate sub-directories.

     - You place \MSVC\BIN or \F32\BIN (your Visual C++ or Fortran 
       PowerStation sub-directory) first on your path statement before 
       \MASM611\BIN (your MASM 6.11 sub-directory).

     - You use NMAKE.EXE from MASM 6.11.  You can do this using various
       methods, such as moving or renaming NMAKE.EXE installed in \MSVC
       or \F32 thus causing the system to continue searching your path 
       and use the NMAKE.EXE in \MASM611.

     Optionally, for MASM 6.1x/Visual C++ mixed programming, you may
     use NMAKER.EXE which is installed with both products.

     When using the LINK utility included with Visual C++ 1.0, you may 
     encounter one or both of the following warnings:

	  LINK : warning L4017: /r : unrecognized option name; option 
				     ignored
	  CVPACK : warning CK4007 : unrecognized option /x; option 
				    ignored
     
     These warnings do not affect the resulting program and should be
     ignored.
     
 
     Working with MASM 5.1 Code
     --------------------------
     MASM 6.x offers major advances over previous versions of MASM.
     Some of these improvements require changes that make MASM 5.1
     source code incompatible with MASM 6.x. To provide compatibility
     with code written for MASM 5.1, MASM 6.x allows you to access
     MASM 5.1 compatibility code in three ways:
     
          - By using the conversion driver MASM.EXE. MASM.EXE converts
            your existing command-line options to the new syntax, adds
            the compatibility option /Zm, and invokes ML.EXE.
	  
          - By using ML.EXE with the /Zm option. You also need to
            convert command-line options to the new syntax.
	  
          - By placing the statement OPTION M510 at the beginning of
            each file. You also need to convert command-line options
            to the new syntax.
	    
     In most cases, using the /Zm option or OPTION M510 will be the best
     solution for assembling existing code. If you prefer to modify your
     code so it can be assembled without /Zm or OPTION M510, do the
     following:
     
     1. Add the appropriate OPTION directives to your code.

        - Always add the following:

          OPTION OLDSTRUCTS ; Supports old-style structures
          OPTION OLDMACROS  ; Supports old-style macros
          OPTION DOTNAME    ; Supports naming identifiers with
                            ; a leading dot [.]

        - If your code does not specify the .386 or .386P directive, add
          the following:

          OPTION EXPR16     ; Use 16-bit precision in expressions

        - If your code does not contain a .MODEL directive, add the
          following:

          OPTION OFFSET:SEGMENT ; Specifies that the OFFSET operator
                                ; defaults to segment-relative rather
                                ; than group-relative

	- If your code does not contain a .MODEL directive or if the
          .MODEL directive does not specify a language, add the following:

          OPTION NOSCOPED       ; Makes code labels global rather than
                                ; local to the procedure in which they
                                ; appear
          OPTION PROC:PRIVATE   ; Makes code labels defined with PROC
                                ; local unless specified otherwise

     2. Once your code assembles with the OPTION directives, remove each 
        OPTION directive, one at a time, and reassemble the code after you 
        remove each one.

        Usually, it is best to remove the OPTION directives in the 
        opposite order in which you added them. In some cases, you may 
        decide that you prefer the MASM 5.x compatibility behavior 
        instead of the new MASM 6.x behavior. When this is true, do not 
        remove the corresponding OPTION statement from your code. 
	
     For more information on assembling MASM 5.1 code, see Appendix A 
     of the MASM Programmer's Guide.

     
     Working With Microsoft BASIC Far Strings
     ----------------------------------------
     The BASIC runtime function StringAssign does not correctly handle
     strings of zero length.  Instead of calling StringAssign to convert
     a zero-length string, simply return a near pointer to a doubleword 
     with the value 0.


     .FPO Directive
     --------------

     FPO stands for Frame Pointer Omission. The .FPO directive is a feature 
     added to MASM386 5.10.NT that controls the emission of debug records 
     to the .debug$F segment or section of the object file. These records 
     are the same records that the Microsoft Visual C++ 1.10 or Microsoft 
     Fortran PowerStation compilers emit when they perform frame pointer 
     elimination under /Oy and /Ox optimization control, respectively. 
     Unlike the compiler, MASM never performs any such optimization. it 
     simply passes on the information supplied by the programmer within 
     this directive to the object file.

     The .FPO directive does not have to be used in order to debug assembly 
     programs under the Microsoft Visual C++ 1.10 or Microsoft Fortran 
     PowerStation debuggers whether they are stand alone Windows NT
     applications or mixed language C\Assembly or Fortran\Assembly Windows 
     NT applications. This directive has been implemented to provide better 
     backward compatibility with assembly code written for MASM386 5.10.NT, 
     which is provided with the Windows NT DDK.

     The FPO directive should only be used on naked procedures or those 
     procedures not declared with proto and called with invoke. Also you do 
     not need to use the .FPO directive to debug naked procedures or on 
     procedures that use proto and invoke. 


     The following 6 parameters are used within the directive as follows. 

     .FPO (  number of bytes in a procedures local variables divided by 4, 
             number of bytes in a procedures parameters divided by 4,
             number of bytes in a procedure prologue,
             number of registers saved by a procedures prologue,
             If EBP is allocated,
             Frame Type )            


        Parameters                                      Range 
        ----------                                      -----
        number of bytes in local variables / 4          >= 0
        number of bytes in parameters / 4               0 - 65535
        number of bytes in the procedure prologue       0 - 255
        number of registers saved                       0 - 7
        If EBP is allocated                             0 = false, 1 = true
        Frame Type                                      0 - 2

        The valid values for the Frame Type parameter above are 

        FRAME_FPO   0
        FRAME_TRAP  1
        FRAME_TSS   2

        The C compiler only generates entries with FRAME_FPO. The other two 
        types are used inside the Windows NT kernel to all stack traces 
        across trap and tss frames that can appear in ring 0 code.

        Example Usages:

        1) 
        aproc proc
            .FPO ( 0, 0, 0, 0, 0, 0 )       ; all params are zero. 
            ret
        aproc endp

        2)                      
        .code
            push  +000000001h             
            call  aproc
            add   esp, 04h
            ret             

        aproc proc
            push  ebp
            mov   ebp, esp

            .FPO ( 0, 1, 3, 1, 1, 0 )   ; 0 = no locals
                                        ; 1 = 4 byte param \ 4
                                        ; 3 = bytes in procedure prologue
                                        ; 1 = one register saved in prologue
                                        ; 1 = if EBP was allocated
                                        ; 0 = frame type of FPO

            mov   eax, dword ptr [ebp+8]  ; move the passed param to EAX.

            leave   
            ret   00h
        aproc endp


        See ERRMSG.TXT for a list of possible error messages that could 
        be encountered when using the .FPO directive.   

======================< Part 5: Known Assembler Bugs >=====================

     Expression Order in High-Level Conditionals
     -------------------------------------------
     Comparisons in high-level conditionals cannot begin with a literal.
     For instance, this comparison causes an error:

	  .IF 1 == AX

     but this works properly:

	  .IF AX == 1


     Hexadecimal Constants
     ---------------------
     In some instances, ML might not generate the appropriate error
     message if it encounters a hexadecimal constant that does not have
     an appending "h". The following will help to ensure that hexadecimal 
     constants are properly represented:

     - Make sure that all hexadecimal constants have an appending "h".
     - Begin all hexadecimal constants with the numeral 0. This ensures
       that the compiler will generate the appropriate error message
       if it encounters a hexadecimal constant that does not end in "h".

     
     Initializing Nested Structures ? 
     ------------------------------
     If one structure is nested within another, the inner structure's
     initializer list must either be empty or include a comma between
     every field.  For example, the structure INFO declared on page 123 
     of the Programmer's Guide contains a structure of type DISKDRIVES,
     which in turn contains three BYTE fields.  An object of type INFO
     could be initialized as:

	  Info1 INFO { , , , , { }}      ; Inner initializer list is blank

     or as:

	  Info1 INFO { , , , , {1, 2, }} ; Commas for all three fields

     but not as:

	  Info1 INFO { , , , , {1, 2 }}  ; Error: missing last comma
     
	  
     Span-Dependent Expressions used in Macros
     -----------------------------------------
     MASM 6.1x evaluates macro expressions only on the first pass of 
     assembly, but code and data are reevaluated on subsequent passes.
     Because of this, macro expressions which depend on the span between
     two addresses may not evaluate correctly. For instance, the
     following code will not evaluate correctly:

	  Label1:
	       JMP Label2
	  Label2:

	  REPEAT Label2 - Label1  ; Evaluates incorrectly
	       INC AX
	  END

     View the listing file to determine if a questionable macro expression
     was evaluated as desired.


     Span-Dependent Equates in Macros and EXTERNDEF ABS
     --------------------------------------------------
     The ABS operator causes an identifier to be exported as a relocatable
     unsized constant (see Programmer's Guide page 220).  If ABS is used
     with EXTERNDEF within a macro, and the constant being exported
     depends on the difference between two addresses, the constant may not
     be exported correctly.  In some cases, the listing file will show the
     correct value, but the value in the resulting .obj will be incorrect.
     For instance, the following code will not evaluate correctly:

	  EXTERNDEF TableSize:ABS  ; Will not be exported correctly

	  MAKETABLE MACRO
	  Table1 LABEL BYTE
	       DB 0, 1, 2
	  TableSize EQU $-Table1
	  ENDM

	  SEG1 SEGMENT
	  MAKETABLE
	  SEG1 ENDS

     To avoid this problem, either use the 'PUBLIC' directive in place of 
     'EXTERNDEF', or put a label before the equate, within the macro.


     Span-Dependent Text Equates
     ---------------------------
     The TEXTEQU operator is evaluated on the first assembly pass.  If
     TEXTEQU is used with an expression that depends on the difference
     between two addresses, the resulting constant may be incorrect.
     For instance, the following code will not evaluate correctly:

	  Label1:
	       JMP Label2
	  Label2:
	  WrongNum TEXTEQU %Label2-Label1 ; WrongNum will be incorrect


     STRUCT and RECORD Initialization
     --------------------------------
     If a STRUCT containing a UNION is initialized incorrectly, it is
     possible that the compiler might not generate an appropriate error.
     If the UNION contains a RECORD, the STRUCT is initialized to the
     default value for the original UNION.
     

     EQU Redefinition
     ----------------

     EQU can be redefined when a text macro is used, the following example
     illustrates this known bug.

     a EQU <T>
     a EQU <U>   ; This second occurence should generate an error "A2005: 
		 ; symbol redefinition" because once "a" is defined as a 
		 ; text macro it cannot be redefined to be a different kind 
		 ; of symbol.

     y EQU y     ; This statement is syntactically correct, but any attempt  
		 ; to use "y" and you'll receive "error A2123: text macro 
		 ; nesting level too deep".


=================< Part 6: What Has Been Fixed in 6.11d? >=================

     - The opcode generated for the FSETPM instruction has been 
       corrected.

     - Errors when using the ALIAS directive and creating COFF object 
       files have been fixed. 

     - Errors when using the ORG directive to back patch the code being 
       generated in a COFF object file have been fixed.

     - The extra byte in the listing file for instructions using 32-bit
       addressing modes has been removed.

     - Unresolved externals that could occur when a symbol appeared more
       than once in EXTERNDEF directives have been fixed.

     - You can now step through code in include files when building COFF
       object files.

     - Various Access Violations when generating COFF object files (/coff)
       have been fixed.


=================< Part 7: What Has Been Fixed in 6.12? >==================

     - Various Access Violations when generating CodeView debug information 
       (/Zi) have been fixed.

     - Errors when specifying an entry point with the END directive and 
       creating COFF object files have been fixed. 

     - Various structure packing inconsistencies when compared to the 
       Microsoft C/C++ compilers have been corrected. MASM 6.12 should now 
       pack structures the same as the Microsoft C/C++ compiler when using 
       the same packing options.


     - Note there were no major fixes in MASM 6.13 so there's no section on
       those fixes


=================< Part 8: What Has Been Fixed in 6.14? >==================

     - Incorrect A2039 errors indicating 'line too long' have been fixed.


================< Part 9: What Has Been Added up to 6.14? >================

  .586 and .586P Directives in MASM 6.11
  --------------------------------------
  The .586 directive enables assembly of non-privileged instructions 
  available for the Pentium processor. The .586P directive enables 
  privileged instructions in addition to the non-privileged instructions
  for the Pentium.

  The following example demonstrates implementation of the .586 directive.
     
  .586
  .model flat, C

  .data
  ; .586  gives 110100111111y = 0D3Fh
  ; .586p gives 110110111111y = 0DBFh
  var1 dw @cpu

  IF  @Cpu AND 0100000y
      %echo Pentium instructions enabled.
  ELSE
      %echo Pentium instructions Not enabled.
  ENDIF

  end

  .686 and .686P Directives in MASM 6.12
  --------------------------------------
  The .686 directive enables assembly of non-privileged instructions 
  available for the Pentium Pro processor. The .686P directive enables 
  privileged instructions in addition to the non-privileged instructions
  for the Pentium Pro.

  The following example demonstrates implementation of the .686 directive.
     
  .686
  .model flat, C

  .data
  ; .686  gives 110101111111y = 0D7Fh
  ; .686p gives 110111111111y = 0DFFh
  var1 dw @cpu

  IF  @Cpu AND 1000000y
      %echo Pentium Pro instructions enabled.
  ELSE
      %echo Pentium Pro instructions Not enabled.
  ENDIF

  end

  .MMX Directive in MASM 6.12
  ---------------------------------------------------------------------
  The .MMX directive enables assembly of MMX instructions.  Users can
  check to see that @Version is 612 or higher to tell if the version
  of MASM being used supports the .MMX directive and MMX instructions.

  The following example demonstrates the use of the .MMX directive.
     
  .586
  .MMX
  .model flat, C

  .code
      ;; MMX opcodes can be assembled

  end

  .K3D Directive in MASM 6.13
  ---------------------------------------------------------------------
  The .K3D directive enables assembly of K3D instructions.  Users can
  check to see that @Version is 613 or higher to tell if the version
  of MASM being used supports the .K3D directive and K3D instructions.

  The following example demonstrates the use of the .K3D directive.
     
  .586
  .K3D
  .model flat, C

  .code
      ;; K3D opcodes can be assembled

  end

  .XMM Directive in MASM 6.14
  ---------------------------------------------------------------------
  The .XMM directive enables assembly of Internet Streaming SIMD
  Extension instructions.  Users can check to see that @Version is 614
  or higher to tell if the version of MASM being used supports the .XMM
  directive and Internet Streaming SIMD Extension instructions.

  The following example demonstrates the use of the .XMM directive.
     
  .686
  .XMM
  .model flat, C

  .code
      ;; Internet Streaming SIMD Extension opcodes can be assembled

  end

  The Intel Internet Streaming SIMD Extension instructions use 128-bit 
  or 16 byte data items that need to be 16 byte aligned.  These data 
  items would normally be defined as an array of REALs, but can be 
  accessed with a single instruction as type OWORD (Octel Word).  
  This is an example of how the data would be defined and accessed.
     
  .686
  .XMM

  _DATA SEGMENT PARA 'DATA'
      ALIGN 16
      DATA_ARRAY  REAL4 1.0
                  REAL4 2.0
                  REAL4 3.0
                  REAL4 4.0
  _DATA ENDS

  _TEXT SEGMENT DWORD 'CODE'
      ASSUME ds:_DATA
      ;; ...
      movaps xmm1, OWORD PTR DATA_ARRAY
      ;; ...
  _TEXT ENDS

  end
