Firstly some minor updates. I have changed a couple of things on the assembler and emulator - the assembler now returns an error code on an error (handy for scripts) and the emulator now sounds somewhat better (pitch wise), but also worse as I've made it so it does what the real thing does and modulate another tone. It now sounds generically "cheap buzzer" awful, a bit like playing music underwater.
Now, if you've read this far you are probably wondering who this bloke is (it isn't me, too much hair). This is a fellow called Alan Turing who did a lot of the early development work in computing, including working at Bletchley Park in the war.
He also had this concept of "Turing completeness" which was used to differentiate between "not really computers" like the Code breaking machine Colossus or the work of the German Konrad Zuse. Both of these were nearly-but-not-quite computers, they missed things that meant you couldn't write some programs with it - I think Zuse's early machines didn't have conditional branching.
I nearly abandoned this RetroChallenge because I think the SM-5, while not exactly not Turing complete, is broken.
When I was looking at the COP411 (a NatSemi MCU) I wondered why they had this odd, single, exchange memory location $1F with the accumulator instruction (XAD 3,15). It just looked wierd. Why not allow the swap of any memory location with the accumulator directly ?
Now I know. The SM-5's big problem is that it can't do an indirect write very well.
You have two registers to work with, more or less, known as A and B, A is the accumulator and B is the memory pointer. Most modern CPUs have an instruction like
sta $4032
which for a 6502 stores the accumulator at location 0x4032. Most old fashioned 4 bitters don't have this. You load the "Memory Pointer" - B in Sharp/Nat Semi, XY in Texas with the address then write the accumulator, e.g.
lbi $3F
x 0
loads B with $3F and then saves A at that memory location (actually it swaps A and the memory location).
The big problem with the SM-5 is that it doesn't have a mechanism - that I can work out, that allows you to do an indirect save (in any kind of sensible fashion.
For example, you might want to save the value in A in the memory location whose address is in $40, rather than $40 itself. So suppose memory location $40 contains $17, your 'save' would go to location $17.
I don't think you can do this on an SM-5. You have the value in A, but to load B, you have to put the address ($40) in B, load memory location into A (then A will be $17), then copy it into B .... but in doing this you have overwritten A.
If you save A so you can load B this is fine, except that to get A back you have to put the address of where you stored it in B.
That's why (I think) the COP411 has XAD 3,15. It allows you to load A without putting an address in B first. I reckon this is a last minute "oh XXXX" design decision :)
- there are ways round it but they are all bonkers - e.g. having 16 identical copies of
lbi <some value>
lda 0
lbi 4
x 0
rtn0
except for the save address (the 4) and doing an indexed jump to the right one, and things like that. But you have to code for the processor you have.
Exclusive OR for example. Neither this nor the TMS1x00 has it (or AND or OR for that matter), and I needed it for the TMS1000 project (Simon). I ended up writing a sort of 'check and rotate in a loop' bit of code to just exclusive or two values, and it took nearly a whole page of the ROM space.
That's why the Sharp SM-5 series is broken (the other things like using T for every instruction going, I can live with .....)
TBH, I did seriously consider abandoning it for another project. But it's not called RetroChallenge for nothing.