MASM 5.NT Version Information

5.NT.01, 12/5/90 - Jeff Spencer. Initial release, same functionality as the
		  released product Masm 5.10A.

5.NT.02, 3/5/91 - Bugs fixed:
		- The xchg operator given two undefined symbols rather than
		  registers would GP fault. The problem was caused by referencing
		  an invalid pointer after having detected the error. The solution
		  was to stop processing the xchg instruction when this error
		  is detected.
		- Some symbols defined by equates were not being found by
		  the symsrch routine. The assembler was incorrectly attempting
		  to scope equates. This code just happend to work on 16
		  bit environments because of the memory alignment. It failed
		  on NT/386. The code was removed.


			MASM 5.NT.01

		Written 12/5/90, by Jeff Spencer.

Current state of MASM:

Masm 5.NT.01 is a portable version of MASM 5.10A. It works exactly like
MASM 5.10A with the following exceptions:

    - Masm 5.NT.01 does not support floating point initializers. This is
      because the strtod and _strtold C runtime functions are unavailable
      at this time. Future versions will support this capability
      (the code to support this has been ifdef'd out). Attempting to
      initialize a variable with a floating point number will result in a
      divide by zero error at assembly time.

    - Support for the MS floating point data format, and .MSFLOAT directive
      have been removed. Once floating point initializers are supported they
      will use the IEEE formats.

    - The time/date stamp in listing files has changed to the format
      provided by the standard C runtime libraries.

The code has been built and tested on NT/386 and NT/MIPS using the OS2
subsystem C runtime libraries. As of 12/5/90 there are no known bugs in

General description of MASM 5.NT.01 code:

The code contained in this directory can produce an assembler to run on
OS2 1.2, OS2 2.0, and any version of NT. NT portability was achieved by
removing all assembly language and replacing all operating system
calls with C runtime calls.

Conditional Compilation Switches:

NOFLOAT 	- This constant is a binary switch. If it is absent the
		  code for floating point initializers is compiled. If it is
		  present then the floating point initializer code isn't
		  compiled. Currently the sources file does define this
		  constant. This allows MASM to be built despite the fact
		  that the strtod and _strtold functions don't exist
		  in the NT C runtime libraries. When these functions are
		  available the definition of NOFLOAT should be removed from
		  the sources file and masm rebuilt.

FIXCOMPILERBUG	- When defined allows some ifdef's to go around
		  some known compiler bugs. This include both CL386 and
		  MIPS compiler bugs. (These have been reported but not
		  fixed as of 12/5/90.)

<others>	- See asmconf.h.

General Info on building MASM for NT:

MASM 5.NT has been set up to use the standard NT build mechanism without
the requirement of the source actually being in the NT source tree. What
follows is a quick synopsis of my experiences with the NT build environment.

Building for the NT environment is not done through the standard
nmake mechanism. Instead the NT group uses a standard set of tools
that assume that the NT file tree starts at <current drive>\NT.
The best documentation I've found on how to set up to build files to run
on NT is in a file called newcomer.txt on \\ntos2\ntrel\release. KyleSh wrote
this document and can be quite helpful. Note that this document describes
both the development projects and the release project. It is only necessary
to enlist in one of these two projects. The advantage of enlisting in the
developer project is that you have the latest version of everything, and
with the right hardware, can build for MIPS. The disadvantage is
that this tree occupies over 100Mb of disk space. Although you can ghost
some of this I'm not sure which portions of the tree aren't needed. You also
have to build your own version of the NT kernel, OS2 subsystem, ect. The
advantage to enlisting in the release project is that you only have to build
your own code. And it requires only 21Mb of disk space. I found that for
building masm for NT/386 the release project was adequate. However, getting
the environment configuration files in the developr directory set up for
yourself can be a hassle. Also, be forewarned that sometimes the build tools
on the released project don't get updated as quickly as they should.
Note that the MASM tree must reside on the same logical drive (drive letter)
as the NT stuff. This is a limitation of how the NT tools work.

The masm project can be enlisted in from almost anywhere on the disk.
I suggest placing it in \MASM. Just make sure it is on the same drive
as the NT tree.

To use the developer projects rather than the released project you will
need to enlist in the projects: public, private, developr and os2.

Building MASM for NT/386:

    Released project method:
	- cd \NT (from \\os2nt\ntrel)
	- ssync -r
	- cd \MASM\510nt
	- build -esi -386 masm
	    Note: I've been having trouble with this hanging up at the link
	    step. Simply executing nmake at that point will finish the build,
	    assuming your environment variables are set up for 386 builds.

    Develeoper projects method:
	- cd \NT
	- ntsync
	- build -esi -386 os2 os2ss cmd cmd32
	    Note: This to build the necessary libraries to link with
		  and a version of NT to run on.
	- cd \MASM\510nt
	- build -esi -386 masm

Building MASM for NT/MIPS:

    As of this writing to build for the MIPS processor requires an Etherlink
    II network card and TCP/IP software. MarkL has this software and
    directions on how to install it. This is required because the
    actual MIPS compilation is done on a DEC server. The makefile.def
    file automatically ships the file to the server compiles it and ships
    it back.

    To build for the MIPS processor use the same procedure as for the 386
    except replace the -386 switch with the -mips switch.

Building MASM for OS2 1.2:

    The environment necessary:
	MASMOS = <nothing, i.e. not set>
	    - This causes the OS2 1.2 version to be built by makefile.os2
	      rather  than the OS2 2.0 version.
	PATH = <os2>;<LanMan>;<slm>;c:\tools\binb;c:\tools\binp
	LIB = c:\tools\lib
	INCLUDE = c:\tools\include
	Note: Tools directory comes from \\slug\tools\src\tools <pswd: vorga>

    The command line:
	- cd \MASM\510nt
	- md obj\os2.12 <if this hasn't been done yet>
	- nmake -f makefile.os2
	- The object and executable files will be in obj\os2.12

Building MASM for OS2 2.0:

    The environment necessary:
		- This causes makefile.os2 to build the OS2 2.0 version when
		  it nmake is involked.
	PATH = <os2>;<LanMan>;<slm>;c:\c6_386\binb;c:\c6_386\binp
		- The release point for c6_386 is \\slproduct\current\c6_386
		  however the compiler code on \\sl\users\hanss\larch is
		  generally more current, and more bug free. The password
		  for \\slproduct\current is rikwrast, the password for
		  \\sl\users is soonhely.
	LIB = c:\c6_386\lib
		- this comes from \\slproduct\current\c6_386\lib
		  <pswd: rikwrast>
	INCLUDE = c:\c6_386\include
		- this comes from \\slproduct\current\c6_386\include

    The command line:
	- cd \MASM\510nt
	- md obj\os2.20 <if this hasn't been done yet>
	- nmake -f makefile.os2
	- The objects and executables will be in obj\os2.20

MASM execution speed:

In order to speed up the port from MASM to NT we decided to replace all
occurences of integer variables with either signed or unsigned short
variables. This was done at the expense of execution speed and size.
Therefore, this is one area that could be visited if execution speed
becomes an issue.

Testing MASM:

There are two different mechanisms available to test MASM on NT. The normal
mechanism uses the testing tool td. Although td is the preferred way to do
the testing it currently doesn't work on NT because of various subsystem bugs.
Because of this a set of very simple command files has been developed to run
the tests.

Testing MASM using TD:

    - Read the readme file on \\slog\slm\src\nt
    - Enlist in the NT project on \\slop\slm <pswd:ungepamm>
	- The directory you enlist must be on the same drive as the NT tree.
    - Build all the tools in the project (see readme)
    - Put the exe's built in a directory in the path on the NT test machine.
    - Put masm.exe in the same directory.
    - Tree copy \\loki\test\masmqa to \masmqa on the NT test machine.
    - Boot NT.
    - Start the OS2 cmd processor (cmd32).
    - cd to the masmqa directory.
    - Run the command "td masm=masm"
    - Within the masmqa directory will be a file called masm.log. This file
      contains the summary of the test results. Within each of the
      subdirectories below masmqa will be a log file with the same name as
      the subdirectory that contains the test results for that directory.

Testing MASM using command files:
    - Tree copy \\loki\test\masmqa to \masmqa on the NT test machine.
    - Over the top of this tree copy the masmqa tree contained under the
      masm 510nt project (this directory). This adds the necessary command
      files to the standard test tree.
    - Put masm.exe somewhere in the NT file execution path.
    - Boot NT
    - Start the OS2 command processor (cmd32).
    - cd to the masmqa directory.
    - Run the command file "testnt.cmd".
	- This will assemble all the test files and leave the resulting objects
	  on the hard disk.
    - Boot OS2 1.2.
    - cd to the masmqa directory and run the command file "checknt.cmd".
	- This will compare each of the object files with the pattern in
	  the results subdirectory. Note that a binary comparison is not
	  done. This is because the command line that td and the command
	  files use to invoke masm are slightly different. This results in
	  the file name stored in masm.obj having a slightly different mix
	  of upper and lower case. Rather than doing a binary compare a diff
	  is done of the decoded object files. Then expected differences are
	  thrown out.
    - Note: The command files currently skip any tests that would
      involve redirecting the error output to a file. This is because the
      NT command processor can't do redirection at the moment. Hopefully
      by the time a working command processor is running these command files
      can be abandoned completely in favor of td.
    - NT/386 status:
	Currently the top level command file must be cut in half and executed
	separately for the tests to run through. Otherwise NT gets tired and
    - NT/MIPS status:
	Currently files can't be found unless they are in the root directory
	or a full path to the file is specified. This appears to be
	an NT problem and not related to MASM, therefore I've simply been
	working around this limitation. This should be fixed after the windows
	subsystem command processor is available. To work around the problem
	move the assembly file and all include files to the root directory.

Expected failures:

    - Some of the test files generate warnings. These can be safely ignored.
      Most of these warnings occur in the win386 subdirectories.
    - There is a test that checks the error output from code that has too
      long of a line in it. The error output will not match for this test.
      This is actually an improvement on MASM 5.NT. The MASM 5.10A assembler
      used to literally cut the line in half and try to process the second
      half of the line as a separate line. This would then generate more errors
      than actually existed in the file. MASM 5.NT doesn't do this but instead
      logs the line too long error and goes on to the next line.