If a computer can emulate another computer that is known to be Turing complete then it must itself be considered Turing complete. One thing we must decide is if we allow the addition of memory that the first machine didn't have originally. For example, an Apple ][ can emulate a modern PC (at a tiny fraction of the speed) if we can add a card with a few GB of RAM to it.
A very simple Von Neumann style computer is the ByteByteJump. It has a single instruction (so no op code) with 3 address fields and it copies a single byte from the first address to the second address and then always jumps to the third address. If the addresses are 3 bytes long then every instruction takes up 9 bytes in memory. You can do math and logic operations by setting up 16KB tables in memory and then patching an instruction so the two operands are the bottom two bytes of the first address. To subtract the byte in address 0x001234 from the byte in address 0x00C0F0 and store the result in address 0x003333 on a little endian BBJ with a subtraction table at 0xD00000 you could use this sequence:
There are several ways of implementing conditional jumps by patching the value of the third address.
Could the Z3 emulate this machine if given a 16MB memory it could interface to? Its instruction tape could be made into an infinite loop, which is good enough for this application. There are no other jumps or conditional execution in the emulator.
If you do need conditional execution to emulate a Turing complete machine (the Game Of Life, for example) then you might get by with conditional assignment instead. If the value of B is either 0 or 1, then Z:=A*B+C(1-B) will assign either A or C to Z. I am not familiar enough with the Z3 but would be surprised if it can't even do that.
A very simple Von Neumann style computer is the ByteByteJump. It has a single instruction (so no op code) with 3 address fields and it copies a single byte from the first address to the second address and then always jumps to the third address. If the addresses are 3 bytes long then every instruction takes up 9 bytes in memory. You can do math and logic operations by setting up 16KB tables in memory and then patching an instruction so the two operands are the bottom two bytes of the first address. To subtract the byte in address 0x001234 from the byte in address 0x00C0F0 and store the result in address 0x003333 on a little endian BBJ with a subtraction table at 0xD00000 you could use this sequence:
There are several ways of implementing conditional jumps by patching the value of the third address.Could the Z3 emulate this machine if given a 16MB memory it could interface to? Its instruction tape could be made into an infinite loop, which is good enough for this application. There are no other jumps or conditional execution in the emulator.
If you do need conditional execution to emulate a Turing complete machine (the Game Of Life, for example) then you might get by with conditional assignment instead. If the value of B is either 0 or 1, then Z:=A*B+C(1-B) will assign either A or C to Z. I am not familiar enough with the Z3 but would be surprised if it can't even do that.