This is a botched version check error message.
Windows 1.x was designed to run under MS-DOS 2.0, 3.0 and 3.10; to ensure it only runs under one of these, it performs a version test on its host DOS. Windows does not merely obtain the officially-advertised version number; to ensure the version number is not spoofed, it also tests whether certain fields of the DOS data segment are found at the expected addresses. When one of these checks fails, the beta version of Windows displays a message detailing the specific check that failed to pass:
In the final release of Windows, these detailed messages were hastily removed. The code that would print them, however, was not, and this is what produces the garbage output. We can see this in the disassembly of WIN100.BIN
:
-u 7359:7004
7359:7004 B430 MOV AH,30
7359:7006 CD21 INT 21
7359:7008 3C02 CMP AL,02
7359:700A 7204 JB 7010
7359:700C 3C04 CMP AL,04
7359:700E 7203 JB 7013
7359:7010 E9A002 JMP 72B3
-u 7359:72b3
7359:72B3 50 PUSH AX
7359:72B4 B87C6E MOV AX,6E7C
7359:72B7 0E PUSH CS
7359:72B8 50 PUSH AX
7359:72B9 E8DAFB CALL 6E96
7359:72BC 58 POP AX
7359:72BD 0E PUSH CS
7359:72BE 50 PUSH AX
7359:72BF E8D4FB CALL 6E96
7359:72C2 B8926E MOV AX,6E92
7359:72C5 0E PUSH CS
7359:72C6 50 PUSH AX
7359:72C7 E8CCFB CALL 6E96
7359:72CA 33C0 XOR AX,AX
7359:72CC 1F POP DS
7359:72CD 07 POP ES
7359:72CE 5F POP DI
7359:72CF 5E POP SI
7359:72D0 C3 RET
-d 7359:6e7c
7359:6E70 - 49 6E 63 6F Inco
7359:6E80 72 72 65 63 74 20 44 4F-53 20 76 65 72 73 69 6F rrect DOS versio
7359:6E90 6E 24 0D 0A 24 CF 55 8B-EC 1E B4 09 C5 56 04 CD n$..$.U......V..
7359:6EA0 21 1F 8B E5 5D C2 04 00-55 53 45 52 00 53 59 53 !...]...USER.SYS
7359:6EB0 54 45 4D 00 23 31 00 23-32 00 4B 45 59 42 4F 41 TEM.#1.#2.KEYBOA
7359:6EC0 52 44 00 23 35 00 56 57-0E 1F B8 20 35 CD 21 89 RD.#5.VW... 5.!.
7359:6ED0 1E 76 00 8C 06 78 00 B8-21 35 CD 21 89 1E 7A 00 .v...x..!5.!..z.
7359:6EE0 8C 06 7C 00 B8 24 35 CD-21 89 1E 7E 00 8C 06 80 ..|..$5.!..~....
7359:6EF0 00 B8 27 35 CD 21 89 1E-82 00 8C 06 ..'5.!......
At address 6E96
is a simple wrapper around DOS’s ‘print string’ system call. When the version number check fails, control flow jumps straight to the fragment which displays the ‘Incorrect DOS version’ message, and then whatever happens to be in the code segment at the offset held in AX. (In this case, AX happens to hold the DOS version number, so you could in principle guess what DOS version Windows crashed on based on what is displayed on the screen.) In the beta release, between those two there is an additional MOV AX
instruction that sets the other string to ‘DOS 2.0 or greater required’.
The remedy is clear now: you need to downgrade your DOS to a version supported by Windows 1.x. Although it just so happens that later versions of MS-DOS are sufficiently similar to 3.10 to allow the other version checks to pass, which means that spoofing the version number should work fine as well.0 For that purpose you can use the command ver set 3 10
(in DOSBox), callver 3.10
(FreeDOS) or setver win100.bin 3.10
(MS-DOS, rebooting afterwards).
As to why the version check was there in the first place, I cannot say for sure. While later shenanigans with the infamous AARD code buried inside Windows 3.1 (and a similar, somewhat more obscure check found in other products) might suggest this might have been an anti-competitive measure, personally I find this rather doubtful. Windows 1 was released in 1985, whereas Microsoft’s anti-competitive efforts only began a few years later, after the release of the newly-rebranded DR DOS in 1988. Where the error message in Windows 1 beta helpfully pinpointed the exact version test that failed, the AARD code message was deliberately vague and cryptic, meant to provoke uncertainty; the code itself was also obfuscated. Given that, I presume Windows 1 verified the DOS version not to sabotage DR DOS (which did not even exist under that name back then), but because it relied in some places on implementation details that weren’t part of the official API surface, presumably for performance reasons. (Which still makes it rather sketchy: we are simply lucky that those details were preserved intact until the very end of the MS-DOS line.)
Anyway, it would have been pretty ironic if the Windows 1.01 version check were put in place to harm competition, as Windows 1 actually runs fine under DR DOS 6 (whose ‘get version’ syscall reports it as PC DOS 3.31), while under the roughly contemporaneous MS-DOS 6 (which does not spoof the version number) it crashes like described above.
0 Or perhaps not. This survey of DOS compatibility modes in early versions of Windows notes that ‘It took me several days to manage to get it to run correctly at all, and I eventually found out that you have to run it on DOS 3.3 or it'll just break in a bunch of weird ways.’. The specific ways in which it broke were not explained, however.
FatalExit code = stack overflow