private boolean simula (int indexIniziale) {
        // indica se e' avvenuto un loop infinito:
        boolean loop = false;
        
        // cellaCorrente assume il valore della cella da cui deve iniziare la simulazione della macchina
        this.indexCorrente = indexIniziale;
        
        while (this.indexCorrente != 0) {
            // memorizzo all'interno di hm la cella corrente e lo stato. Se la macchina torna in questo punto significa che si sta ripetendo
            hm.put(this.indexCorrente, this.statoCorrente);
            
            int newStato = this.statoReturner(this.cellaReader(this.indexCorrente), this.statoCorrente);
            int newShift = this.shiftReturner(this.cellaReader(this.indexCorrente), this.statoCorrente);
            this.indexCorrente += newShift;
            this.statoCorrente = newStato;
            
            // hm interrompe il ciclo se la macchina si ripete
            if (hm.containsKey(indexCorrente)) {
                if ((int) hm.get(indexCorrente) == statoCorrente) {
                    loop = true;
                    break;
                }
            }
            this.simula(indexCorrente);
        }
        return !loop;
    }