What a blast from the past. I recall my own experimenting with DJGPP and DPMI in my own software. It felt futuristic at the time. I was blown away.
Another fond memory: I was playing Star Wars: Dark Forces (I think that was the one) and was frustrated with the speed of level loading. I think it used DOS/4GW and I recall renaming it, copying in a new dos extender (was it CWSDPMI? not sure), and renaming it to the one Star Wars used. I was shocked when it not only worked, but the level loading was MUCH faster (like 3-5x faster I recall). My guess is whatever one I had swapped in wasn't calling the interrupt in DOS (by swapping back to real mode), but perhaps was calling the IDE disk hw directly from protected mode. Not sure, but it was a ton faster, and I was a very happy kid. The rest of the game had the same performance (which makes sense I think) with the new extender.
I learned to solder as a pre-teen so I could make a nullmodem :) Then I learned that resistors were a thing when I made a parallel port sound card (this thing https://en.wikipedia.org/wiki/Covox_Speech_Thing). Fun times!
I wasn't allowed a soldering iron as a kid, so I ended up just chopping and splicing a regular serial cable and turned it into a null modem, all so that I could play OMF2097 with my friends without having to share the same keyboard (we would always fight over right side, which defaulted to using the arrow keys for movement - and so the person who got the right side generally had the advantage, as back then arrow keys were the default movement keys, unlike these days where WASD is default.)
Nice. I learned on a DE-9 cable making an HP-48 cable from an internal CD-ROM analog cable. I was such a poor student cliché that I used Scotch tape instead of electrical tape to ensure the RX, TX, and GND lines didn't short.
There wasn't one kind of null modem cable, per se, there were serial and parallel null modem cables.
Originally, there were null modem (serial) adapters that worked with straight through cables but that got expensive, awkward, and complicated. A universal serial null modem cable had a pair of "DB-9" DE-9 female and DB-25 female connectors on both ends so it would work with either system having either type of connector.
A parallel null modem cable had DB-25 male connectors on both ends.
That parallel port sound card was my primary sound card for a long time. I bought a bunch of full sized resistors from Maplin and soldered them all as janky as a kid can with huge blobs of solder, but it worked perfectly from day one.
Really fun times. I “learned” to solder around that time and age also. Playing Mod files through a DIY version of that “thing” piped into a portable stereo speaker was awesome.
Years later I learned what flux was, and soldering became quite a bit better and easier.
> From the beginning of the development, id had requested from djgpp engineers that their DPMI client would be able to run on djgpp's DPMI server but also Windows 95 DPMI server.
I'm pretty sure that "DJGPP engineers" is just one guy, DJ Delorie. DJGPP was always open source so I bet he got some contributors, but if the rest of this sentence is true that "id has requested from djgpp engineers", it just means they asked the maker of an open source tool they used to please add a feature. I wonder whether they paid him for it or whether DJ just hacked it all in at id's request for kicks. His "about me" page suggests he does contracting so might be the latter.
DJGPP was spectacularly good back in the day. I didn't appreciate at the time what a monumental effort it must have been to port the entire GCC toolchain and runtime to DOS/Windows. Hats off to DJ Delorie!
Back then, DJGPP was a much bigger group, and most of the Quake kudos go to Charles Sandmann, author of cwsdpmi, who worked directly with Id to help them optimize their code for our environment.
I think I remember there was some communication between ID and Charles Sandmann about CWSDPMI, so even though it's worded a bit strange for an open source project there's probably some thruth in it?
Also a bit strange how the author is surprised about Quake running in a 'VM', apparently they don't really know about VM86 mode in x86 processors...
So I just took a look at DJ’s website and he has a college transcript there. Something looked interesting.
Apparently he passed a marksmanship PE course at the first year. Is that a thing in US? I don’t know, maybe its common and I have no idea. I’d love to have a marksmanship course while studying computer science though.
Or from the Seinfeld episode "The Pool Guy" (Aired November 1995) which had a fictional movie called "Chunnel" -- probably based on the very same channel tunnel.
This worked in DOS, but was easily ported to Linux.
As far as DPMI: I used the CWSDPMI client fairly recently because it allows a 32-bit program to work in both DOS and Windows (it auto-disables its own DPMI functions when Windows detected).
I recall reading about TCP/IP-powered Internet multiplayer DOS Quake in TECHINFO.TXT that shipped with the retail version of the game, and I quote:
Beame & Whiteside TCP/IP
------------------------
This is the only DOS TCP/IP stack supported in the test release.
It is not shareware...it's what we use on our network (in case you
were wondering why this particular stack). This has been "tested"
extensively over ethernet and you should encounter no problems
with it. Their SLIP and PPP have not been tested. When connecting
to a server using TCP/IP (UDP actually), you specifiy it's "dot notation"
address (like 123.45.67.89). You only need to specify the unique portion
of the adress. For example, if your IP address is 123.45.12.34
and the server's is 123.45.56.78, you could use "connect 56.78".
I looked around a little and sure enough, a copy of the software was avaiable in a subdirectory of idgames(2?) at ftp.cdrom.com. I knew nothing about TCP/IP networking at the time, so it was a struggle to get it all working, and in the end, the latency and overall performance was miserable and totally not worth it. Playing NetQuake with WinQuake was a much more appropriate scenario.
In an interview with Lex Fridman, John Carmack said that in retrospect, Quake was too ambitious in terms of development time, as it both introduced network play and a fully polygonal 3D engine written in assembly. So it would have been better to split the work in two and publish a "Network Doom" first and then build on that with a polygonal Quake.
Which seems to imply that the network stack was about as difficult to implement as the new 3D engine.
I feel he's stepping his way to that, but Quake is an entire other world of complexity from DooM (which is simple enough that a 400+ page book can "explain" it and the OS and the computers it ran on).
It's amusing to me that in the 90s you could easily play Quake or Doom with your friends by calling their phone number over the modem whereas now setting up any sort of multiplayer essentially requires a server unless you use some very user-unfriendly NAT busting.
Glad you mentioned DOOM! Sometimes people forget that DOOM supported multiplayer as early as December 1993, via a serial line and February 1994 for IPX networking. 4 player games on a LAN in 1994! On release, TCP/IP wasn't supported at all, but as the Internet took off, that was solved as well. I remember testing an early-ish version of the 3rd party iDOOM TCP setup driver from my dorm room (10 base T connection) when I was supposed to be in class, and it was a true game changer.
You usually just need to forward a port or two on your router. That gets through the NAT because you specify which destination IP to forward it to. You also need to open that port in your Windows firewall in most cases.
Some configuration, but you don't have to update the port forwarding as often as you would expect.
The reason you can't just play games with your friends anymore is that game companies make way too much money from skins and do not want you to be able to run a version of the server that does not check whether you paid your real money for those skins. Weirdly, despite literally inventing loot boxes, Valve does not suffer from this sometimes. TF2 had a robust custom server community that had dummied out checks so you could wear and use whatever you want. Similar to how Minecraft still allows you to turn off authentication so you can play with friends who have a pirate copy.
Multi-player started with Doom 2. Original doom was single player only. Doom 2 was for 4 players which I used in my mod ArsDoom. Quake then extended it to scale via a dedicated quake server.
I was half expecting something about how to get tcp into windows, but this is win95 where they shipped it inside the os and put some company out of business that used to sell that.
The turbulent times and the breakneck speed of computer development need to be taken into account. Not long before that computer networks were strictly corporate things installed by contractors choosing hardware, driver and software suppliers suitable for tasks performed by employees or students, and someone who installed it at home was the same kind of nerd who would drag an engine from the work into his room to tinker. Non-business-oriented software rarely cared about third party network functions. Then network card became a consumer device, and a bit later it became integrated and expected.
Also, Windows did not install TCP/IP components on computers without a network card (most of them until the Millennium era), it was an optional component. You could not “ping” anything, as there was no ping utility, nor libraries it could call. In that aspect, those network-less Windows systems were not much different from network-less DOS systems. The installer probably still works that way (or can be made to, by excluding some dependencies), but it's hard to find hardware without any network connectivity today. I wonder what Windows 11 installer does when there is no network card to phone home...
Ah I remember running a serial cable from my bedroom to the hallway so we could play 1v1 quake via direct connect. Good times! I think we used to play age of empires that way too.
This article makes it seems like 1996 was ancient times. There was the internet then, browsers, Mac’s had a tcp stack for a while by then, quake was an extremely advanced game.
Yeah, the dos to windows transitions was a big deal, but it was a pretty ripe time for innovation then.
Yeah, but dial-up was slow, laggy, and what 95% of people used to access the internet in those days. Real-time gaming was not fun with anything that used it. I grew up in a rural area in the 1990s and was no match for people that started to get cable modems as time went on.
> My guess is that, in full screen, memory writes and reads to the VGA are given direct access to the hardware to preserve performances. [sic]
When a DOS VM is in windowed mode, Windows must intercept VGA port I/O and video framebuffer RAM access to a shadow framebuffer and scale/bitblt it to display in its hosted window.
In full screen, exclusive VGA access is possible so it doesn't need to do anything special except restore state on task switching.
Quake would be even faster if it didn't have to support DPMI/Windows and ran in "unreal mode" with virtual memory and I/O port protections disabled.
> If you wanted to play a multiplayer game on the internet, either you needed to have explicit host & port information, or you needed to use an online multiplayer gaming service.
Technically true, although tools like Kali existed which could simulate IPX style networks over the internet. I know this because I played a substantial amount of Mechwarrior 2 online when it designed only for local network play!
Of course Quake had to support DOS but id developed Quake on NeXTSTEP which of course had TCP/IP and they had been supporting Linux and other commercial Unix versions like Solaris since Doom a few years earlier.
and let's not forget QuakeWorld that introduced latency compensation, allowing you to have an OK experience with up to 200ms ping, where as the normal Quake TCP/IP stack was basically unplayable with anything over 70-80ms. https://quakewiki.org/wiki/QuakeWorld
my first multiplayer Quake was with Qtest in February 1996 using a null modem cable between two machines, and later on using coax cables and IPX in DOS
getting a multiplayer game running was a tech feat compared to the plug & play nature of things now. the learning curve is gone now.
” It is impressive to see Quake run at full speed knowing that Windows 95 runs DOS executable in a virtual machine. My guess is that, in full screen, memory writes and reads to the VGA are given direct access to the hardware to preserve performances”
Virtual x86 mode had little to do with what we nowadays think of when someone says ”virtual machine”
Arguably it had a great deal to do with what we think of as a "virtual machine."
Virtual 8086 remapped all opcodes and memory accesses to let a program pretend to be on a single, real-mode 8086 when in reality it was one of many programs running in protected mode on a newer chip
AMD-V and whatever the Intel counterpart is do the almost exactly the same thing: re-map all ia32 and amd64 instructions and memory accesses to let a program pretend to be doing ring 0 stuff on an x86 box, when in reality it is one of many programs running with fewer privileges on a newer chip
There are a few more wrinkles in the latter case -- nested page tables, TLB, etc -- but it is the same idea from the viewpoint of the guest.
> And in 1995 there were only two: us, and Total Entertainment Network. You might think game creators would come to us and say "please put my game on your service!", but... nope! Not only did we have a licensing team that went out and got contracts to license games for our service, but we had to pay the vendor for the right to license their game, which was often an exclusive. So, we had Quake and Unreal; TEN got Duke Nukem 3D and NASCAR.
FWIW, the Total Entertainment Network (TEN) got Quake later, here's a press release from September 30 1996 [1]. Wikipedia says QTest was released Feb 24, 1996, and I can't find when MPath support launched, so I don't know how long the exclusive period was, but not very long. Disclosure: I was a volunteer support person (TENGuide) so I could get internet access as a teen; I was GuideToast and/or GuideName.
nu11ptr|3 months ago
Another fond memory: I was playing Star Wars: Dark Forces (I think that was the one) and was frustrated with the speed of level loading. I think it used DOS/4GW and I recall renaming it, copying in a new dos extender (was it CWSDPMI? not sure), and renaming it to the one Star Wars used. I was shocked when it not only worked, but the level loading was MUCH faster (like 3-5x faster I recall). My guess is whatever one I had swapped in wasn't calling the interrupt in DOS (by swapping back to real mode), but perhaps was calling the IDE disk hw directly from protected mode. Not sure, but it was a ton faster, and I was a very happy kid. The rest of the game had the same performance (which makes sense I think) with the new extender.
ggambetta|3 months ago
d3Xt3r|3 months ago
burnt-resistor|3 months ago
There wasn't one kind of null modem cable, per se, there were serial and parallel null modem cables.
Originally, there were null modem (serial) adapters that worked with straight through cables but that got expensive, awkward, and complicated. A universal serial null modem cable had a pair of "DB-9" DE-9 female and DB-25 female connectors on both ends so it would work with either system having either type of connector.
A parallel null modem cable had DB-25 male connectors on both ends.
http://www.nullmodem.com/LapLink.htm
Both were used with LapLink and often interchangeably called "LapLink cables" too because the boxed version of LapLink included both cables.
qingcharles|3 months ago
lll-o-lll|3 months ago
Years later I learned what flux was, and soldering became quite a bit better and easier.
skrebbel|3 months ago
> From the beginning of the development, id had requested from djgpp engineers that their DPMI client would be able to run on djgpp's DPMI server but also Windows 95 DPMI server.
I'm pretty sure that "DJGPP engineers" is just one guy, DJ Delorie. DJGPP was always open source so I bet he got some contributors, but if the rest of this sentence is true that "id has requested from djgpp engineers", it just means they asked the maker of an open source tool they used to please add a feature. I wonder whether they paid him for it or whether DJ just hacked it all in at id's request for kicks. His "about me" page suggests he does contracting so might be the latter.
DJGPP was spectacularly good back in the day. I didn't appreciate at the time what a monumental effort it must have been to port the entire GCC toolchain and runtime to DOS/Windows. Hats off to DJ Delorie!
djdelorie|3 months ago
maybewhenthesun|3 months ago
I think I remember there was some communication between ID and Charles Sandmann about CWSDPMI, so even though it's worded a bit strange for an open source project there's probably some thruth in it?
Also a bit strange how the author is surprised about Quake running in a 'VM', apparently they don't really know about VM86 mode in x86 processors...
bluedino|3 months ago
eknkc|3 months ago
So I just took a look at DJ’s website and he has a college transcript there. Something looked interesting.
Apparently he passed a marksmanship PE course at the first year. Is that a thing in US? I don’t know, maybe its common and I have no idea. I’d love to have a marksmanship course while studying computer science though.
gpderetta|3 months ago
afandian|3 months ago
The British guy named Henry might have named it after another feat of engineering completed around the same time.
https://en.wikipedia.org/wiki/Channel_Tunnel
torh|3 months ago
jhallenworld|3 months ago
https://www.ka9q.net/code/ka9qnos/
This worked in DOS, but was easily ported to Linux.
As far as DPMI: I used the CWSDPMI client fairly recently because it allows a 32-bit program to work in both DOS and Windows (it auto-disables its own DPMI functions when Windows detected).
https://en.wikipedia.org/wiki/CWSDPMI
badocr|3 months ago
cubefox|3 months ago
Which seems to imply that the network stack was about as difficult to implement as the new 3D engine.
bitwize|3 months ago
PeterHolzwarth|3 months ago
klaussilveira|3 months ago
As well as bug reports: https://github.com/Henrique194/chocolate-quake/issues/57
I personally would love to get some help with my chocolate Doom 3 BFG fork, specially with pesky OpenGL issues: https://github.com/klaussilveira/chocolate-doom3-bfg
bombcar|3 months ago
sempron64|3 months ago
ryandrake|3 months ago
mrguyorama|3 months ago
Some configuration, but you don't have to update the port forwarding as often as you would expect.
The reason you can't just play games with your friends anymore is that game companies make way too much money from skins and do not want you to be able to run a version of the server that does not check whether you paid your real money for those skins. Weirdly, despite literally inventing loot boxes, Valve does not suffer from this sometimes. TF2 had a robust custom server community that had dummied out checks so you could wear and use whatever you want. Similar to how Minecraft still allows you to turn off authentication so you can play with friends who have a pirate copy.
unknown|3 months ago
[deleted]
rurban|3 months ago
klaussilveira|3 months ago
It's like in-engine Hamachi. Works really well with P2P games.
Lammy|3 months ago
kamranjon|3 months ago
unknown|3 months ago
[deleted]
sroussey|3 months ago
ogurechny|3 months ago
Also, Windows did not install TCP/IP components on computers without a network card (most of them until the Millennium era), it was an optional component. You could not “ping” anything, as there was no ping utility, nor libraries it could call. In that aspect, those network-less Windows systems were not much different from network-less DOS systems. The installer probably still works that way (or can be made to, by excluding some dependencies), but it's hard to find hardware without any network connectivity today. I wonder what Windows 11 installer does when there is no network card to phone home...
jahnu|3 months ago
https://en.wikipedia.org/wiki/Trumpet_Winsock
hypercube33|3 months ago
mmastrac|3 months ago
fallingfrog|3 months ago
ec109685|3 months ago
Yeah, the dos to windows transitions was a big deal, but it was a pretty ripe time for innovation then.
hylaride|3 months ago
burnt-resistor|3 months ago
When a DOS VM is in windowed mode, Windows must intercept VGA port I/O and video framebuffer RAM access to a shadow framebuffer and scale/bitblt it to display in its hosted window.
In full screen, exclusive VGA access is possible so it doesn't need to do anything special except restore state on task switching.
Quake would be even faster if it didn't have to support DPMI/Windows and ran in "unreal mode" with virtual memory and I/O port protections disabled.
Rodeoclash|3 months ago
Technically true, although tools like Kali existed which could simulate IPX style networks over the internet. I know this because I played a substantial amount of Mechwarrior 2 online when it designed only for local network play!
lizknope|3 months ago
pragma_x|3 months ago
bombcar|3 months ago
Windows 95 and MS-DOS in 2004 worry me a bit more.
xela79|3 months ago
my first multiplayer Quake was with Qtest in February 1996 using a null modem cable between two machines, and later on using coax cables and IPX in DOS
getting a multiplayer game running was a tech feat compared to the plug & play nature of things now. the learning curve is gone now.
nikanj|3 months ago
Virtual x86 mode had little to do with what we nowadays think of when someone says ”virtual machine”
skywal_l|3 months ago
[0]: https://en.wikipedia.org/wiki/QuakeC
hapless|3 months ago
Virtual 8086 remapped all opcodes and memory accesses to let a program pretend to be on a single, real-mode 8086 when in reality it was one of many programs running in protected mode on a newer chip
AMD-V and whatever the Intel counterpart is do the almost exactly the same thing: re-map all ia32 and amd64 instructions and memory accesses to let a program pretend to be doing ring 0 stuff on an x86 box, when in reality it is one of many programs running with fewer privileges on a newer chip
There are a few more wrinkles in the latter case -- nested page tables, TLB, etc -- but it is the same idea from the viewpoint of the guest.
toast0|3 months ago
FWIW, the Total Entertainment Network (TEN) got Quake later, here's a press release from September 30 1996 [1]. Wikipedia says QTest was released Feb 24, 1996, and I can't find when MPath support launched, so I don't know how long the exclusive period was, but not very long. Disclosure: I was a volunteer support person (TENGuide) so I could get internet access as a teen; I was GuideToast and/or GuideName.
[1] https://web.archive.org/web/20110520114948/http://www.thefre...
anthk|3 months ago
unknown|3 months ago
[deleted]
unit149|3 months ago
[deleted]
John-Tony12|3 months ago
[deleted]
dndvr|3 months ago
Fascinating deep dive — shows how Quake.exe integrated its own TCP/IP stack, highlighting clever engineering and early game networking innovations.
--------------------------
This is AI right? the em dash and the inane sycophantic reiteration