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 |
205 | C.StringLn("Usage: Compiler |
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 |
212 | C.StringLn(" -stk |
- | 213 | C.StringLn(" -base set base address of image in kilobytes"); C.Ln; |
|
- | 214 | C.StringLn(' -ver |
|
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 |
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 |
Line 190... | Line 218... | ||
190 | C.StringLn(' BYTE, CHR, WCHR)'); C.Ln; |
218 | C.StringLn(" -rom |
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") |