Debug.ob07 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. (*
  2. Copyright 2016, 2018, 2022, 2023 Anton Krotov
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. *)
  14. MODULE Debug;
  15. IMPORT API, sys := SYSTEM;
  16. CONST
  17. d = 1.0 - 5.0E-12;
  18. VAR
  19. Realp: PROCEDURE (x: REAL; width: INTEGER);
  20. PROCEDURE Char*(c: CHAR);
  21. VAR res: INTEGER;
  22. BEGIN
  23. res := API.sysfunc3(63, 1, ORD(c))
  24. END Char;
  25. PROCEDURE String*(s: ARRAY OF CHAR);
  26. VAR n, i: INTEGER;
  27. BEGIN
  28. n := LENGTH(s);
  29. FOR i := 0 TO n - 1 DO
  30. Char(s[i])
  31. END
  32. END String;
  33. PROCEDURE WriteInt(x, n: INTEGER);
  34. VAR i: INTEGER; a: ARRAY 16 OF CHAR; neg: BOOLEAN;
  35. BEGIN
  36. i := 0;
  37. IF n < 1 THEN
  38. n := 1
  39. END;
  40. IF x < 0 THEN
  41. x := -x;
  42. DEC(n);
  43. neg := TRUE
  44. END;
  45. REPEAT
  46. a[i] := CHR(x MOD 10 + ORD("0"));
  47. x := x DIV 10;
  48. INC(i)
  49. UNTIL x = 0;
  50. WHILE n > i DO
  51. Char(" ");
  52. DEC(n)
  53. END;
  54. IF neg THEN
  55. Char("-")
  56. END;
  57. REPEAT
  58. DEC(i);
  59. Char(a[i])
  60. UNTIL i = 0
  61. END WriteInt;
  62. PROCEDURE IsNan(AValue: REAL): BOOLEAN;
  63. VAR h, l: SET;
  64. BEGIN
  65. sys.GET(sys.ADR(AValue), l);
  66. sys.GET(sys.ADR(AValue) + 4, h)
  67. RETURN (h * {20..30} = {20..30}) & ((h * {0..19} # {}) OR (l * {0..31} # {}))
  68. END IsNan;
  69. PROCEDURE IsInf(x: REAL): BOOLEAN;
  70. RETURN ABS(x) = sys.INF()
  71. END IsInf;
  72. PROCEDURE Int*(x, width: INTEGER);
  73. VAR i: INTEGER;
  74. BEGIN
  75. IF x # 80000000H THEN
  76. WriteInt(x, width)
  77. ELSE
  78. FOR i := 12 TO width DO
  79. Char(20X)
  80. END;
  81. String("-2147483648")
  82. END
  83. END Int;
  84. PROCEDURE OutInf(x: REAL; width: INTEGER);
  85. VAR s: ARRAY 5 OF CHAR; i: INTEGER;
  86. BEGIN
  87. IF IsNan(x) THEN
  88. s := "Nan";
  89. INC(width)
  90. ELSIF IsInf(x) & (x > 0.0) THEN
  91. s := "+Inf"
  92. ELSIF IsInf(x) & (x < 0.0) THEN
  93. s := "-Inf"
  94. END;
  95. FOR i := 1 TO width - 4 DO
  96. Char(" ")
  97. END;
  98. String(s)
  99. END OutInf;
  100. PROCEDURE Ln*;
  101. BEGIN
  102. Char(0DX);
  103. Char(0AX)
  104. END Ln;
  105. PROCEDURE _FixReal(x: REAL; width, p: INTEGER);
  106. VAR e, len, i: INTEGER; y: REAL; minus: BOOLEAN;
  107. BEGIN
  108. IF IsNan(x) OR IsInf(x) THEN
  109. OutInf(x, width)
  110. ELSIF p < 0 THEN
  111. Realp(x, width)
  112. ELSE
  113. len := 0;
  114. minus := FALSE;
  115. IF x < 0.0 THEN
  116. minus := TRUE;
  117. INC(len);
  118. x := ABS(x)
  119. END;
  120. e := 0;
  121. WHILE x >= 10.0 DO
  122. x := x / 10.0;
  123. INC(e)
  124. END;
  125. IF e >= 0 THEN
  126. len := len + e + p + 1;
  127. IF x > 9.0 + d THEN
  128. INC(len)
  129. END;
  130. IF p > 0 THEN
  131. INC(len)
  132. END
  133. ELSE
  134. len := len + p + 2
  135. END;
  136. FOR i := 1 TO width - len DO
  137. Char(" ")
  138. END;
  139. IF minus THEN
  140. Char("-")
  141. END;
  142. y := x;
  143. WHILE (y < 1.0) & (y # 0.0) DO
  144. y := y * 10.0;
  145. DEC(e)
  146. END;
  147. IF e < 0 THEN
  148. IF x - FLT(FLOOR(x)) > d THEN
  149. Char("1");
  150. x := 0.0
  151. ELSE
  152. Char("0");
  153. x := x * 10.0
  154. END
  155. ELSE
  156. WHILE e >= 0 DO
  157. IF x - FLT(FLOOR(x)) > d THEN
  158. IF x > 9.0 THEN
  159. String("10")
  160. ELSE
  161. Char(CHR(FLOOR(x) + ORD("0") + 1))
  162. END;
  163. x := 0.0
  164. ELSE
  165. Char(CHR(FLOOR(x) + ORD("0")));
  166. x := (x - FLT(FLOOR(x))) * 10.0
  167. END;
  168. DEC(e)
  169. END
  170. END;
  171. IF p > 0 THEN
  172. Char(".")
  173. END;
  174. WHILE p > 0 DO
  175. IF x - FLT(FLOOR(x)) > d THEN
  176. Char(CHR(FLOOR(x) + ORD("0") + 1));
  177. x := 0.0
  178. ELSE
  179. Char(CHR(FLOOR(x) + ORD("0")));
  180. x := (x - FLT(FLOOR(x))) * 10.0
  181. END;
  182. DEC(p)
  183. END
  184. END
  185. END _FixReal;
  186. PROCEDURE Real*(x: REAL; width: INTEGER);
  187. VAR e, n, i: INTEGER; minus: BOOLEAN;
  188. BEGIN
  189. IF IsNan(x) OR IsInf(x) THEN
  190. OutInf(x, width)
  191. ELSE
  192. e := 0;
  193. n := 0;
  194. IF width > 23 THEN
  195. n := width - 23;
  196. width := 23
  197. ELSIF width < 9 THEN
  198. width := 9
  199. END;
  200. width := width - 5;
  201. IF x < 0.0 THEN
  202. x := -x;
  203. minus := TRUE
  204. ELSE
  205. minus := FALSE
  206. END;
  207. WHILE x >= 10.0 DO
  208. x := x / 10.0;
  209. INC(e)
  210. END;
  211. WHILE (x < 1.0) & (x # 0.0) DO
  212. x := x * 10.0;
  213. DEC(e)
  214. END;
  215. IF x > 9.0 + d THEN
  216. x := 1.0;
  217. INC(e)
  218. END;
  219. FOR i := 1 TO n DO
  220. Char(" ")
  221. END;
  222. IF minus THEN
  223. x := -x
  224. END;
  225. Realp := Real;
  226. _FixReal(x, width, width - 3);
  227. Char("E");
  228. IF e >= 0 THEN
  229. Char("+")
  230. ELSE
  231. Char("-");
  232. e := ABS(e)
  233. END;
  234. IF e < 100 THEN
  235. Char("0")
  236. END;
  237. IF e < 10 THEN
  238. Char("0")
  239. END;
  240. Int(e, 0)
  241. END
  242. END Real;
  243. PROCEDURE FixReal*(x: REAL; width, p: INTEGER);
  244. BEGIN
  245. Realp := Real;
  246. _FixReal(x, width, p)
  247. END FixReal;
  248. PROCEDURE Open*;
  249. TYPE
  250. info_struct = RECORD
  251. subfunc: INTEGER;
  252. flags: INTEGER;
  253. param: INTEGER;
  254. rsrvd1: INTEGER;
  255. rsrvd2: INTEGER;
  256. fname: ARRAY 1024 OF CHAR
  257. END;
  258. VAR info: info_struct; res: INTEGER;
  259. BEGIN
  260. info.subfunc := 7;
  261. info.flags := 0;
  262. info.param := sys.SADR(" ");
  263. info.rsrvd1 := 0;
  264. info.rsrvd2 := 0;
  265. info.fname := "/sys/develop/board";
  266. res := API.sysfunc3(70, sys.ADR(info), 0)
  267. END Open;
  268. END Debug.