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 MASM. 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.) - 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 \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 = - This causes the OS2 1.2 version to be built by makefile.os2 rather than the OS2 2.0 version. PATH = ;;;c:\tools\binb;c:\tools\binp LIB = c:\tools\lib INCLUDE = c:\tools\include Note: Tools directory comes from \\slug\tools\src\tools The command line: - cd \MASM\510nt - md obj\os2.12 - nmake -f makefile.os2 - The object and executable files will be in obj\os2.12 Building MASM for OS2 2.0: The environment necessary: MASMOS = OS2_2 - This causes makefile.os2 to build the OS2 2.0 version when it nmake is involked. PATH = ;;;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 INCLUDE = c:\c6_386\include - this comes from \\slproduct\current\c6_386\include The command line: - cd \MASM\510nt - md obj\os2.20 - 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 - 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 dies. - 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.