Someone emailed me asking about the design decisions that went into our programming languages for TIS-100, SHENZHEN I/O, and EXAPUNKS. I figure some of you might be interested in it too, so here it is in the worst format possible: a Twitter thread!
The BAK register was inspired by the “alternate registers” on the Z80, which we had been programming right before for the semi-failed Project Gibson.

http://www.zachtronics.com/gibson/ 
At first you could only SWP between it and ACC, but it was clear we needed a faster way to cram values into it, which gave us the BAK instruction and its identity as a “backup” register. I think the register was just called ACC’ before that.
The branch instructions in TIS-100 are meant to feel like branching on the Z80 without the conceptual difficulty of CPU flags. The fact that all numbers are in decimal (from -999 to 999) is similarly meant to keep things simple. Some people balk at this, but BCD was a real thing!
Originally all jumps in TIS-100 used explicit offsets, not labels, but this quickly got out of hand. We added the JRO instruction to keep some of the weirdness around after switching all the other branch instructions to use labels. I'm glad we did, because it has some fun hacks.
For SHENZHEN I/O we copied the branching from TIS-100, but we knew we needed something new. The conditional prefixes are borrowed from our vague understandings of the Itanium and ARM instruction sets. This feature is what makes it my favorite instruction set of the three.
There are a few instructions in SHENZHEN I/O that are meant to evoke the feeling of low-level embedded programming. DGT and DST (digit get and digit set) are what you do when you want bit twiddling but don’t want to explain what a bit is.
EXAPUNKS, on the other hand, is designed to evoke higher-level systems programming, with the REPL instruction being like fork(), and a variety of other instructions for manipulating files with file cursors.
It supports atomic keywords in addition to integers so that we could make some values non-forgeable, and so that we could inject more flavor into the puzzles than with numbers alone. I considered strings at first, but they were too complex for a feature used in every puzzle.
This was when we started running out of interesting ways to branch. We ended up with a Z80-like TEST instruction that sets a register (T) instead of a flag. Branching looks at the T register which allows you to store your loop count there and count to zero without having to TEST.
The important thing to remember is that these are puzzle games first and foremost! The instruction sets are balanced to be puzzling but not overly complicated.
You can follow @zachtronics.
Tip: mention @twtextapp on a Twitter thread with the keyword “unroll” to get a link to it.

Latest Threads Unrolled:

By continuing to use the site, you are consenting to the use of cookies as explained in our Cookie Policy to improve your experience.