The key point is that the OS is running in 64 bit mode. If the OS is in 32 bit mode, as for normal Windows XP, then we are back to 100% compatibility. For non-programmers: The OS sets up an environment which determines how an application will run. Once control is passed to the program, it is confined to that environment. After the processor has switched to 64 bit mode for the OS, the OS can set an apps environment to 64 bit or 32 bit, even though the OS itself is running as 64 bit.
I'm unclear about this, but this is as much as I understand. Once AMD64 is switched into 64 bit mode for the OS, one old mode is unavailable. (real mode?) I am not sure if this mode is required to run 16 bit programs or not. If it is, then I believe sonoran is right. I just do not know how the 16 bit compatibility mode is accomplished while in Windows.
The default Windows mode for applications has been 32 bit since Windows 95. Before that the default mode for Windows apps had been 16 bits. In the Windows 3.1 era, there was a Win32 module that could be added to allow 32 bit programming, but it was not used much. A prefix also could be added to opcodes to make it use 32 bit wide data even while the mode was set to 16 bits, although that was not used much either. (There is no corresponding capabilty to use 64 bit wide data while set to 32 bit mode for AMD64.)
True, in AMD64 64 bit mode, programs can be set to run in 32 bit mode, where all the 64 bit extensions are unavailable, and everything looks exactly like the old x86 32 bit environment we have been using. Can 16 bit programs run correctly that way? No. The instructions act differently. The same op codes do different things in 16 bit mode as compared to 32 bit mode. Is there a mode available for true 16 bit programs? I don't know.
It is true that you can convert an instruction in 32 bit mode to act as 16 bit instruction by adding a prefix op, but that is not how native 16 bit programs are coded. So native 16 bit programs would be executing 32 bit opcodes without know it. Unless every native 16 bit instruction produces the expected result (which is unlikely), then some results would be wrong, and the program will not run right. For instance, if you add two 16 bit numbers whose sum goes over 16 bits, the carry flag is set to true in 16 bit mode, but to untrue in 32 bit mode.
To sum up, it seems possible that programs from the 16 bit era may not run in XP64. If not, then possibly there is some sort of emulator that could convert the programs on the fly.