Subversion Repositories Kolibri OS

Rev

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

Rev 7696 Rev 7983
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-2020, 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 STATEMENTS;
8
MODULE STATEMENTS;
9
 
9
 
Line 10... Line 10...
10
IMPORT
10
IMPORT
Line 11... Line 11...
11
 
11
 
Line 27... Line 27...
27
 
27
 
Line 28... Line 28...
28
    chkIDX* = 0; chkGUARD* = 1; chkPTR* = 2; chkCHR* = 3; chkWCHR* = 4; chkBYTE* = 5;
28
    chkIDX* = 0; chkGUARD* = 1; chkPTR* = 2; chkCHR* = 3; chkWCHR* = 4; chkBYTE* = 5;
Line 29... Line -...
29
 
-
 
30
    chkALL* = {chkIDX, chkGUARD, chkPTR, chkCHR, chkWCHR, chkBYTE};
-
 
Line 31... Line 29...
31
 
29
 
Line 32... Line 30...
32
    cpuX86 = 1; cpuAMD64 = 2; cpuMSP430 = 3;
30
    chkALL* = {chkIDX, chkGUARD, chkPTR, chkCHR, chkWCHR, chkBYTE};
Line 416... Line 414...
416
            END
414
            END
417
        ELSIF isReal(e) & (VarType = tREAL) THEN
415
        ELSIF isReal(e) & (VarType = tREAL) THEN
418
            IF e.obj = eCONST THEN
416
            IF e.obj = eCONST THEN
419
                IL.Float(ARITH.Float(e.value))
417
                IL.Float(ARITH.Float(e.value))
420
            END;
418
            END;
421
            IL.savef
419
            IL.savef(e.obj = eCONST)
422
        ELSIF isChar(e) & (VarType = tCHAR) THEN
420
        ELSIF isChar(e) & (VarType = tCHAR) THEN
423
            IF e.obj = eCONST THEN
421
            IF e.obj = eCONST THEN
424
                IL.AddCmd(IL.opSAVE8C, ARITH.Int(e.value))
422
                IL.AddCmd(IL.opSAVE8C, ARITH.Int(e.value))
425
            ELSE
423
            ELSE
426
                IL.AddCmd0(IL.opSAVE8)
424
                IL.AddCmd0(IL.opSAVE8)
Line 498... Line 496...
498
 
496
 
499
 
497
 
500
    PROCEDURE ArrLen (t: PROG.TYPE_; n: INTEGER): INTEGER;
498
    PROCEDURE ArrLen (t: PROG.TYPE_; n: INTEGER): INTEGER;
-
 
499
    VAR
501
    VAR
500
        res: INTEGER;
502
        res: INTEGER;
501
 
503
    BEGIN
502
    BEGIN
504
        REPEAT
503
        REPEAT
505
            res := t.length;
504
            res := t.length;
Line 511... Line 510...
511
    END ArrLen;
510
    END ArrLen;
Line 512... Line 511...
512
 
511
 
513
 
512
 
514
    PROCEDURE OpenArray (t, t2: PROG.TYPE_);
-
 
515
    VAR
513
    PROCEDURE OpenArray (t, t2: PROG.TYPE_);
-
 
514
    VAR
516
        n: INTEGER;
515
        n, d1, d2: INTEGER;
517
        d1, d2: INTEGER;
516
 
518
    BEGIN
517
    BEGIN
519
        IF t.length # 0 THEN
518
        IF t.length # 0 THEN
520
            IL.Param1;
519
            IL.Param1;
Line 604... Line 603...
604
                ELSIF (e.type.typ = PROG.tSTRING) OR
603
                ELSIF (e.type.typ = PROG.tSTRING) OR
605
                      (e.type.typ IN {PROG.tCHAR, PROG.tWCHAR}) & (p.type.typ = PROG.tARRAY) & (p.type.base.typ IN {PROG.tCHAR, PROG.tWCHAR}) THEN
604
                      (e.type.typ IN {PROG.tCHAR, PROG.tWCHAR}) & (p.type.typ = PROG.tARRAY) & (p.type.base.typ IN {PROG.tCHAR, PROG.tWCHAR}) THEN
606
                    IF p.type.base = tCHAR THEN
605
                    IF p.type.base = tCHAR THEN
607
                        stroffs := String(e);
606
                        stroffs := String(e);
608
                        IL.StrAdr(stroffs);
607
                        IL.StrAdr(stroffs);
609
                        IF (CPU = cpuMSP430) & (p.type.size - strlen(e) - 1 > MSP430.IntVectorSize) THEN
608
                        IF (CPU = TARGETS.cpuMSP430) & (p.type.size - strlen(e) - 1 > MSP430.IntVectorSize) THEN
610
                            ERRORS.WarningMsg(pos.line, pos.col, 0)
609
                            ERRORS.WarningMsg(pos.line, pos.col, 0)
611
                        END
610
                        END
612
                    ELSE (* WCHAR *)
611
                    ELSE (* WCHAR *)
613
                        stroffs := StringW(e);
612
                        stroffs := StringW(e);
614
                        IL.StrAdr(stroffs)
613
                        IL.StrAdr(stroffs)
Line 646... Line 645...
646
END PExpression;
645
END PExpression;
Line 647... Line 646...
647
 
646
 
648
 
647
 
649
PROCEDURE stProc (parser: PARS.PARSER; VAR e: PARS.EXPR);
648
PROCEDURE stProc (parser: PARS.PARSER; VAR e: PARS.EXPR);
650
VAR
649
VAR
651
    e2:    PARS.EXPR;
650
    e1, e2: PARS.EXPR;
652
    pos:   PARS.POSITION;
651
    pos:    PARS.POSITION;
653
    proc:  INTEGER;
652
    proc,
654
    label: INTEGER;
653
    label,
655
    n, i:  INTEGER;
654
    n, i:   INTEGER;
656
    code:  ARITH.VALUE;
655
    code:   ARITH.VALUE;
657
    e1:    PARS.EXPR;
656
    wchar,
658
    wchar: BOOLEAN;
657
    comma:  BOOLEAN;
659
    cmd1,
-
 
Line 660... Line 658...
660
    cmd2:  IL.COMMAND;
658
    cmd1,
661
    comma: BOOLEAN;
659
    cmd2:   IL.COMMAND;
662
 
660
 
Line 673... Line 671...
673
 
671
 
674
 
672
 
675
    PROCEDURE shift_minmax (proc: INTEGER): CHAR;
673
    PROCEDURE shift_minmax (proc: INTEGER): CHAR;
-
 
674
    VAR
676
    VAR
675
        res: CHAR;
677
        res: CHAR;
676
 
678
    BEGIN
677
    BEGIN
679
        CASE proc OF
678
        CASE proc OF
680
        |PROG.stASR: res := "A"
679
        |PROG.stASR: res := "A"
Line 775... Line 774...
775
            END;
774
            END;
776
            IL.popBegEnd(begcall, endcall)
775
            IL.popBegEnd(begcall, endcall)
Line 777... Line 776...
777
 
776
 
778
        |PROG.stNEW:
777
        |PROG.stNEW:
779
            varparam(parser, pos, isPtr, TRUE, e);
778
            varparam(parser, pos, isPtr, TRUE, e);
780
            IF CPU = cpuMSP430 THEN
779
            IF CPU = TARGETS.cpuMSP430 THEN
781
                PARS.check(e.type.base.size + 16 < Options.ram, pos, 63)
780
                PARS.check(e.type.base.size + 16 < Options.ram, pos, 63)
782
            END;
781
            END;
Line 783... Line 782...
783
            IL.New(e.type.base.size, e.type.base.num)
782
            IL.New(e.type.base.size, e.type.base.num)
Line 883... Line 882...
883
 
882
 
884
            IF proc = PROG.sysPUT THEN
883
            IF proc = PROG.sysPUT THEN
885
                PARS.check(e2.type.typ IN PROG.BASICTYPES + {PROG.tPOINTER, PROG.tPROCEDURE}, pos, 66);
884
                PARS.check(e2.type.typ IN PROG.BASICTYPES + {PROG.tPOINTER, PROG.tPROCEDURE}, pos, 66);
886
                IF e2.obj = eCONST THEN
885
                IF e2.obj = eCONST THEN
887
                    IF e2.type = tREAL THEN
-
 
888
                        IL.setlast(endcall.prev(IL.COMMAND));
886
                    IF e2.type = tREAL THEN
-
 
887
                        IL.Float(ARITH.Float(e2.value));
889
                        IL.Float(ARITH.Float(e2.value));
888
                        IL.setlast(endcall.prev(IL.COMMAND));
890
                        IL.savef
889
                        IL.savef(FALSE)
891
                    ELSE
890
                    ELSE
892
                        LoadConst(e2);
891
                        LoadConst(e2);
893
                        IL.setlast(endcall.prev(IL.COMMAND));
892
                        IL.setlast(endcall.prev(IL.COMMAND));
894
                        IL.SysPut(e2.type.size)
893
                        IL.SysPut(e2.type.size)
895
                    END
894
                    END
896
                ELSE
895
                ELSE
897
                    IL.setlast(endcall.prev(IL.COMMAND));
896
                    IL.setlast(endcall.prev(IL.COMMAND));
898
                    IF e2.type = tREAL THEN
897
                    IF e2.type = tREAL THEN
899
                        IL.savef
898
                        IL.savef(FALSE)
900
                    ELSIF e2.type = tBYTE THEN
899
                    ELSIF e2.type = tBYTE THEN
901
                        IL.SysPut(tINTEGER.size)
900
                        IL.SysPut(tINTEGER.size)
902
                    ELSE
901
                    ELSE
903
                        IL.SysPut(e2.type.size)
902
                        IL.SysPut(e2.type.size)
Line 960... Line 959...
960
        |PROG.sysCODE:
959
        |PROG.sysCODE:
961
            REPEAT
960
            REPEAT
962
                getpos(parser, pos);
961
                getpos(parser, pos);
963
                PARS.ConstExpression(parser, code);
962
                PARS.ConstExpression(parser, code);
964
                PARS.check(code.typ = ARITH.tINTEGER, pos, 43);
963
                PARS.check(code.typ = ARITH.tINTEGER, pos, 43);
965
                IF CPU # cpuMSP430 THEN
964
                IF CPU IN {TARGETS.cpuX86, TARGETS.cpuAMD64} THEN
966
                    PARS.check(ARITH.range(code, 0, 255), pos, 42)
965
                    PARS.check(ARITH.range(code, 0, 255), pos, 42)
-
 
966
                ELSIF CPU = TARGETS.cpuTHUMB THEN
-
 
967
                    PARS.check(ARITH.range(code, 0, 65535), pos, 110)
967
                END;
968
                END;
968
                IL.AddCmd(IL.opCODE, ARITH.getInt(code));
969
                IL.AddCmd(IL.opCODE, ARITH.getInt(code));
969
                comma := parser.sym = SCAN.lxCOMMA;
970
                comma := parser.sym = SCAN.lxCOMMA;
970
                IF comma THEN
971
                IF comma THEN
971
                    PARS.Next(parser)
972
                    PARS.Next(parser)
Line 1111... Line 1112...
1111
            PARS.check(isInt(e), pos, 66);
1112
            PARS.check(isInt(e), pos, 66);
1112
            e.type := tBOOLEAN;
1113
            e.type := tBOOLEAN;
1113
            IF e.obj = eCONST THEN
1114
            IF e.obj = eCONST THEN
1114
                ARITH.odd(e.value)
1115
                ARITH.odd(e.value)
1115
            ELSE
1116
            ELSE
1116
                IL.AddCmd0(IL.opODD)
1117
                IL.AddCmd(IL.opMODR, 2)
1117
            END
1118
            END
Line 1118... Line 1119...
1118
 
1119
 
1119
        |PROG.stORD:
1120
        |PROG.stORD:
1120
            PExpression(parser, e);
1121
            PExpression(parser, e);
Line 1407... Line 1408...
1407
    END LoadAdr;
1408
    END LoadAdr;
Line 1408... Line 1409...
1408
 
1409
 
1409
 
1410
 
1410
    PROCEDURE OpenIdx (parser: PARS.PARSER; pos: PARS.POSITION; e: PARS.EXPR);
1411
    PROCEDURE OpenIdx (parser: PARS.PARSER; pos: PARS.POSITION; e: PARS.EXPR);
1411
    VAR
1412
    VAR
1412
        label:  INTEGER;
-
 
Line 1413... Line 1413...
1413
        type:   PROG.TYPE_;
1413
        label, offset, n, k: INTEGER;
Line 1414... Line 1414...
1414
        n, offset, k: INTEGER;
1414
        type: PROG.TYPE_;
1415
 
1415
 
Line 1569... Line 1569...
1569
END designator;
1569
END designator;
Line 1570... Line 1570...
1570
 
1570
 
1571
 
1571
 
1572
PROCEDURE ProcCall (e: PARS.EXPR; procType: PROG.TYPE_; isfloat: BOOLEAN; VAR fregs: INTEGER; parser: PARS.PARSER; pos: PARS.POSITION; CallStat: BOOLEAN);
1572
PROCEDURE ProcCall (e: PARS.EXPR; procType: PROG.TYPE_; isfloat: BOOLEAN; VAR fregs: INTEGER; parser: PARS.PARSER; pos: PARS.POSITION; CallStat: BOOLEAN);
1573
VAR
1573
VAR
1574
    cconv:     INTEGER;
1574
    cconv,
1575
    parSize:   INTEGER;
1575
    parSize,
1576
    callconv:  INTEGER;
1576
    callconv,
1577
    fparSize:  INTEGER;
1577
    fparSize,
Line 1578... Line 1578...
1578
    int, flt:  INTEGER;
1578
    int, flt,
1579
    stk_par:   INTEGER;
1579
    stk_par:  INTEGER;
1580
 
1580
 
Line 1860... Line 1860...
1860
 
1860
 
1861
 
1861
 
1862
    PROCEDURE term (parser: PARS.PARSER; VAR e: PARS.EXPR);
1862
    PROCEDURE term (parser: PARS.PARSER; VAR e: PARS.EXPR);
1863
    VAR
-
 
1864
        pos: PARS.POSITION;
1863
    VAR
1865
        op:  INTEGER;
-
 
1866
        e1:  PARS.EXPR;
-
 
1867
 
1864
        pos: PARS.POSITION;
Line 1868... Line 1865...
1868
        label:  INTEGER;
1865
        e1:  PARS.EXPR;
1869
        label1: INTEGER;
1866
        op, label, label1: INTEGER;
1870
 
1867
 
Line 1970... Line 1967...
1970
                END
1967
                END
Line 1971... Line 1968...
1971
 
1968
 
1972
            |SCAN.lxDIV, SCAN.lxMOD:
1969
            |SCAN.lxDIV, SCAN.lxMOD:
1973
                PARS.check(isInt(e) & isInt(e1), pos, 37);
1970
                PARS.check(isInt(e) & isInt(e1), pos, 37);
1974
                IF e1.obj = eCONST THEN
-
 
1975
                    PARS.check(~ARITH.isZero(e1.value), pos, 46);
-
 
1976
                    IF CPU = cpuMSP430 THEN
1971
                IF e1.obj = eCONST THEN
1977
                        PARS.check(ARITH.Int(e1.value) > 0, pos, 122)
-
 
1978
                    END
1972
                    PARS.check(ARITH.Int(e1.value) > 0, pos, 122)
1979
                END;
1973
                END;
Line 1980... Line 1974...
1980
                IF (e.obj = eCONST) & (e1.obj = eCONST) THEN
1974
                IF (e.obj = eCONST) & (e1.obj = eCONST) THEN
1981
 
1975
 
Line 1986... Line 1980...
1986
                    END
1980
                    END
Line 1987... Line 1981...
1987
 
1981
 
1988
                ELSE
1982
                ELSE
1989
                    IF e1.obj # eCONST THEN
1983
                    IF e1.obj # eCONST THEN
1990
                        label1 := IL.NewLabel();
-
 
1991
                        IF CPU = cpuMSP430 THEN
1984
                        label1 := IL.NewLabel();
1992
                            IL.AddJmpCmd(IL.opJG, label1)
-
 
1993
                        ELSE
-
 
1994
                            IL.AddJmpCmd(IL.opJNZ, label1)
-
 
1995
                        END
1985
                        IL.AddJmpCmd(IL.opJG, label1)
1996
                    END;
1986
                    END;
1997
                    IF e.obj = eCONST THEN
1987
                    IF e.obj = eCONST THEN
1998
                        IL.OnError(pos.line, errDIV);
1988
                        IL.OnError(pos.line, errDIV);
1999
                        IL.SetLabel(label1);
1989
                        IL.SetLabel(label1);
Line 2221... Line 2211...
2221
    PROCEDURE strcmp (VAR e, e1: PARS.EXPR; op: INTEGER): BOOLEAN;
2211
    PROCEDURE strcmp (VAR e, e1: PARS.EXPR; op: INTEGER): BOOLEAN;
2222
    VAR
2212
    VAR
2223
        res: BOOLEAN;
2213
        res: BOOLEAN;
Line 2224... Line 2214...
2224
 
2214
 
2225
    BEGIN
-
 
2226
 
2215
    BEGIN
Line 2227... Line 2216...
2227
        res := TRUE;
2216
        res := TRUE;
2228
 
2217
 
2229
        IF isString(e) & isCharArray(e1) THEN
2218
        IF isString(e) & isCharArray(e1) THEN
Line 3024... Line 3013...
3024
    IF e.obj = eCONST THEN
3013
    IF e.obj = eCONST THEN
3025
        LoadConst(e)
3014
        LoadConst(e)
3026
    ELSIF isRec(e) THEN
3015
    ELSIF isRec(e) THEN
3027
        IL.drop;
3016
        IL.drop;
3028
        IL.AddCmd(IL.opLADR, e.ident.offset - 1);
3017
        IL.AddCmd(IL.opLADR, e.ident.offset - 1);
3029
        IL.load(PARS.program.target.word)
3018
        IL.load(TARGETS.WordSize)
3030
    ELSIF isPtr(e) THEN
3019
    ELSIF isPtr(e) THEN
3031
        deref(pos, e, FALSE, errPTR);
3020
        deref(pos, e, FALSE, errPTR);
3032
        IL.AddCmd(IL.opSUBR, PARS.program.target.word);
3021
        IL.AddCmd(IL.opSUBR, TARGETS.WordSize);
3033
        IL.load(PARS.program.target.word)
3022
        IL.load(TARGETS.WordSize)
3034
    END;
3023
    END;
Line 3035... Line 3024...
3035
 
3024
 
3036
    PARS.checklex(parser, SCAN.lxOF);
3025
    PARS.checklex(parser, SCAN.lxOF);
3037
    PARS.Next(parser);
3026
    PARS.Next(parser);
Line 3241... Line 3230...
3241
 
3230
 
3242
BEGIN
3231
BEGIN
3243
    rtl := PARS.program.rtl;
3232
    rtl := PARS.program.rtl;
Line 3244... Line -...
3244
    ASSERT(rtl # NIL);
-
 
3245
 
3233
    ASSERT(rtl # NIL);
3246
    IF CPU IN {cpuX86, cpuAMD64} THEN
3234
 
3247
        getproc(rtl,  "_strcmp",    IL._strcmp);
3235
    getproc(rtl, "_strcmp",   IL._strcmp);
3248
        getproc(rtl,  "_length",    IL._length);
3236
    getproc(rtl, "_length",   IL._length);
3249
        getproc(rtl,  "_arrcpy",    IL._arrcpy);
3237
    getproc(rtl, "_arrcpy",   IL._arrcpy);
3250
        getproc(rtl,  "_is",        IL._is);
3238
    getproc(rtl, "_is",       IL._is);
3251
        getproc(rtl,  "_guard",     IL._guard);
-
 
3252
        getproc(rtl,  "_guardrec",  IL._guardrec);
3239
    getproc(rtl, "_guard",    IL._guard);
3253
        getproc(rtl,  "_error",     IL._error);
3240
    getproc(rtl, "_guardrec", IL._guardrec);
3254
        getproc(rtl,  "_new",       IL._new);
3241
    getproc(rtl, "_new",      IL._new);
3255
        getproc(rtl,  "_rot",       IL._rot);
3242
    getproc(rtl, "_rot",      IL._rot);
3256
        getproc(rtl,  "_strcpy",    IL._strcpy);
-
 
3257
        getproc(rtl,  "_move",      IL._move);
3243
    getproc(rtl, "_strcpy",   IL._strcpy);
3258
        getproc(rtl,  "_divmod",    IL._divmod);
3244
    getproc(rtl, "_move",     IL._move);
3259
        getproc(rtl,  "_set",       IL._set);
-
 
3260
        getproc(rtl,  "_set1",      IL._set1);
3245
    getproc(rtl, "_set",      IL._set);
3261
        getproc(rtl,  "_isrec",     IL._isrec);
3246
    getproc(rtl, "_set1",     IL._set1);
3262
        getproc(rtl,  "_lengthw",   IL._lengthw);
-
 
3263
        getproc(rtl,  "_strcmpw",   IL._strcmpw);
-
 
3264
        getproc(rtl,  "_dllentry",  IL._dllentry);
-
 
3265
        getproc(rtl,  "_dispose",   IL._dispose);
3247
    getproc(rtl, "_lengthw",  IL._lengthw);
-
 
3248
    getproc(rtl, "_strcmpw",  IL._strcmpw);
-
 
3249
    getproc(rtl, "_init",     IL._init);
-
 
3250
 
-
 
3251
    IF CPU IN {TARGETS.cpuX86, TARGETS.cpuAMD64} THEN
-
 
3252
        getproc(rtl, "_error",    IL._error);
-
 
3253
        getproc(rtl, "_divmod",   IL._divmod);
-
 
3254
        getproc(rtl, "_exit",     IL._exit);
-
 
3255
        getproc(rtl, "_dispose",  IL._dispose);
3266
        getproc(rtl,  "_exit",      IL._exit);
3256
        getproc(rtl, "_isrec",    IL._isrec);
-
 
3257
        getproc(rtl, "_dllentry", IL._dllentry);
-
 
3258
        getproc(rtl, "_sofinit",  IL._sofinit)
-
 
3259
    ELSIF CPU = TARGETS.cpuTHUMB THEN
-
 
3260
        getproc(rtl, "_fmul",  IL._fmul);
-
 
3261
        getproc(rtl, "_fdiv",  IL._fdiv);
-
 
3262
        getproc(rtl, "_fdivi", IL._fdivi);
-
 
3263
        getproc(rtl, "_fadd",  IL._fadd);
-
 
3264
        getproc(rtl, "_fsub",  IL._fsub);
-
 
3265
        getproc(rtl, "_fsubi", IL._fsubi);
-
 
3266
        getproc(rtl, "_fcmp",  IL._fcmp);
-
 
3267
        getproc(rtl, "_floor", IL._floor);
-
 
3268
        getproc(rtl, "_flt",   IL._flt);
3267
        getproc(rtl,  "_init",      IL._init);
3269
        getproc(rtl, "_pack",  IL._pack);
Line 3268... Line 3270...
3268
        getproc(rtl,  "_sofinit",   IL._sofinit)
3270
        getproc(rtl, "_unpk",  IL._unpk)
Line 3284... Line 3286...
3284
    tBOOLEAN := PARS.program.stTypes.tBOOLEAN;
3286
    tBOOLEAN := PARS.program.stTypes.tBOOLEAN;
3285
    tWCHAR   := PARS.program.stTypes.tWCHAR;
3287
    tWCHAR   := PARS.program.stTypes.tWCHAR;
3286
    tREAL    := PARS.program.stTypes.tREAL;
3288
    tREAL    := PARS.program.stTypes.tREAL;
Line 3287... Line 3289...
3287
 
3289
 
-
 
3290
    Options := options;
Line 3288... Line -...
3288
    Options := options;
-
 
3289
 
-
 
3290
    CASE target OF
-
 
3291
    |mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64, mConst.Target_iELF64, mConst.Target_iELFSO64:
-
 
3292
        CPU := cpuAMD64
-
 
3293
    |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL,
-
 
3294
     mConst.Target_iKolibri, mConst.Target_iObject, mConst.Target_iELF32,
-
 
3295
     mConst.Target_iELFSO32:
-
 
3296
        CPU := cpuX86
-
 
3297
    |mConst.Target_iMSP430:
-
 
3298
        CPU := cpuMSP430
-
 
3299
    END;
3291
    CPU := TARGETS.CPU;
3300
 
3292
 
3301
    ext := mConst.FILE_EXT;
3293
    ext := UTILS.FILE_EXT;
Line 3302... Line 3294...
3302
    CaseLabels := C.create();
3294
    CaseLabels := C.create();
3303
    CaseVar := C.create();
3295
    CaseVar := C.create();
Line 3304... Line 3296...
3304
 
3296
 
3305
    CaseVariants := LISTS.create(NIL);
-
 
3306
    LISTS.push(CaseVariants, NewVariant(0, NIL));
-
 
3307
 
-
 
3308
    CASE CPU OF
-
 
Line 3309... Line 3297...
3309
    |cpuAMD64:  IL.init(6, IL.little_endian)
3297
    CaseVariants := LISTS.create(NIL);
3310
    |cpuX86:    IL.init(8, IL.little_endian)
3298
    LISTS.push(CaseVariants, NewVariant(0, NIL));
3311
    |cpuMSP430: IL.init(0, IL.little_endian)
3299
 
3312
    END;
3300
    IL.init(CPU);
3313
 
3301
 
3314
    IF CPU # cpuMSP430 THEN
3302
    IF CPU # TARGETS.cpuMSP430 THEN
3315
        parser := PARS.create(path, lib_path, StatSeq, expression, designator, chkreturn);
3303
        parser := PARS.create(path, lib_path, StatSeq, expression, designator, chkreturn);
3316
        IF parser.open(parser, mConst.RTL_NAME) THEN
3304
        IF parser.open(parser, UTILS.RTL_NAME) THEN
3317
            parser.parse(parser);
3305
            parser.parse(parser);
3318
            PARS.destroy(parser)
3306
            PARS.destroy(parser)
3319
        ELSE
3307
        ELSE
3320
            PARS.destroy(parser);
3308
            PARS.destroy(parser);
3321
            parser := PARS.create(lib_path, lib_path, StatSeq, expression, designator, chkreturn);
3309
            parser := PARS.create(lib_path, lib_path, StatSeq, expression, designator, chkreturn);
3322
            IF parser.open(parser, mConst.RTL_NAME) THEN
3310
            IF parser.open(parser, UTILS.RTL_NAME) THEN
3323
                parser.parse(parser);
3311
                parser.parse(parser);
3324
                PARS.destroy(parser)
3312
                PARS.destroy(parser)
Line 3325... Line 3313...
3325
            ELSE
3313
            ELSE
3326
                ERRORS.FileNotFound(lib_path, mConst.RTL_NAME, mConst.FILE_EXT)
3314
                ERRORS.FileNotFound(lib_path, UTILS.RTL_NAME, UTILS.FILE_EXT)
Line 3327... Line 3315...
3327
            END
3315
            END
3328
        END
3316
        END
3329
    END;
3317
    END;
3330
 
3318
 
3331
    parser := PARS.create(path, lib_path, StatSeq, expression, designator, chkreturn);
3319
    parser := PARS.create(path, lib_path, StatSeq, expression, designator, chkreturn);
Line 3332... Line 3320...
3332
    parser.main := TRUE;
3320
    parser.main := TRUE;
Line 3333... Line 3321...
3333
 
3321
 
3334
    IF parser.open(parser, modname) THEN
3322
    IF parser.open(parser, modname) THEN
3335
        parser.parse(parser)
3323
        parser.parse(parser)
Line 3336... Line 3324...
3336
    ELSE
3324
    ELSE
3337
        ERRORS.FileNotFound(path, modname, mConst.FILE_EXT)
3325
        ERRORS.FileNotFound(path, modname, UTILS.FILE_EXT)
3338
    END;
3326
    END;
Line 3339... Line 3327...
3339
 
3327
 
Line 3340... Line 3328...
3340
    PARS.destroy(parser);
3328
    PARS.destroy(parser);
Line 3341... Line 3329...
3341
 
3329
 
3342
    IF PARS.program.bss > mConst.MAX_GLOBAL_SIZE THEN
3330
    IF PARS.program.bss > UTILS.MAX_GLOBAL_SIZE THEN
3343
        ERRORS.Error(204)
3331
        ERRORS.Error(204)
3344
    END;
3332
    END;
-
 
3333
 
3345
 
3334
    IF CPU # TARGETS.cpuMSP430 THEN
Line 3346... Line 3335...
3346
    IF CPU # cpuMSP430 THEN
3335
        setrtl