Subversion Repositories Kolibri OS

Rev

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

Rev 7597 Rev 7693
Line 5... Line 5...
5
    All rights reserved.
5
    All rights reserved.
6
*)
6
*)
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
MODULE Compiler;
8
MODULE Compiler;
Line 9... Line 9...
9
 
9
 
10
IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, C := CONSOLE, ERRORS, STRINGS, mConst := CONSTANTS, WRITER;
10
IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, ERRORS, STRINGS, mConst := CONSTANTS, WRITER, MSP430;
11
 
11
 
Line 31... Line 31...
31
        res := mConst.Target_iGUI64
31
        res := mConst.Target_iGUI64
32
    ELSIF s = mConst.Target_sDLL64 THEN
32
    ELSIF s = mConst.Target_sDLL64 THEN
33
        res := mConst.Target_iDLL64
33
        res := mConst.Target_iDLL64
34
    ELSIF s = mConst.Target_sELF32 THEN
34
    ELSIF s = mConst.Target_sELF32 THEN
35
        res := mConst.Target_iELF32
35
        res := mConst.Target_iELF32
-
 
36
    ELSIF s = mConst.Target_sELFSO32 THEN
-
 
37
        res := mConst.Target_iELFSO32
36
    ELSIF s = mConst.Target_sELF64 THEN
38
    ELSIF s = mConst.Target_sELF64 THEN
37
        res := mConst.Target_iELF64
39
        res := mConst.Target_iELF64
-
 
40
    ELSIF s = mConst.Target_sELFSO64 THEN
-
 
41
        res := mConst.Target_iELFSO64
-
 
42
    ELSIF s = mConst.Target_sMSP430 THEN
-
 
43
        res := mConst.Target_iMSP430
38
    ELSE
44
    ELSE
39
        res := 0
45
        res := 0
40
    END
46
    END
Line 41... Line 47...
41
 
47
 
42
    RETURN res
48
    RETURN res
Line 43... Line 49...
43
END Target;
49
END Target;
44
 
50
 
45
 
51
 
46
PROCEDURE keys (VAR StackSize, BaseAddress, Version: INTEGER; VAR pic: BOOLEAN; VAR checking: SET);
52
PROCEDURE keys (VAR options: PROG.OPTIONS);
47
VAR
53
VAR
48
    param: PARS.PATH;
54
    param: PARS.PATH;
49
    i, j:  INTEGER;
55
    i, j:  INTEGER;
50
    end:   BOOLEAN;
56
    end:   BOOLEAN;
-
 
57
    value: INTEGER;
Line 51... Line 58...
51
    value: INTEGER;
58
    minor,
-
 
59
    major: INTEGER;
52
    minor,
60
    checking: SET;
53
    major: INTEGER;
61
 
54
 
62
BEGIN
55
BEGIN
63
    checking := options.checking;
Line 56... Line 64...
56
    end := FALSE;
64
    end := FALSE;
57
    i := 4;
65
    i := 4;
58
    REPEAT
66
    REPEAT
59
        UTILS.GetArg(i, param);
67
        UTILS.GetArg(i, param);
60
 
68
 
61
        IF param = "-stk" THEN
69
        IF param = "-stk" THEN
62
            INC(i);
70
            INC(i);
63
            UTILS.GetArg(i, param);
71
            UTILS.GetArg(i, param);
64
            IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN
72
            IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN
Line 65... Line 73...
65
                StackSize := value
73
                options.stack := value
66
            END;
74
            END;
67
            IF param[0] = "-" THEN
75
            IF param[0] = "-" THEN
68
                DEC(i)
76
                DEC(i)
69
            END
77
            END
-
 
78
 
-
 
79
        ELSIF param = "-base" THEN
-
 
80
            INC(i);
-
 
81
            UTILS.GetArg(i, param);
-
 
82
            IF STRINGS.StrToInt(param, value) THEN
-
 
83
                options.base := ((value DIV 64) * 64) * 1024
-
 
84
            END;
-
 
85
            IF param[0] = "-" THEN
-
 
86
                DEC(i)
-
 
87
            END
-
 
88
 
-
 
89
        ELSIF param = "-ram" THEN
-
 
90
            INC(i);
-
 
91
            UTILS.GetArg(i, param);
-
 
92
            IF STRINGS.StrToInt(param, value) THEN
-
 
93
                options.ram := value
-
 
94
            END;
-
 
95
            IF param[0] = "-" THEN
-
 
96
                DEC(i)
-
 
97
            END
70
 
98
 
71
        ELSIF param = "-base" THEN
99
        ELSIF param = "-rom" THEN
72
            INC(i);
100
            INC(i);
73
            UTILS.GetArg(i, param);
101
            UTILS.GetArg(i, param);
Line 107... Line 135...
107
                    ELSIF param[j] = "a" THEN
135
                    ELSIF param[j] = "a" THEN
108
                        checking := {}
136
                        checking := {}
109
                    END;
137
                    END;
Line 110... Line 138...
110
 
138
 
111
                    INC(j)
139
                    INC(j)
-
 
140
                END;
112
                END
141
 
Line 113... Line 142...
113
            END
142
            END
114
 
143
 
115
        ELSIF param = "-ver" THEN
144
        ELSIF param = "-ver" THEN
116
            INC(i);
145
            INC(i);
117
            UTILS.GetArg(i, param);
146
            UTILS.GetArg(i, param);
118
            IF STRINGS.StrToVer(param, major, minor) THEN
147
            IF STRINGS.StrToVer(param, major, minor) THEN
119
                Version := major * 65536 + minor
148
                options.version := major * 65536 + minor
120
            END;
149
            END;
121
            IF param[0] = "-" THEN
150
            IF param[0] = "-" THEN
Line 122... Line 151...
122
                DEC(i)
151
                DEC(i)
123
            END
152
            END
Line 124... Line 153...
124
 
153
 
125
        ELSIF param = "-pic" THEN
154
        ELSIF param = "-pic" THEN
Line 126... Line 155...
126
            pic := TRUE
155
            options.pic := TRUE
127
 
156
 
128
        ELSIF param = "" THEN
157
        ELSIF param = "" THEN
Line 129... Line 158...
129
            end := TRUE
158
            end := TRUE
130
 
159
 
Line -... Line 160...
-
 
160
        ELSE
131
        ELSE
161
            ERRORS.BadParam(param)
Line 132... Line 162...
132
            ERRORS.error3("bad parameter: ", param, "")
162
        END;
133
        END;
163
 
Line 147... Line 177...
147
    lib_path:   PARS.PATH;
177
    lib_path:   PARS.PATH;
148
    modname:    PARS.PATH;
178
    modname:    PARS.PATH;
149
    outname:    PARS.PATH;
179
    outname:    PARS.PATH;
150
    param:      PARS.PATH;
180
    param:      PARS.PATH;
151
    temp:       PARS.PATH;
181
    temp:       PARS.PATH;
152
 
-
 
153
    target:     INTEGER;
182
    target:     INTEGER;
154
 
-
 
-
 
183
    bit_depth:  INTEGER;
155
    time:       INTEGER;
184
    time:       INTEGER;
156
 
-
 
157
    StackSize,
-
 
158
    Version,
-
 
159
    BaseAdr:    INTEGER;
-
 
160
    pic:        BOOLEAN;
185
    options:    PROG.OPTIONS;
161
    checking:   SET;
-
 
162
 
-
 
163
    bits64: BOOLEAN;
-
 
Line 164... Line 186...
164
 
186
 
165
BEGIN
187
BEGIN
166
    StackSize := 2;
188
    options.stack := 2;
167
    Version := 65536;
189
    options.version := 65536;
168
    pic := FALSE;
190
    options.pic := FALSE;
Line 169... Line 191...
169
    checking := ST.chkALL;
191
    options.checking := ST.chkALL;
170
 
192
 
Line 171... Line 193...
171
    PATHS.GetCurrentDirectory(app_path);
193
    PATHS.GetCurrentDirectory(app_path);
Line -... Line 194...
-
 
194
    lib_path := app_path;
-
 
195
 
-
 
196
    UTILS.GetArg(1, inname);
-
 
197
 
-
 
198
    C.Ln;
172
    lib_path := app_path;
199
    C.String("Akron Oberon Compiler v"); C.Int(mConst.vMajor); C.String("."); C.Int2(mConst.vMinor);
173
 
-
 
174
    UTILS.GetArg(1, inname);
200
        C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)");
175
 
201
    C.StringLn("Copyright (c) 2018-2019, Anton Krotov");
176
    IF inname = "" THEN
202
 
177
        C.String("Akron Oberon-07/16 Compiler v"); C.Int(mConst.vMajor); C.String("."); C.Int2(mConst.vMinor);
203
    IF inname = "" THEN
178
            C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)"); C.Ln;
204
        C.Ln;
179
        C.StringLn("Usage: Compiler 
[optional settings]"); C.Ln;
205
        C.StringLn("Usage: Compiler 
[optional settings]"); C.Ln;
180
        IF UTILS.bit_depth = 64 THEN
206
        IF UTILS.bit_depth = 64 THEN
181
            C.StringLn('target = console | gui | dll | console64 | gui64 | dll64 | kos | obj | elfexe | elfexe64'); C.Ln;
207
            C.StringLn('target = console | gui | dll | console64 | gui64 | dll64 | kos | obj | elfexe | elfso | elfexe64 | elfso64 | msp430'); C.Ln;
182
        ELSIF UTILS.bit_depth = 32 THEN
208
        ELSIF UTILS.bit_depth = 32 THEN
183
            C.StringLn('target = console | gui | dll | kos | obj | elfexe'); C.Ln;
209
            C.StringLn('target = console | gui | dll | kos | obj | elfexe | elfso | msp430'); C.Ln;
184
        END;
210
        END;
185
        C.StringLn("optional settings:"); C.Ln;
211
        C.StringLn("optional settings:"); C.Ln;
186
        C.StringLn("  -stk             set size of stack in megabytes"); C.Ln;
212
        C.StringLn("  -stk             set size of stack in megabytes"); C.Ln;
-
 
213
        C.StringLn("  -base 
set base address of image in kilobytes"); C.Ln;
-
 
214
        C.StringLn('  -ver      set version of program'); C.Ln;
187
        C.StringLn("  -base 
set base address of image in kilobytes"); C.Ln;
215
        C.StringLn('  -nochk <"ptibcwra">    disable runtime checking (pointers, types, indexes,');
188
        C.StringLn('  -ver      set version of program'); C.Ln;
216
        C.StringLn('                         BYTE, CHR, WCHR)'); C.Ln;
Line 189... Line 217...
189
        C.StringLn('  -nochk <"ptibcwra">    disable runtime checking (pointers, types, indexes,');
217
        C.StringLn("  -ram             set size of RAM in bytes (MSP430)"); C.Ln;
Line 190... Line 218...
190
        C.StringLn('                         BYTE, CHR, WCHR)'); C.Ln;
218
        C.StringLn("  -rom             set size of ROM in bytes (MSP430)"); C.Ln;
191
        UTILS.Exit(0)
219
        UTILS.Exit(0)
192
    END;
220
    END;
-
 
221
 
193
 
222
    PATHS.split(inname, path, modname, ext);
194
    PATHS.split(inname, path, modname, ext);
223
 
195
 
224
    IF ext # mConst.FILE_EXT THEN
196
    IF ext # mConst.FILE_EXT THEN
225
        ERRORS.Error(207)
Line 197... Line 226...
197
        ERRORS.error3('inputfile name extension must be "', mConst.FILE_EXT, '"')
226
    END;
198
    END;
227
 
199
    IF PATHS.isRelative(path) THEN
228
    IF PATHS.isRelative(path) THEN
200
        PATHS.RelPath(app_path, path, temp);
229
        PATHS.RelPath(app_path, path, temp);
201
        path := temp
230
        path := temp
202
    END;
231
    END;
203
 
232
 
204
    UTILS.GetArg(2, outname);
233
    UTILS.GetArg(2, outname);
Line 205... Line 234...
205
    IF outname = "" THEN
234
    IF outname = "" THEN
206
        ERRORS.error1("not enough parameters")
235
        ERRORS.Error(205)
207
    END;
236
    END;
208
    IF PATHS.isRelative(outname) THEN
237
    IF PATHS.isRelative(outname) THEN
Line 209... Line 238...
209
        PATHS.RelPath(app_path, outname, temp);
238
        PATHS.RelPath(app_path, outname, temp);
Line 210... Line 239...
210
        outname := temp
239
        outname := temp
211
    END;
240
    END;
212
 
241
 
Line -... Line 242...
-
 
242
    UTILS.GetArg(3, param);
213
    UTILS.GetArg(3, param);
243
    IF param = "" THEN
214
    IF param = "" THEN
-
 
215
        ERRORS.error1("not enough parameters")
244
        ERRORS.Error(205)
-
 
245
    END;
-
 
246
 
216
    END;
247
    target := Target(param);
217
 
248
 
218
    target := Target(param);
249
    IF target = 0 THEN
219
 
250
        ERRORS.Error(206)
220
    IF target = 0 THEN
-
 
221
        ERRORS.error1("bad parameter ")
251
    END;
222
    END;
252
 
Line 223... Line 253...
223
 
253
    CASE target OF
224
    bits64 := target IN {mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64, mConst.Target_iELF64};
254
    |mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64, mConst.Target_iELF64, mConst.Target_iELFSO64:
-
 
255
        bit_depth := 64
Line 225... Line 256...
225
 
256
    |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL,
226
    IF bits64 THEN
257
     mConst.Target_iKolibri, mConst.Target_iObject, mConst.Target_iELF32, mConst.Target_iELFSO32:
Line -... Line 258...
-
 
258
        bit_depth := 32
227
        IF UTILS.bit_depth = 32 THEN
259
    |mConst.Target_iMSP430:
228
            ERRORS.error1("bad parameter ")
260
        bit_depth := 16;
229
        END;
261
        options.ram := MSP430.minRAM;
230
        PARS.init(64, target)
262
        options.rom := MSP430.minROM
231
    ELSE
263
    END;
232
        PARS.init(32, target)
264
 
233
    END;
265
    IF UTILS.bit_depth < bit_depth THEN
Line 234... Line 266...
234
 
266
        ERRORS.Error(206)
235
    PARS.program.dll := target IN {mConst.Target_iDLL, mConst.Target_iObject, mConst.Target_iDLL64};
267
    END;
Line 236... Line 268...
236
    PARS.program.obj := target = mConst.Target_iObject;
268
 
237
 
269
    STRINGS.append(lib_path, "lib");
Line 238... Line 270...
238
    STRINGS.append(lib_path, "lib");
270
    STRINGS.append(lib_path, UTILS.slash);
239
    STRINGS.append(lib_path, UTILS.slash);
271
 
Line 240... Line 272...
240
 
272
    CASE target OF
241
    IF target IN {mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL} THEN
273
    |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL:
Line -... Line 274...
-
 
274
        IF target = mConst.Target_iDLL THEN
-
 
275
            options.base := 10000000H
-
 
276
        ELSE
242
        IF target = mConst.Target_iDLL THEN
277
            options.base := 400000H
Line 243... Line 278...
243
            BaseAdr := 10000000H
278
        END;
Line -... Line 279...
-
 
279
        STRINGS.append(lib_path, "Windows32")
-
 
280
 
244
        ELSE
281
    |mConst.Target_iKolibri, mConst.Target_iObject:
-
 
282
        STRINGS.append(lib_path, "KolibriOS")
-
 
283
 
-
 
284
    |mConst.Target_iELF32, mConst.Target_iELFSO32:
Line 245... Line 285...
245
            BaseAdr := 400000H
285
        STRINGS.append(lib_path, "Linux32")
Line 246... Line 286...
246
        END;
286
 
Line 247... Line 287...
247
        STRINGS.append(lib_path, "Windows32")
287
    |mConst.Target_iELF64, mConst.Target_iELFSO64:
248
 
288
        STRINGS.append(lib_path, "Linux64")