Trap.ob07 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2020-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE Trap;
  7. IMPORT SYSTEM;
  8. CONST
  9. SP = 4;
  10. PROCEDURE [code] sp* (): INTEGER
  11. 22, 0, SP; (* MOV R0, SP *)
  12. PROCEDURE [code] syscall* (ptr: INTEGER)
  13. 22, 0, SP, (* MOV R0, SP *)
  14. 27, 0, 8, (* ADD R0, 8 *)
  15. 16, 0, 0, (* LDD R0, R0 *)
  16. 67, 0, 0; (* SYSCALL R0 *)
  17. PROCEDURE Char (c: CHAR);
  18. VAR
  19. a: ARRAY 2 OF INTEGER;
  20. BEGIN
  21. a[0] := 8;
  22. a[1] := ORD(c);
  23. syscall(SYSTEM.ADR(a[0]))
  24. END Char;
  25. PROCEDURE String (s: ARRAY OF CHAR);
  26. VAR
  27. i: INTEGER;
  28. BEGIN
  29. i := 0;
  30. WHILE s[i] # 0X DO
  31. Char(s[i]);
  32. INC(i)
  33. END
  34. END String;
  35. PROCEDURE PString (ptr: INTEGER);
  36. VAR
  37. c: CHAR;
  38. BEGIN
  39. SYSTEM.GET(ptr, c);
  40. WHILE c # 0X DO
  41. Char(c);
  42. INC(ptr);
  43. SYSTEM.GET(ptr, c)
  44. END
  45. END PString;
  46. PROCEDURE Ln;
  47. BEGIN
  48. String(0DX + 0AX)
  49. END Ln;
  50. PROCEDURE IntToStr (x: INTEGER; VAR str: ARRAY OF CHAR);
  51. VAR
  52. i, a: INTEGER;
  53. BEGIN
  54. i := 0;
  55. a := x;
  56. REPEAT
  57. INC(i);
  58. a := a DIV 10
  59. UNTIL a = 0;
  60. str[i] := 0X;
  61. REPEAT
  62. DEC(i);
  63. str[i] := CHR(x MOD 10 + ORD("0"));
  64. x := x DIV 10
  65. UNTIL x = 0
  66. END IntToStr;
  67. PROCEDURE Int (x: INTEGER);
  68. VAR
  69. s: ARRAY 32 OF CHAR;
  70. BEGIN
  71. IntToStr(x, s);
  72. String(s)
  73. END Int;
  74. PROCEDURE trap* (modnum, _module, err, line: INTEGER);
  75. VAR
  76. s: ARRAY 32 OF CHAR;
  77. BEGIN
  78. CASE err OF
  79. | 1: s := "assertion failure"
  80. | 2: s := "NIL dereference"
  81. | 3: s := "bad divisor"
  82. | 4: s := "NIL procedure call"
  83. | 5: s := "type guard error"
  84. | 6: s := "index out of range"
  85. | 7: s := "invalid CASE"
  86. | 8: s := "array assignment error"
  87. | 9: s := "CHR out of range"
  88. |10: s := "WCHR out of range"
  89. |11: s := "BYTE out of range"
  90. END;
  91. Ln;
  92. String("error ("); Int(err); String("): "); String(s); Ln;
  93. String("module: "); PString(_module); Ln;
  94. String("line: "); Int(line); Ln;
  95. SYSTEM.CODE(0, 0, 0) (* STOP *)
  96. END trap;
  97. END Trap.