Saturday, August 31, 2013

Switching to 6502

Mineshaft was written mainly in C. I was comfortable with C since before, and getting from zero to Mineshaft took about a week and a half. Shiru, a member of the nesdev community, has a great library available free for anyone to download on his page.

On my next game, I also started in C. As you may or may not know, C is what is called a high level language. You write code that is easy to understand for a human which then gets translated to machine code by a compiler. This conversion produces code that works, but the code can get bigger and slower than you might want. On a modern platform such as a normal Intel/AMD x86, the compilers will most of the time be able to produce better code than a human. But on such a limited CPU as the 6502, a C compiler will have a bit more trouble. Writing assembly code can save both CPU cycles and code size even if you are not a master sorcerer of assembly.

The result of writing the new game in C was that I spent more time optimizing for speed than I spent on developing game features. I had set a goal for myself that I wanted 6 enemies plus 2 players moving about on a level in my game, while still maintaining 60 fps. When I had the game running with all zombies moving about with simple AI, music playing and collisions happening, I was using almost the full frame time for calculations. There was no more time left to do anything else. It would either have to be a very simple game in terms of mechanics, or I would have to sacrifice the 60 fps. All the opimizations also made the code a mess of hacks and it was becoming hard to read.

When starting over this time around, I had started looking at writing the game in 6502 assembly directly. It seemed like a massive undertaking at first to learn a whole new way of programming. I had never really done any assembly programming before, except going through the excellent Nerdy Nights tutorials over at Nintendoage.com, and making a few small additions to the scrolling in Mineshaft. Would I be able to learn 6502 assembly well enough to make a game in a reasonable time frame?

Arnold can LDA and and stuff

I started messing about and doing some tests of stuff like moving and animating metasprites. After a few days of trinkering I began to get an OK understanding of the way things worked, even though I still messed up simple stuff and spent hours debugging stupid newbie mistakes. Pretty soon I felt comfortable that I would be able to write the game, or at least the low level engine, in assembly.

The results so far are encouraging. I am still very much a newbie at assembly, and the code I produce is most likely shit compared to the greats, but so far things are looking good on the performance side. I won't give away too many details, but 6 enemies are now not an issue.

Friday, August 30, 2013

It's a start

Hi all.

I am a guy born in the early 80s. When I was a kid I never played sports, or rarely even played outside (at least if I could help it). What I did was play video games. What got me started was, like most people my age, getting a Nintendo Entertainment System for christmas. Ever since I played that first video game I was amazed at the magic at work. I wanted to know how they worked behind the scenes, and I wanted to make my own.

NES front loader

Since making games for the NES was pretty much out of the question, and since I had figured out it was basically some type of computer inside, I got really into computers. I bought my first computer probably around age 7 or 8 with my savings. It was a used Atari 520ST.

On the Atari was an application called STOS Basic. This was my first meeting with any form of programming. My friend had the manual to STOS lying around, and it had instructions in it on how to make your own game. The instructions were in English, and combined with never having programmed anything in my life it was quite hard to understand much more than how to get a picture on the screen. I really wanted to get good at STOS, but my 9 year old mind was just too stupid.

A year or two passes and my mom buys our first PC. Her sisters' work place was switching to newer machines and the 386s they had were sold off for cheap. With this PC came something called QBasic. QBasic was my second go at making something more like a game. I did text adventures and simpler pong type games. But I was still too stupid to learn anything cool. Remember, there was no googling for tutorials in those days.

In 1994, when I was 11 years old, an amazing piece of software comes along; it was called Klik & Play. This applicationl let anyone, even a stupid kid like me, make their own game without any programming involved. I was finally able to be a little creative without thinking too much about the technical difficulties. I could just imagine a game idea, draw a few ugly sprites and backgrounds, and make stuff.

Klik & Play game making software 1994

I have lots of fond memories of using the Klik line of software, all the way up to the more modern versions of it called Multimedia Fusion. But as I grew older, I noticed that I was not as stupid as I used to be anymore. I began tinkering with programming once again. This time around I was about 15 years old, the internet had come along, and my English was good enough that I could read books, articles and forums and not have to worry about the language.

Programming was more fun now. I didn't get stuck on drawing simple shapes or text. I was experimenting with making stuff that actually resembled games. I never made anything spectacular, but I finally was starting to understand how games fit together. My interest for programming continued, but eventually turned into developing other stuff than games.

When I started college I was mainly interested in the technology behind video and audio processing. So, I spent lots of years at university doing that stuff. But I kept tinkering with games. By now, games were filled with 3D worlds spanning gigabytes of data and content. Making a game like that had become an impossibility for some loner like me. But I kept looking back at my first Nintendo with great nostalgic appreciation of the lovely chip tunes and pixel graphics.

One day, I stumbled upon nesdev.com. A forum full of tinkerers like me, but it turns out they actually had figured out how to create real actual NES games. I was instantly hooked and started reading through all the material the community of homebrew developers had managed to gather over the years. Some of these guys are serious geniuses. It turns out that making a Nintendo game is not magic. You can actually make your own games for the NES quite easily these days. Emulators, graphics editors, compilers, assemblers and flash carts have made my childhood dream a reality.

I immediately started to port an old flash game I had made to the NES. It was itself based on a great little game I had played on an old mac in High School. It was a simple infinite arcade game where the goal is to survive as long as you can to get a high score. It was a learning experience, and a small enough project that I knew I could finish and release it. The game is called Mineshaft, and you can download a ROM here.

NES Rom download available

When I was done with Mineshaft, I started on a new project. I wanted to do something bigger. I had a game I had started on in XNA which I thought would fit the NES quite well. I already had some graphics ready, and a nice game idea. This was in early 2012. I had just been promoted at work, and my own business on the side was picking up. I got a little bit on the way, but eventually real life was too much. Development slowed to a crawl, and whenever I had time over to work on the game I spent more time figuring out where I was and what the hell my code did than moving forward. Here is a small video showing a bit of early code:



This year, life is more stable. I have my own place, I don't have to commute, and I don't spend as much time on my side business. So, I decided to start over, rewrite the game again from scratch. On this blog I will try and keep anyone interested updated on the project. I might write about other cool stuff I come across or tinker with, but I hope to keep most posts about my foray into NES development.

Hope you enjoy my stuff.
/Nioreh

TL;DR
I will write about making NES games