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