123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #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 int estrai_lunghezza(carattere *ind)
- {
- 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 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
|