declare register AR(15:0), DR(19:0), SP(15:0), PC(15:0);
declare memory MEM(AR,DR);
INIT: PC <- 0, AR <- 0, SP <- $FFFF, DR <- 0;
FETCH: AR <- PC;
read MEM, PC <- PC + 1 |
switch DR(19:16) { case 0: goto PUSH
case 1: goto POP
case 2: goto SUB
case 3: goto NOT
case 4: goto JNZ
default: goto FETCH };
PUSH: AR <- DR(15:0), SP <- SP - 1;
read MEM, AR <- SP;
write MEM | goto FETCH;
POP: AR <- SP, if SP <> $FFFF then SP <- SP + 1 fi;
read MEM, AR <- DR(15:0);
write MEM | goto FETCH;
SUB: AR <- SP, SP <- SP + 1;
read MEM, AR <- SP;
AR <- DR(15:0), read MEM;
AR <- AR - DR(15:0);
DR(15:0) <- AR, AR <- SP;
write MEM | goto FETCH;
NOT: AR <- SP;
read MEM;
AR <- not DR(15:0);
DR(15:0) <- AR, AR <- SP;
write MEM | goto FETCH;
JNZ: AR <- SP, SP <- SP + 1;
read MEM;
if DR(15:0) <> 0 then goto JNZ1 fi;
SP <- SP + 1 | goto FETCH;
JNZ1: AR <- SP, SP <- SP + 1;
read MEM;
PC <- DR(15:0) | goto FETCH;
Comments