Rev 7597 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7597 | akron1 | 1 | (* |
2 | BSD 2-Clause License |
||
6613 | leency | 3 | |
7597 | akron1 | 4 | Copyright (c) 2018, 2019, Anton Krotov |
5 | All rights reserved. |
||
6613 | leency | 6 | *) |
7 | |||
8 | MODULE Compiler; |
||
9 | |||
7693 | akron1 | 10 | IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, ERRORS, STRINGS, mConst := CONSTANTS, WRITER, MSP430; |
6613 | leency | 11 | |
12 | |||
7597 | akron1 | 13 | PROCEDURE Target (s: ARRAY OF CHAR): INTEGER; |
14 | VAR |
||
15 | res: INTEGER; |
||
6613 | leency | 16 | |
7597 | akron1 | 17 | BEGIN |
18 | IF s = mConst.Target_sConsole THEN |
||
19 | res := mConst.Target_iConsole |
||
20 | ELSIF s = mConst.Target_sGUI THEN |
||
21 | res := mConst.Target_iGUI |
||
22 | ELSIF s = mConst.Target_sDLL THEN |
||
23 | res := mConst.Target_iDLL |
||
24 | ELSIF s = mConst.Target_sKolibri THEN |
||
25 | res := mConst.Target_iKolibri |
||
26 | ELSIF s = mConst.Target_sObject THEN |
||
27 | res := mConst.Target_iObject |
||
28 | ELSIF s = mConst.Target_sConsole64 THEN |
||
29 | res := mConst.Target_iConsole64 |
||
30 | ELSIF s = mConst.Target_sGUI64 THEN |
||
31 | res := mConst.Target_iGUI64 |
||
32 | ELSIF s = mConst.Target_sDLL64 THEN |
||
33 | res := mConst.Target_iDLL64 |
||
34 | ELSIF s = mConst.Target_sELF32 THEN |
||
35 | res := mConst.Target_iELF32 |
||
7693 | akron1 | 36 | ELSIF s = mConst.Target_sELFSO32 THEN |
37 | res := mConst.Target_iELFSO32 |
||
7597 | akron1 | 38 | ELSIF s = mConst.Target_sELF64 THEN |
39 | res := mConst.Target_iELF64 |
||
7693 | akron1 | 40 | ELSIF s = mConst.Target_sELFSO64 THEN |
41 | res := mConst.Target_iELFSO64 |
||
42 | ELSIF s = mConst.Target_sMSP430 THEN |
||
43 | res := mConst.Target_iMSP430 |
||
7597 | akron1 | 44 | ELSE |
45 | res := 0 |
||
46 | END |
||
6613 | leency | 47 | |
7597 | akron1 | 48 | RETURN res |
49 | END Target; |
||
6613 | leency | 50 | |
51 | |||
7693 | akron1 | 52 | PROCEDURE keys (VAR options: PROG.OPTIONS); |
6613 | leency | 53 | VAR |
7597 | akron1 | 54 | param: PARS.PATH; |
55 | i, j: INTEGER; |
||
56 | end: BOOLEAN; |
||
57 | value: INTEGER; |
||
58 | minor, |
||
59 | major: INTEGER; |
||
7693 | akron1 | 60 | checking: SET; |
6613 | leency | 61 | |
62 | BEGIN |
||
7693 | akron1 | 63 | checking := options.checking; |
7597 | akron1 | 64 | end := FALSE; |
65 | i := 4; |
||
66 | REPEAT |
||
67 | UTILS.GetArg(i, param); |
||
6613 | leency | 68 | |
7597 | akron1 | 69 | IF param = "-stk" THEN |
70 | INC(i); |
||
71 | UTILS.GetArg(i, param); |
||
72 | IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN |
||
7693 | akron1 | 73 | options.stack := value |
7597 | akron1 | 74 | END; |
75 | IF param[0] = "-" THEN |
||
76 | DEC(i) |
||
77 | END |
||
6613 | leency | 78 | |
7597 | akron1 | 79 | ELSIF param = "-base" THEN |
80 | INC(i); |
||
81 | UTILS.GetArg(i, param); |
||
82 | IF STRINGS.StrToInt(param, value) THEN |
||
7693 | akron1 | 83 | options.base := ((value DIV 64) * 64) * 1024 |
7597 | akron1 | 84 | END; |
85 | IF param[0] = "-" THEN |
||
86 | DEC(i) |
||
87 | END |
||
6613 | leency | 88 | |
7693 | akron1 | 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 |
||
98 | |||
99 | ELSIF param = "-rom" THEN |
||
100 | INC(i); |
||
101 | UTILS.GetArg(i, param); |
||
102 | IF STRINGS.StrToInt(param, value) THEN |
||
103 | options.rom := value |
||
104 | END; |
||
105 | IF param[0] = "-" THEN |
||
106 | DEC(i) |
||
107 | END |
||
108 | |||
7597 | akron1 | 109 | ELSIF param = "-nochk" THEN |
110 | INC(i); |
||
111 | UTILS.GetArg(i, param); |
||
6613 | leency | 112 | |
7597 | akron1 | 113 | IF param[0] = "-" THEN |
114 | DEC(i) |
||
115 | ELSE |
||
116 | j := 0; |
||
117 | WHILE param[j] # 0X DO |
||
6613 | leency | 118 | |
7597 | akron1 | 119 | IF param[j] = "p" THEN |
120 | EXCL(checking, ST.chkPTR) |
||
121 | ELSIF param[j] = "t" THEN |
||
122 | EXCL(checking, ST.chkGUARD) |
||
123 | ELSIF param[j] = "i" THEN |
||
124 | EXCL(checking, ST.chkIDX) |
||
125 | ELSIF param[j] = "b" THEN |
||
126 | EXCL(checking, ST.chkBYTE) |
||
127 | ELSIF param[j] = "c" THEN |
||
128 | EXCL(checking, ST.chkCHR) |
||
129 | ELSIF param[j] = "w" THEN |
||
130 | EXCL(checking, ST.chkWCHR) |
||
131 | ELSIF param[j] = "r" THEN |
||
132 | EXCL(checking, ST.chkCHR); |
||
133 | EXCL(checking, ST.chkWCHR); |
||
134 | EXCL(checking, ST.chkBYTE) |
||
135 | ELSIF param[j] = "a" THEN |
||
136 | checking := {} |
||
137 | END; |
||
6613 | leency | 138 | |
7597 | akron1 | 139 | INC(j) |
7693 | akron1 | 140 | END; |
141 | |||
7597 | akron1 | 142 | END |
6613 | leency | 143 | |
7597 | akron1 | 144 | ELSIF param = "-ver" THEN |
145 | INC(i); |
||
146 | UTILS.GetArg(i, param); |
||
147 | IF STRINGS.StrToVer(param, major, minor) THEN |
||
7693 | akron1 | 148 | options.version := major * 65536 + minor |
7597 | akron1 | 149 | END; |
150 | IF param[0] = "-" THEN |
||
151 | DEC(i) |
||
152 | END |
||
6613 | leency | 153 | |
7597 | akron1 | 154 | ELSIF param = "-pic" THEN |
7693 | akron1 | 155 | options.pic := TRUE |
6613 | leency | 156 | |
7597 | akron1 | 157 | ELSIF param = "" THEN |
158 | end := TRUE |
||
6613 | leency | 159 | |
7107 | akron1 | 160 | ELSE |
7693 | akron1 | 161 | ERRORS.BadParam(param) |
7107 | akron1 | 162 | END; |
6613 | leency | 163 | |
7597 | akron1 | 164 | INC(i) |
7693 | akron1 | 165 | UNTIL end; |
6613 | leency | 166 | |
7693 | akron1 | 167 | options.checking := checking |
7597 | akron1 | 168 | END keys; |
6613 | leency | 169 | |
170 | |||
7597 | akron1 | 171 | PROCEDURE main; |
172 | VAR |
||
173 | path: PARS.PATH; |
||
174 | inname: PARS.PATH; |
||
175 | ext: PARS.PATH; |
||
176 | app_path: PARS.PATH; |
||
177 | lib_path: PARS.PATH; |
||
178 | modname: PARS.PATH; |
||
179 | outname: PARS.PATH; |
||
180 | param: PARS.PATH; |
||
181 | temp: PARS.PATH; |
||
182 | target: INTEGER; |
||
7693 | akron1 | 183 | bit_depth: INTEGER; |
7597 | akron1 | 184 | time: INTEGER; |
7693 | akron1 | 185 | options: PROG.OPTIONS; |
6613 | leency | 186 | |
187 | BEGIN |
||
7693 | akron1 | 188 | options.stack := 2; |
189 | options.version := 65536; |
||
190 | options.pic := FALSE; |
||
191 | options.checking := ST.chkALL; |
||
6613 | leency | 192 | |
7597 | akron1 | 193 | PATHS.GetCurrentDirectory(app_path); |
194 | lib_path := app_path; |
||
6613 | leency | 195 | |
7597 | akron1 | 196 | UTILS.GetArg(1, inname); |
6613 | leency | 197 | |
7693 | akron1 | 198 | C.Ln; |
199 | C.String("Akron Oberon Compiler v"); C.Int(mConst.vMajor); C.String("."); C.Int2(mConst.vMinor); |
||
200 | C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)"); |
||
201 | C.StringLn("Copyright (c) 2018-2019, Anton Krotov"); |
||
202 | |||
7597 | akron1 | 203 | IF inname = "" THEN |
7693 | akron1 | 204 | C.Ln; |
7597 | akron1 | 205 | C.StringLn("Usage: Compiler |
206 | IF UTILS.bit_depth = 64 THEN |
||
7693 | akron1 | 207 | C.StringLn('target = console | gui | dll | console64 | gui64 | dll64 | kos | obj | elfexe | elfso | elfexe64 | elfso64 | msp430'); C.Ln; |
7597 | akron1 | 208 | ELSIF UTILS.bit_depth = 32 THEN |
7693 | akron1 | 209 | C.StringLn('target = console | gui | dll | kos | obj | elfexe | elfso | msp430'); C.Ln; |
7107 | akron1 | 210 | END; |
7597 | akron1 | 211 | C.StringLn("optional settings:"); C.Ln; |
212 | C.StringLn(" -stk |
||
213 | C.StringLn(" -base set base address of image in kilobytes"); C.Ln; |
||
214 | C.StringLn(' -ver |
||
215 | C.StringLn(' -nochk <"ptibcwra"> disable runtime checking (pointers, types, indexes,'); |
||
216 | C.StringLn(' BYTE, CHR, WCHR)'); C.Ln; |
||
7693 | akron1 | 217 | C.StringLn(" -ram |
218 | C.StringLn(" -rom |
||
7597 | akron1 | 219 | UTILS.Exit(0) |
6613 | leency | 220 | END; |
221 | |||
7597 | akron1 | 222 | PATHS.split(inname, path, modname, ext); |
6613 | leency | 223 | |
7597 | akron1 | 224 | IF ext # mConst.FILE_EXT THEN |
7693 | akron1 | 225 | ERRORS.Error(207) |
6613 | leency | 226 | END; |
7693 | akron1 | 227 | |
7597 | akron1 | 228 | IF PATHS.isRelative(path) THEN |
229 | PATHS.RelPath(app_path, path, temp); |
||
230 | path := temp |
||
6613 | leency | 231 | END; |
232 | |||
7597 | akron1 | 233 | UTILS.GetArg(2, outname); |
234 | IF outname = "" THEN |
||
7693 | akron1 | 235 | ERRORS.Error(205) |
6613 | leency | 236 | END; |
7597 | akron1 | 237 | IF PATHS.isRelative(outname) THEN |
238 | PATHS.RelPath(app_path, outname, temp); |
||
239 | outname := temp |
||
6613 | leency | 240 | END; |
7597 | akron1 | 241 | |
242 | UTILS.GetArg(3, param); |
||
243 | IF param = "" THEN |
||
7693 | akron1 | 244 | ERRORS.Error(205) |
6613 | leency | 245 | END; |
246 | |||
7597 | akron1 | 247 | target := Target(param); |
6613 | leency | 248 | |
7597 | akron1 | 249 | IF target = 0 THEN |
7693 | akron1 | 250 | ERRORS.Error(206) |
6613 | leency | 251 | END; |
252 | |||
7693 | akron1 | 253 | CASE target OF |
254 | |mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64, mConst.Target_iELF64, mConst.Target_iELFSO64: |
||
255 | bit_depth := 64 |
||
256 | |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL, |
||
257 | mConst.Target_iKolibri, mConst.Target_iObject, mConst.Target_iELF32, mConst.Target_iELFSO32: |
||
258 | bit_depth := 32 |
||
259 | |mConst.Target_iMSP430: |
||
260 | bit_depth := 16; |
||
261 | options.ram := MSP430.minRAM; |
||
262 | options.rom := MSP430.minROM |
||
263 | END; |
||
6613 | leency | 264 | |
7693 | akron1 | 265 | IF UTILS.bit_depth < bit_depth THEN |
266 | ERRORS.Error(206) |
||
6613 | leency | 267 | END; |
268 | |||
7597 | akron1 | 269 | STRINGS.append(lib_path, "lib"); |
270 | STRINGS.append(lib_path, UTILS.slash); |
||
6613 | leency | 271 | |
7693 | akron1 | 272 | CASE target OF |
273 | |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL: |
||
7597 | akron1 | 274 | IF target = mConst.Target_iDLL THEN |
7693 | akron1 | 275 | options.base := 10000000H |
7107 | akron1 | 276 | ELSE |
7693 | akron1 | 277 | options.base := 400000H |
7107 | akron1 | 278 | END; |
7597 | akron1 | 279 | STRINGS.append(lib_path, "Windows32") |
6613 | leency | 280 | |
7693 | akron1 | 281 | |mConst.Target_iKolibri, mConst.Target_iObject: |
7597 | akron1 | 282 | STRINGS.append(lib_path, "KolibriOS") |
6613 | leency | 283 | |
7693 | akron1 | 284 | |mConst.Target_iELF32, mConst.Target_iELFSO32: |
7597 | akron1 | 285 | STRINGS.append(lib_path, "Linux32") |
6613 | leency | 286 | |
7693 | akron1 | 287 | |mConst.Target_iELF64, mConst.Target_iELFSO64: |
7597 | akron1 | 288 | STRINGS.append(lib_path, "Linux64") |
6613 | leency | 289 | |
7693 | akron1 | 290 | |mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64: |
7597 | akron1 | 291 | STRINGS.append(lib_path, "Windows64") |
6613 | leency | 292 | |
7693 | akron1 | 293 | |mConst.Target_iMSP430: |
294 | STRINGS.append(lib_path, "MSP430") |
||
295 | |||
6613 | leency | 296 | END; |
297 | |||
7597 | akron1 | 298 | STRINGS.append(lib_path, UTILS.slash); |
6613 | leency | 299 | |
7693 | akron1 | 300 | keys(options); |
6613 | leency | 301 | |
7693 | akron1 | 302 | PARS.init(bit_depth, target, options); |
6613 | leency | 303 | |
7693 | akron1 | 304 | PARS.program.dll := target IN {mConst.Target_iELFSO32, mConst.Target_iELFSO64, mConst.Target_iDLL, mConst.Target_iDLL64, mConst.Target_iObject}; |
305 | PARS.program.obj := target = mConst.Target_iObject; |
||
306 | |||
307 | ST.compile(path, lib_path, modname, outname, target, options); |
||
308 | |||
7597 | akron1 | 309 | time := UTILS.GetTickCount() - UTILS.time; |
6613 | leency | 310 | |
7597 | akron1 | 311 | C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, "); |
312 | C.Int(WRITER.counter); C.StringLn(" bytes"); |
||
6613 | leency | 313 | |
7597 | akron1 | 314 | UTILS.Exit(0) |
315 | END main; |
||
316 | |||
317 | |||
6613 | leency | 318 | BEGIN |
7597 | akron1 | 319 | main |
6613 | leency | 320 | END Compiler.>"ptibcwra">=>=> |