From 4bbca74e311937a700bd9751a016ff3ff26aa734 Mon Sep 17 00:00:00 2001 From: Jeff Jetton Date: Sat, 14 May 2022 10:37:50 -0500 Subject: [PATCH] Initial commit --- README.md | 41 +++++++++++++++++++++++++++++++++++++++++ img/screenshot.png | Bin 0 -> 14807 bytes 2 files changed, 41 insertions(+) create mode 100644 README.md create mode 100644 img/screenshot.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..de6ec89 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Apple 1 "Worple" + + + +A Wordle-style puzzle game for the Apple 1. Features over 850 words, but small enough to run on systems with as little as 4K of RAM. + + +## Files in the Repo: + +* **worple.asm** + * The 6502 assembly language source code + * I used [dasm](https://dasm-assembler.github.io/) to assemble this, but other 6502 assemblers should work without too much tweaking + +* **worple.bin** + * Assembled binary file + * The first two bytes in the file are the (little-endian) origin address of the code: $0300 +* **worple.js** + * Javascript "tape file" format, compatible with Will Scullin's [Apple 1js emulator](https://www.scullinsteel.com/apple1/) + * You can use this with a local copy of the emulator by putting the file in the `/tapes` directory and adding a reference to it in `apple1.htm` + +* **worple.txt** + * Typed version of program in "Woz Monitor" hex format + * Many emulators will let you copy/paste or otherwise load this in + * You can also send this over to a real Apple 1 (or replica/clone) via serial connection + * Once loaded in, enter `300R` to run + +* **words.txt** + * Text file of words used by the game + +* **words_0.bin and words_1.bin** + * Compressed binary versions of the word list, split into two parts (A-P and Q-Z) + +* **packer.py** + * Python utility that creates the compressed binary word files + +## Modifying the Word List + +* Edit `words.txt` as you see fit. (If your list exceeds 866 words, more than 4K of RAM will be required.) +* Run `packer.py` to shuffle the word list and rebuild the two binary word files +* Reassemble `worple.asm` to build a new executable binary with the new words in it + diff --git a/img/screenshot.png b/img/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..319040edf38b9ef1a8b9b46467c5a8f366346ac0 GIT binary patch literal 14807 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