elea9003-emu/governo.h
Daniele Lacamera ca2bdec5d4 hello world!
2019-12-24 01:26:09 +01:00

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