Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8097 maxcodehac 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.