+ `INSN_RET: begin
+ case (cycle)
+ 0: cycle <= 1;
+ 1: begin
+ cycle <= 2;
+ registers[`REG_PCL] <= rdata;
+ end
+ 2: begin
+ cycle <= 3;
+ registers[`REG_PCH] <= rdata;
+ end
+ 3: begin
+ cycle <= 0;
+ {registers[`REG_SPH],registers[`REG_SPL]} <=
+ {registers[`REG_SPH],registers[`REG_SPL]} + 2;
+ if (opcode[4]) /* RETI */
+ ie <= 1;
+ end
+ endcase
+ end
+ `INSN_CALL: begin
+ case (cycle)
+ 0: cycle <= 1;
+ 1: begin
+ cycle <= 2;
+ tmp <= rdata; // tmp contains newpcl
+ end
+ 2: begin
+ cycle <= 3;
+ tmp2 <= rdata; // tmp2 contains newpch
+ end
+ 3: begin
+ cycle <= 4;
+ registers[`REG_PCH] <= tmp2;
+ end
+ 4: begin
+ cycle <= 5;
+ registers[`REG_PCL] <= tmp;
+ end
+ 5: begin
+ {registers[`REG_SPH],registers[`REG_SPL]} <=
+ {registers[`REG_SPH],registers[`REG_SPL]} - 2;
+ cycle <= 0;
+ end
+ endcase
+ end
+ default:
+ $stop;