DOOM over TCP/IP

I never played DOOM over the internet, as by the time I had a proper connection and fast enough machine, Quake was all the rage, and all I had was this crappy cable modem that used a dialup connection for the upstream.

If I wanted to play multiplayer I’d wind up dong a LAN party anyways.  We were living in the era of $20 NE2000 clones, and 56kb modems, with the occasional 1mbit down cable.

Anyways I recently saw The Internet DOOM Client/Server System v0.01, which was a simple TCP/IP DOOM matchmaking server that includes source the client and server.  This eventually grew up into iDOOM.  It looked simple enough and it does mention that it is based on the opensource IPX component of DOOM.  I’d never looked at it so taking a peek I saw this:

DOOMNET.C

// hook an interrupt vector
p= CheckParm (“-vector”);

if (p)
{
doomcom.intnum = sscanf (“0x%x”,_argv[p+1]);
}
else
{
for (doomcom.intnum = 0x60 ; doomcom.intnum <= 0x66 ; doomcom.intnum++)
{
vector = *(char far * far *)(doomcom.intnum*4);
if ( !vector || *vector == 0xcf )
break;
}
if (doomcom.intnum == 0x67)
{
printf (“Warning: no NULL or iret interrupt vectors were found in the 0x60 to 0x66\n”
“range. You can specify a vector with the -vector 0x<num> parameter.\n”);
doomcom.intnum = 0x66;
}
}
printf (“Communicating with interupt vector 0x%x\n”,doomcom.intnum);

olddoomvect = getvect (doomcom.intnum);
setvect (doomcom.intnum,NetISR);
vectorishooked = 1;

IPXSETUP.C

/*
=============
=
= NetISR
=
=============
*/

void interrupt NetISR (void)
{
if (doomcom.command == CMD_SEND)
{
localtime++;
SendPacket (doomcom.remotenode);
}
else if (doomcom.command == CMD_GET)
{
GetPacket ();
}
}

So for those who missed it, the IPX client just hooks in as a TSR, which doom calls down to, and then either sends or receives data.  Now I wish I’d looked earlier I didn’t realize that it was something so simple.

So I thought it’d be interesting to watch it in action.  Now it compiles on modern Linux, but it doesn’t work.  I don’t know why, I didn’t investigate much.  Instead I opted for a server from the era, UnixWare.  Oddly enough that works (and so does OS X).  I fired up GNS3, put the server on one network, and added two clients on separate TCP/IP networks.  I went ahead with DOOM v1.2.

doom tcpipThe clients are able to connect to the server, and once the both register, they drop out of the server, and pass all the command line arguments to TCPSETUP, and away they go.
doom tcpip 2Now it’s worth noting that back in these days people use registered addresses.  None of this will work with NAT as it expects 1:1 UDP port mappings.  The clients are all equal peers.

So could a newer driver be written to support a server, and work behind NAT? Yeah I don’t see why not.  Is there any point in doing so?

Probably not.

In 2004 it was hard enough trying to do a deathmatch online, but 2014?.. 20 years too late.

But it’s kind of interesting how convoluted the networking setup had to be for a 32bit protected mode program calling down to a real mode TCP/IP TSR, which in turn called the network driver.  It’s amazing it even works.

 

Just how ‘original’ is the Ultimate Doom on steam?

I don’t own any stock in iD(bethesda), or let alone steam.  This is just a small research thing so I’m not shilling.  Also Ultimate DOOM, is on sale, although not for long.  I thought it would be interesting to compare the version on steam with the original version of Doom. Now backtracking, Ultimate DOOM, was a boxed in version of DOOM, that included all the patches, and added in an extra level to the classic DOOM 1, “thy flesh consumed“.

Ultimate DOOM

Ultimate DOOM

And this is the version of DOOM that is for sale on steam.  Now the nice thing about Ultimate DOOM, is that it was released as a patch to registered users of DOOM so that they too could upgrade to Ultimate DOOM, and enjoy the new levels.  So that also means that the enthusiasts thankfully made a patch to regress Ultimate DOOM to version 1.1 First we start with Ultimate DOOM, which can be found in your  steam directory.  Mine is “C:\Program Files (x86)\Steam\SteamApps\common\Ultimate Doom\base”, but yours will be similar. So the first step would be to copy this directory to somewhere else, as we are going to run some patches against it to alter the level as we go.  I’m going to use DOSBox to do all of this.  Also in my setup of DOSBox, I mount my c:\dos directory as c:\ to make life easier for me.  So on my windows side, I copy Ultimate Doom\base into c:\dos\temp\udoom.  That way when I fire up DOSBox, I see it under c:\temp\udoom. The only files I’m going to use from steam are:

03/12/2014 12:27 AM 715,493 DOOM.EXE
03/12/2014 12:27 AM 12,408,292 DOOM.WAD

Noticeably absent is SETUP.EXE.  I have no idea why it is missing, so I figured I’d provide a collection of the various setup programs.  This is the best way to change sound card settings, and alter keyboard bindings.  Why it was omitted, well I have no idea. You can download my combined archive of doom setup programs here.  Place the utlimate doom setup into the directory. Then download & extract downgrd.zip, into your dosbox doom directory (c:\dos\temp\udoom), then fireup dosbox and run patch.bat .  The downgrade uses a shareware version of MDIFF, so it will delay for 5 seconds every time it’s used (which is a few times) so this will take a little while.

Downgrade to v1.1

Downgrade to v1.1

Now looking around the directory we have:

06/30/2014 09:57 AM 803 DEFAULT.CFG
06/30/2014 09:57 AM 579,187 DOOM.EXE
06/30/2014 09:59 AM 10,396,254 DOOM.WAD
06/30/2014 09:57 AM 2,158 DOWNGRAD.TXT
06/30/2014 09:57 AM 7,527 LICENSE.DOC
06/30/2014 09:57 AM 20,850 README.EXE
06/30/2014 09:57 AM 68,923 SETUP.EXE
06/30/2014 09:57 AM 627,155 U1_94.EXE
06/30/2014 09:57 AM 218 USE1_94.BAT
06/30/2014 09:57 AM 190 USE1_95.BAT

Now how does this compare to the registered version of DOOM 1.1?  Well I have a copy, and after installing it, we can compare.

10/29/2013 01:26 PM 579,187 DOOM.EXE
10/29/2013 01:26 PM 10,396,254 DOOM.WAD
10/29/2013 01:26 PM 439 FILE_ID.DIZ
10/29/2013 01:26 PM 7,527 LICENSE.DOC
10/29/2013 01:26 PM 20,850 README.EXE
10/29/2013 01:26 PM 68,923 SETUP.EXE
10/29/2013 01:26 PM 627,155 U1_94.EXE
10/29/2013 01:26 PM 218 USE1_94.BAT
10/29/2013 01:26 PM 190 USE1_95.BAT

As you can see the first difference is that the original version has “FILE_ID.DIZ”, and the downgrade has a “DOWNGRAD.TXT”. Comparing the common files..

c:\dos\temp\udoom>fc /b doom.exe doom11\doom.exe Comparing files DOOM.EXE and DOOM11\DOOM.EXE FC: no differences encountered

c:\dos\temp\udoom>fc /b doom.wad doom11\doom.wad Comparing files DOOM.WAD and DOOM11\DOOM.WAD FC: no differences encountered

c:\dos\temp\udoom>fc /b license.doc doom11\license.doc Comparing files LICENSE.DOC and DOOM11\LICENSE.DOC FC: no differences encountered

c:\dos\temp\udoom>fc /b readme.exe doom11\readme.exe Comparing files README.EXE and DOOM11\README.EXE FC: no differences encountered

c:\dos\temp\udoom>fc /b SETUP.EXE doom11/SETUP.EXE Comparing files SETUP.EXE and DOOM11/SETUP.EXE FC: no differences encountered

c:\dos\temp\udoom>fc /b u1_94.exe doom11\u1_94.exe Comparing files U1_94.EXE and DOOM11\U1_94.EXE FC: no differences encountered

c:\dos\temp\udoom>fc /b use1_94.bat doom11\USE1_94.BAT Comparing files USE1_94.BAT and DOOM11\USE1_94.BAT FC: no differences encountered

c:\dos\temp\udoom>fc /b use1_95.bat doom11\USE1_95.BAT Comparing files USE1_95.BAT and DOOM11\USE1_95.BAT FC: no differences encountered

And everything looks ok.  Now FILE_ID.DIZ was a nice way back in the day of BBS’s to have a description of the file inside of the ZIP that would automatically set the description.  And the FILE_ID.DIZ from the registered version is:

████▓▒░ THIS IS PIRATED SOFTWARE! ░▒▓████ ███████████████████████████████████████████
THIS FILE IS NOT SHAREWARE — it is ILLEGAL and forbidden to upload this copyrighted software on bulletin boards. If you see this message on a BBS, please request that the Sysop remove this software IMMEDIATELY. or contact id Software @ 214-613-0132 IT IS ILLEGAL TO GET THIS FILE FROM A BBS!
███████████████████████████████████████████

Which I guess is not all that surprising.  So other than omitting this one file (which does not alter game play in the least bit) we have now taken Ultimate DOOM from steam, and reverted it to DOOM v1.1.  Now to be honest this is my favorite version, it feels faster than later versions,and for me at least it was more stable.  However as I’ve mentioned before the network play would destroy old hub based 10Mbit networks. And running DOOM, we can check the version

DOOM v1.1

DOOM v1.1

And you can see that we have downgraded Ultimate DOOM to registered DOOM v1.1 in it’s original state from December 10th, 1993. Now moving to version 1.2, you need the file dm1_2rpt.zip, which contains:

06/30/2014 09:15 AM 78,129 PATCH.EXE
06/30/2014 09:15 AM 3,053 PATCH.RTD
06/30/2014 09:15 AM 409,687 PATCH.RTP
06/30/2014 09:15 AM 272 README.PAT

Now we run patch.exe which will move our 1.1 to 1.2.

Patching DOOM to v1.2

Patching DOOM to v1.2

Once the patch is installed, we can delete the patch files, and we should have:

06/30/2014 09:57 AM 803 DEFAULT.CFG
06/30/2014 09:57 AM 2,158 DOWNGRAD.TXT
06/30/2014 09:57 AM 7,527 LICENSE.DOC
06/30/2014 10:04 AM 580,391 DOOM.EXE
06/30/2014 10:04 AM 10,399,316 DOOM.WAD
06/30/2014 10:04 AM 32,134 IPXSETUP.EXE
06/30/2014 10:04 AM 393 MODEM.CFG
06/30/2014 10:04 AM 34,386 README.EXE
06/30/2014 10:04 AM 36,567 SERSETUP.EXE
06/30/2014 10:04 AM 91,931 SETUP.EXE

And when we run DOOM we now see that it is upgraded to version 1.2!

DOOM version 1.2

DOOM version 1.2

The next version of DOOM that was widely available was v1.666.  And the patch is named dm1666rp.zip, which contains:

06/30/2014 09:24 AM 78,129 PATCH.EXE
06/30/2014 09:24 AM 2,864 PATCH.RTD
06/30/2014 09:24 AM 729,949 PATCH.RTP
06/30/2014 09:24 AM 649 PATCHIT.BAT

And this time we run ‘patchit.bat’.

Patched to 1.666

Patched to 1.666

And now we can remove the patch files.  Now when we run DOOM, we see..

DOOM v1.666

DOOM v1.666

The next version of DOOM was v1.8, and it can be patched up from v1.666 dm18rpt.zip.  Inside of this zip, is another zip, patch.zip that contains the patch files patch.exe & patch.rtp.

Upgrading to DOOM v1.8

Upgrading to DOOM v1.8

The directory is growing as well.

06/30/2014 10:09 AM 791 DEFAULT.CFG
06/30/2014 10:12 AM 6,397 DM.DOC
06/30/2014 10:12 AM 33,640 DM.EXE
06/30/2014 10:12 AM 120,201 DMFAQ66A.TXT
06/30/2014 10:12 AM 140,594 DMFAQ66B.TXT
06/30/2014 10:12 AM 76,898 DMFAQ66C.TXT
06/30/2014 10:12 AM 34,572 DMFAQ66D.TXT
06/30/2014 10:12 AM 709,865 DOOM.EXE
06/30/2014 10:12 AM 11,159,840 DOOM.WAD
06/30/2014 09:57 AM 2,158 DOWNGRAD.TXT
06/30/2014 10:12 AM 10,623 DWANGO.DOC
06/30/2014 10:12 AM 65,021 DWANGO.EXE
06/30/2014 10:12 AM 2,536 DWANGO.STR
06/30/2014 10:12 AM 4,690 HELPME.TXT
06/30/2014 10:12 AM 18,051 IPXSETUP.EXE
06/30/2014 10:12 AM 67 MODEM.CFG
06/30/2014 10:07 AM 67 MODEM.NUM
06/30/2014 10:12 AM 3,405 MODEM.STR
06/30/2014 10:12 AM 4,617 ORDER.FRM
06/30/2014 10:12 AM 21,631 README.TXT
06/30/2014 10:13 AM 20,257 SERSETUP.EXE
06/30/2014 10:13 AM 45,884 SETUP.EXE

And running DOOM, we can now verify that we are running version 1.8

DOOM v1.8

DOOM v1.8

The next version of DOOM was version 1.9.  The upgrade patch from v1.8 to v1.9 was called 18_19drp.exe.  This is a SFX unpacking exe, so you’ll need to run this under DOSBox to get the patch

Yoshi SFX

Yoshi SFX

And now we can run the patch, this one is silent so don’t panic at the lack of output.

Patching from v1.8 to v1.9

Patching from v1.8 to v1.9

And now when we run DOOM we can verify that we are running v1.9

DOOM v1.9

DOOM v1.9

And the directory now looks like this:

06/30/2014 10:26 AM 769 DEFAULT.CFG
06/30/2014 10:12 AM 6,397 DM.DOC
06/30/2014 10:12 AM 33,640 DM.EXE
06/30/2014 10:12 AM 120,201 DMFAQ66A.TXT
06/30/2014 10:12 AM 140,594 DMFAQ66B.TXT
06/30/2014 10:12 AM 76,898 DMFAQ66C.TXT
06/30/2014 10:12 AM 34,572 DMFAQ66D.TXT
06/30/2014 10:23 AM 709,905 DOOM.EXE
06/30/2014 10:24 AM 11,159,840 DOOM.WAD
06/30/2014 09:57 AM 2,158 DOWNGRAD.TXT
06/30/2014 10:12 AM 10,623 DWANGO.DOC
06/30/2014 10:12 AM 65,021 DWANGO.EXE
06/30/2014 10:12 AM 2,536 DWANGO.STR
06/30/2014 10:12 AM 4,690 HELPME.TXT
06/30/2014 10:12 AM 18,051 IPXSETUP.EXE
06/30/2014 10:12 AM 67 MODEM.CFG
06/30/2014 10:07 AM 67 MODEM.NUM
06/30/2014 10:12 AM 3,405 MODEM.STR
06/30/2014 10:12 AM 4,617 ORDER.FRM
06/30/2014 10:24 AM 21,631 README.TXT
06/30/2014 10:24 AM 20,257 SERSETUP.EXE
06/30/2014 10:13 AM 45,884 SETUP.EXE

Now comes the final patch, DOOM v1.9 to Ultimate DOOM, 19_udpat.exe.  And just like before it too as a SFX patch, which you have to run under DOSBox.

Upgrading v1.9 to Ultimate DOOM

Upgrading v1.9 to Ultimate DOOM

Deleting the patches, we are now left with:

06/30/2014 10:29 AM 769 DEFAULT.CFG
06/30/2014 10:12 AM 6,397 DM.DOC
06/30/2014 10:30 AM 20,937 DM.EXE
06/30/2014 10:12 AM 120,201 DMFAQ66A.TXT
06/30/2014 10:12 AM 140,594 DMFAQ66B.TXT
06/30/2014 10:12 AM 76,898 DMFAQ66C.TXT
06/30/2014 10:12 AM 34,572 DMFAQ66D.TXT
06/30/2014 10:30 AM 715,493 DOOM.EXE
06/30/2014 10:31 AM 12,408,292 DOOM.WAD
06/30/2014 09:57 AM 2,158 DOWNGRAD.TXT
06/30/2014 10:12 AM 10,623 DWANGO.DOC
06/30/2014 10:31 AM 73,638 DWANGO.EXE
06/30/2014 10:31 AM 255 DWANGO.SRV
06/30/2014 10:12 AM 2,536 DWANGO.STR
06/30/2014 10:31 AM 4,689 HELPME.TXT
06/30/2014 10:12 AM 18,051 IPXSETUP.EXE
06/30/2014 10:12 AM 67 MODEM.CFG
06/30/2014 10:07 AM 67 MODEM.NUM
06/30/2014 10:12 AM 3,405 MODEM.STR
06/30/2014 10:12 AM 4,617 ORDER.FRM
06/30/2014 10:31 AM 21,989 README.TXT
06/30/2014 10:24 AM 20,257 SERSETUP.EXE
06/30/2014 10:31 AM 46,665 SETUP.EXE

Which when compared with what was sold on steam:

03/12/2014 12:27 AM 243 AUTHORS.txt
03/12/2014 12:27 AM 18,332 COPYING.txt
03/12/2014 12:27 AM 12,408,292 d.WAD
06/30/2014 08:30 AM 819 DEFAULT.CFG
03/12/2014 12:27 AM 715,493 DOOM.EXE
03/12/2014 12:27 AM 12,408,292 DOOM.WAD
03/12/2014 12:27 AM 989,672 dosbox-0.71.tar.gz
03/12/2014 12:27 AM 7,214 dosbox.conf
03/12/2014 12:27 AM 3,200,000 dosbox.exe
03/12/2014 12:27 AM 3,018 INSTALL.txt
03/12/2014 12:27 AM 771 MOUSE.CFG
03/12/2014 12:27 AM 23,574 NEWS.txt
03/12/2014 12:27 AM 47,035 README.txt
03/12/2014 12:27 AM 331,776 SDL.dll
03/12/2014 12:27 AM 13,312 SDL_net.dll
03/12/2014 12:27 AM 874 THANKS.txt
03/12/2014 12:27 AM 1,139 ultimate.conf
03/12/2014 12:27 AM 1,157 ultimatem.conf
03/12/2014 12:27 AM 35,296 uninstall.exe

Which as you can see the only files that really made the cut were the wad and the doom executable.  I don’t know why they omitted the setup program, but that’s easy enough to fix.  And running our patched up executable:

Ultimate DOOM

Ultimate DOOM

And as we can see, the extra level ‘thy flesh consumed’ is now available!

Ultimate DOOM level select

Ultimate DOOM level select

And finally to verify the steam wad/exe:

C:\dos\temp\udoom>fc /b doom.exe “c:\Program Files (x86)\Steam\Stea mApps\common\Ultimate Doom\base\DOOM.EXE” Comparing files DOOM.EXE and C:\PROGRAM FILES (X86)\STEAM\STEAMAPPS\COMMON\ULTIM ATE DOOM\BASE\DOOM.EXE FC: no differences encountered

C:\dos\temp\udoom>fc /b doom.wad “c:\Program Files (x86)\Steam\Stea mApps\common\Ultimate Doom\base\DOOM.wad” Comparing files DOOM.WAD and C:\PROGRAM FILES (X86)\STEAM\STEAMAPPS\COMMON\ULTIM ATE DOOM\BASE\DOOM.WAD FC: no differences encountered

So there we go, a full round trip from Ultimate DOOM, v1.1, v1.2, v1.666, v1.8, v1.9 and back to Ultimate DOOM!

UPDATE!

While looking around I noticed that the steam version of DOOM also only uses the Adlib! for music.  But DOOM really does have much better MIDI music.

Adlib. really.

Adlib. really.

Well one of the great things we can do with a setup program, and the WAD/DOOM.EXE we copied out of steam is that we can run it with a newer version of DOSBox, say version 0.74 where the General MIDI actually works!  So go ahead, and run setup, and change the music card to “General MIDI”.

Change it to General MIDI

Change it to General MIDI

Next it’ll give a wide range of ports, I used 330.

Port 330!

Port 330!

Now when you save the config, and re-launch DOOM you can experience the music without the major pain of setting up the UltraSound.  And General MIDI is available in every version of DOOM as well.

Chex Quest

Chex Quest

Chex Quest montagé

I’ve never heard of Chex Quest.  I guess because at the time, 1996 I wasn’t that big on kids cereal.  But as it turns out, Digital Café had been selected by WatersMolitor, care of Ralston Foods to create something for this new fangled digital age to get kids to eat Chex.

You can of course read all about it on wiki, or one of the many fan pages & forums..

So yeah, it’s Ultimate DOOM, done as a total conversion.  All licensed from iD in the days before Quake.

Unlike DOOM, and it’s feel for ultra-violence, you just zap green slime things back to their home dimension while you try to free your Chex people things.  I guess this shouldn’t be surprising, remember there is that horrid ‘Super 3d Noah’s Ark‘ thing that is built around Wolfenstein 3D.

And it was a few more years (1999) until we had to deal with Columbine, and how violent video games make people kill (just like loud music, role playing games, books, and other things before that).

Doom IPX revisited

So, since I’ve been starting up my virtual network thing, I got distracted with this thread on reddit

Fun times ahead!

Fun times ahead!

, talking about the good old days of Doom.  Now Doom was revolutionary for the music, the sound effects, the 2.5D environment, the fast pace, the violence, the unlimited lives, dynamic lighting and of course LAN play.  Now what was cool is that it could easily run over IPX/SPX networks.  Although you did have to be on the same network it was very easy to setup, and get going. But as anyone can tell you, the moment you setup a four player deathmatch on a company LAN people would go nuts, as you would without a doubt bring the entire network to a halt.  Back when I used to play this we would just disconnect the 10base2 cable from the lab 486DX2/50 PC’s and just make our own four computer segment.  We did notice that if we had 3 four player games on the same network (afterhours!) that it was unplayable.  I never did have access to a sniffer back then, and when I got a corporate job, being caught with something like Doom was grounds for termination so I never did get to see what the big deal was.

So I figured I’d cook up a super quick lab to check it out.  This is my Dynagen configuration.  Sadly I do need a cisco router to preform the network capture, although I don’t need to configure it to see what is going on.

autostart = True

[localhost]

[[7200]]
image = ../C7200-JS.BIN
npe = npe-400
ram = 160
idlepc = 0x60529c84
disk0 = 0
mmap = False
ghostios = True

[[ROUTER corertr1]]
model = 7200
slot1 = PA-8E
F0/0 = coresw1 5

[[ethsw coresw1]]
1 = access 1 NIO_udp:41300:127.0.0.1:51300
2 = access 1 NIO_udp:41301:127.0.0.1:51301
3 = access 1 NIO_udp:41302:127.0.0.1:51302
4 = access 1 NIO_udp:41303:127.0.0.1:51303
5 = access 1

As you can see this is very simple, a switch with four ports setup for four virtual computers, and a fifth port for the router.  Next I run four instances of Qemu with a copy of Doom v1.1 shareware, and a IPX/SPX client.  I fire them up like this:

./qemu/qemu-system-i386 -cpu pentium -L ./qemu/pc-bios/ -m 16 -hda doom11-00.img -soundhw sb16,adlib -net nic,model=pcnet,macaddr=00:11:22:33:44:00 -net socket,udp=localhost:41300,localaddr=0.0.0.0:51300 &
#
./qemu/qemu-system-i386 -cpu pentium -L ./qemu/pc-bios/ -m 16 -hda doom11-01.img -soundhw sb16,adlib -net nic,model=pcnet,macaddr=00:11:22:33:44:01 -net socket,udp=localhost:41301,localaddr=0.0.0.0:51301 &
#
./qemu/qemu-system-i386 -cpu pentium -L ./qemu/pc-bios/ -m 16 -hda doom11-02.img -soundhw sb16,adlib -net nic,model=pcnet,macaddr=00:11:22:33:44:02 -net socket,udp=localhost:41302,localaddr=0.0.0.0:51302 &
#
./qemu/qemu-system-i386 -cpu pentium -L ./qemu/pc-bios/ -m 16 -hda doom11-03.img -soundhw sb16,adlib -net nic,model=pcnet,macaddr=00:11:22:33:44:03 -net socket,udp=localhost:41303,localaddr=0.0.0.0:51303 &

Again all very simple.

From there I configure each of the four VM’s for a four player game, start the game, then connect.

Loneliest deathmatch

Loneliest deathmatch

I only had the game running for a few seconds when I went to my Dynagen console, and setup a capture session:

=> capture corertr1 fa0/0 doom.cap
=>

As you can see very simple.  I walk the guys around a little bit, shoot someone, then just quit all the clients, and turn off the VM’s.  Then I end the capture

=> no capture corertr1 fa0/0
=>

And now I’m left with a 50MB file!

$ ls -alh *cap
-rw-r–r– 1 jsteve staff 50M 25 Oct 14:27 doom.cap

I’m shocked!  I wasn’t even running Doom that long!  A quick peek reveals why Doom was never popular on corporate networks.

14:25:57.464031 IPX 00000000.00:11:22:33:44:00.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444

14:27:28.996489 IPX 00000000.00:11:22:33:44:01.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444
14:27:28.997618 IPX 00000000.00:11:22:33:44:03.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444
14:27:29.019568 IPX 00000000.00:11:22:33:44:01.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444
14:27:29.026000 IPX 00000000.00:11:22:33:44:03.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444
14:27:29.026205 IPX 00000000.00:11:22:33:44:01.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444
14:27:29.054425 IPX 00000000.00:11:22:33:44:01.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444

If you see the destination it is ff:ff:ff:ff:ff:ff, a broadcast packet.  And I have 50MB of this in the span of a minute and a half!  Even worse, opening the packet stream most of it is empty packets!

14:26:22.806014 IPX 00000000.00:11:22:33:44:00.869c > 00000000.ff:ff:ff:ff:ff:ff.869c: ipx-#869c 444
0x0000: e0e0 03ff ff01 da00 0000 0000 00ff ffff …………….
0x0010: ffff ff86 9c00 0000 0000 1122 3344 0086 ………..”3D..
0x0020: 9c00 0000 0000 0000 0001 0000 0001 0000 …………….
0x0030: 0002 0000 0000 0000 0000 0065 0000 0000 ………..e….
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0070: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0090: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x00a0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x00b0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x00e0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0100: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0110: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0120: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0130: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0140: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0150: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0160: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0170: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0180: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x0190: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x01a0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x01b0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x01c0: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0x01d0: 0000 0000 0000 0000 0069 0000 00 ………i…

Needless to say this could have been optimized a little better.. but at the same time back in 1993 this was the coolest thing ever.  Even if it did have a reputation of destroying networks.

I can remember how loudly network people would complain about Doom, but it is kind of interesting to see it first hand how chatty it is. But at the same time, how exhilarating it was, for the first time we were playing against each other, not bots.

And speaking of this era, for those who may not have ever read about the rise & fall of iD, you may want to check out the book ‘Masters of Doom‘. Although the end is pretty much Old Man Murray. There is no mention of the soundcard disaster that was DMX, or anything about how deathmatch could crush a LAN. But I guess everything can’t be 100% for the time.

Kali

My friend, Mara’akate is working on locating all the versions of Kali, and it’s precursor iDoom/iFrag.  His collection is available here.

Briefly this software let you play Doom (and other Doom variants) with other people over the internet.

I’ll have to write something up about this later on, but before I head out this Friday evening I thought I should at least give him a quick shout out, and hope that anyone out there has anything further to contribute could do so.

I wonder how hard it’d be to organize a Doom match in 2013…. probably just as hard as it was in 1993 if not more difficult.  Although the main issue today would be time, not finding a capable machine like it was back then.

Pre-release versions of DOOM

On the heels of a jdosbox update, I figured it’d be cool to try ALL the early pre-release versions of Doom!  I’ve setup the links so you can click on any picture, and it’ll launch the appropriate jdosbox emulator, with the disk image.  Just click & go!

So here we go!

Doom 0.2

This is a pre-alpha version of DOOM from early February 1993 — only 2 months of work had been done to this point.

This is the first version that was made semi-public.  As you can see the HUD is the inside of the helmet.  The sky doesn’t work, but you can move around, and see the monsters from various angles..

Doom 0.4

Yes, it’s the DOOM ALPHA!  (Actually, we’re just try to release theseevery two weeks or so.  This WAS going to be a pre-beta, but a certainperson let us down Super-Nintendo cart-programming-wise, so it’s just analpha.  Nonetheless, here ’tis.)

It feels more doom like… But you can’t kill anything, and they can’t kill you… better textures and whatnot.

Doom 0.5

From the notes:

It’s an ALPHA version of doom (I just run it to make sure)called “Doom: Evil Unleashed”.  Start up screen says Doom Alpha byId Software.

It has the basic Doom engine, but:

  • It has the basic Doom engine, but
  • The imps and pink demons are in the game they don’t move or anything just stand there
  • No barrels (as noted above)
  • A lot of graphics from wolf is used (eg medic kit, gold treasure cup)
  • The map key is “a” not tab
  • The strafe and open door key are both alt
  • No sounds!
  • The two weapons you start with are (1) bayonet and (2) rifle
  • There is no run key (that I could find, so makes getting around really slow)
  • It is quite easy to recognise some of the structures in the game (so the whole map structure is now over two years old).  I can’t quote exactly were they are from but I do recognise them.
  • In the screen options there is high, medium, low, <another one>, and HIGH RES, so it looks like there use to be a high res mode that was taken out in the official release.

Doom Press Release Pre-Beta

This is the press release pre-beta version.  As you can tell from the screen shot it’s basically DOOM.  Some things are different though.  The readme is pretty long, and I think it’s better to just link it here.  I took the CPU cap off this one as it really seems to want to run FAST.  But I’m probably just screwing something up in the world of jdosbox.  But it does run, and quite nicely on my core i7.

So there you basically have it… Lots and lots of DOOM!

WinDoom, WinG, Win32s on Windows 3.1 (on Qemu)

So since I was looking at the Doom stuff, I thought I’d try to track down the WinG version of Doom, and luckily someone pack ratted away two versions! Needless to say the older one didn’t work for me, but the last one, the April 13th, 1995 build, worked just great!

WinDoom on Windows 7 x64

Even on Windows 7 x86_64, sp1!

So how much of a chore was this to run back in 1995, before Windows 95?

Well to start WinDoom requires a display capable of at least 256 colors. I thought I’d use Qemu for this, but this proved to be… exceptionally difficult to locate a satisfactory display driver. I know lots of people point to the SVGA.EXE update from Microsoft, that uses VESA extensions to drive the video. Oh sure it sounds great but this is what I got:

And.. corruption.

Ok, so you say, there is this great patch to enable better VESA support right?

Wrong.

Yeah. I also hunted down various cirrus drivers for the specifically emulated chip (I checked the source) and they were all consistently defective. So I tried using a lower chip driver from HP and amazingly the 640x480x16MM colors works! (well, works ‘enough’).

Installing the right driver.

It’s the GD5430 v1.25f, 640x480x16.8M

The next thing is that Doom in both MS-DOS and Windows are full 32bit executables. On the MS-DOS side, it relies on the DOS4G/W extender. For Windows, it relies on the then new Win32 standard, and Windoom was written to conform to the Win32s standard, meaning with an addon it can run on Windows 3.1, Windows 95, And Windows NT. I just fished around the internet and scored a copy of Win32s 1.25. I just remember this being a somewhat stable version.

Installing Win32s

Win32s installs pretty smooth, (as long as you remember the share.exe). Now we just need the WinG runtime to be installed. WinG was Microsoft’s first real attempt at high speed gaming video under Windows. From what I understand it kind of went down because it was ‘too difficult’, and buying DirectX seemed to be a better fit.

Setting the midi mapper.

Another thing I’ve found is that if you change the midi mapper from the default “Ad Lib” to “Ad Lib general”, you can at least get the midi working in Doom.

Once WinG is installed, then it’ll want to do some blit tests…

WinG calibrating.

And after that, we can even bump it up to glorious 640×400, something the initial MS-DOS version couldn’t do easily as VESA wasn’t a big standard with INSTALLED cards at the time, and it’d require lots of work from the iD team, where the move to Windows pushed all the peripheral development to the Vendors to work around Microsoft. Even to this day, it’s still a big deal with video and audio.

One thing that is cool about Qemu is that at compile time, you can put in adlib & soundblaster cards to give the ‘full’ Windows 3.1 multimedia experience. There is also GUS (Gravis Ultra Sound) support
in Qemu, but I’ve never played with it..

With all of that out of the way, WinDoom will launch.

WING dispdib.dll missing error that turned out to be Video for Windows.

Then it’ll throw an error, because Windows 3.1 doesn’t have the same video backend as Windows NT 3.5 (and higher), hit ok and then …

And it works! WinGDoom running on Windows 3.1 on Qemu!

Sadly on Windows 3.1 the sound effects do not seem to work, but overall it’s a GREAT little port, mostly because as it comes up on 16 years old, it still works, and with sound. I wish other OS’s could give this kind of support for legacy applications, even ones that had such a brief window of support.

Anyone crazy enough to even think of playing along can download the blob of software I used to get this going here (Updated on archive.org here: Windows-3.1-WING-doom)

I should also add if you want sound effects to work on WinDOOM you really should install the Video for Windows Runtime, and it’ll work… poorly on Qemu/SoundBlaster 16, but it does work!

Cross compiling for MS-DOS (DJGPP) from OS X

So building on DOOM, I thought I’d try to build a djgpp cross compiler from my main OS X box, as compiling under DOSBox is… just too slow. Luckily Delorie has a page on building a cross compiler.

I started out with binutils-2.9.1, just as he does, with a few things thrown in…

First I had to run configure like this, as OS X didn’t exist back then, let alone x64 cpu’s..
./configure --target=i586-pc-msdosdjgpp --host=i386-netbsd --prefix=/usr/local/djgpp
Next the following error is thrown…

strerror.c:463: error: conflicting type qualifiers for ‘sys_nerr’

So I just edited libiberty/strerror.c, and commented out the following line.

Next up was a strange error in gas/targ-cpu.h

targ-cpu.h:374: error: array type has incomplete element type
targ-cpu.h:378: error: previous declaration of ‘flag_16bit_code’ was here

I simply commented out the lines.

Then later while compiling gas/write.c it bombs out because of an undefined type.. One of which was commented out in targ-cpu.h . The easiest fix is to go to the start of the relax_align procedure and just add in the definition:

extern const struct relax_type md_relax_table[];

Next up was gcc. I couldn’t get 2.8.1 to build, instead I built gcc-2.95.3.

I had to configure gcc like this:
./configure --target=i586-pc-msdosdjgpp --host=i386-netbsd --prefix=/usr/local/djgpp
And it threw the same error as binutils… with the same fix (commenting out the line in libiberty/strerror.c).

strerror.c:465: error: conflicting type qualifiers for ‘sys_nerr’

I also had an error pop up like this:

./config/i386/i386.c:142:22: error: macro “strcat” requires 2 arguments

And again I just commented it out.

Under OSX the makeinfo parts crashed, so I simply removed them from the makefile. With a little more tweaking the cross compiler was ready!

REMEMBER TO FOLLOW DJ’s steps too!

The cool thing is that now I can run make with the -j4 flags allowing gcc to run on each of the cpu cores letting me build doom in under 3 seconds!

i586-pc-msdosdjgpp-gcc -O2 -DNORMALUNIX dos/doomdef.o dos/doomstat.o dos/dstrings.o dos/i_system.o dos/i_sound.o dos/i_video.o dos/i_net.o dos/tables.o dos/f_finale.o dos/f_wipe.o dos/d_main.o dos/d_net.o dos/d_items.o dos/g_game.o dos/m_menu.o dos/m_misc.o dos/m_argv.o dos/m_bbox.o dos/m_fixed.o dos/m_swap.o dos/m_cheat.o dos/m_random.o dos/am_map.o dos/p_ceilng.o dos/p_doors.o dos/p_enemy.o dos/p_floor.o dos/p_inter.o dos/p_lights.o dos/p_map.o dos/p_maputl.o dos/p_plats.o dos/p_pspr.o dos/p_setup.o dos/p_sight.o dos/p_spec.o dos/p_switch.o dos/p_mobj.o dos/p_telept.o dos/p_tick.o dos/p_saveg.o dos/p_user.o dos/r_bsp.o dos/r_data.o dos/r_draw.o dos/r_main.o dos/r_plane.o dos/r_segs.o dos/r_sky.o dos/r_things.o dos/w_wad.o dos/wi_stuff.o dos/v_video.o dos/st_lib.o dos/st_stuff.o dos/hu_stuff.o dos/hu_lib.o dos/s_sound.o dos/z_zone.o dos/info.o dos/sounds.o dos/i_main.o \
-o dos/dosdoom

real 0m1.174s
user 0m2.626s
sys 0m0.679s

How’s that for fast?

For any curious OS X 64bit users out there you can download my binary toolchain here.

I would imagine that if you stuck with versions of binutils & gcc that build on your platform you too should be able to build a MS-DOS DJGPP cross compiler. And there is nothing like native 64bit tools for building for DOSBox… Oh and DOOM runs just fine, although I guess screen shots of the cross compiled exe is… redundant.