How to Build an Awesome 386 Computer - Part 2: The Software
Oh Just Shoot Me Now...
IRQ, DMA and PORTs
The real hell of setting up a 386 is getting the components to co-exist with each other without conflict. This may sound ridiculous to you as a reader. "Why the heck should I have to figure that out? Why don't the designers make the computer so it just works?" Back in the late 80s, hardware communicated with the CPU in a fairly elementary way. We can't blame the engineers. The sophisticated techniques employed today hadn't been pioneered yet, so hardware had to be "set up" for each system.
Imagine a class full of little kids. The teacher is like the CPU and the kids are like all the cards you put in the computer. The teacher tells the kids to raise their hand if they wanna talk. This is known as an "interrupt". A kid raising his hand is like a card sending an interrupt signal. Each kid, each card, has its own interrupt channel and no 2 devices can share the same interrupt. When you go out and buy a sound card or something, it doesn't know which interrupts will be used in the computer you have or the computer someone else has, so this has to be defined by the user. If you don't do that, 2 devices will try to interrup the CPU on the same channel and bad things will happen. IRQs are either set through software or through physical jumper pins that have to be shorted out will little shunts on the board. The instructions telling you which jumpers to shunt are either printed on the board itself or depicted in a schematic in the documentation that came with the board. On top of all this, some IRQs are reserved by the system and can never be used. And there are only 15 in total. Good luck! In all seriousness, out of the IRQs you can use, you simply have to decide, fairly arbitrarily, which ones to assign to which devices, make sure the devices support your choices and muddle around with the distribution of them on a napkin until you get something that works. Then you set the jumpers on each card (where applicable), plug them in and your done. Generally speaking, IRQs you can actually use are 5, 10, 11, 12 and 15. If you're in a jam you can sometimes use others but it means disabling another part of the computer or praying there won't be a conflict. Sound cards like 5, SCSI and NIC cards tend to favour 10 and 11 and 15 is kind of a wild card that's normally reserved for a secondary hard disk controller that people don't usually need.
DMA channels are handled in much the same way as IRQs. Without going into the technical details, you just have to select an unused DMA channel for each card that needs a DMA channel and set it via the jumpers or the software later on. You have more of a selection with DMA channels so this should be the second thing you work on. Sound cards like to use 1 and 5 but 3, 4, 6 and 7 should also be available.
PORT addresses, again, are handled with jumpers or in software. Now this is a bit tricky so I'll start with a brief explanation. When you install a card and turn the machine on, a small block of system memory has to be reserved at an address of the user's choosing, which points or correlates to a port or a piece of memory on the physical device being plugged in. This basically allows the CPU to communicate with and utilize the onboard resources of the card in question. It's a software interface of sorts that works at a much lower level than drivers do. However because the computer's main memory is not managed very well by default, you have to take care not to write to the same address in memory with 2 different cards or there will be a conflict. At the same time, you have to use memory that is actually available and not something that has been reserved by the system for a different purpose. To achieve this more easily you can use a program which shows you the memory blocks, their addresses and which ones are used and unused. A DOS program called SysInfo is a good example of a program that does this. All the addresses are represented in HEX and you need to reserve spots in an area called "Upper Memory" that is sort of quarantined for this purpose. Luckily there are lots of defaults for various different cards so you just have to pick from a list of defaults and make sure they aren't used by something else. Sometimes the card itself will make things easy by only allowing you to pick from 2 or 3 addresses, so you can spend all your time on the ones with arbitrary values to pick from. Again, starting with the sound card, digitized sound likes to use 220H, wavetable sound likes 330h and the rest is kind of all over the map and first come first serve.
As I said before, if the card isn't Plug'n'Play, you need to shunt specific jumpers on the boards to pick these 3 values. The instructions for how to do so will be printed on the card next to the jumper in question or can be found in a schematic in the documentation that came with the card, which you'll have to dig up. The schematic will identify the jumper with nomenclature such as J11, J29, etc., which you will then look for on the board and try to line up the shape of the jumper pins with the little picture in your documentation. Then you just need to use pliers to insert these little shunts (which should already be on the board) across the correct pair of pins. If the card does not have jumpers, you still need to do the work, just not on the board. Plug the board in and forget about it... for now.
Turn the Computer On
If you've plugged all your chips into their sockets (CPU, FPU), installed the RAM, cache, all the cards, connected a suitable power supply (pretty much any wattage will do) and set all your jumpers, making sure to take notes of what you picked, then you're ready to turn the PC on. Chances are you'll have problems right off the bat but not because you did anything wrong. New hardware needs to be set up not only in hardware but also in software. If you physically installed your CPU/FPU, RAM and cache properly, you'll get past the POST screen where the memory test is performed. However soon after, the next thing that happens is all your drives will be polled. This will probably fail because either you plugged your ribbon cable in wrong, set the jumpers on the back of your DRIVES (not cards) wrong, didn't set up your BIOS yet or your SCSI controller can't find the hard drive. No big deal, this is to be expected. What you want to do is ensure that your drives are detected properly and match the BIOS and what it expects to see.
While We're on the Topic of BIOS...
BIOS stands for Basic In Out System and is akin to a mini operating system that lives on the motherboard. Its sole purpose is to manage the stuff that's plugged into it. It needs to know what is in every socket and slot and how to configure everything. It also keeps track of the time and date, the order in which devices are booted, power management, cpu/ram speeds and special memory mapping parameters, among others. When you start your computer, the BIOS is the very first thing that runs because... nothing else can yet - it hasn't been set up! Chances are, you will have to tinker with the BIOS at least a little because every system configuration is slightly different and the default settings will only get you so far. Having said that, I would begin by setting everything to its default. When you turn the computer on, quickly press and hold the delete key. This is typically the key that brings you into the BIOS. Once inside, you'll see a menu that can be navigated by keyboard. First, find the option to restore default settings. Apply this, reset the computer and go back into the BIOS. Then set the date and time. This is actually important because certain programs will not run properly if the date is too far off from reality. Next, you'll need to define drives A, B and C at the least. If you have 3.5" and 5.25" floppy drives, assign them as such to A and B. C is for your hard drive. This will either have a simple option from a menu to pick or you'll have to painstakingly determine all the tech data on your specific drive and feed it in one parameter at a time. Either way, your hard drive will not work, even if properly installed, until you pick the right setting in the BIOS. Also keep in mind that if you have a SCSI hard drive and controller, that controller card has its own BIOS just for the hard drive, so in your main BIOS you have to clear the C drive entry so that it thinks there's no hard drive at all. This prevents a conflict between the controllers on the motherboard and SCSI card. The next step is to browse each of the menus until you find the boot sequence, which says which drives to load first, second, third, etc. You will almost always want to load A,B,C or B,A,C, as long as C is last. This allows you to get a DOS prompt in a pinch using a bootable floppy disk, if you are having problems with your hard drive. If you have an FPU chip physically installed you will have to find the option that enables/disables the numeric or Weitek processor and make sure that is enabled, whichever the case may be. Otherwise it won't get used. Beyond that, there are a ton of other settings that can optimize the cpu, ram and device I/O but it's beyond the scope of this article so if you're so inclined you can read up more on these and tinker till your heart's content. Otherwise, save everything and reboot.
Back to the Computer
If you have a normal PATA hard drive, you need to set it up in your BIOS, as previously described. Your BIOS will want to know all sorts of stuff about it like how many heads and sectors there are. All this tech jargon should be available if you google it or sometimes you'll get lucky and it's printed on the label on the hard drive. Either way, find your primary master channel in the BIOS (typically what you would make your C:\ drive), define the hard drive parameters, save, reboot and see what happens. If it doesn't work, check the jumpers at the back of the hard drive. It should be set to master, especially if you put a CD-ROM drive on the 2nd plug on the same cable. By the way, the furthest plug from the part that's connected to your motherboard (there should only be 2 plugs) is the Master. The one in the middle is the slave. That's for your CD-ROM if you have one. Plug the end connector into your hard drive, set the jumpers to master, double-check your BIOS settings, reboot and it should detect the drive.
If you have a SCSI drive, your ribbon cable will not only be different but it will also plug into the SCSI card, not the motherboard or the PATA controller card. There is usually a different keystroke to enter setup for the SCSI controller, like CTRL-A. Doing this will allow you to check and possibly set your IRQ/DMA/PORT info and ensure that the card is configured to enable all relevant headers and check for drive presence. This could be why the boot fails. Enter setup and consult the card documentation if necessary to navigate the different options but most importantly, check the aformentioned settings are the same in the setup as they are on the jumpers. Reboot and your SCSI controller should pick up the drive this time.
One other quirk about SCSI is that you can daisy chain multiple drives on the same cable... I mean a lot of drives in some cases. The technology that allows this to possible has its pros and cons. One of the cons is the need to "terminate" the last device in the chain. If you only have 1 hard drive connected, this won't be an issue for you but if you have several, the furthest one from the controller card needs to be terminated, either internally using jumpers or by a special dongle that contains resistors. While this is beyond the scope of this article to describe in detail, simply be aware of it if you have multiple SCSI devices.
Even More Ribbon Cables
If you have both 5.25" and 3.25" floppy drives, they will go on the same floppy cable, connected to your PATA or SCSI controller but the order matters and so does the way you put the plug in. Get a ribbon cable that is keyed so you can't screw up the orientation and hopefully your drives are also keyed. A normal floppy cable has a twist in some of the wires too so don't let that scare you. In your BIOS settings, you should see where it allows you to pick what is going to be your A drive and what's going to be your B drive. Pick the 3.25" as drive A and the 5.25" as drive B and try booting the machine. If you are able to put a bootable diskette in your 3.25" drive and boot from it, then it worked. After booting to a C prompt, try typing B: and hit enter to see if you can read the other drive. If that works, great. If not, swap the drives and try again. If that don't work, swap them back and try switching the order in your BIOS. Try different combos until 1 works. Also bear in mind that SCSI controllers usually have a setting in software that enables or disables the floppy header. It has to be enabled or it won't work.
If you did everything right in the last few paragraphs, you should now be at the point where the computer POSTs, shows the correct amount of RAM, detects the primary hard drive and both floppy drives, shows some basic stats like how fast the CPU is and what each drive letter is assigned to and then... it should fail with a warning about not being able to detect any sort of file system. This is because more than likely you have a blank hard drive with no OS on it. This is easily fixed. All you need is a DOS bootable diskette. You'll have to make this on another computer though. Make a boot diskette that will boot to any late version of DOS (6.22 is best). Such a diskette should have a utility on it called FDISK. Put the floppy in the drive, restart the machine and the system should boot from the floppy this time and give you a C:\ prompt. Type FDISK and hit enter. You will be presented with a utility that allows you to format your hard drive. I won't explain how to use this program because that takes too long but what you want to do is create a primary DOS partition called C:\ and format that. Any other partitions are optional. Once you have a C:\ drive, you can install DOS to it. DOS should also install from about 3 diskettes (for 6.22) so stick that one in your drive and run the setup/install exe file. Follow the instructions and install it to your C:\ drive (the path should default to C:\DOS). After you're done, you will finally have a barely working machine that boots by itself without help and results in a C:\ prompt with some basic DOS utilities. Congratulations on passing that hurdle. Now it's time to set up all your cards and their drivers.
Memory Management and Driver Installation
While it's beyond the scope of this article to go into memory segment mapping, you should be aware at a minimum, that DOS has a relatively restrictive means of allocating your available memory. You can have 8MB or even 16MB of installed memory but as far as individual applications are concerned you can't run anything bigger than a 640KB file in theory, because that's how much memory is set aside as "conventional memory". All this means is that anything you run has to fit inside this space and whatever other memory the software may need to access after the fact can be taken from what remains of your extended memory, so it's not your "extended" memory that matters most of the time. It's saving that precious conventional memory that makes the difference between being able to run a program or not. This is mostly a DOS limitation but it also carries over to some extent when running Windows 3.X. All systems start out with 640KB of this conventional memory but as soon as you turn the machine on, it immediately wants to put all your drivers and TSRs there so by the time the computer is done booting you could have only 500 something KB left or maybe less, depending on what you load. Since our next job is to make sure all cards have their drivers loaded, you need to be aware of this memory limitation first so you put the drivers in the right place in memory, not just anywhere. What you can do to get around this 640KB barrier is to put most of what's loaded during boot into another area called "Upper Memory". This is the same general area that the cards will shadow their BIOS info and port addresses to but not exactly the same portion of it. There is a rather large percentage of contiguous space that doesn't automatically get used by the cards when you define their port address and this is what you can use to load drivers. You will have to edit your config.sys and autoexec.bat files (2 very important files that define precisely how your computer boots), which are just text files, so that they load the card drivers "HIGH", meaning they will go into upper memory blocks and not into conventional memory. This is a time-consuming task if you have a lot of stuff to put in there because the total upper memory area is just under 400KB and the useable portion of that for loading drivers high tends to be less than 100KB because some of it is reserved for another thing called a "page frame" for EMS memory, another type of memory used for certain applications and games. All I can say in this article is that if you load all your drivers high and put them in the right order, they will fit neatly like Tetris blocks into the memory space without spilling out into conventional memory. This should leave you with more than 600KB free conventional memory if you do it right, which is enough to run just about any DOS program that has ever been designed to run in DOS.
Getting Software to Talk to Hardware
In most cases, your expansion cards (sound card, video card, NIC, etc) will have come with documentation explaining how to install the corresponding drivers. Usually this amounts to running a setup program that will put the files in the right place on your hard drive and modify your autoexec/config files to launch those files. Sometimes you will have to place the driver files manually and enter lines into your boot files manually although this is rare. Just be aware that as you install your cards' drivers, they will tend to install in a "first come first serve" manner, which may not be optimal for memory management. They may also not load HIGH so you'll want to re-order the drivers in your boot files the way you like and try to load them all HIGH. It is during the installation of these drivers that you may encounter (in the setup utility) prompts to pick the IRQ/DMA/PORT again. Even though this is set in hardware most of the time, it isn't always the case (some cards are plug'n'play) and even for non-PNP cards, you still need to make sure the software matches the hardware so keep records of the jumper settings you picked and set them correctly in the driver setup utilities. If you have to enter information manually into your config/autoexec files, the IRQ/DMA/PORT info will be there as well. For example, installing a sound blaster will generate a line that defines the "BLASTER" variable and has a bunch of switches that follow. You may see something like "I5" or "A220" for example. The former defines the interrupt as 5 and the latter defines the port as 220H in HEX. Don't ask me why they used the letter A. Maybe Creative is just sadistic ;) In any case, your cards won't function properly until all the drivers are loaded at boot, in this manner and putting them mostly into upper memory will allow you to run most programs without errors.
There's also a bunch of stuff that should be in your config.sys and autoexec.bat files that isn't related to your expansion cards. Some of it is related to setting up DOS. Some of it is related to making your CD-ROM drive work. Some of it tells the computer how to manage memory more efficiently. Here are barebones examples of both files you can start with, that will work for most people in most cases. However please note that this assumes using the OAKCDROM driver to enable your CD-ROM so make sure you get that driver for that feature to work.
DEVICE=C:\DOS\HIMEM.SYS DEVICE=C:\DOS\EMM386.EXE HIGHSCAN I=B000-B7FF DOS=HIGH,UMB DEVICEHIGH=C:\OAKCDROM.SYS /D:MSCD001 DEVICEHIGH=C:\DOS\SETVER.EXE LASTDRIVE=Z BUFFERS=15 FILES=40 STACKS=9,256
SET PATH=C:\DOS SET TEMP=C:\DOS SET BLASTER=A220 I5 D1 H5 P330 LH C:\MSCDEX.EXE /D:MSCD001 PROMPT $P$G
Everything Works. Now What?
At this point you should in theory have a working computer but as I have found from experience, you won't know if it really works until you attempt to run differnt types of software so the next litmus test is to install some DOS stuff and try to use it. You could jump to install Windows at this point but the thing is, if DOS isn't sublime and running like a well oiled machine, Windows is certainly going to Sh*t the bed when you try to run stuff there so you may as well put in the effort now rather than have to start all over again later on.
Since it took a lot of work to get this far, I like to reward myself with something like Doom or Descent. Neither are going to run at a playable frame rate but it's an excellent starting point for making sure things work. Both games use a lot of memory, have both sound effects and midi support and support net play so at the very least you can check your sound card, modem/lan and your memory management. If everything works, try reading the contents of a CD from DOS by changing drive letters to your CD drive (probably D:) and typing "dir". If that works, you may want to install something graphically intensive like AutoCAD (which will check your FPU) or Microsoft Flight Simulator (which will check your graphics card via setup). You'll want to install and try software that uses specific elements of your computer, so you know whether or not they work as expected. No doubt you will run into something that doesn't work and have to troubleshoot but after doing this half a dozen times, you can be fairly confident your computer is set up correctly. Next stop, Windows!
On a 386 you have 1 option for Windows: Windows 3.X. Yeah you could install Windows 1 or 2 but why? They suck and not so much in the nostalgic sense. Windows 3.X is just enough of a backwards PITA to bring a petrified tear to your eye but also functional enough that you won't want to stab yourself repeatedly with a dessert spoon. Of all the Windows 3 versions, Windows 3.11 tends to be the best choice although Windows 3.1 can be better for you if you don't need networking support. Skip Windows 3.0. There's nothing to gain in that.
No doubt you will have Windows on floppy disks so go ahead and fire up your machine till you get good ol' C:\ and switch to A:\ with your first disk in the drive. Run the setup file and follow the instructions. It's pretty easy. Once Windows is done copying files, you will notice that it attempts to configure your hardware based on what it can detect. It will also try to configure certain software you may have installed if that's the case. This is why it's a good idea to get DOS perfect in advance, so you don't propagate mistakes into Windows. If the setup asks for IRQ related stuff, make sure to enter all the same values as before. At the end of the install, you'll be greeted by a familiar desktop and program manager with a few basic program groups. These, I usually tile into 6 groups including MAIN, APPLICATIONS, MULTIMEDIA, NETWORKING, ACCESSORIES and GAMES but that's totally up to you. If you go to the control panel, you can check what drivers are currently installed there. The setup will have probably missed most of them so you'll need to find the Windows 3.X compatible driver packs for your hardware and go through that all over again, running the setup utilities from Windows this time. This may add additional program groups and the drivers list will be repopulated. You can then configure the settings of your driver so that for example, your screen resolution is higher with more color depth, if your video card supports this. Sound drivers also tend to be of paramount importance with 386 users so make sure to get the Win3.X drivers for your sound card and install them too.
At this point you are pretty much done with the hard stuff. I mean debugging hardware, drivers and config settings on a 386 is the gift that keeps on giving and you're never truly done... really. But for now you are, so all that's left is to install software to make the computer useful. What software should you install? Well, the most responsible thing to do of course is install a bunch of video games that aren't playable, like Doom! However once the novelty of looking at pixels through a window the size of a credit card (with full wavetable sound no less) wears off, you'll want some productive software on your machine. Assuming you instlled a LAN card and also installed the TCP/IP network protocol that allows you to connect to the internet the way we do today, you'll want a browser or 2... or 5 because modern websites will be hell to load properly on a 386 so it's good to have options. Get Internet Explorer 5.0 for sure and Netscape Navigator.
Microsoft Office is always a great choice for any computer you plan to do work on and Windows 3.X supports some of the earlier versions of Word, Excel and Powerpoint. Granted you won't the flexibility of your modern-day counterparts but most of the most commonly used functions are still there including the ability to produce charts in Excel so why not? Bear in mind that an FPU chip will greatly speed up Excel since calculations often involve floating point numbers. You don't have to have an FPU but having one means waiting less when you drag a cell to copy a formula to 1000 other cells.
Your sound card's windows drivers may come with some software or it may not. If not, you'll want to install some sort of media player. Windows Media Player is a good choice but many third party players are better. If your sound card has a wavetable board or is an AWE card, all the more reason to get a nice midi player too. MP3s are going to be a problem however. While there are MP3 players written to work on a 386, they usually only work on the lowest quality MP3s, only if you have an FPU to aid in the maths involved and only if you have the fastest cpu speed and ram. Often the overhead used by windows will further hamper this so if you are extremely dedicated and your 386 is maxed out, go for a DOS player instead and you may be able to enjoy MP3 sound.
If your graphics card isn't complete balls, you may want to install the avi codec, which supports avi videos. You may only be able to play simple ones in low res but sometimes other software requires it for playing small clips and such so it's good to have. The same goes for QuickTime, which will further expand your multimedia capabilities.
What am I missing? Oh yeah... GAMES!
At the end of the day you may end up with quite an impressive retro rig that can run all kinds of cool retro software but the 386 would not be complete without a library of GAMES to play. After all, that's essentially what the sound card is for ;) Rather than spend a wall of text going over all the best DOS games, I will leave you with this video, showing samples of some very notable ones. It will whet your appetite sufficiently to seek out whatever games appeal to you the most.
In the meantime, I hope you enjoyed building your 386 computer and that you enjoy re-living the early 90s!