Blog

A Splash of Colour

Now that we’ve got the basics out of the way, we can now start diving into something a bit more interesting. It helps at this point if you have basic understanding of the way that the NGPC graphics system works. The screen is divided into three distinct layers like so:

NGPCScreenPlanes

As you can see, the screen basically consists of two tile planes which form the display background, and a sprite layer that then sits on top of this.

Why do we need two tile planes? This is because NGPC tiles (or graphics bitmaps) can only display three colours. Well, four, but one of them will be transparent. By overlaying two planes on top of each other, we can create the illusion of a seven colour graphic.

We can see this in our STARTOVR project if we add a second plane to our Hello World splash screen like so:

void main()

{
   InitNGPC();
   SysSetSystemFont();

   // TODO: add game code - and remove hello world :-)

   ClearScreen(SCR_1_PLANE);
   ClearScreen(SCR_2_PLANE);
   SetBackgroundColour(RGB(0, 0, 15));

   SetPalette(SCR_1_PLANE, 0, 0, 0, 0, RGB(15,0,0));
   SetPalette(SCR_2_PLANE, 0, 0, 0, 0, RGB(0,15,0));
   PrintString(SCR_1_PLANE, 0, 2, 7, "Feels like");
   PrintString(SCR_2_PLANE, 0, 2, 9, "Starting over!");
   PrintString(SCR_1_PLANE, 0, 0, 0, "--------------");
   PrintString(SCR_2_PLANE, 0, 0, 0, "()()()()()()()");

   while(1); // never fall out of main!!!
}

If we compile and run that, we should see those lines of minuses and brackets look a bit like this:

startingoverv2

So, what are you seeing here? Essentially, exactly what we were talking about – the brackets are on Scroll Plane 1, and then the hyphens are on top of that on Scroll Plane 2. The net effect being to create a row of very lo-res TIE fighters.

Before we move on to talking about sprites, it’s worth pausing here and looking at this code in more detail – specifically to discuss palettes. A NGPC palette consists of four colours, typically a transparency/background base colour and three foreground colours. Each plane can support up to 16 individual palettes. Effectively, this means that you can have anything up to 96 colours (plus the background) displayed at any one time, albeit with only 7 colours within a single grid block.

In the example above, we are using two palettes – one per tile plane, both numbered zero.

SetPalette(SCR_1_PLANE, 0, 0, 0, 0, RGB(15,0,0));
SetPalette(SCR_2_PLANE, 0, 0, 0, 0, RGB(0,15,0));

So, when you define a palette, you specify the palette number or ID (I’ve been lazy here and just hard-coded palette 0, in the real world you would probably use a #define constant)  and then four colours. The first colour acts as a transparency against the overall screen background colour, and the other three are the palette foreground colours.

PrintString(), PrintDecimal() and other tile operations then simply define which palette to apply and the colours you choose here are then used. Only the fourth colour is used for PrintString() and PrintDecimal(). The other basic tile operation to keep in mind is PutTile() – this is mainly used to directly put a tile (see what they did there) into a scroll plane rather than indirectly as part of a string or number. This is more useful when we start talking about custom tile sets, but keep it in mind until then…

PutTile(SCR_1_PLANE, Palette, xPos, yPos, TileNumber);
SetBackgroundColour() sets the overall background colour – you’d probably normally use Black (0,0,0) or white (15,15,15) but I thought I’d set it to blue to show the effect. This basically acts as the default transparency colour for all your own graphics.

So, that’s the basics out of the way – you can do quite a lot just with text or block graphics, although the NGPC probably isn’t best suited for that rewrite of Zork you’ve always wanted to write…

In the next instalment, sprites!

Baby steps…

The story so far… I now have a compiler, emulator, tile editor and the NGPC Framework. If you want to play along then I have saved the versions of these that I am using here.

So, where to start…

There are a few bits of admin you need before you can start actually doing something useful.

First step – create a project folder. Simply unzip frmwrk3.zip into a new folder and rename to your preferred project name. By default this will build a NGP file called FRAMEWRK.ngp which probably isn’t what you want.

So start by editing the makefile and changing the NAME = line at the top like so:

NAME = STARTOVR

Use whichever name you like, by convention this should be eight characters, but it can be more or less if you like.

Secondly, edit carthdr.h and change the CartTitle to your project name like so:

const char CartTitle[12] = "STARTINGOVER";

There are some limits here that you need to be aware of. This must be exactly 12 characters long, no longer and no shorter. You can use spaces to pad this out if needed. It should also be as unique as you can manage – this will help if you ever try to bundle it on real hardware or on a multicart, but basically it’s just nice. Don’t tread on someone else’s toes.

Your last step is to create a batch file to do the make. You could do this manually each time using the command prompt, but generally it’s easier to just double click on a file and let the computer do all the hard work. For this, I create a batch file called “makengp.bat” which will look like this:

@path=%PATH%;C:\Data\Development\NGPC\t900\bin
@SET THOME=C:\Data\Development\NGPC\t900\
@PROMPT $P$_NGPC$G
@make
@cmd

Your path names should reflect the locations where you have installed the T900 compiler. This will run the MAKE for the project and leave you at a command line at the end – this is useful in case there are any compiler errors so that you don’t end up swearing at a blank screen wondering what went wrong.

Lets prove that it works, change main.c and edit the void main() function like so:

void main()
{
 InitNGPC();
 SysSetSystemFont();

 // TODO: add game code - and remove hello world :-)

 ClearScreen(SCR_1_PLANE);
 ClearScreen(SCR_2_PLANE);
 SetBackgroundColour(RGB(0, 0, 0));

 SetPalette(SCR_1_PLANE, 0, 0, 0, 0, RGB(15,15,15));
 PrintString(SCR_1_PLANE, 0, 2, 8, "Feels like");
 PrintString(SCR_1_PLANE, 0, 2, 9, "Starting over!");

 while(1); // never fall out of main!!!
}

Don’t fret too much about the function definitions for now, just bear in mind that all co-ordinates are relative to the NGPC screen size of 160×152 (or 20 tiles across and 19 down). Get used to those sizes, as everything you do from now on will be inside that space…

Save this and run makengp.bat. You should have a basic NGP build now, which when run will produce the following output:

startingover

That’s it. I, and you if you are playing along, have now successfully compiled our first NGPC ROM. Granted, it doesn’t do very much yet, but we’ll come on to that next time…

Pocket Adventures – Starting over…

If you’ll remember, it was something of a revelation when I realised that, thanks to the work of various shadowy figures on the internet (who had done all the hard work) that I could write my own software for my beloved NGPC.

Now, none of my creations was ever likely to set the world on fire, or save the poor beleagured handheld from commercial oblivion, but this was a chance to get my own code running on a games console – how could I resist.

But first, how to actually get started…

There are various things I would need:

  • A compiler. Specifically the Toshiba T900 compiler. My old version no longer works on Windows 7 and upwards, but you can find newer releases if you creep around the corners of the internet a bit…
  • A text editor. Notepad at a push, although I prefer something a bit fuller featured – you have lots of options here. UltraEdit, TextPad, Visual Studio Code… Pick your poison.
  • An emulator. Even with a flash linker, it helps that you can compile and run something quickly on the computer. There are lots of options now, perhaps slightly fewer back in the early 2000’s. I still prefer NeoPop, but that hasn’t been developed for years now and you can probably find something better these days.
  • A Tile Editor – you can do this manually, if you’re a masochist, but it’s much easier to get your head round if you can work graphically. I originally started with my own, developed in Visual Basic, but one of the stalwarts of the NGPC development community (Soft n’ fuzzy) released a much better version called NeoTile.
  • A head start…

The problem with developing for consoles for me, as a jobbing software developer was always that you were expected to get down and dirty with Assemblers and various machine coding hackery to get your own code running on a console. Now, while that is possible, I really do lack the inclination to learn the ins and outs of various old 8 bit processors in order to do something as simple as say “Hello World!”

Luckily for me, Ivan Mackintosh (an old UKVAC associate) had thought of this too, and had wrapped Dark Fader’s original code in a C framework. And that was the key to the console right there.

Out of the box, there was a “hello world” example and the source code for, if I remember correctly, a version of Denki Blocks. That was enough.

In the next installment, I’ll start revisiting my original NGPC development tutorial with a discussion on the NPGC tile management and how to move from Hello World through to something a bit more interesting… In the meantime, there is some discussion on NGPC homebrew over at http://forum.freeplaytech.com/index.php where you can find links to some of the tools, including the compiler and a quiet, but still active development community.

It’s not you, It’s a me!

 

Dear Mario, I don’t really know how to say this…

But you’re just an annoying little git aren’t you?

It’s not just you, it’s the whole world that you inhabit. I don’t mind the cartoon visuals, the bouncy tunes, and yes, you’ve got some great characters, but it’s all just too videogame-y.

Let me explain…

So, it’s your latest Odyssey that has finally made me realise how much we’ve grown apart… It’s the Switch’s second big hitter and another contender for game of the year, if not game of the generation, after the mighty Breath of the Wild.

So, i’ve played it, I enjoyed it for what it was, but I’m not keeping it. I know that, having seen the credits roll, there’s a shedload of things we still haven’t done together, worlds to explore, story to unlock, little twisty jumpy bits to swear at, that sort of thing, but…

It’s not just your latest iteration, I don’t think we’ve been getting on since I owned and rinsed the original two-screen Game & Watch back in 1982. There’s just too much going on, too many changes of pace, of style, of gameplay, of, well, of everything. Your inherent madness is just too much to bear, I need a bit more… Well, a bit more consistency.

This is massively noticeable in the New Donk City section of Odyssey, where semi-realistic looking NPCs wander around behaving, well, behaving like NPCs in a Mario game. It simply doesn’t work. See also, the slightly spurious dragon fight later on in the journey – or the one against a giant disembodied baby head. They wouldn’t be out of place in Bayonetta, but do they really belong in your day-glo world?

Jarring.

That’s the word. It just jars, too much dissonance between (or even inside) worlds. I know that this is precisely what some people love about you and your world, but as much as I love videogames, I don’t love them like this.

I’m going back to Hyrule…

Pocket Adventures

Firefly

We’re spoiled now, with our iPads and emulators running on inexpensive mobile phones. With the addition of a £10 bluetooth controller, we can play decent emulations of almost any gaming system that takes our fancy. But it wasn’t always thus…

Looking back on it now, mid to late 90’s era handheld gaming was, well, a bit crap really?

But that didn’t stop me falling absolutely head over heels in love with SNK’s Neo Geo Pocket Color when it managed to make it to the UK in 1999. I saw Sonic, Metal Slug, Pac Man and Crush Roller and I was all-in. The combination of “good enough” colour, decent sound and (still!) the best joystick on a handheld device was enough for me. I quickly burned a hole in my wallet and my heart getting hold of the best games for the system – a line up which still stands up today. I would still rank Card Fighter’s Clash in my top-3 games of all time…

And then… Within a year, SNK crashed and burned and the new owners Aruze pulled the plug on the NGPC and boom, my new favourite toy was suddenly defunct in the West, just when it felt like it was hitting it’s stride.

Well, what do you do in this situation? Of course, you go into mad completist mode and try and buy up everything you can as quickly as you can… I swiftly cleaned out my local shops of the few games that I didn’t already own, and then hit Ebay looking for other hits. Play-Asia became my new favourite website as I found myself looking for more and more obscure titles such as Gunbare Neo Poke-Kun, a game which I still don’t understand, but into which I sank 100’s of hours of my life.

Eventually, all too soon, of course, even the Japanese titles started to dry up – or simply became far too expensive to buy – something not helped when Edge ran an article on the NGPC and every collector in the UK suddenly seemed to wake up, causing the prices to rocket in the process. I started to look elsewhere for my gaming needs…

There was, however, one last chance for the NGPC to shine. The late purchase of a flash Linker, bought to play games I could no longer afford, and the timely expertise of a small handful of hardcore hackers, led me into the murky worlds of console development…

…to be continued…

 

Arcade Parinirvana?

As those of you with long memories, or access to an internet archive, may know I have been collecting video arcade games for pretty much twenty years.

It’s been a game of many highs, and a few lows. A hobby that has survived three children, four homes and a divorce. Through it all, I have somehow managed to keep, and occasionally grow, my small and humble collection of cabs, boards and associated paraphernalia. They’ve even worked, sometimes. They have been my constant companions, working or not, complete or not, in storage or in the home.

But now… Well, this is looking like the end of Arcade Nirvana…

A new home. A new partner. A new start for me and the kids. Two cats. In short, another messy divorce.

But, crucially, nowhere for four and a half hulking great bits of late 70’s/early 80’s Arcade Nirvana to fit.

Sure, I could put them into storage, I could probably call in a few favours to get them looked after by friends, but that would only be a temporary solution. I might be able to find a home for the Space Invader cocktail – being the most unobtrusive of the bunch – but that’s about it.

Do I want to sell? No.

Do I need the money? Not really, no – unfortunately, they’re not nearly valuable enough to fund a new home, although I won’t pretend a little bit of pin money won’t come in handy.

But do I have any other choice? They’re part of me, but they can’t be part of my new life. Deep down, I know that. It’s time to put them aside, maybe for a short while, maybe forever. I have emulation, and I have the memories, but it’s time to say goodbye.

Anyone want to buy a Robotron upright, slightly foxed?

Breath of the Wild

So, here it is, the Legend of Zelda Breath of the Wild review literally no-one is waiting for…

I have what you might call a “boutique” gaming collection, if you were being generous. My games are bought to be played, rather than left in pristine condition for future generations. At this moment in time, spread across multiple locations and entirely from memory, it consists of the following:

  • Dreamcast, 30 or 40 games, mostly Japanese shooters and the common as muck Euro releases
  • Gamecube, 15 of the best Japanese imports I could find
  • Xboxes 360 and One, 10 years of XBLA, plus games with gold freebies
  • Playstations 3 and 4 Similar numbers, with maybe slightly more games
  • Various retro oddites including Colecovision, Atari, Sinclair and Amstrad
  • Various handhelds from Nintendo, Sony, NGPC, Wonderswan et al
  • Four arcade cabs, in various states of nearly-but-not-quite-working
  • One Wii-U, with Breath of the Wild

Anyone want to make an offer on the lot, apart from that last item?