Assembler for obfuscated Turing Machine
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
examples
.gitignore
LICENSE
Makefile
README.md
tmasm.l
tmasm.y

README.md

tmasm

TMASM is an assembler for an obfuscated Turing Machine emulator.

I don't know why. Like a few other projects, I don't actually remember writing this. I do vaguely remember thinking about it. But writing a full assembler? Using lex and yacc?

Believe it or not, though, that's not the weirdest part of this. I didn't write the virtual machine. That already existed...as Paul E. Black's 1989 IOCCC entry (source, compile and go).

Not included here is what appears to have been a first, tentative step at de-obfuscating the code, which I assume I sensibly gave up on. I'm also not about to include somebody else's code without permission or a license.

I might be convinced to do so if I rewrite it, but otherwise, you'll need to rely on the original.

Syntax

I can't believe you're still reading this...

Every Turing Machine assembler instruction has the same format:

  • Current State: Represented as a number. The maximum number is hard-coded as 127.

  • /, obligatory syntax.

  • Condition: The character (preceded by a ``` back-tick) expected on the tape at this position.

  • :, apparently because I said so.

  • Target State: The number of the state to which we transition when the condition is true.

  • /, like before.

  • Output: Character (again, preceded by a ``` back-tick) to write to the tape.

  • Direction: An L or R to optionally move the tape head.

  • Debug: Optionally, a p can be added to (I believe) activate the trace routine, though I'm not entirely convinced of that.

A typical line looks something like:

42/`1 : 13/`0 R p

End-of-line comments also start with a semi-colon (;), such as:

; This is a terrible comment

Yes, I used lex and yacc to do this, for some reason.

Usage

The first command-line parameter is the source. The second is your output binary.

If you don't supply the second parameter, the assembler automatically chooses a.out to guarantee conflict with any lazily-compiled C code you might have around. If you don't supply the first parameter, the assembler reads from stdin, which won't confuse you at all.

Run the resulting binary through Black's emulator, and at least in theory, you'll get some kind of result, especially if the commented code (the trace routine) is turned on.

Examples

There are two maybe-worthwhile example programs:

  • invert.tm: Invert binary data on the tape, printing new zeroes.

  • fib.tm: Generates Fibonacci numbers.

Caveats

As with a lot of this old code, it may not be ready for prime time. If there are any bugs, I'll be happy to try to track things down, but it probably won't be a priority.

Hopefully, nobody will use this as a core part of their mission-critical toolchain...