Reals.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /* voc 2.1.0 [2019/11/01]. Bootstrapping compiler for address size 8, alignment 8. xrtspaSF */
  2. #define SHORTINT INT8
  3. #define INTEGER INT16
  4. #define LONGINT INT32
  5. #define SET UINT32
  6. #include "SYSTEM.h"
  7. static void Reals_BytesToHex (SYSTEM_BYTE *b, ADDRESS b__len, SYSTEM_BYTE *d, ADDRESS d__len);
  8. export void Reals_Convert (REAL x, INT16 n, CHAR *d, ADDRESS d__len);
  9. export void Reals_ConvertH (REAL y, CHAR *d, ADDRESS d__len);
  10. export void Reals_ConvertHL (LONGREAL x, CHAR *d, ADDRESS d__len);
  11. export void Reals_ConvertL (LONGREAL x, INT16 n, CHAR *d, ADDRESS d__len);
  12. export INT16 Reals_Expo (REAL x);
  13. export INT16 Reals_ExpoL (LONGREAL x);
  14. export void Reals_SetExpo (REAL *x, INT16 ex);
  15. export REAL Reals_Ten (INT16 e);
  16. export LONGREAL Reals_TenL (INT16 e);
  17. static CHAR Reals_ToHex (INT16 i);
  18. REAL Reals_Ten (INT16 e)
  19. {
  20. LONGREAL r, power;
  21. r = (LONGREAL)1;
  22. power = (LONGREAL)10;
  23. while (e > 0) {
  24. if (__ODD(e)) {
  25. r = r * power;
  26. }
  27. power = power * power;
  28. e = __ASHR(e, 1);
  29. }
  30. return r;
  31. }
  32. LONGREAL Reals_TenL (INT16 e)
  33. {
  34. LONGREAL r, power;
  35. r = (LONGREAL)1;
  36. power = (LONGREAL)10;
  37. for (;;) {
  38. if (__ODD(e)) {
  39. r = r * power;
  40. }
  41. e = __ASHR(e, 1);
  42. if (e <= 0) {
  43. return r;
  44. }
  45. power = power * power;
  46. }
  47. __RETCHK;
  48. }
  49. INT16 Reals_Expo (REAL x)
  50. {
  51. INT16 i;
  52. __GET((ADDRESS)&x + 2, i, INT16);
  53. return __MASK(__ASHR(i, 7), -256);
  54. }
  55. void Reals_SetExpo (REAL *x, INT16 ex)
  56. {
  57. CHAR c;
  58. __GET((ADDRESS)x + 3, c, CHAR);
  59. __PUT((ADDRESS)x + 3, __CHR(__ASHL(__ASHR((INT16)c, 7), 7) + __MASK(__ASHR(ex, 1), -128)), CHAR);
  60. __GET((ADDRESS)x + 2, c, CHAR);
  61. __PUT((ADDRESS)x + 2, __CHR(__MASK((INT16)c, -128) + __ASHL(__MASK(ex, -2), 7)), CHAR);
  62. }
  63. INT16 Reals_ExpoL (LONGREAL x)
  64. {
  65. INT16 i;
  66. __GET((ADDRESS)&x + 6, i, INT16);
  67. return __MASK(__ASHR(i, 4), -2048);
  68. }
  69. void Reals_ConvertL (LONGREAL x, INT16 n, CHAR *d, ADDRESS d__len)
  70. {
  71. INT32 i, j, k;
  72. if (x < (LONGREAL)0) {
  73. x = -x;
  74. }
  75. k = 0;
  76. if (n > 9) {
  77. i = __SHORT(__ENTIER(x / (LONGREAL)(LONGREAL)1000000000), 2147483648LL);
  78. j = __SHORT(__ENTIER(x - i * (LONGREAL)1000000000), 2147483648LL);
  79. if (j < 0) {
  80. j = 0;
  81. }
  82. while (k < 9) {
  83. d[__X(k, d__len)] = __CHR((int)__MOD(j, 10) + 48);
  84. j = __DIV(j, 10);
  85. k += 1;
  86. }
  87. } else {
  88. i = __SHORT(__ENTIER(x), 2147483648LL);
  89. }
  90. while (k < n) {
  91. d[__X(k, d__len)] = __CHR((int)__MOD(i, 10) + 48);
  92. i = __DIV(i, 10);
  93. k += 1;
  94. }
  95. }
  96. void Reals_Convert (REAL x, INT16 n, CHAR *d, ADDRESS d__len)
  97. {
  98. Reals_ConvertL(x, n, (void*)d, d__len);
  99. }
  100. static CHAR Reals_ToHex (INT16 i)
  101. {
  102. if (i < 10) {
  103. return __CHR(i + 48);
  104. } else {
  105. return __CHR(i + 55);
  106. }
  107. __RETCHK;
  108. }
  109. static void Reals_BytesToHex (SYSTEM_BYTE *b, ADDRESS b__len, SYSTEM_BYTE *d, ADDRESS d__len)
  110. {
  111. INT16 i;
  112. INT32 l;
  113. CHAR by;
  114. i = 0;
  115. l = b__len;
  116. while (i < l) {
  117. by = __VAL(CHAR, b[__X(i, b__len)]);
  118. d[__X(__ASHL(i, 1), d__len)] = Reals_ToHex(__ASHR((INT16)by, 4));
  119. d[__X(__ASHL(i, 1) + 1, d__len)] = Reals_ToHex(__MASK((INT16)by, -16));
  120. i += 1;
  121. }
  122. }
  123. void Reals_ConvertH (REAL y, CHAR *d, ADDRESS d__len)
  124. {
  125. Reals_BytesToHex((void*)&y, 4, (void*)d, d__len * 1);
  126. }
  127. void Reals_ConvertHL (LONGREAL x, CHAR *d, ADDRESS d__len)
  128. {
  129. Reals_BytesToHex((void*)&x, 8, (void*)d, d__len * 1);
  130. }
  131. export void *Reals__init(void)
  132. {
  133. __DEFMOD;
  134. __REGMOD("Reals", 0);
  135. /* BEGIN */
  136. __ENDMOD;
  137. }