What if Wordle but it's 1978
▒▒▒ DOWNLOAD ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
(BIN) Untitled Word Game (140KB disk image)
v1.0.2, released 2022-04-15
(BIN) Untitled Word Game Pro (140KB disk image)
v1.1, released 2022-04-24
▒▒▒ ABOUT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Untitled Word Game is a Wordle clone for 8-bit Apple ][ computers.
The game is fully playable and feature-complete. It randomly picks
from a curated list of 2048 five-letter words and validates your
guesses against a list of 9330 words. There is no "daily" play,
just random puzzles as long as your Apple ][ can draw breath. It
even plays a little tune when you win.
▒▒▒ BACKGROUND ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Since Wordle exploded in popularity in late 2021 / early 2022,
there have been many variations (Quordle, Octordle), innovative
adjacent spin-offs (Nerdle, Worldle), and ports to older space-
and CPU-constrained devices (Gameboy Fiver).
As you might expect, the primary challenge of a retrocomputing port
of a word guessing game is the massive word list. Generalized text
compression is a well-studied topic, but CPU-intensive
decompression is usually required before access, and there's not
enough space to decompress everything (or possibly anything).
Wordle Trie Packing is the best deep dive into the subject of
creating compressed data structures specifically for Wordle-type
lookups.
(HTM) Wordle Trie Packing repository on GitHub
Untitled Word Game uses a Huffman Coded Bitpacked Smart Trie to
store the two word lists: the first of possible solutions, and the
second of all valid words not in the first list. You can use
unpacker.py to extract the word lists from the compressed versions
and packer.py to repack them.
We split 9330 five-letter words into two lists and encode them into
two identical data structures, for a total of 13159 bytes. At
runtime, we work directly with these compressed data structures;
there's not enough space in memory to decompress them, or even
portions of them. To make the game playable at 1 MHz, we have an
additional 360 bytes of indexes by first letter. For instance, if
your guess is ZEBRA, we can skip directly to the first Z word and
only search through 60 words instead of thousands to determine if
your guess is a valid word. Lookups are still O(N) within the space
of "words that start with this letter," and for some letters that's
still several hundred words, but there's a handsome little spinner
you can watch while you wait.
qkumba wrote the 6502 assembly language routines to access these
compressed data structures: nth to pick a solution word, and exists
to validate your guesses. These routines require another 495 bytes.
If you don't know much about the Apple ][, you might be thinking
"16K=16384, minus 13159, minus 360, minus 495, still leaves you
with 2370 bytes for code!" But the Apple ][ uses main memory for
everything. The text screen is 1KB, starting at main memory address
0x400. Even the stack is in main memory (256 bytes, starting at
address 0x100).
Then you realize that you forgot to budget for an operating system,
or even a disk reading routine, and you have no way to get the game
from the disk into memory in the first place.
So that's fun.
To load the game into memory, qkumba wrote a custom bootloader
called 0boot. It relocates itself into zero page (hence the name),
squeezes its required data structures into the stack page and page
2, then reads the game into memory starting at address 0x300. Since
the text page starts at address 0x0400, we end up reading an entire
screenful of text directly from disk while loading; we used this
for the initial help screen. Once the game starts, we clear the
screen (partially, leaving the header and footer) and the help text
is gone forever. We also no longer need the disk reading code, so
we can reuse zero page, the stack page, and page 2.
The actual game code is in untitled.a, plus a few routines that we
squeezed in and around 0boot. constants.a has a good summary of
memory usage at various stages. It is all completely ridiculous.
Thanks for reading.
▒▒▒ SYSTEM REQUIREMENTS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Untitled Word Game runs on the "rev. 0" Apple ][ from 1977 (or any
later model). It requires only 16KB of RAM.
For ease of use on modern emulators, the game is distributed as a
16-sector floppy disk image. This is slightly ahistorical. Apple
did not ship a floppy drive until 1978, and did not ship a 16-
sector floppy drive until 1980. You'll be okay.
Untitled Word Game Pro runs on any Apple ][ with 48K. It can be
copied to a ProDOS hard drive if you like that sort of thing. The
gameplay is identical, although word lookup is slightly faster
due to using different data structures for the dictionary data.
▒▒▒ LICENSE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Untitled Word Game is (c) 2022 by 4am and licensed under the MIT
open source license. All original code is available on GitHub.
Untitled Word Game Pro is (c) 2022 by 4am and licensed under the
MIT open source license. All original code is available on GitHub.
(HTM) Untitled Word Game repository on GitHub
(HTM) Untitled Word Game Pro repository on GitHub