# Macchina RASP

In informatica la Macchina RASP (Random Access Stored Program) è un calcolatore primitivo ideale che, sulla base dell'architettura di von Neumann, elabora le informazioni ricevute in entrata da un nastro di input in una unità centrale (CPU), grazie al supporto di una memoria interna ad accesso casuale (RAM), e stampa i risultati su un nastro di output. I nastri di entrata ed uscita delle informazioni e la RandRAM sono potenzialmente infiniti e costituiti da celle di memoria che possono contenere un solo valore, di tipo numerico intero (Z), che per essere elaborato dalla CPU deve prima essere salvato sulla RAM, che costituisce così il ponte di collegamento tra i nastri input/output e l'unità elaborativa.

## Struttura
### Nastri di comunicazione

I nastri di input/output sono la strada che permette alla macchina di comunicare con l'esterno. Essi sono costituiti da infinite celle, essendo questa una struttura ideale, contenenti valori che possono essere letti/stampati in modo sequenziale, verso un'unica direzione. I nastri possono comunicare unicamente con la memoria della macchina.

### Memoria RAM

La memoria della macchina è ad accesso casuale, così da poter salvare o recuperare qualsiasi dato in un qualsiasi punto della memoria, che essendo ideale è, come i nastri, potenzialmente infinita. La RAM fa anche da tramite fra la CPU e l'esterno, salvando su di sé i dati in lettura e stampando in uscita i dati che contiene.

### CPU

La Central Processing Unit, è il centro operativo della macchina, costituito da:
* ALU (Arithmetic Logic Unit), che è la centrale logica della macchina in grado di eseguire calcoli e dare istruzioni;
* CIR (Current Instruction Register) o PC (Process Counter), registro che memorizza l'istruzione corrente che l'ALU ha richiesto di svolgere;
* IP (Instruction Pointer), registro che localizza l'indirizzo di memoria con cui l'ALU intende lavorare;
* ACC (Accumulatore), è l'unico registro che esegue direttamente i calcoli con l'ALU, in quanto conserva il valore letto dalla memoria e lo conserva in attesa della elaborazione. Una volta elaborato un nuovo risultato, questo verrà salvato nell'ACC, dal quale sarà poi possibile copiare e salvare nella RAM.

## Linguaggio

Il linguaggio di programmazione della macchina RASP è un linguaggio assembler ideale che consente alla macchina di eseguire istruzioni e calcoli

### Istruzioni di input/output

* READ 1
** Legge il dato in ingresso e lo salva nella cella di memoria 1
* WRITE 2
** Stampa in uscita il dato contenuto nella cella di memoria 2

### Istruzioni di spostamento dati

* LOAD 0
** Carica nell'accumulatore (ACC) il dato presente nella cella di memoria 0
* LOAD #8
** Carica nell'accumulatore il valore 8
* LOAD @5
** Carica nell'accumulatore il dato contenuto all'indirizzo indicato dal dato presente nella cella di memoria 5
* STORE 10
** Legge il dato contenuto nell'accumulatore (ACC) e lo sposta nella cella di memoria 10

### Istruzioni di calcolo

* ADD 1
** Legge il dato contenuto nella cella di memoria 1 e lo somma a quello contenuto nell'accumulatore, E SALVA IL RISULTATO NELL'ACCUMULATORE
* ADD #10
** Aggiunge il valore 10 a quello contenuto nell'accumulatore
* SUB 1
** Legge il valore contenuto nella cella di memoria 1 e lo sottrae al valore contenuto nell'accumulatore
* SUB #10
** Sottrae il valore 10 a quello contenuto nell'accumulatore
* MUL 1
** Legge il dato contenuto nella cella di memoria 1 e lo moltiplica per quello contenuto nell'accumulatore
* MUL #10
** Moltiplica il valore 10 per quello contenuto nell'accumulatore
* DIV 1
** Legge il dato contenuto nell'accumulatore e lo divide per quello contenuto nella cella di memoria 1
* DIV #10
** Divide il valore contenuto nell'accumulatore per 10

### Istruzioni di salto

Le istruzioni di salto sono rese possibili dal fatto che ad una data istruzione viene conferito un nome, ad esempio
* InizioCiclo: LOAD 1
* FineCiclo: STORE 2
Queste 2 istruzioni sono state indicate con dei nomi, e l'istruzione di salto, dopo aver verificato una determinata condizione indirizzerà lo svolgimento del programma verso uno di queste due istruzioni ad esempio:
* JZ InizioCiclo
** Verifica che il valore presente nell'accumulatore sia zero, se lo è rimanda all'istruzione LOAD 1, altrimenti prosegue
altri tipi di salti sono:
* JNZ nomestruzione
** Salta se il valore nell'ACC non è 0
* JGZ nomeistruzione
** Salta se il valore nell'ACC è maggiore di 0
* JGEZ nomeistruzione
** Salta se il valore nell'ACC è maggiore o uguale a 0
* JLZ nomeistruzione
** Salta se il valore nell'ACC è minore di 0
* JLEZ nomeistruzione
** Salta se il valore nell'ACC è minore o uguale a 0
* JUMP nomeistruzione
** Salta incondizionatamente
Una variante dell'istruzione è quella de non inserire il nome dell'istruzione a cui saltare, sottintendendo un salto di una istruzione

### Istruzione di arresto

* HALT
** Arresta il programma in esecuzione, necessario alla fine di ogni programma.