uint32_t iw;
if (state->hack->resume_word) {
iw = state->hack->iw;
+ state->active_thread->sc++;
} else {
iw = fetch_instruction_word(state);
+ state->active_thread->sc = 0;
}
/* Decode instruction word format and execute. */
stack_push(state->active_thread, (iw << 1));
} else if ((iw & (0b11 << 30)) == 0) { /* Instruction word is type C. */
uint8_t syllable = extract_syllable_from_word(iw, state->active_thread->sc);
- state->active_thread->sc++;
/* The following variable allows us to catch JMP/BRZ instructions that */
/* jump to a new PC and need the SC reset. */
uint32_t pre_execution_pc = state->active_thread->pc;
execute_syllable(state, syllable);
if (state->active_thread->pc != pre_execution_pc) {
/* Jumped to a new address, so prepare to execute a new instruction word. */
- state->active_thread->sc = 0;
state->hack->resume_word = false;
- } else if (state->active_thread->sc >= SPW) {
+ } else if (state->active_thread->sc >= SPW-1) {
/* Just executed the last syllable in this word, follow the PC to the next word. */
- state->active_thread->sc = 0;
state->hack->resume_word = false;
} else {
/* More syllables remain to be executed in this instruction word. */