at least in my case it would be good to have a masm alternative package ready to use, unpack and run, with examples with batch files to compile in one click. Easy to use, easy to see. With no external dependencies. I think that in such case masm would desappear and jWasm an forks would reign as real successors.
As I demonstrate every now and then, it is indeed possible to produce include files and macros that work with ML32, ML64 and the WatCom forks:
include \Masm32\MasmBasic\Res\JBasic.inc
Init
Inkey Chr$("This code was assembled with ", @AsmUsed$(1), " in ", jbit$, "-bit format")
EndOfCode
OPT_64 1 ; put 0 for 32 bit, 1 for 64 bit assembly
OPT_Assembler ML ; choose your assembler
Output, depending only on the OPT_ settings:
This code was assembled with ml64 in 64-bit format
This code was assembled with ML in 32-bit format
This code was assembled with UAsm64 in 64-bit format
This code was assembled with UAsm64 in 32-bit format
This code was assembled with AsmC in 64-bit format
This code was assembled with AsmC in 32-bit format
Full project attached, with source and six executables, all at 1536 bytes. It "compiles" by hitting F6, provided that MasmBasic is installed and you use the RichMasm editor to open the *.asc source. Note that it does
not require an additional "MASM64 SDK". It just needs the Masm32 and
MasmBasic packages, and UAsm, nothing else.
So, with a little bit of goodwill, it is possible to use both Microsoft ML64 (requiring
.if eax}=edx) and UAsm (happy with
.if eax>=edx) with identical sources and include files.
The problem is that JBasic.inc is just a proof of concept; the necessary macros and includes for both ML and UAsm will not fall from heaven, and I will not write them simply because I don't believe that 64-bit code is any better than 32-bit code

Note there is
a big and sophisticated macros and include files package that
could perform this task. However, it lacks an occasional switch:
IFDEF __UASM__
... use syntax that is compatible with Microsoft MASM, 32-bit version, plus UAsm, JWasm and AsmC ...
ELSE
... use syntax that is compatible with Microsoft MASM, 64-bit version, and nothing else ...
ENDIF
Simple example for Win64.inc, line 9552:
ifdef __UASM__
_Rip DWORD64 ? ;+0F8h
else
Rip DWORD64 ? ;+0F8h
endif
The
Rip in CONTEXT STRUCT works only with ML64, because in other assemblers it is the name of a register (i.e. a reserved keyword), used e.g. as follows:
lea rax, [rip+2] ; cannot work with current versions of ML64
jmp @F
db "Hello World", 0
@@:
PrintLine rax