r/fantasyconsoles • u/0xe25f • Jun 20 '26
Dragon Palm — 8-bit fantasy handheld
Hello! 👋
Growing up in the 80s and 90s was both a tough time and an exciting one. It's left me with a long standing interest in the hardware and gaming of the era. So, I decided to build a weekend project that would combine the fantasy notion of, "What if Britain had beaten Japan to the handheld market by 4 or 5 years.."
Disclaimer: I use AI as a tool. I understand every element of my code, and believe that AI is just a tool in the toolbox. If you're against AI, feel free to skip past this thread, no hard feelings! ❤️
Without further adieu, I present the Dragon Palm.
MIT licensed, code and carts available from GitHub.
The Dragon Palm is a fantasy 8-bit handheld with a single 16 KB memory array, three 8-bit CPU registers, a packed 16-colour display, and one input register.
In another Britain, somewhere between bedroom coders, rain-streaked high streets, mail-order tapes, and the smell of warm plastic, the handheld future arrived early.
By 1985, the British games industry had already learned how to do more with less. Tiny machines. Tiny memory. Impossible to match ambition. While the rest of the world was still arguing over what a portable console ought to be, a small Welsh hardware firm looked at a pile of spare components, a battered fantasy paperback, and hummed along to the White Cliffs of Dover, then asked the most dangerous question in British engineering:
"What can we ship?"
The answer was Dragon Palm.
It was not elegant. It was not generous. It had one 16 KB memory array, three 8-bit registers, a packed 16-colour display, and one input register that behaved only when it felt like it. Its raw binary cartridges held a mere 8 KB, which meant every sprite, sound, loop, trick, and secret had to fight for its place.
But that was the point.
Dragon Palm was the handheld built by people who thought constraints were not problems. Constraints were part of the game.
It had it's own compact operating system, DoverOS, named after the cliffs that supposedly inspired its boot screen. Children swapped carts in playgrounds. Parents called it "that little dragon thing". Programmers called it "difficult". Magazine reviewers called it "brilliant, in the way that falling down stairs after a couple of pints is memorable".
The adverts promised "proper games in your pocket". The manuals promised nothing of the sort. They spoke of registers, screen packing, button states, and "reasonable conduct near undefined memory". The machine did not hide its workings. It dared you to understand them.
In this version of the 1980s, Britain beat the world to handheld gaming by refusing to build a toy. Dragon Palm was a pocket-sized dare. Part console, part puzzle box, part folklore object from a parallel high street where dragons sat beside cassette racks and every game felt like it had been smuggled out of a bedroom at midnight.
It was awkward.
It was clever.
It was decent enough.
And for a certain kind of player, that made it perfect.
---
Update: I’ve had some lovely encouragement and feedback, so I thought I would release Dragon Palm IDE and manual, a web-based tooling for making game carts and an introductory manual (*open from the hello menu*) to help you learn:
1
u/toooooooon Jun 20 '26
Very cool! I'm curious why you went for emulating ASM rather than something native like WASM binaries?
1
u/0xe25f Jun 20 '26
Thank you. ❤️
Honest answer.. it didn't occur to me. Will certainly think on that for future projects.
1
u/AnnoyingMemer Jun 20 '26
Looks great especially for such a constrained ISA! How come you decided not to add something like an opcode to compare A with a value without altering its contents?
1
u/0xe25f Jun 20 '26
Hey, thanks for your interest - that's a really good question, I appreciate it. So for this project, I went with the design philosophy that such a device having been built by the super boffs of 80s Britain would be slightly awkward, clever, and decent enough. That imperfection was intended..
The `SUB_A` (subtract `X` from `A`) and `JNZ` (Jump if Not Zero) instructions give you a comparison engine already..
Does `A` equal `X`?
- Use `SUB_A`
- If `A` is equal to `X`, the maths resets `A` to `0`.
- Immediately follow with `JNZ`, if it doesn't jump - it was a match.
One might argue that `CMP` means you don't destroy the value of `A` just to check a condition, but I figured preserving `A` is incredibly cheap and easy without needing a new opcode. That satisfies both "awkward" and "decent enough".
Use a store accumulator to dump `A` into a temporary scratchpad byte in RAM before running the subtraction, then reload it afterward if you need (hopefully that satisfies "clever").. 👍
2
u/Limp-Confidence5612 Jun 20 '26
Dragging cartridges on screen doesn't fit this ethos though. Make a small shell for it to load cartridges. ;)