Because I hate myself, I tried to get the Microsoft OS/2 Beta 2 SDK’s C compiler building simple stuff for text mode NT. Because, why not?!
Since the object files won’t link, we have to go in with assembly. And that of course doesn’t directly assemble, but it just needs a little hand holding:
Microsoft (R) Program Maintenance Utility Version 1.40
Copyright (c) Microsoft Corp 1988-93. All rights reserved.
cl386 /Ih /Ox /Zi /c /Fadhyrst.a dhyrst.c
Microsoft (R) Microsoft 386 C Compiler. Version 1.00.075
Copyright (c) Microsoft Corp 1984-1989. All rights reserved.
dhyrst.c
wsl sed -e 's/FLAT://g' dhyrst.a > dhyrst.a1
wsl sed -e "s/DQ\t[0-9a-f]*r/&XMMMMMMX/g" dhyrst.a1 | wsl sed -e "s/rXMMMMMMX/H/g" > dhyrst.asm
ml /c dhyrst.asm
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
Assembling: dhyrst.asm
del dhyrst.a dhyrst.a1 dhyrst.asm
link -debug:full -out:dhyrst.exe dhyrst.obj libc.lib
Microsoft (R) 32-Bit Executable Linker Version 1.00
Copyright (C) Microsoft Corp 1992-93. All rights reserved.
I use sed to remove the FLAT: directives which makes everything upset. Also there is some weird confusion on how to pad float constants and encode them.
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
$T20001 DQ 0040f51800r ; 86400.00000000000
CONST ENDS
MASM 6.11 is very update with this. I just padded it with more zeros, but it just hung. I suspect DQ isn’t the right size? I’m not 386 MASM junkie. I’m at least getting the assembler to shut-up but it doesn’t work right. I’ll have to look more into it.
Xenix 386 also includes an earlier version of Microsoft C / 386, and it formats the float like this:
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
$T20000 DQ 0040f51800H ; 86400.00000000000
CONST ENDS
So I had thought maybe if I replace the ‘r’ with a ‘H’ that might be enough? The only annoying thing about the Xenix compiler is that it was K&R so I spent a few minutes porting phoon to K&R, dumped the assembly and came up with this sed string to find the pattern, mark it, and replace it (Im not that good at this stuff)
wsl sed -e "s/DQ\t[0-9a-f]r/&XMMMMMMX/g" $.a1 \
| wsl sed -e "s/rXMMMMMMX/H/g" > $*.asm
While it compiles with no issues, and runs, it just hangs. I tried the transplanted Xenix assembly and it just hangs as well. Clearly there is something to do with how to use floats.
I then looked at whetstone, and after building it noticed this is the output compiling with Visual C++ 8.0
0 0 0 1.0000e+000 -1.0000e+000 -1.0000e+000 -1.0000e+000
12000 14000 12000 -1.3190e-001 -1.8218e-001 -4.3145e-001 -4.8173e-001
14000 12000 12000 2.2103e-002 -2.7271e-002 -3.7914e-002 -8.7290e-002
345000 1 1 1.0000e+000 -1.0000e+000 -1.0000e+000 -1.0000e+000
210000 1 2 6.0000e+000 6.0000e+000 -3.7914e-002 -8.7290e-002
32000 1 2 5.0000e-001 5.0000e-001 5.0000e-001 5.0000e-001
899000 1 2 1.0000e+000 1.0000e+000 9.9994e-001 9.9994e-001
616000 1 2 3.0000e+000 2.0000e+000 3.0000e+000 -8.7290e-002
0 2 3 1.0000e+000 -1.0000e+000 -1.0000e+000 -1.0000e+000
93000 2 3 7.5000e-001 7.5000e-001 7.5000e-001 7.5000e-001
However this is the output from C/386:
0 0 0 5.2998e-315 1.5910e-314 1.5910e-314 1.5910e-314
12000 14000 12000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000
14000 12000 12000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000
345000 1 1 5.2998e-315 1.5910e-314 1.5910e-314 1.5910e-314
210000 1 2 6.0000e+000 6.0000e+000 0.0000e+000 0.0000e+000
32000 1 2 5.2946e-315 5.2946e-315 5.2946e-315 5.2946e-315
899000 1 2 5.2998e-315 5.2998e-315 0.0000e+000 0.0000e+000
616000 1 2 5.3076e-315 5.3050e-315 5.3076e-315 0.0000e+000
0 2 3 5.2998e-315 1.5910e-314 1.5910e-314 1.5910e-314
93000 2 3 5.2972e-315 5.2972e-315 5.2972e-315 5.2972e-315
Great they look nothing alike. So something it totally broken. I guess the real question is, does it even work on OS/2?
Since I should post the NMAKE Makefile so I can remember how it can do custom steps so I can edit the intermediary files. Isn’t C fun?!
INC = /Ih
OPT = /Ox
DEBUG = /Zi
CC = cl386
OBJ = dhyrst.obj
.c.obj:
$(CC) $(INC) $(OPT) $(DEBUG) /c /Fa$*.a $*.c
wsl sed -e 's/FLAT://g' $*.a > $*.a1
wsl sed -e "s/DQ\t[0-9a-f]*r/&XMMMMMMX/g" $*.a1 \
| wsl sed -e "s/rXMMMMMMX/H/g" > $*.asm
ml /c $*.asm
del $*.a $*.a1 $*.asm
dhyrst.exe: $(OBJ)
link -debug:full -out:dhyrst.exe $(OBJ) libc.lib
clean:
del $(OBJ)
del dhyrst.exe
del *.asm *.a *.a1
As you can see, I’m using /Ox or maximum speed! So how does it compare?
Dhrystone(1.1) time for 180000000 passes = 20
This machine benchmarks at 9000000 dhrystones/second
And for the heck of it, how does Visual C++ 1.0’s performance compare?
Dhrystone(1.1) time for 180000000 passes = 7
This machine benchmarks at 25714285 dhrystones/second
That’s right the 1989 compiler is 35% the speed of the 1993 compiler. wow. Also it turns out that MASM 6.11 actually can (mostly) assemble the output of this ancient compiler. It’s nice when something kind of work. I can also add that the Infocom ’87 interpreter works as well.
YAY!