Subversion Repositories Kolibri OS

Rev

Rev 8097 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8097 Rev 8859
Line 1... Line 1...
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
Line 3... Line 3...
3
 
3
 
4
    Copyright (c) 2018-2020, Anton Krotov
4
    Copyright (c) 2018-2021, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 6... Line 6...
6
*)
6
*)
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
MODULE RTL;
8
MODULE RTL;
Line 9... Line -...
9
 
-
 
10
IMPORT SYSTEM, API;
-
 
11
 
9
 
Line 12... Line 10...
12
 
10
IMPORT SYSTEM, API;
13
CONST
-
 
Line 14... Line 11...
14
 
11
 
Line 15... Line 12...
15
    bit_depth* = 32;
12
 
Line 70... Line 67...
70
BEGIN
67
BEGIN
71
    _move(MIN(len_dst, len_src) * chr_size, dst, src)
68
    _move(MIN(len_dst, len_src) * chr_size, dst, src)
72
END _strcpy;
69
END _strcpy;
Line 73... Line 70...
73
 
70
 
74
 
-
 
75
PROCEDURE [stdcall] _rot* (VAR A: ARRAY OF INTEGER);
-
 
76
VAR
-
 
77
    i, n, k: INTEGER;
71
 
78
 
72
PROCEDURE [stdcall] _rot* (Len, Ptr: INTEGER);
-
 
73
BEGIN
-
 
74
    SYSTEM.CODE(
-
 
75
    08BH, 04DH, 008H,   (*  mov   ecx, dword [ebp +  8]  *)  (* ecx <- Len *)
-
 
76
    08BH, 045H, 00CH,   (*  mov   eax, dword [ebp + 12]  *)  (* eax <- Ptr *)
-
 
77
    049H,               (*  dec   ecx                    *)
-
 
78
    053H,               (*  push  ebx                    *)
-
 
79
    08BH, 018H,         (*  mov   ebx, dword [eax]       *)
79
BEGIN
80
                        (*  L:                           *)
80
    k := LEN(A) - 1;
81
    08BH, 050H, 004H,   (*  mov   edx, dword [eax + 4]   *)
-
 
82
    089H, 010H,         (*  mov   dword [eax], edx       *)
81
    n := A[0];
83
    083H, 0C0H, 004H,   (*  add   eax, 4                 *)
82
    i := 0;
84
    049H,               (*  dec   ecx                    *)
-
 
85
    075H, 0F5H,         (*  jnz   L                      *)
83
    WHILE i < k DO
86
    089H, 018H,         (*  mov   dword [eax], ebx       *)
-
 
87
    05BH,               (*  pop   ebx                    *)
84
        A[i] := A[i + 1];
88
    05DH,               (*  pop   ebp                    *)
85
        INC(i)
-
 
86
    END;
89
    0C2H, 008H, 000H    (*  ret   8                      *)
Line 87... Line 90...
87
    A[k] := n
90
    )
88
END _rot;
91
END _rot;
-
 
92
 
-
 
93
 
-
 
94
PROCEDURE [stdcall] _set* (b, a: INTEGER); (* {a..b} -> eax *)
-
 
95
BEGIN
-
 
96
    SYSTEM.CODE(
-
 
97
    08BH, 04DH, 008H,              (*  mov   ecx, dword [ebp +  8]  *)  (* ecx <- b *)
89
 
98
    08BH, 045H, 00CH,              (*  mov   eax, dword [ebp + 12]  *)  (* eax <- a *)
-
 
99
    039H, 0C8H,                    (*  cmp   eax, ecx               *)
-
 
100
    07FH, 033H,                    (*  jg    L1                     *)
-
 
101
    083H, 0F8H, 01FH,              (*  cmp   eax, 31                *)
-
 
102
    07FH, 02EH,                    (*  jg    L1                     *)
-
 
103
    085H, 0C9H,                    (*  test  ecx, ecx               *)
-
 
104
    07CH, 02AH,                    (*  jl    L1                     *)
-
 
105
    083H, 0F9H, 01FH,              (*  cmp   ecx, 31                *)
-
 
106
    07EH, 005H,                    (*  jle   L3                     *)
-
 
107
    0B9H, 01FH, 000H, 000H, 000H,  (*  mov   ecx, 31                *)
-
 
108
                                   (*  L3:                          *)
90
 
109
    085H, 0C0H,                    (*  test  eax, eax               *)
91
PROCEDURE [stdcall] _set* (b, a: INTEGER): INTEGER;
110
    07DH, 002H,                    (*  jge   L2                     *)
-
 
111
    031H, 0C0H,                    (*  xor   eax, eax               *)
92
BEGIN
112
                                   (*  L2:                          *)
93
    IF (a <= b) & (a <= MAX_SET) & (b >= 0) THEN
113
    089H, 0CAH,                    (*  mov   edx, ecx               *)
-
 
114
    029H, 0C2H,                    (*  sub   edx, eax               *)
-
 
115
    0B8H, 000H, 000H, 000H, 080H,  (*  mov   eax, 0x80000000        *)
-
 
116
    087H, 0CAH,                    (*  xchg  edx, ecx               *)
94
        IF b > MAX_SET THEN
117
    0D3H, 0F8H,                    (*  sar   eax, cl                *)
95
            b := MAX_SET
118
    087H, 0CAH,                    (*  xchg  edx, ecx               *)
96
        END;
119
    083H, 0E9H, 01FH,              (*  sub   ecx, 31                *)
97
        IF a < 0 THEN
120
    0F7H, 0D9H,                    (*  neg   ecx                    *)
98
            a := 0
121
    0D3H, 0E8H,                    (*  shr   eax, cl                *)
-
 
122
    05DH,                          (*  pop   ebp                    *)
-
 
123
    0C2H, 008H, 000H,              (*  ret   8                      *)
99
        END;
124
                                   (*  L1:                          *)
100
        a := LSR(ASR(minint, b - a), MAX_SET - b)
-
 
101
    ELSE
-
 
102
        a := 0
125
    031H, 0C0H,                    (*  xor   eax, eax               *)
Line 103... Line 126...
103
    END
126
    05DH,                          (*  pop   ebp                    *)
104
 
127
    0C2H, 008H, 000H               (*  ret   8                      *)