If you're planning on using Celtic III, you can use it to identify the first ten bytes of a calc's serial. Then, you can come up with an algorithm (preferably using the rand command + seeds) that uses this information to generate a list with encrypted numbers. Your program decrypts the numbers and checks what it has against the calc's serial. If it doesn't match, program refuses to run.
If you went with this method, I would keep the key generator as a separate program on your calc only, not in the main program.
This along with edit-locking + obfuscating your program is the most foolproof way I can think of. I was planning on doing the exact same thing myself.
Since it's extremely unlikely that any two calculators you'll encounter will share the same key, you'll be fine. For extra security, package everything (including key + 8xp version of Celtic) as a Flash app with BasicBuilder (unless you'll be selling to owners of original 83s). Although you'd have to make a new Flash app for each person on your PC, your code is well protected even to expert calculator users. Additionally, this means that the key cannot be deleted, so no hassles over RAM clears or anything deleting activation keys.
I think a great side-effect of using seeds is that depending on the seed you use, you can create levels of privileges. Ex. Free/trial/demo, lite, regular, pro, and pro elite versions of the program in one executable, with the version used being determined by the key (or lack thereof).