Ever since I learned how to manipulate assembly in college, I have been fascinated with the idea of starting as small as possible and building up to infinite complexity. I've been working on my own theoretical minimal instruction set which avoids composite instructions like "subleq." The problem I have with these sorts of instructions is that they act like two (or more) separate instructions with a maintained state. In other words, they could be broken down into (IBM Pseudocode):
S R0,NUMBER
CLI R0,XL4'00'
BNH DESTINATION
So the minimal instruction set I want to use to build more complexity on top of should already be atomized and should not contain state.
So far what I have come up with is three instructions: (s)tore, (n)and, and (j)ump. There is a single accumulator and a PC counter - there is nothing else. All instructions take two bits followed by X bits containing a relative address which means there are no "immediate" values. I can load a value into the accumulator by using these instructions as demonstrated (8-bit):
00 000111 LOAD S HOLDER ; first we must zero-out the accumulator
01 000110 N HOLDER
01 000101 N HOLDER
00 000100 S HOLDER
01 000011 N HOLDER ; accumulator is now equal to zero
01 XXXXXX N NUMBER ; load number into accumulator
10 000010 J NEXT ; jump over the helper to the next instruction
00 000000 HOLDER = 0
XX XXXXXX NEXT ...
It should become obvious that instruction editing is allowed to make jumps effectively conditional but I'm not entirely sure how to accomplish such a task as yet. Is something so simple still Turing complete or is this a pie in the sky kind of idea?