In my years being a programming consultant, I have worked on many projects, one of them being my favorite. A gentleman from the other side of the country called me up and said that he had weather stations around the area (about 17 or so) giving the current time and temperature along with forecasts for the next few hours.
These simple stations consisted of a single standard desktop PC computer using an ISA card to communicate with a temperature probe and a modem to call a national weather station for the forecast.
The caller would call a specified number, which would connect to this PC via a modem. The modem, along with other hardware and software, would send back text in the form of voice, giving the current time, temperature, and forecast.
The catch was that the caller would have to listen to about a 30-second advertisement before the time, temperature, and forecast would be played. At call time, the software would randomly choose one of a few pre-recorded advertisements. The owner of the "station" could change these advertisements at will.
The owner of the PC, hardware, and software, who became a good friend of mine over the years, would make a small amount of money through these "stations" surrounding the area.
However, the owner didn't want to drive to each "station" each time there was something wrong with the PC. Therefore he and I devised a way to call the "station" as if we were a local caller, but enter VOICE codes that would put the software into command mode allowing us to get status of and/or change functions of the "station".
To program and debug the software, I needed to have at least two PCs along with a Ringit Simulator in between each one, connected via two modems. This way I could call one PC from the other as if I were using the actual phone company, with each PC in the same room.
At the time, the owner sent me a small PC so that I could use it as the test PC, or the "station". He called it a "Lunch-box" PC. When it arrived, I found out why. Click on the image to see it full size. It is about 16" wide, 9" in height, and 9" in depth.
The owner, who still operates some of the function of the project, has a website that uses a national code base and weather gathering system. However, the 17+ stations have all but been retired since my good friend has now retired himself, and spends most of his time in service to his church and his grandkids. (An honorable new career, me being religious and having three grandkids of my own.)
The other day I decided to get this old "Lunch-box" out of storage and see what it was made of. Below is an image of the boot screen. Click on the image to see it full-sized. (I blurred out the prompt due to software name copyrights.)
You can see that it is a 80486 with 16Meg of RAM, nearly a 100Meg of hard drive space, a 1.44Meg floppy, and an 80x25 color display. Looking at the first image above, you can see that there are two serial ports installed, a video card, as well as the modem.
I decided to see if I could get my Hobby OS to boot on it, well knowing it wouldn't get too far, but I still wanted to see. The first attempt completely failed and halted the machine just after the POST.
After a little bit of debugging, this machine does not have the CPUID instruction, which I thought I clearly scanned for throughout the first part of my code. Come to find out, I used the CPUID instruction as a serialization instruction after using self-modifying code to call the Real Mode BIOS from Unreal Mode. Therefore, I was using the chicken to see if it could lay an egg before the egg hatched and became the chicken I was checking.
After a few other modifications, and a massive restraining order on the memory assumptions, I got my OS to boot and load my kernel. Here is an image of this happening.
The screen is a little fuzzy due to the camera I used to take the image. The keyboard looks like it has a lot of dust on it, which is really the case. I just need to charge my air compressor to 15 pounds or so and give it a good blast. (Sorry for the pixelated envelopes to the right. No one needs to see my mail, right?)
Once the kernel is loaded and ready for execution, the "Lunch-box" does a triple fault and reboots due to the kernel requiring more memory than the 16Meg this little machine has. However, it did what I desired it to do, boot and load my operating system.
This was a fun little project. I found a few bugs and code errors that I probably would never have found without actually running it on an older processor. It was an enjoyable task, and this is exactly why we do this, right.
To see updated boot and loader code that works on this 80486 as well as modern hardware, have a look at my github page. I didn't have to update the boot code at all for this 80486, but the loader code, in the loader folder, had a few modifications. The EFI folder is for a more modern machine using UEFI firmware instead of the Legacy BIOS.