Recently, the oldest known versions of DOS were uploaded to the internet, and Michal Necasek dove into the floppy images.
Even after more than 40 years(!), old software releases and pre-releases can still surface. In the case of 86-DOS 0.11 and 0.34 it’s practically a miracle, since there were probably never very many copies in existence.
For the first time since the early 1980s, FAT formatted floppies with the primordial 16-byte directory entry format have come to light. The old 16-byte directory entries were gone by 86-DOS 1.0 in April 1981 and of course never appeared in any public PC DOS release.
These prehistoric versions of 86-DOS allow us to fill in further missing pieces in the puzzle of DOS origins. It is fascinating to follow how DOS developed from almost nothing to a multi-million dollar business in the course of just a few years.
↫ Michal Necasek
It started out so humbly. Yet, here we are, in 2024, and variants of DOS still have their uses in certain niches. An incredible legacy, for sure.
DOS was, and is, an incredibly flexible and powerful framework for low-level applications. Sure, it isn’t as feature-rich and powerful like a modern multitasking OS, but for quite a few applications you don’t need a full pre-emptive multitasking environment with a rich driver stack and GUI. Many applications just need to bit-and-byte-bang on a low level, and benefit from a more direct path to hardware interaction.
I’m actually suprised DOS hasn’t actually gained more of a following in recent years, especially with simple microcontrollers like Arduinos, or single-application use cases with RPis. Of course, i know DOS is x86, but even then, i don’t see much talk about 64-bit x64 DOS projects.
The123king,
I’m quite familiar with both DOS and low level bare metal programming. One might make the connection that because DOS is a low level OS, it would be good for low level microcontroller programming. But honestly I don’t see DOS adding much value for an arduino programmer. Generally speaking things like arduinos are single purpose and the functionality you want to import is better served by special purpose libraries than a full fledged OS. As minimalist as DOS was, it would still take up valuable space on an arduino. Furthermore, even when DOS was popular, many programs would bypass DOS functions (ie software interrupts) because they were significantly slower than just accessing IO directly. The same would be true on arduino, even if IO facilities were there, everyone would still be opting for direct IO, which is easier/faster/smaller.
Something I do wish worked better on arduino is wifi/networking, but DOS didn’t have good facilities for this anyway. You’d be better off using a purpose built TCP stack library than a DOS TSR.
Supporting a full OS makes more sense on a raspberry pi, but personally I’d choose linux over DOS because linux remote access facilities are far more developed. Not to mention ready-to-use support for a full catalog of linux utilities/libraries/etc.
This is not meant to be argumentative but why do you say “incredibly flexible and powerful framework for low-level applications”? Perhaps I do not know enough about DOS.
What about DOS makes it powerful? As I understand it, it relies mostly on the BIOS to interact with hardware. The memory model seems very primitive. It executes only a single process at a time. Towards the end of the DOS era, many programs essentially used DOS as a boot loader to get into a “DOS Extender” that was effectively the real OS ( providing drivers, managing memory, rendering graphics, etc ).
What about DOS do you find powerful? ( again: real question – I am looking forward to the answer ).
So maybe “powerful” was the wrong word, probably more the opposite. Let’s tackle your points in the order you made them.
It has very simple requirements. Calling on the BIOS is great, because the BIOS is pretty much the lowest common denominator in PCs. With few drivers to worry about, there’s less code running and less to crash and “bug out”. Of course, that generally means you have to supply your own drivers, but for most DOS use cases, you’re probably doing that already.
The memory model IS very primitive. Providing you can write your code in 640KB or less, it’s run without needing to page, or worry about variable physical memory on anything more modern than a PC XT. Great for data recovery or other hardware diagnostic programs.
It does only execute a single task at a time. The lack of any multitasking or scheduler means your program has 100% of the computer’s attention. You don’t have to worry about when the computer will get to your task and execute your code, because there isn’t anything else running. Great for realtime tasks or other programs that need snappy responses form the hardware.
There’s a lot of tasks that don’t require a “real OS”. The aforementioned data recovery tools, real time applications, low level drive manipulation tools. A “full OS” like Linux is great, but you are still at the beck and call of driver support for a lot of it. If you’re running as close to the metal as DOS does, you don’t need driver support. Some vendors still ship BIOS flash utilities with a DOS foundation.
DOS is simple, and that simplicity can lend to to being perfect for many different tasks. Sure, it’s not going to be a day-to-day OS for most people, but it’s damn useful if you need it.
The123king,
When talking about MMU-less systems, most devs would be more comfortable with flat memory models like m68k. DOS on x86 used segmented memory. Memory could only be accessed through 64K segment windows, which doesn’t exist with other architectures.
I don’t take issue classifying DOS as lightweight, but don’t forget about DOS TSRs running in the background. For example I wrote a remote tenet daemon for DOS, which ran both the telnet daemon and TCP stack behind the foreground application. Many TSRs did things like this.
I agree that DOS is “simple” in terms of desktop software, but in terms of microcontrollers it still seems more complex & bloated than necessary. It would have to be significantly stripped down to fit in the EEPROM and RAM of most micro-controllers.
oldest CP/m that can run dos and basic?