Explaining the code: next
Now let’s look at this piece of code:
LD A, *(IP)
INC IP
JMP *(A)
Before we start this sequence, the situation looks like this:
PC ---> 0x1D: 0x2043 LD A, *(IP)
0x1E: 0x7003 INC IP
0x1F: 0x2004 JMP *(A)
… …
0x27: 0x0028
0x28: 0xB461
… …
0x2E: 0x001A
IP, A ---> 0x2F: 0x0027
0x30: 0x8614
… …
Now, LD A, *(IP) looks up the value at the memory location register IP points to. IP points to 0x2F, this contains 0x0027, which is loaded into register A, effectively makeing the word starting at address 0x0027 the active word.
0x1D: 0x2043 LD A, *(IP)
PC ---> 0x1E: 0x7003 INC IP
0x1F: 0x2004 JMP *(A)
… …
A ---> 0x27: 0x0028
0x28: 0xB461
… …
0x2E: 0x001A
IP ---> 0x2F: 0x0027
0x30: 0x8614
… …
Then INC IP moves the instruction pointer to the next instruction to be executed once we are finished with the active word.
0x1D: 0x2043 LD A, *(IP)
0x1E: 0x7003 INC IP
PC ---> 0x1F: 0x2004 JMP *(A)
… …
A ---> 0x27: 0x0028
0x28: 0xB461
… …
0x2E: 0x001A
0x2F: 0x0027
IP ---> 0x30: 0x8614
… …
Finally, JMP *(A) jumps the program counter to the address contained in the memory cell register A points to, which is 0x0028 in this case. (We could have written the instruction as LD PC, *(A) as well.)
The whole sequence is called NEXT in a Forth system.