Aggiunte alcune istruzioni al modulo accumulatore
This commit is contained in:
parent
45353e0c6a
commit
6a3dfea5b6
5 changed files with 83 additions and 48 deletions
|
@ -1,47 +1,23 @@
|
||||||
#include "elea_tipi.h"
|
#include "elea_tipi.h"
|
||||||
#include "governo.h"
|
#include "governo.h"
|
||||||
|
#include "memoria.h"
|
||||||
|
|
||||||
static carattere Accumulatore[100];
|
static carattere Accumulatore[100];
|
||||||
static segno REG_SEGNO_A = 0;
|
static segno REG_SEGNO_A = 0;
|
||||||
|
|
||||||
/* Da accumulatore a memoria */
|
|
||||||
int AoM(carattere *mem, int lun)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int pos;
|
|
||||||
for (i = 0; i < lun; i++) {
|
|
||||||
pos = (R.P + lun - (i + 1));
|
|
||||||
mem[i] = (Accumulatore[pos] & 0x7F);
|
|
||||||
Accumulatore[pos] = 0x80;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Da memoria a accumulatore */
|
|
||||||
int MA(const carattere *mem, int lun)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
for (i = 0; i < lun; i++) {
|
|
||||||
pos = (lun - (i + 1));
|
|
||||||
Accumulatore[R.P + i] = (mem[pos] & 0x7F);
|
|
||||||
Accumulatore[R.P + i] &= ~0x80;
|
|
||||||
}
|
|
||||||
/* accende gA nell'ultimo carattere */
|
|
||||||
Accumulatore[R.P + lun - 1] |= 0x80;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DA(const int disp)
|
|
||||||
{
|
|
||||||
if (disp < 0 || disp > 99)
|
|
||||||
return -1;
|
|
||||||
R.P = disp;
|
|
||||||
return R.P;
|
|
||||||
}
|
|
||||||
|
|
||||||
int op_da(istruzione *i)
|
int op_da(istruzione *i)
|
||||||
{
|
{
|
||||||
|
int r;
|
||||||
|
int da;
|
||||||
|
r = estrai_cifra(i->da.I[0]);
|
||||||
|
if (r < 0)
|
||||||
|
return -1;
|
||||||
|
da = r;
|
||||||
|
r = estrai_cifra(i->da.I[1]);
|
||||||
|
if (r < 0)
|
||||||
|
return -1;
|
||||||
|
da += 10 * r;
|
||||||
|
R.P = da;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +28,21 @@ int op_fam(istruzione *i)
|
||||||
|
|
||||||
int op_aom(istruzione *i)
|
int op_aom(istruzione *i)
|
||||||
{
|
{
|
||||||
|
int pos;
|
||||||
|
indirizzo mem;
|
||||||
|
int lun;
|
||||||
|
int j;
|
||||||
|
mem = estrai_indirizzo(i->gen.I);
|
||||||
|
if (mem == (uint32_t)(-1))
|
||||||
|
return -1;
|
||||||
|
lun = estrai_lunghezza(i->gen.L);
|
||||||
|
|
||||||
|
for (j = 0; j < lun; j++) {
|
||||||
|
pos = (R.P + lun - (j + 1));
|
||||||
|
mem_scrivi_carattere(mem + j, Accumulatore[pos] & 0x7F);
|
||||||
|
/* Azzeramento */
|
||||||
|
Accumulatore[pos] = 0x80;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int op_piu_ma(istruzione *i)
|
int op_piu_ma(istruzione *i)
|
||||||
|
@ -64,8 +55,31 @@ int op_cma(istruzione *i)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Da memoria a accumulatore */
|
||||||
int op_ma(istruzione *i)
|
int op_ma(istruzione *i)
|
||||||
{
|
{
|
||||||
|
int j;
|
||||||
|
int pos;
|
||||||
|
int lun;
|
||||||
|
int r;
|
||||||
|
indirizzo mem;
|
||||||
|
|
||||||
|
mem = estrai_indirizzo(i->gen.I);
|
||||||
|
if (mem == (uint32_t)(-1))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
lun = estrai_lunghezza(i->gen.L);
|
||||||
|
if (lun < 0)
|
||||||
|
return -1;
|
||||||
|
for (j = 0; j < lun; j++) {
|
||||||
|
carattere c;
|
||||||
|
pos = (lun - (j + 1));
|
||||||
|
c = mem_leggi_carattere(mem);
|
||||||
|
Accumulatore[R.P + j] = c & 0x7f;
|
||||||
|
Accumulatore[R.P + j] &= ~0x80;
|
||||||
|
}
|
||||||
|
/* accende gA nell'ultimo carattere */
|
||||||
|
Accumulatore[R.P + lun - j] |= 0x80;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
elea_tipi.h
13
elea_tipi.h
|
@ -7,20 +7,17 @@
|
||||||
typedef uint8_t carattere;
|
typedef uint8_t carattere;
|
||||||
typedef int8_t segno;
|
typedef int8_t segno;
|
||||||
typedef uint8_t booleano;
|
typedef uint8_t booleano;
|
||||||
|
typedef uint32_t indirizzo;
|
||||||
#define SI (1)
|
#define SI (1)
|
||||||
#define NO (0)
|
#define NO (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* bit gA: valido solo se il carattere e` letto da Accumulatore.
|
/* bit gA: valido solo se il carattere e` letto da Accumulatore.
|
||||||
* Nelle operazioni aritmetiche le cifre che lo seguono sono zeri
|
* Nelle operazioni aritmetiche le cifre che lo seguono sono zeri
|
||||||
* Nei trasferisferimento a mem principale il bit e` ignorato i
|
* Nei trasferisferimento a mem principale il bit e` ignorato i
|
||||||
*/
|
*/
|
||||||
#define gA(x) ((x >> 7) & 0x01)
|
#define gA(x) ((x >> 7) & 0x01)
|
||||||
|
|
||||||
typedef carattere * indirizzo;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct __attribute__((packed)) istruzione_gen {
|
struct __attribute__((packed)) istruzione_gen {
|
||||||
carattere F; /* Tipo di funzione */
|
carattere F; /* Tipo di funzione */
|
||||||
|
@ -60,12 +57,20 @@ struct __attribute__((packed)) istruzione_n {
|
||||||
carattere X; /* Non utilizzato */
|
carattere X; /* Non utilizzato */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct __attribute__((packed)) istruzione_da {
|
||||||
|
carattere F; /* Tipo di funzione */
|
||||||
|
carattere Tm; /* Modificatore */
|
||||||
|
carattere I[2]; /* Indirizzo interno dell'accumulatore */
|
||||||
|
carattere X[4]; /* Non utilizzato */
|
||||||
|
};
|
||||||
|
|
||||||
typedef union u_istruzione {
|
typedef union u_istruzione {
|
||||||
struct istruzione_gen gen;
|
struct istruzione_gen gen;
|
||||||
struct istruzione_t t;
|
struct istruzione_t t;
|
||||||
struct istruzione_c c;
|
struct istruzione_c c;
|
||||||
struct istruzione_s s;
|
struct istruzione_s s;
|
||||||
struct istruzione_n n;
|
struct istruzione_n n;
|
||||||
|
struct istruzione_da da;
|
||||||
} istruzione;
|
} istruzione;
|
||||||
|
|
||||||
#endif /* ELEA_TIPI_INCLUSO */
|
#endif /* ELEA_TIPI_INCLUSO */
|
||||||
|
|
25
governo.h
25
governo.h
|
@ -50,9 +50,28 @@ static int estrai_cifra(carattere c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t estrai_indirizzo(carattere *ind)
|
static int estrai_lunghezza(carattere *ind)
|
||||||
{
|
{
|
||||||
uint32_t val = 0;
|
uint32_t lun = 0;
|
||||||
|
int r;
|
||||||
|
/* ind. e` un array di 2 caratteri, 0 e 1 sono unita` e decine */
|
||||||
|
/* unita` */
|
||||||
|
r = estrai_cifra(ind[0]);
|
||||||
|
if (r < 0)
|
||||||
|
return (uint32_t)-1; /* Errore */
|
||||||
|
lun += r;
|
||||||
|
|
||||||
|
/* decine */
|
||||||
|
r = estrai_cifra(ind[1]);
|
||||||
|
if (r < 0)
|
||||||
|
return (uint32_t)-1; /* Errore */
|
||||||
|
lun += 10 * r;
|
||||||
|
return lun;
|
||||||
|
}
|
||||||
|
|
||||||
|
static indirizzo estrai_indirizzo(carattere *ind)
|
||||||
|
{
|
||||||
|
indirizzo val = 0;
|
||||||
int r;
|
int r;
|
||||||
int gruppo_c, gruppo_m;
|
int gruppo_c, gruppo_m;
|
||||||
/* ind. e` un array di 4 caratteri, 0 e 1 sono unita` e decine */
|
/* ind. e` un array di 4 caratteri, 0 e 1 sono unita` e decine */
|
||||||
|
@ -106,9 +125,7 @@ static uint32_t estrai_indirizzo(carattere *ind)
|
||||||
r = estrai_cifra(ind[3] & 0x0f);
|
r = estrai_cifra(ind[3] & 0x0f);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return (uint32_t)-1; /* Errore */
|
return (uint32_t)-1; /* Errore */
|
||||||
|
|
||||||
val += r * 1000;
|
val += r * 1000;
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,6 @@ int op_meno_mm(istruzione *i)
|
||||||
carattere mem_leggi_carattere(uint32_t ind)
|
carattere mem_leggi_carattere(uint32_t ind)
|
||||||
{
|
{
|
||||||
return M[ind];
|
return M[ind];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void mem_scrivi_carattere(uint32_t ind, carattere c)
|
void mem_scrivi_carattere(uint32_t ind, carattere c)
|
||||||
|
|
|
@ -18,7 +18,7 @@ int op_cm(istruzione *i)
|
||||||
int op_ms(istruzione *i)
|
int op_ms(istruzione *i)
|
||||||
{
|
{
|
||||||
struct istruzione_gen *ms = &i->gen;
|
struct istruzione_gen *ms = &i->gen;
|
||||||
uint32_t ind;
|
indirizzo ind;
|
||||||
int len;
|
int len;
|
||||||
int j;
|
int j;
|
||||||
int r;
|
int r;
|
||||||
|
@ -33,10 +33,10 @@ int op_ms(istruzione *i)
|
||||||
return -1; /* Errore */
|
return -1; /* Errore */
|
||||||
len += 10 * r;
|
len += 10 * r;
|
||||||
ind = estrai_indirizzo(ms->I);
|
ind = estrai_indirizzo(ms->I);
|
||||||
if (ind == (uint32_t)(-1))
|
if (ind == (indirizzo)(-1))
|
||||||
return -1; /* Errore */
|
return -1; /* Errore */
|
||||||
for (j = 0; j < len; j++) {
|
for (j = 0; j < len; j++) {
|
||||||
c = mem_leggi_carattere(ind + j);
|
c = mem_leggi_carattere((uint32_t)(ind + j));
|
||||||
printf("%s", mappa_caratteri[c]);
|
printf("%s", mappa_caratteri[c]);
|
||||||
}
|
}
|
||||||
printf("\r\n");
|
printf("\r\n");
|
||||||
|
|
Loading…
Reference in a new issue