#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