Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7693 Rev 7696
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, 2019, Anton Krotov
4
    Copyright (c) 2018-2019, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 6... Line 6...
6
*)
6
*)
Line 94... Line 94...
94
    opLADR_INC* = -16; opLADR_DEC* = -17; opLADR_INCB* = -18; opLADR_DECB* = -19;
94
    opLADR_INC* = -16; opLADR_DEC* = -17; opLADR_INCB* = -18; opLADR_DECB* = -19;
95
    opLADR_INCL* = -20; opLADR_EXCL* = -21; opLADR_INCLC* = -22; opLADR_EXCLC* = -23;
95
    opLADR_INCL* = -20; opLADR_EXCL* = -21; opLADR_INCLC* = -22; opLADR_EXCLC* = -23;
96
    opLADR_UNPK* = -24;
96
    opLADR_UNPK* = -24;
Line 97... Line 97...
97
 
97
 
98
 
98
 
99
    _move      *=   0;
99
    _init      *=   0;
100
    _move2     *=   1;
100
    _move      *=   1;
101
    _strcmpw   *=   2;
101
    _strcmpw   *=   2;
102
    _exit      *=   3;
102
    _exit      *=   3;
103
    _set       *=   4;
103
    _set       *=   4;
104
    _set2      *=   5;
104
    _set1      *=   5;
105
    _lengthw   *=   6;
105
    _lengthw   *=   6;
106
    _strcpy    *=   7;
106
    _strcpy    *=   7;
107
    _div       *=   8;
107
    _length    *=   8;
108
    _mod       *=   9;
108
    _divmod    *=   9;
109
    _div2      *=  10;
109
    _dllentry  *=  10;
110
    _mod2      *=  11;
110
    _sofinit   *=  11;
111
    _arrcpy    *=  12;
111
    _arrcpy    *=  12;
112
    _rot       *=  13;
112
    _rot       *=  13;
113
    _new       *=  14;
113
    _new       *=  14;
114
    _dispose   *=  15;
114
    _dispose   *=  15;
115
    _strcmp    *=  16;
115
    _strcmp    *=  16;
116
    _error     *=  17;
116
    _error     *=  17;
117
    _is        *=  18;
117
    _is        *=  18;
118
    _isrec     *=  19;
118
    _isrec     *=  19;
119
    _guard     *=  20;
-
 
120
    _guardrec  *=  21;
-
 
121
    _length    *=  22;
-
 
122
    _init      *=  23;
-
 
Line 123... Line 119...
123
    _dllentry  *=  24;
119
    _guard     *=  20;
Line 124... Line 120...
124
    _sofinit   *=  25;
120
    _guardrec  *=  21;
Line 173... Line 169...
173
        count:  INTEGER
169
        count:  INTEGER
Line 174... Line 170...
174
 
170
 
Line 175... Line 171...
175
    END;
171
    END;
Line 176... Line 172...
176
 
172
 
177
 
173
 
178
    CODES* = POINTER TO RECORD
174
    CODES = RECORD
179
 
175
 
Line 186... Line 182...
186
        types*:     CHL.INTLIST;
182
        types*:     CHL.INTLIST;
187
        data*:      CHL.BYTELIST;
183
        data*:      CHL.BYTELIST;
188
        dmin*:      INTEGER;
184
        dmin*:      INTEGER;
189
        lcount*:    INTEGER;
185
        lcount*:    INTEGER;
190
        bss*:       INTEGER;
186
        bss*:       INTEGER;
191
        rtl*:       ARRAY 26 OF INTEGER;
187
        rtl*:       ARRAY 22 OF INTEGER;
192
        errlabels*: ARRAY 12 OF INTEGER;
188
        errlabels*: ARRAY 12 OF INTEGER;
Line 193... Line 189...
193
 
189
 
194
        charoffs:   ARRAY 256 OF INTEGER;
190
        charoffs:   ARRAY 256 OF INTEGER;
Line 206... Line 202...
206
    numRegsFloat: INTEGER;
202
    numRegsFloat: INTEGER;
Line 207... Line 203...
207
 
203
 
Line -... Line 204...
-
 
204
    commands, variables: C.COLLECTION;
-
 
205
 
-
 
206
 
-
 
207
PROCEDURE set_dmin* (value: INTEGER);
-
 
208
BEGIN
-
 
209
    codes.dmin := value
-
 
210
END set_dmin;
-
 
211
 
-
 
212
 
-
 
213
PROCEDURE set_bss* (value: INTEGER);
-
 
214
BEGIN
-
 
215
    codes.bss := value
-
 
216
END set_bss;
-
 
217
 
-
 
218
 
-
 
219
PROCEDURE set_rtl* (idx, label: INTEGER);
-
 
220
BEGIN
-
 
221
    codes.rtl[idx] := label
208
    commands, variables: C.COLLECTION;
222
END set_rtl;
209
 
223
 
210
 
224
 
211
PROCEDURE NewCmd (): COMMAND;
225
PROCEDURE NewCmd (): COMMAND;
Line 255... Line 269...
255
PROCEDURE getlast* (): COMMAND;
269
PROCEDURE getlast* (): COMMAND;
256
    RETURN codes.last
270
    RETURN codes.last
257
END getlast;
271
END getlast;
Line 258... Line 272...
258
 
272
 
259
 
273
 
260
PROCEDURE PutByte (codes: CODES; b: BYTE);
274
PROCEDURE PutByte (b: BYTE);
261
BEGIN
275
BEGIN
Line 270... Line 284...
270
    res := CHL.Length(codes.data);
284
    res := CHL.Length(codes.data);
Line 271... Line 285...
271
 
285
 
272
    i := 0;
286
    i := 0;
273
    n := LENGTH(s);
287
    n := LENGTH(s);
274
    WHILE i < n DO
288
    WHILE i < n DO
275
        PutByte(codes, ORD(s[i]));
289
        PutByte(ORD(s[i]));
276
        INC(i)
290
        INC(i)
Line 277... Line 291...
277
    END;
291
    END;
Line 278... Line 292...
278
 
292
 
279
    PutByte(codes, 0)
293
    PutByte(0)
Line 287... Line 301...
287
    res: INTEGER;
301
    res: INTEGER;
Line 288... Line 302...
288
 
302
 
289
BEGIN
303
BEGIN
290
    IF codes.charoffs[c] = -1 THEN
304
    IF codes.charoffs[c] = -1 THEN
291
        res := CHL.Length(codes.data);
305
        res := CHL.Length(codes.data);
292
        PutByte(codes, c);
306
        PutByte(c);
293
        PutByte(codes, 0);
307
        PutByte(0);
294
        codes.charoffs[c] := res
308
        codes.charoffs[c] := res
295
    ELSE
309
    ELSE
296
        res := codes.charoffs[c]
310
        res := codes.charoffs[c]
Line 306... Line 320...
306
 
320
 
307
BEGIN
321
BEGIN
Line 308... Line 322...
308
    res := CHL.Length(codes.data);
322
    res := CHL.Length(codes.data);
309
 
323
 
310
    IF ODD(res) THEN
324
    IF ODD(res) THEN
311
        PutByte(codes, 0);
325
        PutByte(0);
Line 312... Line 326...
312
        INC(res)
326
        INC(res)
Line 313... Line 327...
313
    END;
327
    END;
314
 
328
 
315
    n := STRINGS.Utf8To16(s, codes.wstr);
329
    n := STRINGS.Utf8To16(s, codes.wstr);
316
 
330
 
317
    i := 0;
331
    i := 0;
318
    WHILE i < n DO
332
    WHILE i < n DO
319
        IF endianness = little_endian THEN
333
        IF endianness = little_endian THEN
320
            PutByte(codes, ORD(codes.wstr[i]) MOD 256);
334
            PutByte(ORD(codes.wstr[i]) MOD 256);
321
            PutByte(codes, ORD(codes.wstr[i]) DIV 256)
335
            PutByte(ORD(codes.wstr[i]) DIV 256)
322
        ELSIF endianness = big_endian THEN
336
        ELSIF endianness = big_endian THEN
323
            PutByte(codes, ORD(codes.wstr[i]) DIV 256);
337
            PutByte(ORD(codes.wstr[i]) DIV 256);
Line 324... Line 338...
324
            PutByte(codes, ORD(codes.wstr[i]) MOD 256)
338
            PutByte(ORD(codes.wstr[i]) MOD 256)
325
        END;
339
        END;
Line 326... Line 340...
326
        INC(i)
340
        INC(i)
327
    END;
341
    END;
Line 340... Line 354...
340
BEGIN
354
BEGIN
341
    IF codes.wcharoffs[c] = -1 THEN
355
    IF codes.wcharoffs[c] = -1 THEN
342
        res := CHL.Length(codes.data);
356
        res := CHL.Length(codes.data);
Line 343... Line 357...
343
 
357
 
344
        IF ODD(res) THEN
358
        IF ODD(res) THEN
345
            PutByte(codes, 0);
359
            PutByte(0);
346
            INC(res)
360
            INC(res)
Line 347... Line 361...
347
        END;
361
        END;
348
 
362
 
349
        IF endianness = little_endian THEN
363
        IF endianness = little_endian THEN
350
            PutByte(codes, c MOD 256);
364
            PutByte(c MOD 256);
351
            PutByte(codes, c DIV 256)
365
            PutByte(c DIV 256)
352
        ELSIF endianness = big_endian THEN
366
        ELSIF endianness = big_endian THEN
353
            PutByte(codes, c DIV 256);
367
            PutByte(c DIV 256);
Line 354... Line 368...
354
            PutByte(codes, c MOD 256)
368
            PutByte(c MOD 256)
355
        END;
369
        END;
Line 356... Line 370...
356
 
370
 
357
        PutByte(codes, 0);
371
        PutByte(0);
358
        PutByte(codes, 0);
372
        PutByte(0);
359
 
373
 
Line 933... Line 947...
933
    INC(codes.fregs)
947
    INC(codes.fregs)
934
    RETURN codes.fregs < numRegsFloat
948
    RETURN codes.fregs < numRegsFloat
935
END flt;
949
END flt;
Line 936... Line -...
936
 
-
 
937
 
-
 
938
PROCEDURE odd*;
-
 
939
BEGIN
-
 
940
    AddCmd0(opODD)
-
 
941
END odd;
-
 
942
 
-
 
943
 
-
 
944
PROCEDURE ord*;
-
 
945
BEGIN
-
 
946
    AddCmd0(opORD)
-
 
947
END ord;
-
 
948
 
950
 
949
 
951
 
950
PROCEDURE shift_minmax* (op: CHAR);
952
PROCEDURE shift_minmax* (op: CHAR);
951
BEGIN
953
BEGIN
952
    CASE op OF
954
    CASE op OF
Line 1145... Line 1147...
1145
    commands := C.create();
1147
    commands := C.create();
1146
    variables := C.create();
1148
    variables := C.create();
1147
    numRegsFloat := pNumRegsFloat;
1149
    numRegsFloat := pNumRegsFloat;
1148
    endianness := pEndianness;
1150
    endianness := pEndianness;
Line 1149... Line -...
1149
 
-
 
1150
    NEW(codes);
1151
 
1151
    NEW(codes.begcall);
1152
    NEW(codes.begcall);
1152
    codes.begcall.top := -1;
1153
    codes.begcall.top := -1;
1153
    NEW(codes.endcall);
1154
    NEW(codes.endcall);
1154
    codes.endcall.top := -1;
1155
    codes.endcall.top := -1;