The Early Days (1979-1984)
My first exposure to video games was back when the local 7-Eleven cleared out a corner of space near the front door, and filled with a shiny new Space Invaders. I thought that was pretty neat, but didn't really get into it until they put an Asteroids next to it. I quickly became an addict. Over the course of the next several years, the 7-Eleven faithfully cycled in more and more new games, from Moon Patrol to my all-time favorite Mappy. It wasn't long before I decided that I just had to find a way to play video games in my own home.
The first (and only) video game console I ever owned was a nice new Mattel Intellivision, shortly after it was released. I played that machine relentlessly, so much that we eventually had to replace it with a new one a couple years later. I even managed to get my dad hooked on great action titles like Astro Smash and Space Armada. And we would laugh ourselves to tears playing Hockey, just running around and checking each other for no good reason.
Of course, every young video game addict's dream at the time was to make their own video game, and I was no exception. But to do that, I knew that I needed a computer....
I can't remember exactly when we got our first computer, but it was when I was around 10 or 11. My best friend's dad had an Apple II+, and he was writing video games on it. Worse, my best friend was learning Apple BASIC and 6502 assembly and writing his own games! Talk about serious computer envy! I begged and pleaded with my father (who was himself a mainframe software engineer — think COBOL and RPG/1) to get a personal computer so that I could learn to program it and make my own video games. Then one Christmas (I think it was Christmas 1980) he did it — he went out and bought a....
....a Heathkit H-89?! What the heck kind of computer is that? I had been thinking more along the lines of an Apple II like my friend had, or maybe an Atari 400. But instead here was this computer that wasn't even put together yet! Furthermore, my dad was a software engineer — not exactly the kind of guy who wields a soldering iron all the time. But dad had heard that this kind of computer was a good one, and that building it didn't require an EE degree. Plus, he might be able to use it eventually to log into the mainframe at work. And, it saved us some money, which was kind of tight at the time.
So we spent a good month or two putting it together in our basement nights and weekends. It was pretty interesting stuff, but way over my head at the time. I just wanted a computer so I could write games! So what, exactly, does an H-89 consist of? Well, it had a 2MHz Z80 CPU, 48K of RAM, and a single 100K 5.25" floppy drive. It ran CP/M. But what really let me down, however, was the complete lack of a graphics mode. All it had was a text mode with a few pre-loaded graphics shapes in the upper ASCII part of the character set. So how in the world was I going to learn to write videogames on a system that had no graphics mode?!
Well, the short answer is: I tried my hardest. I started with BASIC, typing in programs from those old computer games books that printed listings of large BASIC programs you could type into your system. For some reason, I picked it up pretty quickly. But already I knew that real video games were written in assembly language! So it didn't take long before I bought a book on 8080 assembly language and started pushing forward. To this day, I can't really remember what I ended up writing, but I'm sure I thought it was the coolest thing ever at the time.
The PCjr Era (1984-1989)
I think my dad knew I was never really satisfied with the Heathkit. I could tell that what he really wanted was an IBM PC. Of course, what I wanted was one of those new Commodore 64's, which ran all the best videogames! In the end, he compromised, sold the H-89, and picked up an IBM PCjr (this was in the days after IBM had replaced the chicklet keyboard with something moderately usable). Finally, I had a real graphics mode, and could get serious about writing games.
I produced a number of shareware and freeware games on the PCjr, all written in 100% assembly language. I doubt any of them survived to the present day. There was Rescue, a game where you had to rescue little creatures that were being eaten by marauding monsters. I even designed all the graphics myself (given a 4 or 16 color 320x200 video mode, even pathetic non-artists like myself could design graphic!) The cool thing about Rescue was the scoring: you didn't have to rescue all of the creatures, you just had to save more than the monsters ate. At higher levels the monsters would lay eggs, spawning new monsters. In the later levels, you could have half a dozen monsters running around. I was always pretty proud of that one.
Another early game I did was Riské, a version of the board game Risk. My friend and I took graph paper and mapped out the Risk game board into pixels, then we painstakingly entered in all that data. I wrote a scanline compressor and code to draw each country either as just an outline, or filled with a particular color pattern. I even wrote a half-decent computer AI for it, again all in 8086 assembly. The game itself was pretty fun as a distraction, but I don't think it was really all that popular.
Probably the best story from my PCjr days was my printer. We had splurged and picked up a really nice Okidata dot matrix printer to go with the PCjr. It was one of those old models that used a modified typewriter ribbon, so when the ribbon was dead, you needed to hook up the new one by carefully threading it through the print head. One day I was doing this and got too impatient. I ended up bending the pins on the print head, so that everything came out jaggy! To solve this problem, I figured out how the pins were offset, and wrote code to render everything in graphics mode, drawing the text using a font I developed that compensated for the jaggy pins. Then I incorporated that into an INT 17 patch so that any DOS program that printed would automatically get my jaggy-free text!
I also wrote a number of other utilities, including a TSR utility similar to Borland's Sidekick, which I submitted to COMPUTE!'s PC and PCjr magazine (it wasn't accepted). I was also a big AD&D fan at the time, so I had a lot of utilities related to that (random number generators, character sheet printers, etc.) For those types of utilities, I learned Pascal using Borland's Turbo Pascal.
One of the major problems with the PCjr was compatibility with the original IBM PC. In order to reduce the cost of the machine, IBM removed some hardware that generally wasn't vital for day-to-day operation of the system. One of these pieces of hardware was the DMA controller. This meant that when the PCjr read data off the floppy drive, it sucked it down one byte at a time through an I/O port, instead of letting the DMA hardware transfer the data asynchronously. The only problem with that was that a lot of advanced game copy protection involved talking directly to the floppy controller and using the DMA controller to receive the data. Since there was no DMA controller to talk to, the copy protection failed, and a lot of games that should have worked just fine on the PCjr didn't. At least until I got my hands on them. Thanks to good old debug and a knowledge of the low-level systems on the machine, I probably hacked half a dozen games I had bought into submission, rather than taking them back to the store.
The Macintosh Era (1991-1995)
The PCjr lasted me through college, at which point I moved from Toledo to Chicago to attend the University of Chicago. I was not equipped with a computer, but rather had received a dedicated word processor as a graduation gift. Once there, however, my eyes were opened to the Mac world. U of C was a heavily Mac-oriented campus at the time. Prior to this, my only experience with a Mac was ooing and aahing at the fine DPI on the original Mac Plus at the local Abacus One computer store.
In the intervening years, Macs had gotten cooler. They now had 256 color displays standard, and looked way better than PCs of the era. They also had support for odd monitor sizes, like the portrait display that a girl down the hall in my freshman dorm had. This girl, whose name happened to be Vera, also had a Mac IIcx running at a blazing 16MHz, with 8MB of RAM and an 80MB hard drive! I couldn't believe it! However, I was here to learn physics, and decided not to get involved with programming so that I could focus on my studies.
So I held out for 2 years. I didn't do any programming, took no computer courses, and fell in love with the girl down the hall. Since we spent a lot of time together, I ended up using her Mac for a lot of non-programming tasks: getting familiar with the internet, playing games, etc. Then she informed me that she was going to study in Paris for a year. I was crushed. We had been joined at the hip since the first few weeks of freshman year, and now we were going to be apart for a year! What was I going to do with myself?!
It was most likely the need to distract myself from the fact that she was gone that led to my teaching myself Macintosh programming on her computer that year (which she conveniently left behind for me to care for). I had never programmed in C before, but it wasn't too hard to pick up after using Turbo Pascal on my PCjr and Modula-2 on the Amiga in my AP Computer Science class in high school. Also, at the time, Apple had just introduced QuickTime. I thought that sounded pretty cool, and started checking it out.
One of the first things I found out about QuickTime is that it had a built-in JPEG decompressor. I thought was so cool, I just had to write a program to display JPEG files using it. This was literally one of my first Mac programs. I even put it up on the internet when I was done. And then a strange thing happened: I was in the right place at the right time. The internet was really starting to take off. NCSA Mosaic had only recently been released and WWW pages were just starting to appear. The ability to view images was quickly becoming very important, and my program — which I dubbed JPEGView was there to fill the void.
The first version of JPEGView was released in 1991 as "postcardware". I simply asked people to send me a postcard if they liked the software. By the time I released the last version in 1995, I had received somewhere between 5,000 and 10,000 postcards (see the picture to the left)! I was starting to offer site licenses (a lot of businesses had problems with it being free software, go figure) and sell nice bound manuals to users who registered. I probably could have made a lot of money off of the product if I had really been greedy. But I was honestly far happier to see it being used all over the place. Plus, in 1995 I landed my dream job.
Having written JPEGView managed to help me land my first "real" job after I graduated: Lead Macintosh Programmer at Cornell University Medical College. Now before I talk about that, let me set a few things straight: first, despite any reports to the contrary, I was never a student at CUMC. I think you would need a loaded gun to force me to attend medical school — no thank you! And second, CUMC is located in New York City (70th and York Ave.) and not in Ithaca, as most people assume!
While I was at CUMC I worked on several Macintosh-based technologies centered around video conferencing with CU-SeeMe, which apparently has gone on to become a big deal in video conferencing (just found out!) But the concept we were working on was neat: to provide plug-ins for CU-SeeMe that would allow two doctors to exchange slides remotely and consult over them. This would allow a general practitioner in a small town to consult with a far-away specialist over the internet. While at CUMC, I also had the opportunity to write Newton software, which was probably the most miserable programming experience of my life!
In 1994, Apple released their first PowerPC-based Macs. One of the coolest parts about the new Macs was that they still ran most of the old 68000 code by emulating it. In fact, most of the operating system was still written in 68000 code! Unfortunately, so were a lot of other programs, including games. Around that time, LucasArts Entertainment Company released the game Rebel Assault. Not only that, but they released a Mac port shortly thereafter. Sadly, it was all written in 68000 code, and therefore ran emulated on my nice new Power Macintosh 6100/60.
Now, back in the PCjr days I considered myself a pretty accomplished hacker. A lot of games were written for the PC but nobody seemed to care about the PCjr, so I learned to hack around the issues. I thought to myself, surely I can figure out a way to hack in some PowerPC optimizations into this code. Sure enough, after poking around in the 68000 code, I found huge unrolled blitter loops, all in 68000 assembly. I had been learning a lot about how the Mac's "mixed-mode" architecture worked, and knew that if I rewrote the blitters in PowerPC assembly, I could poke them into the code. Turns out it wasn't all that hard, and it made a huge difference!
I was so excited by this that I immediately whipped together a patching utility and put it out on the internet for all to share. Apparently, it didn't take too long for LucasArts to learn of its existence. Perhaps putting it up on the net wasn't such a good idea! I learned later that they were trying to decide whether to sue me or hire me. Fortunately, their lead Mac porter was interested in moving on to bigger and better things, and they were looking for a replacement. Soon I was flying out to San Rafael, California and interviewing for my dream job as a games programmer.
An amusing side story: at the time Vera and I (yes, we were married May 28, 1994) were living in New York City. Before then, we had lived as students in Chicago. So, for the past 5 years or so, we had not needed to drive a car at all. In fact, neither of us owned one. But on my trip out, I had to fly into San Francisco Airport, drive through the city, across the Golden Gate Bridge, and into Marin County. Well, with the fog and everything, I almost made a wrong turn on the highway, veered off at the last second, and impaled my rental car on a sawed-off signpost on the "V" between the highway and the exit ramp. I thought things were okay until I noticed the engine start to overheat. I pulled into a gas station and found that I had ruptured something underneath the car! I managed to score a replacement, but then succeeded in locking the keys in that car just one hour before the interview! With all the bad karma I had getting there, I was due for a good interview!
The LucasArts Era (1995-1998)
So I got the job, and we moved out to San Francisco between Christmas 1994 and New Year's 1995. I spent the first year and a half porting as much stuff from DOS/Windows to the Macintosh as I could. My first two projects were Dark Forces and Full Throttle. Dark Forces in particular was a neat project because Mac users were demanding that we support rendering at 640x480 in addition to the lower PC resolution of 320x200. At the time I didn't know much about 3D games at all, and it turned out that a lot of the fixed-point math was carefully designed to barely not overflow when doing computations for a 320-pixel wide screen. In order to fix this, I had to reduce the precision of some of the calculations, but then the reduced precision led to other problems! Eventually I got everything straightened around, and released the Mac port in June 1995.
I then went back and ported two games that had missed the Mac before I had shown up: Day of the Tentacle and Sam & Max Hit the Road, which became my two favorite LucasArts adventures of all time. Unfortunately, no one had planned on me going back to port those two games (I did it in my "spare time" between projects), so I had a bit of a struggle trying to convince the powers that be that they should actually sell them. It took some hard lobbying, but eventually they decided to go for it.
An amusing aspect of the Day of the Tentacle port is that the PC version had an easter egg where you could go back and play the very first LucasArts adventure game Maniac Mansion. To do this, the game would just launch a DOS shell running the original game. Of course, Maniac Mansion had never been ported to the Mac before, so everyone assumed we wouldn't be including it. But I would have none of that — Mac users deserved the easter egg as well! So I went back to the old 16-bit source code and converted it to a library that compiled in a 32-bit world. I simulated 4-color CGA video modes for the graphics. Furthermore, I ended up writing my first emulator: a crude AY-8910 to simulate the sound chip that was in the Tandy 1000 using the Mac's simple DAC sound playback. I happened to know how that chip worked due to my past experience with the PCjr, which also had one.
From there, I went into porting overdrive. I had been working hard to make sure all the games in development were cross-platform aware, and things were getting easier for me all the time. I ported The Dig and Rebel Assault II next, and then did a port of the strange but cool puzzle game Indiana Jones and his Desktop Adventures. After that came the tongue-in-cheek sim game Afterlife and the kid's game Mortimer and the Riddles of the Medallion. Unfortunately, the latter two titles were the first and last titles we ever shipped simultaneously on Windows and on the Mac. Since they weren't very successful, the higher-ups decided to pull the plug on Mac development. Which is really too bad because I had Mac ports of three big upcoming titles already up and running: Outlaws, Jedi Knight, and Shadows of the Empire.
So what's a poor Mac programmer to do, once his company decides not to develop any more Mac titles? Learn Windows programming, of course. I was quickly signed up to help the Outlaws team finish up their game. I ended up writing the weapon and inventory systems, redesigned the networking, and co-developed the 3D plug-in system we eventually shipped in a later revision of the game. I have to say that I had a really good time working on Outlaws, and was always rather disappointed that it didn't do better. I still go back and play it sometimes (it runs quite nicely under Windows 2000) — it's the only first-person shooter I can really get into.
Once Outlaws shipped, I went on to help the Jedi Knight team finish up their game (mainly finishing off the user interface), and then became lead programmer for the add-on pack Mysteries of the Sith. The problem was, I honestly never really cared that much for 3D games. Sure, they were nice technology displays, and pretty to look at, but I realized that I ended up in the gaming industry 10-15 years too late. I wanted to work on games where 1 or 2 programmers in a garage wrote something really innovative, and instead I was developing yet another 3D first-person action game. It just didn't excite me.
What this meant was that I started looking for ways to get involved with the type of games I was actually interested in. It was during my last year at LucasArts that I discovered emulation, and found a way to reconnect with the games of my youth. You can follow that thread on my MAME Memories Page. However, my interest in emulation, and my work on MacMAME eventually caught the eye of one of the programmers at Connectix, who were well-known in the Mac community for Virtual PC, a commerical emulator that allowed you to run the Windows operating system and applications on your PowerPC Macintosh. They offered me a chance to work on Virtual PC, and I saw that as my ticket out of the modern games industry that I had grown to loathe.
The Connectix Era (1998-2003)
My first task at Connectix was to help them finish up Virtual PC 3.0, which was just about to ship by the time I got there. Coming up to speed on a project that huge takes a lot of time, so it was a bit of a struggle to make much of a contribution that late in the project. At the same time, the engineers were all talking about what other new and exciting projects might be possible with emulation. I brought up the fact that there were a couple of freeware Sony Playstation emulators currently in development, and it would be a very cool project to try and write a commercial-quality emulation for it on the Macintosh.
Of course, everyone agreed that this would be a neat project, but there were a lot of concerns about it as well. I can't delve into the fine details of the discussions, but I decided that it couldn't hurt to start investigating the feasibility of writing an emulator targeted toward the new (at the time) iMac. So I spent time writing an R3000 interpreter and disassembler, and started writing emulations of the support chips needed to run the system. Within about a month or so, we had the opening logo appearing on the screen.
Performance was, of course, an issue. Running an interpreter for a 33MHz RISC chip is not in any way fast. Fortunately, we had one of the foremost experts in dynamic recompilation engines working for us: Eric Traut, the man who wrote the second generation recompiling 680x0 emulator for the Power Macintosh while he was at Apple, and who did a lot of the work for the 80x86 emulator in Virtual PC. Eric set to work and fairly quickly came up with a nice recompiling CPU core for our Playstation emulator, which was enough to get us in the ballpark of running in real time.
One of the hardest parts of the project turned out to be reverse-engineering the CD-ROM controller, but with the help of a gutted Playstation and a logic analyzer, we eventually managed to work it out enough to get our first game up and running: Ridge Racer. With a little more work, we had Crash Bandicoot up and running, and at that point we had to ask management: do you want us to keep working on this? Is there any chance we could actually make this project work, even without Sony's blessing? Fortunately, the answer was pretty much: "Keep going until we tell you to stop."
So we kept going. We got more and more games up and running, fixed tons of problems in the early CD-ROM and graphics implementations, reverse-engineered the onboard JPEG decompressor, got sound up and running, figured out the controllers, and optimized the heck out of everything. It was, all told, only 6 months between when I started writing the R3000 interpreter and when we first shipped Connectix Virtual Game Station, but it seemed as if years had passed.
Of course, as was widely reported, we were sued by Sony Computer Entertainment of America, and the legal tussle ensued. Although we won a number of battles, we lost the most important one: SCEA was granted a preliminary injunction against the product, which meant that we had to stop selling it shortly after we released it — and before I could finish up the Windows port. Unfortunately, this put the brakes on all our momentum, and generally hurt our ability to sell the product even after the injunction was overturned on appeal. Plus, since we didn't know whether or not the injunction was going to be overturned, it wasn't in our best interests to devote company resources toward improving the product. So it languished for several months, and a lot of features we wanted to put into it never made it. Eventually, we did ship the Windows version and a few updates, but by then the excitement and novelty of the product had long since worn off.
In the end, we managed to settle things out of court. Overall, despite stress of legal proceedings, I remain very proud of CVGS, and happy that we did it. Getting a full software emulation of the entire 33MHz system — including a software-only 3D graphics engine — to run acceptably on a 233MHz PowerPC was a pretty incredible task. Developing the product in complete secrecy for seven months was pretty intense. Plus, I got my first patent as a result.
After development on CVGS stopped, I was tapped to head up a new project. This turned out to be even more challenging than CVGS: it was essentially a port of Virtual PC to run on Intel processors. A lot of the code from the Macintosh version of Virtual PC was available to emulate the devices in the system (e.g., VGA controller, DMA, keyboard, mouse, SoundBlaster, etc.), but the low-level emulation of, say, a Pentium running on a Pentium is not as easy as it might sound at first. And of course, that was the biggest part of Virtual PC that would need to be rewritten to make it run hosted on an x86 machine.
(One side effect of working on Virtual PC for Windows is that I finally made the switch from Mac programming to Windows programming. Even when I was working on Windows games at LucasArts, I still had a Mac at home that I would use for MAME development. But in the middle of 2000, I finally broke down and bought a nice, new loaded Dell. I was tired of working against the MHz curve, and tired of Steve Jobs' insistence that as long as the OS looked pretty, it didn't matter how badly it perfomed. OS X was not looking promising at the time (and is still only vaguely appealing).)
The first version of Virtual PC for Windows was released in early 2001. It was a long, slow road toward success with this product, but by mid-2002, we were starting to get some big customers. At the time there was some talk of either going public or trying to find someone who would be interested in buying the product and/or investing in Connectix. Rumors abounded and nothing really firm came out until the end of the year 2002, when a number of us who worked on Virtual PC were flown up to Redmond, WA to interview/talk with Microsoft. We were put up in a nice hotel, introduced to Microsoft culture, and shown around the Puget Sound area. Honestly, for me and Vera, it seemed like a really nice fit, in spite of the fact that we would be leaving behind 8 years of friends and connections in the Bay Area. Plus, from a technology point of view, many of us had long ago decided that Microsoft was really the logical place for virtual machine technology. So, in Feburary 2003, it was formally announced that Microsoft was buying Virtual PC from Connectix and hiring away most everyone who developed and marketed the program on both Windows and Macintosh platforms.
The Microsoft Era (2003-present)
More to come as history unfolds! :-)