What is this DOS of which you speak?

If you’ve ever browsed the internet for computer games from the ‘80s and ‘90s, you may have noticed that many of them ran on a platform called DOS. But what exactly is DOS?

DOS stands for Disk Operating System and refers to a specific type of operating system that runs from a disk drive as opposed to other storage devices. A Disk Operating System (DOS) can reside on a hard disk drive, a floppy disk drive, or even an optical disc drive. Early computers that predate DOS tended to use more primitive storage devices such as punched cards, magnetic tapes, and core memories instead.

Features of DOS

DOS is a single-user, single-tasking operating system that uses a command-line interface rather than a graphical user interface. Let’s take a closer look at each of these features independently to better understand what they mean:

  • Single-User

    A single-user computer system only allows one person to interact with its resources at a time. Such computer resources include but are not limited to the central processing unit, main memory, input/output devices, persistent storage, and file management.

    In DOS, there are also no file permissions, meaning that anyone who has access to the computer system can read, write, or delete files at will. There are other single-user operating systems, including Palm OS and Windows 3.1, that do support file permissions though. Ultimately, multi-user operating systems that we have today became the popular demand due to their flexibility and access control capabilities.

  • Single-Tasking

    A single-tasking operating system only allows one program or task to run at a time on the central processing unit (CPU). This means that once a user runs a program, it must finish executing before the user is able to execute another program. In other words, a user cannot run two or more programs simultaneously and share the CPU. DOS and CP/M are prime examples of single-tasking operating systems.

  • Command-Line Interface (CLI)

    A command-line interface (CLI) is a text-based user interface that allows users to navigate folders, manage files, and run programs on a computer system by inputting and executing text commands. There are no graphics and visual icons in a command line interface, only text. Command line interfaces are excellent for system scripting and automation of repetitive tasks through batch files and/or makefiles. DOS only consists of a command line interface upon startup, where it awaits commands such as ‘dir’ to list the contents of a folder.

    In contrast, a graphical user interface (GUI, pronounced gooey) is a visual user interface that allows users to interact with a computer system and its devices through symbolic icons and metaphorical indicators, such as menus, buttons, mouse pointers and more. Graphical user interfaces are everywhere nowadays. Modern OSes such as Windows, MacOS, and Linux consist of a graphical user interface upon startup with your desktop. The mobile phones in our pockets have a graphical user interface that allow us to open applications by tapping their visual icons. In fact, modern systems even have a “command prompt” or “terminal” program that is a command line interface on top of the graphical user interface if you ever wanted to interact with the system at a lower level.

MS-DOS Command Line Interface upon startup

Windows 95 Graphical User Interface (other old school GUIs in the attached link)

Up next: A Brief History of DOS and its Variants

"Hello, DOS!"

Hello, World!

I am thrilled to announce that I have begun a journey to learn and document 16-bit DOS VGA graphics programming based on the Intel 8086 and 80x86 processors.

As I learn along the way, I will be posting DOS graphics programming notes and detailed diagrams on my blog for you all to utilize when crafting your own retro video games. Over time, I also will be creating and selling my own unique retro video game development merchandise.

Tag along on my journey as I explore and discuss the applications, tools, and programming involved with DOS video game development.

Welcome aboard, DOS!

New Year, New Me!

Happy New Year Everyone!

It has been a very long time since I’ve posted anything to my blog. The past few years have honestly been super busy for me with projects and career development after graduating college!

Therefore, as you may tell already, my website is a little bit outdated and needs some clean up. I definitely need to update My Work with a bunch of newer projects I’ve worked on. My GoFundMe donation page has been inactive for about a year now too, so that link needs fixing. I will be doing maintenance work on these over the next few weeks.

Major Updates and Upcoming Plans

I have spent a lot of time thinking about different directions I’d like to go with my game development projects.

I have a bunch of exciting plans for 2023 and the near future:

  • I created a Buy Me A Coffee instead of a GoFundMe for quick donations! This is in case you’d like to support me, my blog posts, and my upcoming game development projects! Follow me at buymeacoffee.com/aaronmh0305

  • I decided I’m going to make DOS games this year to better understand retro homebrew game development and how old hardware works! Because of this, I will definitely be posting to my blog about DOS with some of my own diagrams I’ve created over the past few months.

That’s all I have for now! I wish everyone the best year possible!

Stay tuned because way more game development content is on the way, especially if you are interested in old video game consoles!

Microsoft Excel 95 “The Hall of Tortured Souls” Easter Egg

As I was working the final few days at my internship with JPMorgan Chase, one of my coworkers mentioned to me that I never showed him my game X-Squadron that I mentioned to him at the beginning of my internship. I immediately sent him a link to the game when he asked me:

“What interests you about gaming?”

I explained to him that I’ve always been fascinated with the history of video games and graphics and the way it currently is headed, particularly since the 1990s. I always have felt that the past has a lot to offer in terms of creativity and inspiration for next generation video game developers, especially since those days of game development involved much more hand-crafted code bases rather than preexisting engines like Unity and Unreal today.

When I mentioned 1990s games, my coworker asked me if I ever heard of the Microsoft Excel 95 hidden raycaster game called The Hall of Tortured Souls, which was a way for the developers to express appreciation for all their hard work on that advanced piece of software at the time. I found a video of this game on YouTube and thought it was super interesting, so I have attached it below.

For anyone who loves the classic game DOOM from 1993, check out this neat easter egg! Maybe this will even inspire some of your future software applications to have simple games built-in.

As always, I want to say: Happy Coding!

News: My 2-Year Anniversary of Game Programming and Project Updates

Hello everyone,

This summer I am excited to announce I have finally been working on building my very own Java 2.5D Raycaster game engine with my friend Steven Bajmakovich. I can’t believe it has been two years since I began my game development journey with Steven, where we developed our very first game called X-Squadron from the ground up using the Unity game engine. I’m also super thrilled to announce that we will be releasing the updated X-Squadron game at the end of this summer with a whole new mission mode filled with waves of enemies and bosses! There will also be an information log in game to learn about the enemies and the lore behind the x-squadron team! The art has recently been vastly updated and greatly improved! With these things in mind, I’d like to post two very engaging videos about building a 2.5D Raycaster game engine. Many of the games from the 1990s such as Wolfenstein 3D, Doom, Duke Nukem 3D, and Elder Scrolls Arena, have been created with a Raycaster game engine.

Check out these videos! I’ll keep you guys posted on more updates as I go along. Plus, I will be updating my blog with new projects I’ve worked on in the past recently. I’ve done a lot of neat programs within the past year and I’d be happy to share these with all of you in the upcoming weeks.

The Great Minds in STEM Conference in Orlando

I am honored to have received the prestigious Intel Corporation Great Minds in STEM Scholarship recently. As a GMiS Scholar, I had the opportunity to attend the Great Minds in STEM conference in Orlando, Florida this week. The conference was filled with networking opportunities, informative career presentations, career fairs and recognition events for outstanding STEM achievers from across the country. I would highly recommend attending this conference for STEM students who are seeking insights on how to begin their careers and who enjoy meeting fellow STEM enthusiasts. Now I’m heading back home and back to the books at the University of Wisconsin!

PerBlue - Thanks for a Great Summer Internship!

I spent this summer working at PerBlue, an independent mobile gaming studio based in Madison, Wisconsin that makes RPG and strategy games played by millions of people around the world. As a Game Engine Developer Intern, I worked on the engine team and programmed battle sequences for several characters in the Disney Heroes game, which put my math, physics and programming skills to work! The experience of being part of an Agile Software Development Team at such a progressive company was invaluable. As an indie game developer myself, it was fun to work in a field that I find fascinating for the summer. Thank you to everyone on the PerBlue team for making my intern experience so great. I miss working with you and wish all of you the best!

PerBlue 2019.jpg

Die Flucht - One of my Favorite Animations

I’ve always been a fan of animation systems and how they work underneath the surface. Because of this, I plan on writing about Animation systems in the near future, perhaps after discussing some graph-based AI. This is by far my favorite short animation and was made by Carter Boyce, a student from DePaul University in Chicago.

Next Topic: Graph-Based Data Structures and Artificial Intelligence

For the next chapter of AI, I’m going to begin talking about different types graph data structures and their uses in video games. It has been a while, I know! I’ve been busy and distracted by cool graphics programming, which may be a subject I write about in the future!

Today I just briefly want to explain what I will be discussing and the concepts behind them.

In terms of Artificially Intelligent agents in video games, graph data structures are very useful for:

  • Navigation around an environment

  • State-driven behaviors ( i.e. Finite State Machines )

  • Logical, decision-making in strategy games based on prediction

  • Shortest-path calculations

  • Searching

These are just a few to keep in mind and this is NOT even close to being an exhaustive list. There are many applications where graph data structures can be useful.

I will discuss the graph data structure next! But in case you’re interested, here is a brief overview of graph data structures and game development in a video!

Artificial Intelligence: Behavior Trees Part 5

To finish off our brief discussion on Behavior Trees, I want to leave you guys off with a couple of videos that demonstrate the usage of this data structure in video games! Here are some examples of games/software that utilize Behavior Trees for the AI interaction.

  • Project Zomboid - Chris Simpson, the blogger I referenced for our discussion on Behavior Trees, actually worked on the game Project Zomboid. It is a zombie survival, role-playing game for PC, Mac and Linux that utilizes Behavior Trees for the zombie and survivor AI. Chris Simpson also stated that Project Zomboid was made with the Java programming language. You can build your own safehouse and scavenge the apocalyptic wasteland for supplies like food and weapons. You can even team up with your friends to try and survive together! The game contains a lot of realistic survival elements. It also has modding support. If you like zombie survival video games, and you’re curious to see how the behavior trees work in the actual game, you can buy the game on Steam for $15. Or you could simply watch a video on the game, like the one I posted below!

  • The Sims - The Sims games are real-life simulation games that focus on the everyday life of people, where the player controls artificial human beings to perform tasks such as cooking, bathing, going to work, exercising, you name it! The Sims games have some of the best examples of AI with behavior trees due to the fact that the sims can interact with tons of everyday items. For example, in one of the videos below, you can see a sim cooking a meal on the kitchen counter. This describes how that sim utilizes a sequence node to walk to the fridge, grab some materials to make the food item, walk to the counter, chop up the food, cook it, serve it at the table, and finally begin eating the food! Also, in the Sims, the player can interrupt the current sim’s actions if he/she wants to. In terms of our last example, this means the player can send a ‘failure’ status message up to that food sequence node that is currently executing, which ultimately causes the sim to stop what he/she is doing and put the food somewhere. When the player isn’t controlling the behaviors of a certain sim (i.e. when the player is playing as a different sim or is away from the controller), the sims automatically control their own behaviors depending on their daily needs, such as their thirst, their hunger, their bladder, their tiredness, their hygiene, and so on. These sims utilize behavior trees to maintain their wellbeing autonomously! Check out the sims if you haven’t before.

  • Unreal Engine 4 - Unreal Engine has a built-in node editor for Artificial Intelligence that utilizes behavior trees. The user of the engine can actually define some very complicated and rigorous AI that is suited to his/her own needs. This feature is what game developers use to construct video game AI without worrying about having to create the behavior tree structure completely from scratch! This is very powerful! Check out the videos below to see how they work in Unreal Engine.

Artificial Intelligence: Behavior Trees Part 4

Types of Decorator Nodes

Decorator nodes only have exactly one child node, and their purpose is to somehow alter the functionality of that individual child node through some sort of operation. You can think of Decorators as “manipulators”, since they are ultimately used to manipulate the return statuses of its only child. Common examples of Decorator nodes are inverting the returned status of its only child node, repeating the processing of the child node, or terminating its child node.

  • Inverter - Inverter Decorator nodes are used to negate the result of their child node’s returned status In other words, if the Inverter’s only child node returns “Success”, then the Inverter sends “Failure” back up to its parent. If the Inverter’s only child node returns “Failure”, then the Inverter sends “Success” back up to its parent. Inverters are often used in conditional tests.

  • Succeeder - Succeeder Decorator nodes ALWAYS return “Success” back to its parent, regardless of the returned status of the Succeeder’s child. This is extremely useful in cases where you anticipate “Failure” in some branch of the tree and when you don’t want to abandon processing of a sequence that that branch contains. Fun Fact: There is no need to create an opposite “Failer” Decorator node because you can easily attach an Inverter as the parent to the Succeeder to always guarantee “Failure” is returned back up the tree!

  • Repeater -A Repeater Decorator node reprocess its child node each time the child node returns a status back up. You can also use Repeaters to reprocess the child node a fixed number of times too, like a loop. Repeater Decorator nodes are commonly used towards the top of Behavior Tree to allow for the tree to run continuously.

  • Repeat Until Fail - A “Repeat Until Fail” Decorator node acts in the same way as the Repeater. It reprocesses its child node each time UNTIL the child node returns a “Failure” status. Once the “Repeat Until Fail” node receives the “Failure” status message from its child, it returns “Success” back up the tree.