Lately most of the traffic I'm getting on this blog has been people stumbling onto my multipart series on how a computer works. Glad people are enjoying that as much as they seem to be. My reason for teaching myself all of that (besides just the joy of learning) is I'm very slowly working on designing a new video game console that anyone sufficiently motivated can build for themselves as a neat little DIY project. There are so many moving parts to this project that for now I'm focusing mainly on just the controller and its unique features. To avoid having to make a whole working console, with software, to test it, and make sure I have something to show for all this if the rest doesn't pan out, I'm designing the controller to also be more or less compatible with the NES and SNES (which secretly use the same input standard, just differently shaped plugs at the end of the cord).
This means all I'll need to test and demo my controller is an SNES ROM that knows what to do with my scroll-wheel outputs, a setup where an emulator accurately handles those signals, and later a cart I can slap a couple EEPROMs into and test on real hardware. Oh and I also need to teach myself enough about SNES development to actually create every demo I want to run, do all the art, code it up, and compile it. This is a big job, and I'm not getting paid, so maybe consider throwing me a little money before we dig into this?
Since... really the last time I reported in on this, I've been studying away trying to learn all this, and hey, have a compiled ROM image that'll display a blank screen in any color I want, and a third party program that IN THEORY with a bit of massaging will convert a 256x256 image into an SNES character ROM image. AKA the file with all the graphics. My ultimate goal for this demo cart is to cycle through several very simple games, showcasing how my controller works with each. So I need to cram every image any of these are going to need into my one big image file, which I'm slowly picking away at, but the one thing I knew from the start that I'd definitely need is to throw some text on screen explaining the controls for each demo. And since it's not like there's a built in font in in the system, I had to make my own.
This is not my first font-making rodeo. For this one, my thinking was, I'm going to be in a fixed 16x16 resolution per character (because I forgot the specifics of how the SNES actually tiles graphics), some built in spacing so I can slap them all right up against each other or some border and still be readable, and I wanted a nice little shadow built into every character in case they end up on a low contrast background. Let's zoom in on what I have here so far, in case you don't feel like downloading the file and blowing it up to something more readable.
The first thing I want to note is that after finishing the first 4 rows of characters here, I double checked, and while the SNES CAN break backgrounds into 16x16 tiles, the absolute minimum is 8x8. If I were really trying to be space efficient, I should have designed around that. Several of these characters would easily fit into a 16x8 space, that level of compression would also let me have just the period and comma and be able to build a colon, semicolon, or apostrophe from those, and most importantly, I rendered this with all of the lowercase letters exactly 1 pixel too tall to fit into a 16x8 space and let me double up there. Since I'm rather happy with this font so far and I'd eventually like to make some version of it available for, if nothing else, other people writing software for my eventual console here, I will likely, at some point, make a more space-optimized variation. I'd also like to cover a wider range of characters. At the very least, have some accent marks, wouldn't be too hard to add support for Cyrillic. Pretty sure I can get Japanese and Korean text in keeping with this look. Maybe some other languages. Anyway though, let's talk about what I've got.
My general design rule here was, where possible, make lines 2 pixels thick, and have each white pixel cast a black pixel shadow immediately below, to the right, and the diagonal between them. This gives a pretty convincing relief effect in my opinion, and keeping the shadows this thick keeps a nice firm edge there so it's even generally readable on a pure white background. Within each 16x16 tile, I was extremely strict about keeping a 1 pixel margin clear at the top and bottom of each image, and 2 or 3 on the sides (often 3 on the left, 2 on the right. With capital letters, I went with a generally rigid and blocky style, trying to stretch things to my arbitrary margins. Lowercase letters I restricted to just 8 pixels tall, and those featuring tails are given special permission to drop down an extra pixel, leaving the shadow right on the edge of their true bounding box.
While it wasn't an intentional move at first, several lowercase letters ended up with a decidedly rounded, squashed look, particularly g and q. I found that to be both kind of cute, giving the whole font a real unique character, and eventually started to actively lean into it (which may not be super obvious, I started with W as it's kinda the letter than needs the most breathing room and worked outward from there), and did my best to distort all the rounder shapes and in particular the highly mirrorable b d p q set, as I seem to recall once reading the more you avoid identical shapes with those, the more legible the font becomes for people with dyslexia. Similarly, I made a point of distinguishing the shapes of the Ms and Ws, and added a little whimsy to the numerals. Overall I'm super happy with all the lowercase letters (except for e and s being too thin, but that was an inevitable compromise), and if I ever have the time to kill it's very likely I'll revisit this someday and apply this squishy rounded aesthetic to the capitals too.
Your eyes were probably drawn really quickly to the parentheses here, where for at least the moment I'm breaking my rules about blank space and shifting them inward quite a bit rather than centering them. That's going to look really bad if I use them in a sentence (like this), but the main reason I'm including them right now is so I can list button prompts with both the icons representing what's actually going to be on my controller, and the SNES buttons sharing the same signals. So something like: "GO (A) Jump" and I think the half-spacing and closeness to what they enclose will look pretty nice in this one specific case.
As a final note, the particular hardware I'm working with absolutely supports the ability to mirror any image horizontally or vertically, as well as change the palette. If I truly wanted to cram letters in as efficiently as possible at this font size, I could, for instance, have an 8x8 right-angle segment, build a whole H just from mirroring that, also use it for the legs of the A, P, F, the left side of the D, etc. This however is incompatible with the shadows I'm using for extra readability. And of course for other projects I HAVE made a perfectly legible 8x8 font before.
I'm pointing this out because hey, if you do the math, JUST these characters I've set aside for having arbitrary on-screen text, as is, are consuming 5/16ths of my total graphical memory, and I'm probably never even going to display most of these anywhere. Again, not a huge problem for the simple demo pack I'm making, and that 256x256 drawing space isn't a hard limit. Spending an extra processor cycle to change an index value and access a whole other page of image data is a pretty common practice on the hardware, but especially with older computers and racing to get things ready to draw before a screen refreshes, it's good to at least be mindful of the tradeoffs with that sort of thing.
And again, my sole source of income at the moment is patreon donations, so if you're excited about seeing updates to this weird project of mine or you're learning useful things from any of it, maybe consider throwing me a little support?
So @sony just finished their “Future of gaming”-presentation with the reveal of the Playstation 5-console design; and for the first time ever there will be an “digital edition” without any disc-reader. At all. Probably because the PS5 will be pricier than expected, and they want to offer an budget model. No prices were announced though, so this is just my personal speculations. Down below is some of the announced games that will be released on Playstation 5, either this holliday when the console ships - or shortly thereafter. Enjoy the hype!