117 lines
2.7 KiB
C
117 lines
2.7 KiB
C
#ifndef GOVERNO_INCLUSO
|
|
#define GOVERNO_INCLUSO
|
|
|
|
#include "elea_tipi.h"
|
|
#include "caratteri.h"
|
|
|
|
struct registri_sistema {
|
|
istruzione *I; /* Indirizzo istruzione primo programma */
|
|
istruzione *O; /* Indirizzo operando in memoria */
|
|
istruzione *M; /* Indirizzo istruzione secondo programma */
|
|
int P; /* Indice accumulatore */
|
|
indirizzo Q; /* Indirizzo di accum. in moltipl. */
|
|
indirizzo R; /* Indirizzo moltiplic. in To */
|
|
istruzione *H; /* Indirizzo istruzione terzo programma */
|
|
int N; /* Memorizzatore di W per telescrivente */
|
|
int S; /* Memorizzatore di R per telescrivente */
|
|
int Z; /* ? */
|
|
};
|
|
|
|
extern struct registri_sistema R; /* Globale, definito in governo.c */
|
|
|
|
typedef int(operazione)(istruzione *I);
|
|
|
|
static int estrai_cifra(carattere c)
|
|
{
|
|
/* c e` compresa tra ZERO e NOVE */
|
|
switch(c & 0x3F) {
|
|
case CAR_ZERO:
|
|
return 0;
|
|
case CAR_UNO:
|
|
return 1;
|
|
case CAR_DUE:
|
|
return 2;
|
|
case CAR_TRE:
|
|
return 3;
|
|
case CAR_QUATTRO:
|
|
return 4;
|
|
case CAR_CINQUE:
|
|
return 5;
|
|
case CAR_SEI:
|
|
return 6;
|
|
case CAR_SETTE:
|
|
return 7;
|
|
case CAR_OTTO:
|
|
return 8;
|
|
case CAR_NOVE:
|
|
return 9;
|
|
default:
|
|
return -1; /* Errore */
|
|
}
|
|
}
|
|
|
|
static uint32_t estrai_indirizzo(carattere *ind)
|
|
{
|
|
uint32_t val = 0;
|
|
int r;
|
|
int gruppo_c, gruppo_m;
|
|
/* ind. e` un array di 4 caratteri, 0 e 1 sono unita` e decine */
|
|
|
|
/* unita` */
|
|
r = estrai_cifra(ind[0]);
|
|
if (r < 0)
|
|
return (uint32_t)-1; /* Errore */
|
|
val += r;
|
|
|
|
/* decine */
|
|
r = estrai_cifra(ind[1]);
|
|
if (r < 0)
|
|
return (uint32_t)-1; /* Errore */
|
|
val += 10 * r;
|
|
|
|
gruppo_c = (ind[2] & 0x30) >> 4;
|
|
/* Il gruppo delle centinaia condiziona incrementi di 40K */
|
|
switch (gruppo_c) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
val += 40000;
|
|
break;
|
|
case 3:
|
|
val += 80000;
|
|
break;
|
|
case 2:
|
|
val += 120000;
|
|
}
|
|
gruppo_m = (ind[3] & 0x30) >> 4;
|
|
/* il gruppo delle migliaia condiziona incrementi di 10K */
|
|
switch (gruppo_m) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
val += 10000;
|
|
break;
|
|
case 3:
|
|
val += 20000;
|
|
break;
|
|
case 2:
|
|
val += 30000;
|
|
}
|
|
|
|
r = estrai_cifra(ind[2] & 0x0f);
|
|
if (r < 0)
|
|
return (uint32_t)-1; /* Errore */
|
|
val += r * 100;
|
|
|
|
r = estrai_cifra(ind[3] & 0x0f);
|
|
if (r < 0)
|
|
return (uint32_t)-1; /* Errore */
|
|
|
|
val += r * 1000;
|
|
|
|
return val;
|
|
}
|
|
|
|
void esegui_primo_programma(void);
|
|
|
|
#endif
|