governo.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #ifndef GOVERNO_INCLUSO
  2. #define GOVERNO_INCLUSO
  3. #include "elea_tipi.h"
  4. #include "caratteri.h"
  5. struct registri_sistema {
  6. istruzione *I; /* Indirizzo istruzione primo programma */
  7. istruzione *O; /* Indirizzo operando in memoria */
  8. istruzione *M; /* Indirizzo istruzione secondo programma */
  9. int P; /* Indice accumulatore */
  10. indirizzo Q; /* Indirizzo di accum. in moltipl. */
  11. indirizzo R; /* Indirizzo moltiplic. in To */
  12. istruzione *H; /* Indirizzo istruzione terzo programma */
  13. int N; /* Memorizzatore di W per telescrivente */
  14. int S; /* Memorizzatore di R per telescrivente */
  15. int Z; /* ? */
  16. };
  17. extern struct registri_sistema R; /* Globale, definito in governo.c */
  18. typedef int(operazione)(istruzione *I);
  19. static int estrai_cifra(carattere c)
  20. {
  21. /* c e` compresa tra ZERO e NOVE */
  22. switch(c & 0x3F) {
  23. case CAR_ZERO:
  24. return 0;
  25. case CAR_UNO:
  26. return 1;
  27. case CAR_DUE:
  28. return 2;
  29. case CAR_TRE:
  30. return 3;
  31. case CAR_QUATTRO:
  32. return 4;
  33. case CAR_CINQUE:
  34. return 5;
  35. case CAR_SEI:
  36. return 6;
  37. case CAR_SETTE:
  38. return 7;
  39. case CAR_OTTO:
  40. return 8;
  41. case CAR_NOVE:
  42. return 9;
  43. default:
  44. return -1; /* Errore */
  45. }
  46. }
  47. static uint32_t estrai_indirizzo(carattere *ind)
  48. {
  49. uint32_t val = 0;
  50. int r;
  51. int gruppo_c, gruppo_m;
  52. /* ind. e` un array di 4 caratteri, 0 e 1 sono unita` e decine */
  53. /* unita` */
  54. r = estrai_cifra(ind[0]);
  55. if (r < 0)
  56. return (uint32_t)-1; /* Errore */
  57. val += r;
  58. /* decine */
  59. r = estrai_cifra(ind[1]);
  60. if (r < 0)
  61. return (uint32_t)-1; /* Errore */
  62. val += 10 * r;
  63. gruppo_c = (ind[2] & 0x30) >> 4;
  64. /* Il gruppo delle centinaia condiziona incrementi di 40K */
  65. switch (gruppo_c) {
  66. case 0:
  67. break;
  68. case 1:
  69. val += 40000;
  70. break;
  71. case 3:
  72. val += 80000;
  73. break;
  74. case 2:
  75. val += 120000;
  76. }
  77. gruppo_m = (ind[3] & 0x30) >> 4;
  78. /* il gruppo delle migliaia condiziona incrementi di 10K */
  79. switch (gruppo_m) {
  80. case 0:
  81. break;
  82. case 1:
  83. val += 10000;
  84. break;
  85. case 3:
  86. val += 20000;
  87. break;
  88. case 2:
  89. val += 30000;
  90. }
  91. r = estrai_cifra(ind[2] & 0x0f);
  92. if (r < 0)
  93. return (uint32_t)-1; /* Errore */
  94. val += r * 100;
  95. r = estrai_cifra(ind[3] & 0x0f);
  96. if (r < 0)
  97. return (uint32_t)-1; /* Errore */
  98. val += r * 1000;
  99. return val;
  100. }
  101. void esegui_primo_programma(void);
  102. #endif