Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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