governo.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 int estrai_lunghezza(carattere *ind)
  48. {
  49. uint32_t lun = 0;
  50. int r;
  51. /* ind. e` un array di 2 caratteri, 0 e 1 sono unita` e decine */
  52. /* unita` */
  53. r = estrai_cifra(ind[0]);
  54. if (r < 0)
  55. return (uint32_t)-1; /* Errore */
  56. lun += r;
  57. /* decine */
  58. r = estrai_cifra(ind[1]);
  59. if (r < 0)
  60. return (uint32_t)-1; /* Errore */
  61. lun += 10 * r;
  62. return lun;
  63. }
  64. static indirizzo estrai_indirizzo(carattere *ind)
  65. {
  66. indirizzo val = 0;
  67. int r;
  68. int gruppo_c, gruppo_m;
  69. /* ind. e` un array di 4 caratteri, 0 e 1 sono unita` e decine */
  70. /* unita` */
  71. r = estrai_cifra(ind[0]);
  72. if (r < 0)
  73. return (uint32_t)-1; /* Errore */
  74. val += r;
  75. /* decine */
  76. r = estrai_cifra(ind[1]);
  77. if (r < 0)
  78. return (uint32_t)-1; /* Errore */
  79. val += 10 * r;
  80. gruppo_c = (ind[2] & 0x30) >> 4;
  81. /* Il gruppo delle centinaia condiziona incrementi di 40K */
  82. switch (gruppo_c) {
  83. case 0:
  84. break;
  85. case 1:
  86. val += 40000;
  87. break;
  88. case 3:
  89. val += 80000;
  90. break;
  91. case 2:
  92. val += 120000;
  93. }
  94. gruppo_m = (ind[3] & 0x30) >> 4;
  95. /* il gruppo delle migliaia condiziona incrementi di 10K */
  96. switch (gruppo_m) {
  97. case 0:
  98. break;
  99. case 1:
  100. val += 10000;
  101. break;
  102. case 3:
  103. val += 20000;
  104. break;
  105. case 2:
  106. val += 30000;
  107. }
  108. r = estrai_cifra(ind[2] & 0x0f);
  109. if (r < 0)
  110. return (uint32_t)-1; /* Errore */
  111. val += r * 100;
  112. r = estrai_cifra(ind[3] & 0x0f);
  113. if (r < 0)
  114. return (uint32_t)-1; /* Errore */
  115. val += r * 1000;
  116. return val;
  117. }
  118. void esegui_primo_programma(void);
  119. #endif