
Listing 1
In-line interpreting
main
lda x ; typical assembly language stuff
ldb y
ada b
sta z
...
call sweet16 ; enter interpreter
PUSH 123 ; sweet 16
instructions
PUSH 456
ADD
POPAB
EXIT ; leave sweet 16
sta z ; back to assembly
stb z+1
...
Listing 2
Data structures
short stack[1024]; // operand stack
short return_stack[1024]; // return stack
short heap[1024]; // local RAM
short ip = 0; // instruction pointer
short sp = 0; // stack pointer
short rsp = 0; // pointer for return stack
Listing 3
Typical operations
case NEG:
stack[sp-1] = -stack[sp-1];
break;
case INC:
++stack[sp-1];
break;
...
case ADD:
sp;
stack[sp-1] += stack[sp];
break;
case SUB:
sp;
stack[sp-1] -= stack[sp];
break;
Listing 4
The interpreter
// main loop
while(1){
instr = program[ip++];
switch(instr){
case NOP:
break;
case HALT:
ip;
return;
break;
...
}
sp = min(max(sp, 0),
255);
rsp = min(max(rsp, 0), 255);
ip %= 1024;
}
Listing 5
Defining opcodes.
typedef enum{ NOP, HALT, ...
PUSH, POP, ...
ADD, SUB, ...
} op;
Return to Embedded.com
Send comments to:
Webmaster
All material on this site Copyright © 2000
CMP Media Inc. All rights reserved.
|