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;