If any of you are going to read my comment, don't take offense to it. In other words... "trigger warning".
so how where games programmed / build before 1993?
"Games were written by programmers who actually knew how to code their way out of a wet paper bag" was the first thing that came to my mind, as only a weak programmer would completely rely on an pre existing engine. What if Unity and UE4 suddenly disappeared? Many of you would simply be f**ked.
But to be more on topic, this is my take on the question:
Languages:
But frankly, in the early days, games were often either coded in pure C or a mix of it with some assembly. Console games before then, such as the NES defintely used assembly. Using C for console games started becoming more common around the PSX era. Even then, knowledge of assembly for the specific processor of that console was required as certain routines could only be done in assembly, or just weren't practical to be done in C. Same for PC (DOS) games back in that era. To initialize ModeX or whatever screen resolution you had in mind, you would use a DOS interrupt service with assembly. Other routines, such as detecting a vertical blank/sync, were also done in assembly or by accessing VGA registers directly. When it came to PC games, the drawing routines were often written in software. You would either call the DOS interrupt service to put pixels on the screen, or you'd have to write to video memory (framebuffer) directly. Obviously, assembly drawing routines were faster than straight C implementations, so it was done that way for most 2D/3D games.
Platforms:
Every platform was different, and often didn't have much in common. Knowledge of how each platform worked was required to write code for each one. Some with different memory requirements, others with different bus and bandwidth speeds. Lots of platform specific code needed to be written (well, it would be alot to the average indie of today who has never worked outside of Unity and UE4). Debugging it was not quite as easy as it is now either.
Hardware:
Similar to what I said above, but I wanted to expand on it in a different way. Every platform's hardware differences had to be known and taken into consideration before you even dreamed of putting a game on it. On top of that, your code had to be *optimal* too. These days, too many terribly inefficient games written because we have the hardware that can run it. Such crappy code wouldn't do so well on consoles in the 90s. For instance, console resources are *tight*, meaning you need every last byte, and to make it count. Also, you often had a very limited amount of CPU cycles at your disposal. This was often true for PC games as well. Back then, you actually had to consider how much memory your data structures were using.
Another thing to note is that you didn't have drivers for everything. Back then, you had to have register level documentation to program hardware directly, as well as setup the proper interrupt handlers. For gfx, if you had a special video card that supported 3D acceleration, you'd be fortunate to even have an API provided by the vendor. Managing video memory, drawing efficiency, and vsync timing had to be done by you. For audio, you would have to know how to program the audio hardware as well. Streaming audio to a Soundblaster wasn't as easy as using XAudio2 or OpenAL like we have now. Input wasn't exactly hard, but it was often more work to setup. Short story, you had to know your stuff.
Misc:
I repeat, you had to know your s**t. There were no pre-written math libraries (at least, not nearly as many as we had now), and if you wanted something like an MMX accelerated math library, you wrote it yourself. Engines did exist back then, but if you wanted to use some middleware engine, such as the wolfenstein engine by id Software, you'd have to pay up for a license. And no, licenses weren't cheap either.
These days, you can write a game and get away without knowing any of the internal stuff. Some say that's a good thing, I say it isn't to a certain degree. Which reminds me of a somewhat cruel idea for a whiteboard test for a game development job interview. Try asking your candidate what they would do to write a function that blocks the calling thread until vertical blank called "BlockUntilVerticalBlank()" for any platform or API they desire, while giving them [unspoken] bonus points for considering the thread's priority level. Watch the majority of them fail miserably. At one point, this was common knowledge, and anyone who has ever programmed a game would know how to do this for at least one platform. But that's just the era we live in. It kinda reminds me of how the average human in the 1st world wouldn't know how to hunt or grow food if the supermarkets all disappeared. Convenience eventually leads to laziness.
Shogun