;            File: e18-potenza3.ed.txt
;
;          Autore: Roberto FULIGNI
;
; Ultima modifica: 19/10/2024
;
;     Descrizione: Scrivere un programma per il simulatore che verifichi se un numero n
;                  inizialmente contenuto nella locazione di memoria 100 è o meno una
;                  potenza di 3; in caso affermativo dovrà inserire il valore 1 nella 
;                  locazione di memoria di indirizzo 101, altrimenti 0.
;
;    MEMORIA RAM (DATA)
;    Variabile    Indirizzo    Valore  
;    --------------------------------
;      n             100:        81
;      ris           101:         ?  (soluzione: 1)
;      p             102:
;

; Strategia: data una variabile p inizialmente pari a 1, si moltiplica ripetutamente
;            p per tre finchè p < n. alla fine, se p = n, allora n è una potenza di 3,
;            se p > n, n non è potenza di 3. 

SET A #1          ; Inizialmente p = 1
STO 102

ciclo:
LOD R0 102        ; Controllo del ciclo in testa: carica la variabile p in R0
LOD R1 100        ; Carica n in R1
SUB               ; A <-- R0 - R1     (cioè p - n)
JML triplica      ; se p < n (cioè p-n < 0) occorre triplicare p
JMP fineciclo     ; in caso contrario il ciclo termina

triplica:
LOD R0 102        ; Triplica il valore della cella di indirizzo 102 (var. p)
SET R1 #3
MUL
STO 102
JMP ciclo

fineciclo:
LOD R0 102       ; Occorre verificare se n sia una potenza di 3 confrontandola con p
LOD R1 100
SUB
JMZ potenza3     ; se p - n = 0, si salta alla porzione di codice che gestisce il caso "n è potenza di 3"
SET A #0         ; n non è una potenza di 3, il risultato deve essere 0
JMP fine

potenza3:
SET A #1         ; n è potenza di 3, il risultato è quindi 1

fine:
STO 101          ; Memorizzazione del risultato finale nella cella 101
HLT
