BASIC compiler/interpreter for PIC32MX/MZ-80K
Revisión | 1097fa880c989ed1259667ec25aab57935aa8b0f (tree) |
---|---|
Tiempo | 2019-05-25 03:49:31 |
Autor | Katsumi <kmorimatsu@sour...> |
Commiter | Katsumi |
CLIB and MOS for Zoea/Protozoea.
@@ -104,7 +104,9 @@ _GEN_EXCPT_ADDR = _ebase_address + 0x180; | ||
104 | 104 | *************************************************************************/ |
105 | 105 | MEMORY |
106 | 106 | { |
107 | - kseg0_program_mem (rx) : ORIGIN = (0x9D006000 + 0x1000 + 0x490), LENGTH = 0x40000 - (0x6000 + 0x1000 + 0x490) /* All C Files will be located here */ | |
107 | + kseg0_program_mem (rx) : ORIGIN = (0x9D006000 + 0x1000 + 0x490), LENGTH = 0x40000 - (0x6000 + 0x1000 + 0x490 + 0xD400) /* Most of C Files will be located here */ | |
108 | + /* PERSISTENT_RAM_SIZE: 0xD400, MachiKania object section (MOS) size: 0xD000 (to fit to Zoea) */ | |
109 | + kseg2_program_mem (rx) : ORIGIN = (0x9D040000 - 0xD400), LENGTH = 0xD000 /* Some C Functions (editor and compiler) will be located here */ | |
108 | 110 | exception_mem : ORIGIN = 0x9D006000, LENGTH = 0x1000 /* Interrupt vector table */ |
109 | 111 | debug_exec_mem : ORIGIN = 0x9FC00490, LENGTH = 0x760 |
110 | 112 | kseg0_boot_mem : ORIGIN = 0x9D006000, LENGTH = 0x0 /* This memory region is dummy */ |
@@ -139,6 +141,27 @@ SECTIONS | ||
139 | 141 | } |
140 | 142 | SECTIONS |
141 | 143 | { |
144 | + | |
145 | + /* MachiKania Object Section (MOS) (size: 0xD000) */ | |
146 | + .machikaniaobjtext ORIGIN(kseg2_program_mem): | |
147 | + { | |
148 | + KEEP (*\statement.o(.text)) | |
149 | + KEEP (*\function.o(.text)) | |
150 | + KEEP (*\value.o(.text)) | |
151 | + KEEP (*\string.o(.text)) | |
152 | + KEEP (*\float.o(.text)) | |
153 | + KEEP (*\cmpdata.o(.text)) | |
154 | + } >kseg2_program_mem | |
155 | + .machikaniaobjrodata : | |
156 | + { | |
157 | + KEEP (*\statement.o(.rodata)) | |
158 | + KEEP (*\function.o(.rodata)) | |
159 | + KEEP (*\value.o(.rodata)) | |
160 | + KEEP (*\string.o(.rodata)) | |
161 | + KEEP (*\float.o(.rodata)) | |
162 | + KEEP (*\cmpdata.o(.rodata)) | |
163 | + } >kseg2_program_mem | |
164 | + | |
142 | 165 | /* Boot Sections */ |
143 | 166 | .reset _RESET_ADDR : |
144 | 167 | { |
@@ -876,7 +876,8 @@ char* static_method(char type){ | ||
876 | 876 | char* err; |
877 | 877 | int* data; |
878 | 878 | int record[3]; |
879 | - int i,opos,method,stack; | |
879 | + int i,spos,opos,method,stack; | |
880 | + spos=g_srcpos; | |
880 | 881 | next_position(); |
881 | 882 | // Check class name |
882 | 883 | i=check_var_name(); |
@@ -891,12 +892,15 @@ char* static_method(char type){ | ||
891 | 892 | break; |
892 | 893 | } |
893 | 894 | } |
895 | + if (i) { | |
896 | + g_srcpos=spos; | |
897 | + return ERR_NO_CLASS; | |
898 | + } | |
894 | 899 | // Check '::' |
895 | 900 | if (g_source[g_srcpos]!=':') return ERR_SYNTAX; |
896 | 901 | g_srcpos++; |
897 | 902 | if (g_source[g_srcpos]!=':') return ERR_SYNTAX; |
898 | 903 | g_srcpos++; |
899 | - if (i) return ERR_NO_CLASS; | |
900 | 904 | data=(int*)data[2]; |
901 | 905 | // Check method |
902 | 906 | i=check_var_name(); |
@@ -9,6 +9,13 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "compiler.h" |
13 | 20 | |
14 | 21 | /* |
@@ -40,6 +40,14 @@ | ||
40 | 40 | // RAM size used for object and heap |
41 | 41 | #define RAMSIZE (PERSISTENT_RAM_SIZE-EXCEPTION_DATA_SIZE) |
42 | 42 | |
43 | +/* Structures */ | |
44 | +typedef struct{ | |
45 | + unsigned char size; | |
46 | + unsigned short address; | |
47 | + unsigned char type; | |
48 | + unsigned char data[16]; | |
49 | +} HEXLINE; | |
50 | + | |
43 | 51 | /* Enums */ |
44 | 52 | enum variable{ |
45 | 53 | VAR_INTEGER, |
@@ -187,6 +195,8 @@ enum functions{ | ||
187 | 195 | }; |
188 | 196 | |
189 | 197 | /* Global vars (see globalvers.c) */ |
198 | +extern const volatile int g_object_mos; | |
199 | +extern const volatile int g_objpos_mos; | |
190 | 200 | extern int g_intconst; |
191 | 201 | extern char g_valueisconst; |
192 | 202 | extern unsigned int g_rnd_seed; |
@@ -228,6 +238,8 @@ extern int g_class; | ||
228 | 238 | extern int g_compiling_class; |
229 | 239 | extern unsigned char g_num_classes; |
230 | 240 | extern char g_option_fastfield; |
241 | +extern HEXLINE g_hexline; | |
242 | +extern char g_fs_valid; | |
231 | 243 | extern int g_temp; |
232 | 244 | |
233 | 245 | /* Prototypes */ |
@@ -247,6 +259,7 @@ char* compile_file(); | ||
247 | 259 | int compile_and_link_file(char* buff,char* appname); |
248 | 260 | int compile_and_link_main_file(char* buff,char* appname); |
249 | 261 | int compile_and_link_class(char* buff,int class); |
262 | +int create_self_running_hex(char* hexfilename); | |
250 | 263 | |
251 | 264 | void err_break(void); |
252 | 265 | void err_music(char* str); |
@@ -340,6 +353,7 @@ int* cmpdata_findfirst(unsigned char type); | ||
340 | 353 | void cmpdata_delete(int* record); |
341 | 354 | |
342 | 355 | int check_var_name(); |
356 | +int str_to_name_int(char* str); | |
343 | 357 | int get_var_number(); |
344 | 358 | int search_var_name(int nameint); |
345 | 359 | char* register_var_name(int nameint); |
@@ -384,6 +398,23 @@ char* coretimer_statement(); | ||
384 | 398 | char* coretimer_function(); |
385 | 399 | char* interrupt_statement(); |
386 | 400 | |
401 | +char* useclib_statement(); | |
402 | +char* useclib_begin(char* buff); | |
403 | +char* clib_method(char type); | |
404 | +char* clib_statement(); | |
405 | + | |
406 | +char* hex_init_file(char* buff,char* filename); | |
407 | +void hex_reinit_file(); | |
408 | +void hex_close_file(); | |
409 | +char* hex_read_line(); | |
410 | +char* hex_construct_line(); | |
411 | +#ifdef FS_DOT_H | |
412 | + char* hex_write(FSFILE* fhandle); | |
413 | + char* hex_write_address(FSFILE* fhandle,unsigned short addr); | |
414 | + char* hex_write_data_16(FSFILE* fhandle,unsigned short addr,unsigned int* object); | |
415 | + char* hex_write_eof(FSFILE* fhandle); | |
416 | +#endif | |
417 | + | |
387 | 418 | /* Error messages */ |
388 | 419 | #define ERR_SYNTAX (char*)(g_err_str[0]) |
389 | 420 | #define ERR_NE_BINARY (char*)(g_err_str[1]) |
@@ -415,6 +446,10 @@ char* interrupt_statement(); | ||
415 | 446 | #define ERR_INVALID_CLASS (char*)(g_err_str[27]) |
416 | 447 | #define ERR_NO_INIT (char*)(g_err_str[28]) |
417 | 448 | #define ERR_OPTION_CLASSCODE (char*)(g_err_str[29]) |
449 | +#define ERR_COMPILE_CLIB (char*)(g_err_str[30]) | |
450 | +#define ERR_NO_CLIB (char*)(g_err_str[31]) | |
451 | +#define ERR_HEX_ERROR (char*)(g_err_str[32]) | |
452 | +#define ERR_NO_CLASS_CLIB (char*)(g_err_str[32]) | |
418 | 453 | |
419 | 454 | /* compile data type numbers */ |
420 | 455 | #define CMPDATA_RESERVED 0 |
@@ -425,6 +460,8 @@ char* interrupt_statement(); | ||
425 | 460 | #define CMPDATA_UNSOLVED 5 |
426 | 461 | #define CMPDATA_TEMP 6 |
427 | 462 | #define CMPDATA_FASTFIELD 7 |
463 | +#define CMPDATA_USECLIB 8 | |
464 | +#define CMPDATA_CLIBFUNC 9 | |
428 | 465 | // Sub types follow |
429 | 466 | #define CMPTYPE_PUBLIC_FIELD 0 |
430 | 467 | #define CMPTYPE_PRIVATE_FIELD 1 |
@@ -485,13 +522,15 @@ char* interrupt_statement(); | ||
485 | 522 | } while (0) |
486 | 523 | |
487 | 524 | #define ASM_NOP 0x00000000 |
525 | +#define ASM_ADDU_A0_SP_ZERO 0x03A02021 | |
488 | 526 | #define ASM_ADDU_A0_V0_ZERO 0x00402021 |
489 | 527 | #define ASM_ADDU_A1_V0_ZERO 0x00402821 |
490 | 528 | #define ASM_ADDU_A2_V0_ZERO 0x00403021 |
491 | 529 | #define ASM_ADDU_A3_V0_ZERO 0x00403821 |
492 | -#define ASM_ORI_A0_ZERO_ 0x34040000 | |
493 | -#define ASM_LW_A0_XXXX_S8 0x8FC40000 | |
494 | -#define ASM_LW_A0_XXXX_S5 0x8EA40000 | |
530 | +#define ASM_ORI_A0_ZERO_ 0x34040000 | |
531 | +#define ASM_ADDIU_A0_ZERO_ 0x24040000 | |
532 | +#define ASM_LW_A0_XXXX_S8 0x8FC40000 | |
533 | +#define ASM_LW_A0_XXXX_S5 0x8EA40000 | |
495 | 534 | |
496 | 535 | // Interrupt macros |
497 | 536 | // 32 different type interruptions are possible |
@@ -34,6 +34,7 @@ static const char initext[]; | ||
34 | 34 | static const char bastext[]; |
35 | 35 | static const char class1text[]; |
36 | 36 | static const char class2text[]; |
37 | +static const char hextext[]; | |
37 | 38 | |
38 | 39 | static char* readtext; |
39 | 40 | static int filepos; |
@@ -130,6 +131,9 @@ FSFILE* FSfopen(const char * fileName, const char *mode){ | ||
130 | 131 | } else if (fileName[i+1]=='I' && fileName[i+2]=='N' && fileName[i+3]=='I') { |
131 | 132 | // INI file |
132 | 133 | readtext=(char*)&initext[0]; |
134 | + } else if (fileName[i+1]=='H' && fileName[i+2]=='E' && fileName[i+3]=='X') { | |
135 | + // HEX file | |
136 | + readtext=(char*)&hextext[0]; | |
133 | 137 | } else if (fileName[i+1]=='B' && fileName[i+2]=='A' && fileName[i+3]=='S') { |
134 | 138 | // Select BAS file |
135 | 139 | if (fileName[i-6]=='C' && fileName[i-5]=='L' && fileName[i-4]=='A' && |
@@ -184,6 +188,7 @@ long FSftell (FSFILE * fo){ | ||
184 | 188 | return 0; |
185 | 189 | } |
186 | 190 | int FSfseek(FSFILE *stream, long offset, int whence){ |
191 | + filepos=offset; | |
187 | 192 | return 0; |
188 | 193 | } |
189 | 194 | /* |
@@ -228,12 +233,10 @@ static const char initext[]= | ||
228 | 233 | "#PRINT\n"; |
229 | 234 | |
230 | 235 | static const char bastext[]= |
231 | -"USECLASS CLASS1,CLASS2\n" | |
232 | -"OPTION FASTFIELD\n" | |
233 | -"CLS\n" | |
234 | -"o=new(CLASS1)\n" | |
235 | -"o.T1=123\n" | |
236 | -"print o.T2()\n" | |
236 | +"useclib TCLIB\n" | |
237 | +"print TCLIB::TEST$(0);\n" | |
238 | +"print clib$(TCLIB::TEST,1)\n" | |
239 | +"\n" | |
237 | 240 | "\n" |
238 | 241 | "\n" |
239 | 242 | "\n" |
@@ -255,6 +258,47 @@ static const char class2text[]= | ||
255 | 258 | "\n" |
256 | 259 | "\n"; |
257 | 260 | |
261 | +static const char hextext[]= | |
262 | +":020000040000fa\n" | |
263 | +":1080000000001c3c707f9c2721e09903e0ffbd2706\n" | |
264 | +":108010001c00bfaf1000bcaf030080101880828f1f\n" | |
265 | +":1080200005000010000044ac1c80998f09f8200363\n" | |
266 | +":10803000000000001000bc8f2080828f1c00bf8fca\n" | |
267 | +":088040000800e0032000bd2749\n" | |
268 | +":020000040000fa\n" | |
269 | +":107f80000000000000000080ac7f00a0508000a036\n" | |
270 | +":107f9000708100a0548100a0000001a0388100a0e1\n" | |
271 | +":0c7fa000588000a000000000000000005d\n" | |
272 | +":020000040000fa\n" | |
273 | +":108050000800e0030000000000001c3c187f9c2783\n" | |
274 | +":1080600021e09903e0ffbd271c00bfaf1800b0afaf\n" | |
275 | +":108070001000bcaf110080542880828f1880908f30\n" | |
276 | +":108080000000048e2480998f09f82003000000006e\n" | |
277 | +":108090001000bc8f2880848f248184240000058eea\n" | |
278 | +":1080a0002c80998f09f82003000000001000bc8f7d\n" | |
279 | +":1080b0002880828f0200001004814224148142240f\n" | |
280 | +":1080c0001c00bf8f1800b08f0800e0032000bd2700\n" | |
281 | +":1080d00000001c3ca07e9c2721e09903e0ffbd2707\n" | |
282 | +":1080e0001c00bfaf1000bcaf3080998f09f820038f\n" | |
283 | +":1080f000000000001000bc8f1c00bf8f0800e003d0\n" | |
284 | +":048100002000bd2777\n" | |
285 | +":020000040000fa\n" | |
286 | +":1081040048656c6c6f20576f726c6421000000002e\n" | |
287 | +":108114005468697320697320612074657374000066\n" | |
288 | +":10812400434c494220746573742e000054455354e3\n" | |
289 | +":048134000000000047\n" | |
290 | +":020000040000fa\n" | |
291 | +":108138000000a38c0c00a28c0c00428c08004000ac\n" | |
292 | +":0c81480000007c8c0800e0030000000038\n" | |
293 | +":020000040000fa\n" | |
294 | +":108154000000838c0c00828c1800428c08004000c4\n" | |
295 | +":0c81640000007c8c0800e003000000001c\n" | |
296 | +":020000040000fa\n" | |
297 | +":108170004001000080000000808100a0000000009d\n" | |
298 | +":0c818000308100a0d08000a000000000b2\n" | |
299 | +":00000001FF\n" | |
300 | +; | |
301 | + | |
258 | 302 | /* |
259 | 303 | Test function for constructing assemblies from C codes. |
260 | 304 | */ |
@@ -285,6 +329,15 @@ int _debug_test(int a0, int a1, int a2, int a3, int param4, int param5){ | ||
285 | 329 | return a2+a3; |
286 | 330 | } |
287 | 331 | |
332 | +int _debug_test2(int a0, int a1, int a2, int a3, int a4){ | |
333 | + int v0; | |
334 | + v0=v0+a0; | |
335 | + v0=v0*a1; | |
336 | + v0=v0 & a3; | |
337 | + v0=v0 | a4; | |
338 | + return v0; | |
339 | +} | |
340 | + | |
288 | 341 | /* |
289 | 342 | Break point used for debugging object code. |
290 | 343 |
@@ -240,9 +240,9 @@ int lib_system(int a0, int a1 ,int v0, int a3, int g_gcolor, int g_prev_x, int g | ||
240 | 240 | case 200: |
241 | 241 | // ON/OFF monitor |
242 | 242 | if (v0) { |
243 | -// start_composite(); | |
243 | + start_composite(); | |
244 | 244 | } else { |
245 | -// stop_composite(); | |
245 | + stop_composite(); | |
246 | 246 | } |
247 | 247 | break; |
248 | 248 | default: |
@@ -250,3 +250,8 @@ int lib_system(int a0, int a1 ,int v0, int a3, int g_gcolor, int g_prev_x, int g | ||
250 | 250 | } |
251 | 251 | return 0; |
252 | 252 | } |
253 | + | |
254 | +// Do nothing in following functions. | |
255 | +unsigned char shiftkeys(){ return 0; } | |
256 | +void start_composite(){} | |
257 | +void stop_composite(){} |
@@ -6,7 +6,9 @@ | ||
6 | 6 | */ |
7 | 7 | |
8 | 8 | #define CPU_CLOCK_HZ 48000000 |
9 | -#define PERSISTENT_RAM_SIZE (1024*53) | |
9 | +#define PERSISTENT_RAM_SIZE (1024*53) // 0xD400 | |
10 | +#define MACHIKANIA_OBJ_ADDRESS (0x9D040000 - 0xD400) | |
11 | +#define MACHIKANIA_OBJ_INFO (MACHIKANIA_OBJ_ADDRESS-16) | |
10 | 12 | |
11 | 13 | int readbuttons(); |
12 | 14 | void scroll(int x, int y); |
@@ -42,6 +42,10 @@ const char* g_err_str[]={ | ||
42 | 42 | "Invalid in class file", |
43 | 43 | "INIT method does not exist", |
44 | 44 | "ERR_OPTION_CLASSCODE", |
45 | + "ERR_COMPILE_CLIB", | |
46 | + "C library not found", | |
47 | + "HEX file syntax error", | |
48 | + "Class or C library not found", | |
45 | 49 | }; |
46 | 50 | |
47 | 51 | char* resolve_label(int s6){ |
@@ -13,10 +13,12 @@ | ||
13 | 13 | #include "api.h" |
14 | 14 | #include "compiler.h" |
15 | 15 | |
16 | -static FSFILE* g_fhandle; | |
17 | -static char* g_fbuff; | |
18 | -static int g_size; | |
19 | -static int g_filepoint; | |
16 | +// Variables used for file handling, shared with the other components | |
17 | +// Note that only one file can be open | |
18 | +FSFILE* g_fhandle; | |
19 | +char* g_fbuff; | |
20 | +int g_size; | |
21 | +int g_filepoint; | |
20 | 22 | |
21 | 23 | char* init_file(char* buff,char* appname){ |
22 | 24 | // Open file |
@@ -87,6 +89,8 @@ char* compile_file(){ | ||
87 | 89 | char* err; |
88 | 90 | // Read first 512 bytes |
89 | 91 | read_file(512); |
92 | + // Skip BOM (UTF-8) if exists | |
93 | + if (0xEF==g_source[0] && 0xBB==g_source[1] && 0xBF==g_source[2]) g_srcpos=3; | |
90 | 94 | // Compile line by line |
91 | 95 | while (g_size==512) { |
92 | 96 | err=compile_line(); |
@@ -147,7 +151,7 @@ int compile_and_link_file(char* buff,char* appname){ | ||
147 | 151 | err=compile_file(); |
148 | 152 | close_file(); |
149 | 153 | |
150 | - // If compiling a class file is required, do it. | |
154 | + // If compiling a class file or a clib is required, do it. | |
151 | 155 | if (err==ERR_COMPILE_CLASS) { |
152 | 156 | j=g_compiling_class; |
153 | 157 | i=compile_and_link_class(buff, g_class); |
@@ -155,6 +159,11 @@ int compile_and_link_file(char* buff,char* appname){ | ||
155 | 159 | if (i) return i; |
156 | 160 | // Continue compiling current file from the beginning. |
157 | 161 | continue; |
162 | + } else if (err==ERR_COMPILE_CLIB) { | |
163 | + err=useclib_begin(buff); | |
164 | + // Continue compiling current file from the beginning. | |
165 | + if (err) break; | |
166 | + continue; | |
158 | 167 | } |
159 | 168 | break; |
160 | 169 | } |
@@ -239,7 +248,7 @@ int compile_and_link_class(char* buff,int class){ | ||
239 | 248 | // Restore current dirctory |
240 | 249 | cmpdata_reset(); |
241 | 250 | while(record=cmpdata_find(CMPDATA_TEMP)){ |
242 | - if (cwd_id=(record[0]&0xffff)) break; | |
251 | + if ((record[0]&0xffff)==cwd_id) break; | |
243 | 252 | } |
244 | 253 | if (!record) break; |
245 | 254 | FSchdir((char*)(&record[1])); |
@@ -293,4 +302,4 @@ int compile_and_link_main_file(char* buff,char* appname){ | ||
293 | 302 | to use the same long var name in different files (note that g_long_name_var_num is not reseted after |
294 | 303 | compiling each class code). |
295 | 304 | */ |
296 | -} | |
\ No newline at end of file | ||
305 | +} |
@@ -9,6 +9,13 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "./compiler.h" |
13 | 20 | #include "stdlib.h" |
14 | 21 |
@@ -9,6 +9,13 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "compiler.h" |
13 | 20 | #include "api.h" |
14 | 21 |
@@ -494,12 +501,17 @@ char* float_function(void){ | ||
494 | 501 | err=gosub_function(); |
495 | 502 | } else if (nextCodeIs("ARGS#(")) { |
496 | 503 | err=args_function(); |
504 | + } else if (nextCodeIs("CLIB#(")) { | |
505 | + err=clib_statement(); | |
497 | 506 | } else if (nextCodeIs("PI#")) { |
498 | 507 | return float_constant(3.141593); |
499 | 508 | } else { |
500 | 509 | // Check if static method of a class |
501 | 510 | err=static_method('#'); |
502 | - //return ERR_SYNTAX; | |
511 | + if (err==ERR_NO_CLASS) { | |
512 | + err=clib_method('#'); | |
513 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
514 | + } | |
503 | 515 | } |
504 | 516 | if (err) return err; |
505 | 517 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -520,6 +532,7 @@ static const void* str_func_list[]={ | ||
520 | 532 | "SYSTEM$(",system_function, |
521 | 533 | "FINPUT$(",finput_function, |
522 | 534 | "GETDIR$(",getdir_function, |
535 | + "CLIB$(",clib_statement, | |
523 | 536 | // Additional functions follow |
524 | 537 | ADDITIONAL_STR_FUNCTIONS |
525 | 538 | }; |
@@ -539,7 +552,10 @@ char* str_function(void){ | ||
539 | 552 | } else { |
540 | 553 | // Check if static method of a class |
541 | 554 | err=static_method('$'); |
542 | - //return ERR_SYNTAX; | |
555 | + if (err==ERR_NO_CLASS) { | |
556 | + err=clib_method('$'); | |
557 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
558 | + } | |
543 | 559 | } |
544 | 560 | if (err) return err; |
545 | 561 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -609,6 +625,7 @@ static const void* int_func_list[]={ | ||
609 | 625 | "EXEC(",exec_function, |
610 | 626 | "CORETIMER(",coretimer_function, |
611 | 627 | "READKEY(",readkey_function, |
628 | + "CLIB(",clib_statement, | |
612 | 629 | // Additional functions follow |
613 | 630 | ADDITIONAL_INT_FUNCTIONS |
614 | 631 | }; |
@@ -626,9 +643,12 @@ char* function(void){ | ||
626 | 643 | f=int_func_list[i+1]; |
627 | 644 | err=f(); |
628 | 645 | } else { |
629 | - // Check if static method of a class | |
646 | + // Check if static method of a class of clib | |
630 | 647 | err=static_method(0); |
631 | - //return ERR_SYNTAX; | |
648 | + if (err==ERR_NO_CLASS) { | |
649 | + err=clib_method(0); | |
650 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
651 | + } | |
632 | 652 | } |
633 | 653 | if (err) return err; |
634 | 654 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -12,6 +12,13 @@ | ||
12 | 12 | #include "compiler.h" |
13 | 13 | #include "main.h" |
14 | 14 | |
15 | +// Store g_object/g_objpos values for MOS at jest before MACHIKANIA_OBJ_ADDRESS. | |
16 | +// When these values are 0, MOS code is not loaded. | |
17 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-16))) _reserved1_mos=0; | |
18 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-12))) _reserved2_mos=0; | |
19 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-8))) g_object_mos=0; | |
20 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-4))) g_objpos_mos=0; | |
21 | + | |
15 | 22 | // Contain the valus of $gp and $s6 (GPR of MIPS32) |
16 | 23 | int g_gp; |
17 | 24 | int g_s6; |
@@ -95,5 +102,11 @@ unsigned char g_num_classes; | ||
95 | 102 | // OPTION FASTFIELD |
96 | 103 | char g_option_fastfield; |
97 | 104 | |
105 | +// Flag if file system has been initialized | |
106 | +char g_fs_valid; | |
107 | + | |
108 | +// Result of reading a HEX file line | |
109 | +HEXLINE g_hexline; | |
110 | + | |
98 | 111 | // General purpose integer used for asigning value with pointer |
99 | 112 | int g_temp; |
@@ -161,8 +161,7 @@ extern unsigned char lockkey; // | ||
161 | 161 | extern unsigned char keytype; // キーボードの種類。0:日本語109キー、1:英語104キー |
162 | 162 | |
163 | 163 | //int ps2init(); // PS/2ライブラリ関連初期化。正常終了0、エラーで-1を返す |
164 | -//unsigned char shiftkeys(); // SHIFT関連キーの押下状態を返す | |
165 | -#define shiftkeys() 0 // SHIFT関連キーの押下状態を返す | |
164 | +unsigned char shiftkeys(); // SHIFT関連キーの押下状態を返す(常にゼロを返す) | |
166 | 165 | unsigned char ps2readkey(); |
167 | 166 | // 入力された1つのキーのキーコードをグローバル変数vkeyに格納(押されていなければ0を返す) |
168 | 167 | // 下位8ビット:キーコード |
@@ -51,8 +51,8 @@ extern unsigned char *fontp; | ||
51 | 51 | extern unsigned char twidth; //テキスト1行文字数(30 or 40) |
52 | 52 | extern unsigned int bgcolor; // バックグランドカラー |
53 | 53 | |
54 | -//void start_composite(void); //カラーコンポジット出力開始 | |
55 | -//void stop_composite(void); //カラーコンポジット出力停止 | |
54 | +void start_composite(void); //カラーコンポジット出力開始(なにもしない) | |
55 | +void stop_composite(void); //カラーコンポジット出力停止(なにもしない) | |
56 | 56 | //void init_composite(void); //カラーコンポジット出力初期化 |
57 | 57 | void clearscreen(void); //テキスト画面クリア |
58 | 58 | void set_palette(unsigned char n,unsigned char b,unsigned char r,unsigned char g); //テキストパレット設定 |
@@ -779,6 +779,11 @@ int lib_file(enum functions func, int a0, int a1, int v0){ | ||
779 | 779 | int i; |
780 | 780 | int buff[1]; |
781 | 781 | char* str; |
782 | + | |
783 | + // Immediately return if file system is invalid. | |
784 | + // See also "case LIB_FILE:" in _call_library(). | |
785 | + if (!g_fs_valid) return v0; | |
786 | + | |
782 | 787 | if (activefhandle) fhandle=s_fhandle[activefhandle-1]; |
783 | 788 | switch(func){ |
784 | 789 | case FUNC_FINIT: |
@@ -1011,6 +1016,7 @@ int _call_library(int a0,int a1,int v0,enum libs a3){ | ||
1011 | 1016 | scroll(g_libparams[1],v0); |
1012 | 1017 | return v0; |
1013 | 1018 | case LIB_FILE: |
1019 | + if (!g_fs_valid) err_str("File System not initialized"); | |
1014 | 1020 | return lib_file((enum functions)(a3 & FUNC_MASK),g_libparams[1],g_libparams[2],v0); |
1015 | 1021 | case LIB_KEYS: |
1016 | 1022 | return lib_keys(v0); |
@@ -146,6 +146,7 @@ int searchinittext(char *s){ | ||
146 | 146 | void readinifile(void){ |
147 | 147 | FSFILE *fp; |
148 | 148 | char inittext[9]; |
149 | + if (!g_fs_valid) return; | |
149 | 150 | |
150 | 151 | fp=FSfopen(INIFILE,"r"); |
151 | 152 | if(fp==NULL) return; |
@@ -192,6 +193,7 @@ void printhex32(unsigned int d){ | ||
192 | 193 | |
193 | 194 | int main(void){ |
194 | 195 | char *appname,*s; |
196 | + int use_editor; | |
195 | 197 | |
196 | 198 | if(DEVCFG1 & 0x8000){ |
197 | 199 | // Set Clock switching enabled and reset |
@@ -230,6 +232,18 @@ int main(void){ | ||
230 | 232 | // Show blue screen if exception before soft reset. |
231 | 233 | blue_screen(); |
232 | 234 | |
235 | + // 実行中HEXファイル名がHEXFILEと一致するかどうか | |
236 | + use_editor=0; | |
237 | + appname=(char*)FILENAME_FLASH_ADDRESS; | |
238 | + s=HEXFILE; | |
239 | + while(*s++==*appname++) { | |
240 | + if(*s==0) { | |
241 | + //テキストエディター呼び出し | |
242 | + use_editor=1; | |
243 | + break; | |
244 | + } | |
245 | + } | |
246 | + | |
233 | 247 | printstr("MachiKania BASIC System\n"); |
234 | 248 | printstr(" Ver "SYSVER1" "SYSVER2" by KENKEN\n"); |
235 | 249 | printstr("BASIC Compiler "BASVER"\n"); |
@@ -237,34 +251,46 @@ int main(void){ | ||
237 | 251 | //SDカードファイルシステム初期化 |
238 | 252 | setcursorcolor(COLOR_NORMALTEXT); |
239 | 253 | printstr("Init File System..."); |
240 | - // Initialize the File System | |
241 | - if(FSInit()==FALSE){ //ファイルシステム初期化 | |
242 | - //エラーの場合停止 | |
243 | - setcursorcolor(COLOR_ERRORTEXT); | |
244 | - printstr("\nFile System Error\n"); | |
245 | - printstr("Insert Correct Card\n"); | |
246 | - printstr("And Reset\n"); | |
247 | - while(1) asm("wait"); | |
254 | + g_fs_valid=FSInit(); //ファイルシステム初期化 | |
255 | + if(g_fs_valid==FALSE){ | |
256 | + if (use_editor || !g_objpos_mos) { | |
257 | + // Editorモードの場合、及び、BASファイル読み込みモードの場合 | |
258 | + //エラーの場合停止 | |
259 | + setcursorcolor(COLOR_ERRORTEXT); | |
260 | + printstr("\nFile System Error\n"); | |
261 | + printstr("Insert Correct Card\n"); | |
262 | + printstr("And Reset\n"); | |
263 | + while(1) asm("wait"); | |
264 | + } else { | |
265 | + // MOSモードの場合は、あと二回、トライ | |
266 | + // エラー表示の後、続ける | |
267 | + g_fs_valid=FSInit(); | |
268 | + if(g_fs_valid==FALSE) g_fs_valid=FSInit(); | |
269 | + } | |
248 | 270 | } |
249 | - printstr("OK\n"); | |
271 | + if (g_fs_valid) printstr("OK\n"); | |
272 | + else printstr("Failed\n"); | |
250 | 273 | readinifile(); //INIファイル読み込み |
251 | 274 | |
252 | 275 | wait60thsec(60); //1秒待ち |
253 | 276 | |
254 | 277 | // 実行中HEXファイル名がHEXFILEと一致した場合はエディタ起動 |
255 | - appname=(char*)FILENAME_FLASH_ADDRESS; | |
256 | - s=HEXFILE; | |
257 | - while(*s++==*appname++) if(*s==0) texteditor(); //テキストエディター呼び出し | |
278 | + if(use_editor) texteditor(); //テキストエディター呼び出し | |
258 | 279 | |
259 | - // 実行中HEXファイル名の「.HEX」を「.BAS」に置き換えてBASファイルを実行 | |
260 | - appname=(char*)FILENAME_FLASH_ADDRESS; | |
261 | - s=tempfile; | |
262 | - while(*appname!='.') *s++=*appname++; | |
263 | - appname=".BAS"; | |
264 | - while(*appname!=0) *s++=*appname++; | |
265 | - *s=0; | |
266 | - // buttonmode(); //ボタン有効化 | |
267 | 280 | g_disable_break=1; // Breakキー無効化 |
268 | - runbasic(tempfile,0); | |
281 | + // buttonmode(); //ボタン有効化 | |
282 | + if (g_objpos_mos) { | |
283 | + // MOSからコードをコピーして実行 | |
284 | + runbasic(0,2); | |
285 | + } else { | |
286 | + // 実行中HEXファイル名の「.HEX」を「.BAS」に置き換えてBASファイルを実行 | |
287 | + appname=(char*)FILENAME_FLASH_ADDRESS; | |
288 | + s=tempfile; | |
289 | + while(*appname!='.') *s++=*appname++; | |
290 | + appname=".BAS"; | |
291 | + while(*appname!=0) *s++=*appname++; | |
292 | + *s=0; | |
293 | + runbasic(tempfile,0); | |
294 | + } | |
269 | 295 | while(1) asm(WAIT); |
270 | 296 | } |
@@ -6,8 +6,9 @@ | ||
6 | 6 | */ |
7 | 7 | |
8 | 8 | #define SYSVER1 "Protozoea" |
9 | -#define SYSVER2 "1.3" | |
10 | -#define BASVER "KM-1208" | |
9 | +#define SYSVER2 "1.4" | |
10 | +#define SYSVERI 0x0140 | |
11 | +#define BASVER "KM-1209" | |
11 | 12 | |
12 | 13 | #define INIFILE "MACHILCD.INI" // 初期設定ファイル |
13 | 14 | #define HEXFILE "MACHILCD.HEX" // 実行中HEXファイル名がこれと一致した場合はエディタ起動 |
@@ -69,6 +69,9 @@ file_041=. | ||
69 | 69 | file_042=. |
70 | 70 | file_043=. |
71 | 71 | file_044=. |
72 | +file_045=. | |
73 | +file_046=. | |
74 | +file_047=. | |
72 | 75 | [GENERATED_FILES] |
73 | 76 | file_000=no |
74 | 77 | file_001=no |
@@ -115,6 +118,9 @@ file_041=no | ||
115 | 118 | file_042=no |
116 | 119 | file_043=no |
117 | 120 | file_044=no |
121 | +file_045=no | |
122 | +file_046=no | |
123 | +file_047=no | |
118 | 124 | [OTHER_FILES] |
119 | 125 | file_000=no |
120 | 126 | file_001=no |
@@ -157,10 +163,13 @@ file_037=no | ||
157 | 163 | file_038=no |
158 | 164 | file_039=no |
159 | 165 | file_040=no |
160 | -file_041=yes | |
161 | -file_042=yes | |
166 | +file_041=no | |
167 | +file_042=no | |
162 | 168 | file_043=yes |
163 | 169 | file_044=yes |
170 | +file_045=yes | |
171 | +file_046=yes | |
172 | +file_047=yes | |
164 | 173 | [FILE_INFO] |
165 | 174 | file_000=args.c |
166 | 175 | file_001=class.c |
@@ -190,23 +199,26 @@ file_024=varname.c | ||
190 | 199 | file_025=interface\graphlib.c |
191 | 200 | file_026=interface\keyinput.c |
192 | 201 | file_027=interface\LCDdriver.c |
193 | -file_028=api.h | |
194 | -file_029=compiler.h | |
195 | -file_030=debug.h | |
196 | -file_031=editor.h | |
197 | -file_032=envspecific.h | |
198 | -file_033=main.h | |
199 | -file_034=interface\keyinput.h | |
200 | -file_035=interface\LCDdriver.h | |
201 | -file_036=interface\ps2keyboard.h | |
202 | -file_037=interface\SDFSIO.h | |
203 | -file_038=interface\videoout.h | |
204 | -file_039=interface\libsdfsio.a | |
205 | -file_040=App_32MX170F256B.ld | |
206 | -file_041=reservednames.js | |
207 | -file_042=sharedfiles.js | |
208 | -file_043=class.txt | |
209 | -file_044=help.txt | |
202 | +file_028=clib.c | |
203 | +file_029=hexfile.c | |
204 | +file_030=api.h | |
205 | +file_031=compiler.h | |
206 | +file_032=debug.h | |
207 | +file_033=editor.h | |
208 | +file_034=envspecific.h | |
209 | +file_035=main.h | |
210 | +file_036=interface\keyinput.h | |
211 | +file_037=interface\LCDdriver.h | |
212 | +file_038=interface\ps2keyboard.h | |
213 | +file_039=interface\SDFSIO.h | |
214 | +file_040=interface\videoout.h | |
215 | +file_041=interface\libsdfsio.a | |
216 | +file_042=App_32MX170F256B.ld | |
217 | +file_043=reservednames.js | |
218 | +file_044=sharedfiles.js | |
219 | +file_045=class.txt | |
220 | +file_046=help.txt | |
221 | +file_047=clib.txt | |
210 | 222 | [SUITE_INFO] |
211 | 223 | suite_guid={62D235D8-2DB2-49CD-AF24-5489A6015337} |
212 | 224 | suite_state= |
@@ -100,6 +100,7 @@ var namearray=[ | ||
100 | 100 | 'CHR', |
101 | 101 | 'CIRCLE', |
102 | 102 | 'CLEAR', |
103 | + 'CLIB', | |
103 | 104 | 'CLS', |
104 | 105 | 'COLOR', |
105 | 106 | 'COS', |
@@ -32,10 +32,14 @@ char* printdec(int num){ | ||
32 | 32 | } |
33 | 33 | } |
34 | 34 | |
35 | -int runbasic(char *appname,int test){ | |
35 | +#define RUNMODE_COMPILE_AND_RUN 0 | |
36 | +#define RUNMODE_COMPILE_ONLY 1 | |
37 | +#define RUNMODE_COPY_AND_RUN 2 | |
38 | + | |
39 | +int runbasic(char *appname,int mode){ | |
36 | 40 | // BASICソースのコンパイルと実行 |
37 | 41 | // appname 実行するBASICソースファイル |
38 | -// test 0:コンパイルと実行、0以外:コンパイルのみで終了 | |
42 | +// mode 0:コンパイルと実行、1:コンパイルのみで終了、2:コンパイル済みオブジェクトを実行 | |
39 | 43 | // |
40 | 44 | // 戻り値 |
41 | 45 | // 0:正常終了 |
@@ -57,16 +61,18 @@ int runbasic(char *appname,int test){ | ||
57 | 61 | // Clear object area |
58 | 62 | for(i=0;i<RAMSIZE/4;i++) g_object[i]=0x00000000; |
59 | 63 | |
60 | - // Check file error | |
61 | - err=init_file(buff,appname); | |
62 | - if (err) { | |
63 | - setcursorcolor(COLOR_ERRORTEXT); | |
64 | - printstr("Can't Open "); | |
65 | - printstr(appname); | |
66 | - printchar('\n'); | |
67 | - return -1; | |
64 | + if (mode!=RUNMODE_COPY_AND_RUN) { | |
65 | + // Check file error | |
66 | + err=init_file(buff,appname); | |
67 | + if (err) { | |
68 | + setcursorcolor(COLOR_ERRORTEXT); | |
69 | + printstr("Can't Open "); | |
70 | + printstr(appname); | |
71 | + printchar('\n'); | |
72 | + return -1; | |
73 | + } | |
74 | + close_file(); | |
68 | 75 | } |
69 | - close_file(); | |
70 | 76 | |
71 | 77 | // Initialize parameters |
72 | 78 | g_pcg_font=0; |
@@ -75,7 +81,6 @@ int runbasic(char *appname,int test){ | ||
75 | 81 | clearscreen(); |
76 | 82 | setcursor(0,0,7); |
77 | 83 | g_long_name_var_num=0; |
78 | - cmpdata_init(); | |
79 | 84 | |
80 | 85 | // Initialize music system |
81 | 86 | init_music(); |
@@ -85,13 +90,24 @@ int runbasic(char *appname,int test){ | ||
85 | 90 | |
86 | 91 | printstr("Compiling..."); |
87 | 92 | |
88 | - // Compile the file | |
89 | - i=compile_and_link_main_file(buff,appname); | |
90 | - if (i) return i; | |
91 | - | |
93 | + if (mode==RUNMODE_COPY_AND_RUN) { | |
94 | + // Copy the object from MOS | |
95 | + appname=(char*)MACHIKANIA_OBJ_ADDRESS; | |
96 | + for(i=0;i<RAMSIZE;i++) RAM[i]=appname[i]; | |
97 | + // Set g_object/g_objpos for library functions like lib_read(). | |
98 | + // The g_object/g_objpos values are stoared just before MOS. | |
99 | + g_object=(int*)g_object_mos; | |
100 | + g_objpos=g_objpos_mos; | |
101 | + } else { | |
102 | + // Initialize compiler | |
103 | + cmpdata_init(); | |
104 | + // Compile the file | |
105 | + i=compile_and_link_main_file(buff,appname); | |
106 | + if (i) return i; | |
107 | + } | |
92 | 108 | // All done |
93 | 109 | printstr("done\n"); |
94 | - if(test) return 0; //コンパイルのみの場合 | |
110 | + if(mode==RUNMODE_COMPILE_ONLY) return 0; //コンパイルのみの場合 | |
95 | 111 | wait60thsec(15); |
96 | 112 | |
97 | 113 | // Initialize the other parameters |
@@ -131,3 +147,114 @@ int runbasic(char *appname,int test){ | ||
131 | 147 | |
132 | 148 | return 0; |
133 | 149 | } |
150 | + | |
151 | +int create_self_running_hex(char* hexfilename){ | |
152 | + int i,j,fpos; | |
153 | + FSFILE* dst_file; | |
154 | + char* buff; | |
155 | + char* err; | |
156 | + unsigned int* object; | |
157 | + unsigned int addr,adjust; | |
158 | + unsigned int data[4]; | |
159 | + // Set buffer positions | |
160 | + buff=(char*)&(RAM[RAMSIZE-512]); | |
161 | + // Open original and destination HEX files. | |
162 | + if (hex_init_file(buff,HEXFILE)) return -1; | |
163 | + dst_file=FSfopen(hexfilename,"w"); | |
164 | + if (!dst_file) { | |
165 | + hex_close_file(); | |
166 | + return -1; | |
167 | + } | |
168 | + // Copy the HEX file from original MachiKania, except for MOS. | |
169 | + addr=0; | |
170 | + fpos=0; | |
171 | + while(1) { | |
172 | + if (0==((fpos++)&0x3ff)) { | |
173 | + // Indicator works every 1024 lines | |
174 | + printchar('.'); | |
175 | + } | |
176 | + err=hex_read_line(); | |
177 | + if (err) break; | |
178 | + // Determine type and current address. | |
179 | + // If address is OK, write it to destination. | |
180 | + if (g_hexline.type==1) { | |
181 | + // EOF | |
182 | + break; | |
183 | + } else if (g_hexline.type==4) { | |
184 | + // extended linear address | |
185 | + addr=g_hexline.data[0]; | |
186 | + addr=addr<<8; | |
187 | + addr|=g_hexline.data[1]; | |
188 | + addr=addr<<16; | |
189 | + // Highest bit will be 1 for 0x9D0xxxxx instead of 0x1D0xxxxx | |
190 | + addr|=0x80000000; | |
191 | + // Write this anyway | |
192 | + err=hex_write(dst_file); | |
193 | + if (err) break; | |
194 | + } else if (g_hexline.type==0) { | |
195 | + // data | |
196 | + addr&=0xffff0000; | |
197 | + addr|=g_hexline.address; | |
198 | + // Write this line if not in MOS | |
199 | + if (addr<MACHIKANIA_OBJ_INFO || FILENAME_FLASH_ADDRESS<=addr) { | |
200 | + err=hex_write(dst_file); | |
201 | + if (err) break; | |
202 | + } | |
203 | + } else { | |
204 | + // Unknown type | |
205 | + err=ERR_HEX_ERROR; | |
206 | + break; | |
207 | + } | |
208 | + } | |
209 | + hex_close_file(); | |
210 | + if (err) { | |
211 | + FSfclose(dst_file); | |
212 | + printstr(err); | |
213 | + return -1; | |
214 | + } | |
215 | + // Save MACHIKANIA_OBJ_INFO | |
216 | + addr=MACHIKANIA_OBJ_INFO; | |
217 | + err=hex_write_address(dst_file,addr>>16); | |
218 | + if (!err) { | |
219 | + data[2]=(int)g_object; | |
220 | + data[3]=(int)g_objpos; | |
221 | + err=hex_write_data_16(dst_file,addr&0xffff,&data[0]); | |
222 | + } | |
223 | + if (err) { | |
224 | + FSfclose(dst_file); | |
225 | + printstr(err); | |
226 | + return -1; | |
227 | + } | |
228 | + // Add MOS. Adjustment is for changing address from RAM area to MOS. | |
229 | + addr=-1; | |
230 | + object=(unsigned int*)(&RAM[0]); | |
231 | + adjust=(unsigned int)MACHIKANIA_OBJ_ADDRESS-(unsigned int)object; | |
232 | + while(object<(unsigned int*)(&g_object[g_objpos])){ | |
233 | + if (0==((fpos++)&0x3ff)) { | |
234 | + // Indicator works every 1024 lines | |
235 | + printchar('.'); | |
236 | + } | |
237 | + if ((0x7fff0000 & ((unsigned int)object+adjust)) != addr) { | |
238 | + // Construct a hex line for providing Extended linear addres | |
239 | + addr=0x7fff0000 & ((unsigned int)object+adjust); | |
240 | + err=hex_write_address(dst_file,addr>>16); | |
241 | + if (err) break; | |
242 | + } | |
243 | + // Construct a hex line for data | |
244 | + err=hex_write_data_16(dst_file,((unsigned int)object+adjust)&0xffff,object); | |
245 | + if (err) break; | |
246 | + // All OK for these 4 words (16 bytes). | |
247 | + object+=4; | |
248 | + err=0; | |
249 | + } | |
250 | + if (err) { | |
251 | + FSfclose(dst_file); | |
252 | + printstr(err); | |
253 | + return -1; | |
254 | + } | |
255 | + // All done. Write EOF | |
256 | + err=hex_write_eof(dst_file); | |
257 | + FSfclose(dst_file); | |
258 | + if (err) return -1; | |
259 | + return 0; | |
260 | +} |
@@ -12,6 +12,7 @@ | ||
12 | 12 | var filearray=[ |
13 | 13 | 'args.c', |
14 | 14 | 'class.c', |
15 | + 'clib.c', | |
15 | 16 | 'cmpdata.c', |
16 | 17 | 'compiler.c', |
17 | 18 | 'debug.c', |
@@ -21,6 +22,7 @@ var filearray=[ | ||
21 | 22 | 'float.c', |
22 | 23 | 'function.c', |
23 | 24 | 'globalvars.c', |
25 | + 'hexfile.c', | |
24 | 26 | 'library.c', |
25 | 27 | 'linker.c', |
26 | 28 | 'memory.c', |
@@ -36,6 +38,7 @@ var filearray=[ | ||
36 | 38 | 'reservednames.js', |
37 | 39 | 'sharedfiles.js', |
38 | 40 | 'class.txt', |
41 | + 'clib.txt', | |
39 | 42 | ]; |
40 | 43 | |
41 | 44 | var WshShell = WScript.CreateObject("WScript.Shell"); |
@@ -9,6 +9,13 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "api.h" |
13 | 20 | #include "compiler.h" |
14 | 21 |
@@ -1435,11 +1442,11 @@ char* fclose_statement(){ | ||
1435 | 1442 | |
1436 | 1443 | TODO: candidates to add: |
1437 | 1444 | |
1438 | -int FSattrib (FSFILE * file, unsigned char attributes); | |
1445 | +// int FSattrib (FSFILE * file, unsigned char attributes); | |
1439 | 1446 | int FSrename (const char * fileName, FSFILE * fo); |
1440 | 1447 | int FSmkdir (char * path); |
1441 | 1448 | int FSrmdir (char * path, unsigned char rmsubdirs); |
1442 | -int SetClockVars (unsigned int year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second); | |
1449 | +// int SetClockVars (unsigned int year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second); | |
1443 | 1450 | int FindFirst (const char * fileName, unsigned int attr, SearchRec * rec); |
1444 | 1451 | int FindNext (SearchRec * rec); |
1445 | 1452 |
@@ -1754,6 +1761,8 @@ static const void* statement_list[]={ | ||
1754 | 1761 | "INTERRUPT ",interrupt_statement, |
1755 | 1762 | "IDLE",idle_statement, |
1756 | 1763 | "CORETIMER",coretimer_statement, |
1764 | + "USECLIB",useclib_statement, | |
1765 | + "CLIB",clib_statement, | |
1757 | 1766 | // List of additional statements follows |
1758 | 1767 | ADDITIONAL_STATEMENTS |
1759 | 1768 | }; |
@@ -15,6 +15,13 @@ | ||
15 | 15 | char* simple_string(void); |
16 | 16 | */ |
17 | 17 | |
18 | +/* | |
19 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
20 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
21 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
22 | + See the MOS definition in liker script. | |
23 | +*/ | |
24 | + | |
18 | 25 | #include "api.h" |
19 | 26 | #include "compiler.h" |
20 | 27 |
@@ -13,6 +13,13 @@ | ||
13 | 13 | Public function is only get_value(). |
14 | 14 | */ |
15 | 15 | |
16 | +/* | |
17 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
18 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
19 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
20 | + See the MOS definition in liker script. | |
21 | +*/ | |
22 | + | |
16 | 23 | #include "compiler.h" |
17 | 24 | |
18 | 25 | char* get_value(); |
@@ -32,6 +32,7 @@ static const int reserved_var_names[]={ | ||
32 | 32 | 0x0001129b, /*CHR*/ |
33 | 33 | 0x0e7f3303, /*CIRCLE*/ |
34 | 34 | 0x0067525f, /*CLEAR*/ |
35 | + 0x0003c489, /*CLIB*/ | |
35 | 36 | 0x00011330, /*CLS*/ |
36 | 37 | 0x0069cb6b, /*COLOR*/ |
37 | 38 | 0x0001139f, /*COS*/ |
@@ -194,6 +195,18 @@ int check_var_name(){ | ||
194 | 195 | return i; |
195 | 196 | } |
196 | 197 | |
198 | +int str_to_name_int(char* str){ | |
199 | + int i; | |
200 | + char* src=g_source; | |
201 | + int pos=g_srcpos; | |
202 | + g_source=str; | |
203 | + g_srcpos=0; | |
204 | + i=check_var_name(); | |
205 | + g_source=src; | |
206 | + g_srcpos=pos; | |
207 | + return i; | |
208 | +} | |
209 | + | |
197 | 210 | /* |
198 | 211 | int get_var_number(); |
199 | 212 | This function returns variable number that can be used as the index of $s8 |
@@ -105,7 +105,7 @@ _GEN_EXCPT_ADDR = _ebase_address + 0x180; | ||
105 | 105 | MEMORY |
106 | 106 | { |
107 | 107 | kseg0_program_mem (rx) : ORIGIN = (0x9D006000 + 0x1000 + 0x490), LENGTH = 0x40000 - 0xD000 - (0x6000 + 0x1000 + 0x490) /* Most C Functions will be located here */ |
108 | - kseg2_program_mem (rx) : ORIGIN = (0x9D040000 - (0xD000-4)), LENGTH = 0xD000 -4 /* Some C Functions (editor and compiler) will be located here */ | |
108 | + kseg2_program_mem (rx) : ORIGIN = (0x9D040000 - 0xD000), LENGTH = 0xD000 /* Some C Functions (editor and compiler) will be located here */ | |
109 | 109 | exception_mem : ORIGIN = 0x9D006000, LENGTH = 0x1000 /* Interrupt vector table */ |
110 | 110 | debug_exec_mem : ORIGIN = 0x9FC00490, LENGTH = 0x760 |
111 | 111 | kseg0_boot_mem : ORIGIN = 0x9D006000, LENGTH = 0x0 /* This memory region is dummy */ |
@@ -119,18 +119,6 @@ MEMORY | ||
119 | 119 | configsfrs : ORIGIN = 0xBFC00BF0, LENGTH = 0x10 |
120 | 120 | } |
121 | 121 | |
122 | - | |
123 | -/* | |
124 | - * MachiKania specific section containing some functions for editor and compiler | |
125 | - */ | |
126 | - | |
127 | -SECTIONS | |
128 | -{ | |
129 | - .machikania_object : { | |
130 | - KEEP(*(.machikania_object)) | |
131 | - } > kseg2_program_mem | |
132 | -} | |
133 | - | |
134 | 122 | /************************************************************************* |
135 | 123 | * Configuration-word sections. Map the config-pragma input sections to |
136 | 124 | * absolute-address output sections. |
@@ -152,6 +140,27 @@ SECTIONS | ||
152 | 140 | } |
153 | 141 | SECTIONS |
154 | 142 | { |
143 | + | |
144 | + /* MachiKania Object Section (MOS) (size: 0xD000) */ | |
145 | + .machikaniaobjtext ORIGIN(kseg2_program_mem): | |
146 | + { | |
147 | + KEEP (*\statement.o(.text)) | |
148 | + KEEP (*\function.o(.text)) | |
149 | + KEEP (*\value.o(.text)) | |
150 | + KEEP (*\string.o(.text)) | |
151 | + KEEP (*\float.o(.text)) | |
152 | + KEEP (*\cmpdata.o(.text)) | |
153 | + } >kseg2_program_mem | |
154 | + .machikaniaobjrodata : | |
155 | + { | |
156 | + KEEP (*\statement.o(.rodata)) | |
157 | + KEEP (*\function.o(.rodata)) | |
158 | + KEEP (*\value.o(.rodata)) | |
159 | + KEEP (*\string.o(.rodata)) | |
160 | + KEEP (*\float.o(.rodata)) | |
161 | + KEEP (*\cmpdata.o(.rodata)) | |
162 | + } >kseg2_program_mem | |
163 | + | |
155 | 164 | /* Boot Sections */ |
156 | 165 | .reset _RESET_ADDR : |
157 | 166 | { |
@@ -69,6 +69,9 @@ file_041=. | ||
69 | 69 | file_042=. |
70 | 70 | file_043=. |
71 | 71 | file_044=. |
72 | +file_045=. | |
73 | +file_046=. | |
74 | +file_047=. | |
72 | 75 | [GENERATED_FILES] |
73 | 76 | file_000=no |
74 | 77 | file_001=no |
@@ -115,6 +118,9 @@ file_041=no | ||
115 | 118 | file_042=no |
116 | 119 | file_043=no |
117 | 120 | file_044=no |
121 | +file_045=no | |
122 | +file_046=no | |
123 | +file_047=no | |
118 | 124 | [OTHER_FILES] |
119 | 125 | file_000=no |
120 | 126 | file_001=no |
@@ -156,11 +162,14 @@ file_036=no | ||
156 | 162 | file_037=no |
157 | 163 | file_038=no |
158 | 164 | file_039=no |
159 | -file_040=yes | |
160 | -file_041=yes | |
165 | +file_040=no | |
166 | +file_041=no | |
161 | 167 | file_042=yes |
162 | 168 | file_043=yes |
163 | 169 | file_044=yes |
170 | +file_045=yes | |
171 | +file_046=yes | |
172 | +file_047=yes | |
164 | 173 | [FILE_INFO] |
165 | 174 | file_000=compiler.c |
166 | 175 | file_001=editor.c |
@@ -188,25 +197,28 @@ file_022=class.c | ||
188 | 197 | file_023=args.c |
189 | 198 | file_024=timer.c |
190 | 199 | file_025=interface\keyinput.c |
191 | -file_026=api.h | |
192 | -file_027=compiler.h | |
193 | -file_028=editor.h | |
194 | -file_029=main.h | |
195 | -file_030=debug.h | |
196 | -file_031=envspecific.h | |
197 | -file_032=interface\keyinput.h | |
198 | -file_033=interface\ps2keyboard.h | |
199 | -file_034=interface\SDFSIO.h | |
200 | -file_035=interface\videoout.h | |
201 | -file_036=interface\lib_videoout_machikania.X.a | |
202 | -file_037=interface\libsdfsio.a | |
203 | -file_038=interface\ps2keyboard.X.a | |
204 | -file_039=App_32MX170F256B.ld | |
205 | -file_040=help.txt | |
206 | -file_041=MACHIKAN.INI | |
207 | -file_042=reservednames.js | |
208 | -file_043=class.txt | |
209 | -file_044=sharedfiles.js | |
200 | +file_026=hexfile.c | |
201 | +file_027=clib.c | |
202 | +file_028=api.h | |
203 | +file_029=compiler.h | |
204 | +file_030=editor.h | |
205 | +file_031=main.h | |
206 | +file_032=debug.h | |
207 | +file_033=envspecific.h | |
208 | +file_034=interface\keyinput.h | |
209 | +file_035=interface\ps2keyboard.h | |
210 | +file_036=interface\SDFSIO.h | |
211 | +file_037=interface\videoout.h | |
212 | +file_038=interface\lib_videoout_machikania.X.a | |
213 | +file_039=interface\libsdfsio.a | |
214 | +file_040=interface\ps2keyboard.X.a | |
215 | +file_041=App_32MX170F256B.ld | |
216 | +file_042=help.txt | |
217 | +file_043=MACHIKAN.INI | |
218 | +file_044=reservednames.js | |
219 | +file_045=class.txt | |
220 | +file_046=sharedfiles.js | |
221 | +file_047=clib.txt | |
210 | 222 | [SUITE_INFO] |
211 | 223 | suite_guid={62D235D8-2DB2-49CD-AF24-5489A6015337} |
212 | 224 | suite_state= |
@@ -876,7 +876,8 @@ char* static_method(char type){ | ||
876 | 876 | char* err; |
877 | 877 | int* data; |
878 | 878 | int record[3]; |
879 | - int i,opos,method,stack; | |
879 | + int i,spos,opos,method,stack; | |
880 | + spos=g_srcpos; | |
880 | 881 | next_position(); |
881 | 882 | // Check class name |
882 | 883 | i=check_var_name(); |
@@ -891,12 +892,15 @@ char* static_method(char type){ | ||
891 | 892 | break; |
892 | 893 | } |
893 | 894 | } |
895 | + if (i) { | |
896 | + g_srcpos=spos; | |
897 | + return ERR_NO_CLASS; | |
898 | + } | |
894 | 899 | // Check '::' |
895 | 900 | if (g_source[g_srcpos]!=':') return ERR_SYNTAX; |
896 | 901 | g_srcpos++; |
897 | 902 | if (g_source[g_srcpos]!=':') return ERR_SYNTAX; |
898 | 903 | g_srcpos++; |
899 | - if (i) return ERR_NO_CLASS; | |
900 | 904 | data=(int*)data[2]; |
901 | 905 | // Check method |
902 | 906 | i=check_var_name(); |
@@ -9,6 +9,13 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "compiler.h" |
13 | 20 | |
14 | 21 | /* |
@@ -40,6 +40,14 @@ | ||
40 | 40 | // RAM size used for object and heap |
41 | 41 | #define RAMSIZE (PERSISTENT_RAM_SIZE-EXCEPTION_DATA_SIZE) |
42 | 42 | |
43 | +/* Structures */ | |
44 | +typedef struct{ | |
45 | + unsigned char size; | |
46 | + unsigned short address; | |
47 | + unsigned char type; | |
48 | + unsigned char data[16]; | |
49 | +} HEXLINE; | |
50 | + | |
43 | 51 | /* Enums */ |
44 | 52 | enum variable{ |
45 | 53 | VAR_INTEGER, |
@@ -187,6 +195,8 @@ enum functions{ | ||
187 | 195 | }; |
188 | 196 | |
189 | 197 | /* Global vars (see globalvers.c) */ |
198 | +extern const volatile int g_object_mos; | |
199 | +extern const volatile int g_objpos_mos; | |
190 | 200 | extern int g_intconst; |
191 | 201 | extern char g_valueisconst; |
192 | 202 | extern unsigned int g_rnd_seed; |
@@ -228,6 +238,8 @@ extern int g_class; | ||
228 | 238 | extern int g_compiling_class; |
229 | 239 | extern unsigned char g_num_classes; |
230 | 240 | extern char g_option_fastfield; |
241 | +extern HEXLINE g_hexline; | |
242 | +extern char g_fs_valid; | |
231 | 243 | extern int g_temp; |
232 | 244 | |
233 | 245 | /* Prototypes */ |
@@ -247,6 +259,7 @@ char* compile_file(); | ||
247 | 259 | int compile_and_link_file(char* buff,char* appname); |
248 | 260 | int compile_and_link_main_file(char* buff,char* appname); |
249 | 261 | int compile_and_link_class(char* buff,int class); |
262 | +int create_self_running_hex(char* hexfilename); | |
250 | 263 | |
251 | 264 | void err_break(void); |
252 | 265 | void err_music(char* str); |
@@ -340,6 +353,7 @@ int* cmpdata_findfirst(unsigned char type); | ||
340 | 353 | void cmpdata_delete(int* record); |
341 | 354 | |
342 | 355 | int check_var_name(); |
356 | +int str_to_name_int(char* str); | |
343 | 357 | int get_var_number(); |
344 | 358 | int search_var_name(int nameint); |
345 | 359 | char* register_var_name(int nameint); |
@@ -384,6 +398,23 @@ char* coretimer_statement(); | ||
384 | 398 | char* coretimer_function(); |
385 | 399 | char* interrupt_statement(); |
386 | 400 | |
401 | +char* useclib_statement(); | |
402 | +char* useclib_begin(char* buff); | |
403 | +char* clib_method(char type); | |
404 | +char* clib_statement(); | |
405 | + | |
406 | +char* hex_init_file(char* buff,char* filename); | |
407 | +void hex_reinit_file(); | |
408 | +void hex_close_file(); | |
409 | +char* hex_read_line(); | |
410 | +char* hex_construct_line(); | |
411 | +#ifdef FS_DOT_H | |
412 | + char* hex_write(FSFILE* fhandle); | |
413 | + char* hex_write_address(FSFILE* fhandle,unsigned short addr); | |
414 | + char* hex_write_data_16(FSFILE* fhandle,unsigned short addr,unsigned int* object); | |
415 | + char* hex_write_eof(FSFILE* fhandle); | |
416 | +#endif | |
417 | + | |
387 | 418 | /* Error messages */ |
388 | 419 | #define ERR_SYNTAX (char*)(g_err_str[0]) |
389 | 420 | #define ERR_NE_BINARY (char*)(g_err_str[1]) |
@@ -415,6 +446,10 @@ char* interrupt_statement(); | ||
415 | 446 | #define ERR_INVALID_CLASS (char*)(g_err_str[27]) |
416 | 447 | #define ERR_NO_INIT (char*)(g_err_str[28]) |
417 | 448 | #define ERR_OPTION_CLASSCODE (char*)(g_err_str[29]) |
449 | +#define ERR_COMPILE_CLIB (char*)(g_err_str[30]) | |
450 | +#define ERR_NO_CLIB (char*)(g_err_str[31]) | |
451 | +#define ERR_HEX_ERROR (char*)(g_err_str[32]) | |
452 | +#define ERR_NO_CLASS_CLIB (char*)(g_err_str[32]) | |
418 | 453 | |
419 | 454 | /* compile data type numbers */ |
420 | 455 | #define CMPDATA_RESERVED 0 |
@@ -425,6 +460,8 @@ char* interrupt_statement(); | ||
425 | 460 | #define CMPDATA_UNSOLVED 5 |
426 | 461 | #define CMPDATA_TEMP 6 |
427 | 462 | #define CMPDATA_FASTFIELD 7 |
463 | +#define CMPDATA_USECLIB 8 | |
464 | +#define CMPDATA_CLIBFUNC 9 | |
428 | 465 | // Sub types follow |
429 | 466 | #define CMPTYPE_PUBLIC_FIELD 0 |
430 | 467 | #define CMPTYPE_PRIVATE_FIELD 1 |
@@ -451,9 +488,6 @@ char* interrupt_statement(); | ||
451 | 488 | |
452 | 489 | /* Macros */ |
453 | 490 | |
454 | -// For object section | |
455 | -#define OBJECTSECTION __attribute__((section(".machikania_object"))) | |
456 | - | |
457 | 491 | // Lables as 31 bit integer |
458 | 492 | #define LABEL_INIT 0x0008727b |
459 | 493 |
@@ -488,13 +522,15 @@ char* interrupt_statement(); | ||
488 | 522 | } while (0) |
489 | 523 | |
490 | 524 | #define ASM_NOP 0x00000000 |
525 | +#define ASM_ADDU_A0_SP_ZERO 0x03A02021 | |
491 | 526 | #define ASM_ADDU_A0_V0_ZERO 0x00402021 |
492 | 527 | #define ASM_ADDU_A1_V0_ZERO 0x00402821 |
493 | 528 | #define ASM_ADDU_A2_V0_ZERO 0x00403021 |
494 | 529 | #define ASM_ADDU_A3_V0_ZERO 0x00403821 |
495 | -#define ASM_ORI_A0_ZERO_ 0x34040000 | |
496 | -#define ASM_LW_A0_XXXX_S8 0x8FC40000 | |
497 | -#define ASM_LW_A0_XXXX_S5 0x8EA40000 | |
530 | +#define ASM_ORI_A0_ZERO_ 0x34040000 | |
531 | +#define ASM_ADDIU_A0_ZERO_ 0x24040000 | |
532 | +#define ASM_LW_A0_XXXX_S8 0x8FC40000 | |
533 | +#define ASM_LW_A0_XXXX_S5 0x8EA40000 | |
498 | 534 | |
499 | 535 | // Interrupt macros |
500 | 536 | // 32 different type interruptions are possible |
@@ -34,6 +34,7 @@ static const char initext[]; | ||
34 | 34 | static const char bastext[]; |
35 | 35 | static const char class1text[]; |
36 | 36 | static const char class2text[]; |
37 | +static const char hextext[]; | |
37 | 38 | |
38 | 39 | static char* readtext; |
39 | 40 | static int filepos; |
@@ -130,6 +131,9 @@ FSFILE* FSfopen(const char * fileName, const char *mode){ | ||
130 | 131 | } else if (fileName[i+1]=='I' && fileName[i+2]=='N' && fileName[i+3]=='I') { |
131 | 132 | // INI file |
132 | 133 | readtext=(char*)&initext[0]; |
134 | + } else if (fileName[i+1]=='H' && fileName[i+2]=='E' && fileName[i+3]=='X') { | |
135 | + // HEX file | |
136 | + readtext=(char*)&hextext[0]; | |
133 | 137 | } else if (fileName[i+1]=='B' && fileName[i+2]=='A' && fileName[i+3]=='S') { |
134 | 138 | // Select BAS file |
135 | 139 | if (fileName[i-6]=='C' && fileName[i-5]=='L' && fileName[i-4]=='A' && |
@@ -184,6 +188,7 @@ long FSftell (FSFILE * fo){ | ||
184 | 188 | return 0; |
185 | 189 | } |
186 | 190 | int FSfseek(FSFILE *stream, long offset, int whence){ |
191 | + filepos=offset; | |
187 | 192 | return 0; |
188 | 193 | } |
189 | 194 | /* |
@@ -228,12 +233,10 @@ static const char initext[]= | ||
228 | 233 | "#PRINT\n"; |
229 | 234 | |
230 | 235 | static const char bastext[]= |
231 | -"USECLASS CLASS1,CLASS2\n" | |
232 | -"OPTION FASTFIELD\n" | |
233 | -"CLS\n" | |
234 | -"o=new(CLASS1)\n" | |
235 | -"o.T1=123\n" | |
236 | -"print o.T2()\n" | |
236 | +"useclib TCLIB\n" | |
237 | +"print TCLIB::TEST$(0);\n" | |
238 | +"print clib$(TCLIB::TEST,1)\n" | |
239 | +"\n" | |
237 | 240 | "\n" |
238 | 241 | "\n" |
239 | 242 | "\n" |
@@ -255,6 +258,47 @@ static const char class2text[]= | ||
255 | 258 | "\n" |
256 | 259 | "\n"; |
257 | 260 | |
261 | +static const char hextext[]= | |
262 | +":020000040000fa\n" | |
263 | +":1080000000001c3c707f9c2721e09903e0ffbd2706\n" | |
264 | +":108010001c00bfaf1000bcaf030080101880828f1f\n" | |
265 | +":1080200005000010000044ac1c80998f09f8200363\n" | |
266 | +":10803000000000001000bc8f2080828f1c00bf8fca\n" | |
267 | +":088040000800e0032000bd2749\n" | |
268 | +":020000040000fa\n" | |
269 | +":107f80000000000000000080ac7f00a0508000a036\n" | |
270 | +":107f9000708100a0548100a0000001a0388100a0e1\n" | |
271 | +":0c7fa000588000a000000000000000005d\n" | |
272 | +":020000040000fa\n" | |
273 | +":108050000800e0030000000000001c3c187f9c2783\n" | |
274 | +":1080600021e09903e0ffbd271c00bfaf1800b0afaf\n" | |
275 | +":108070001000bcaf110080542880828f1880908f30\n" | |
276 | +":108080000000048e2480998f09f82003000000006e\n" | |
277 | +":108090001000bc8f2880848f248184240000058eea\n" | |
278 | +":1080a0002c80998f09f82003000000001000bc8f7d\n" | |
279 | +":1080b0002880828f0200001004814224148142240f\n" | |
280 | +":1080c0001c00bf8f1800b08f0800e0032000bd2700\n" | |
281 | +":1080d00000001c3ca07e9c2721e09903e0ffbd2707\n" | |
282 | +":1080e0001c00bfaf1000bcaf3080998f09f820038f\n" | |
283 | +":1080f000000000001000bc8f1c00bf8f0800e003d0\n" | |
284 | +":048100002000bd2777\n" | |
285 | +":020000040000fa\n" | |
286 | +":1081040048656c6c6f20576f726c6421000000002e\n" | |
287 | +":108114005468697320697320612074657374000066\n" | |
288 | +":10812400434c494220746573742e000054455354e3\n" | |
289 | +":048134000000000047\n" | |
290 | +":020000040000fa\n" | |
291 | +":108138000000a38c0c00a28c0c00428c08004000ac\n" | |
292 | +":0c81480000007c8c0800e0030000000038\n" | |
293 | +":020000040000fa\n" | |
294 | +":108154000000838c0c00828c1800428c08004000c4\n" | |
295 | +":0c81640000007c8c0800e003000000001c\n" | |
296 | +":020000040000fa\n" | |
297 | +":108170004001000080000000808100a0000000009d\n" | |
298 | +":0c818000308100a0d08000a000000000b2\n" | |
299 | +":00000001FF\n" | |
300 | +; | |
301 | + | |
258 | 302 | /* |
259 | 303 | Test function for constructing assemblies from C codes. |
260 | 304 | */ |
@@ -285,6 +329,15 @@ int _debug_test(int a0, int a1, int a2, int a3, int param4, int param5){ | ||
285 | 329 | return a2+a3; |
286 | 330 | } |
287 | 331 | |
332 | +int _debug_test2(int a0, int a1, int a2, int a3, int a4){ | |
333 | + int v0; | |
334 | + v0=v0+a0; | |
335 | + v0=v0*a1; | |
336 | + v0=v0 & a3; | |
337 | + v0=v0 | a4; | |
338 | + return v0; | |
339 | +} | |
340 | + | |
288 | 341 | /* |
289 | 342 | Break point used for debugging object code. |
290 | 343 |
@@ -74,7 +74,7 @@ const unsigned char Message2[]="File System Error\n"; | ||
74 | 74 | const unsigned char Message3[]="Retry:[Enter] / Quit:[ESC]\n"; |
75 | 75 | const unsigned char ROOTDIR[]="\\"; |
76 | 76 | |
77 | -OBJECTSECTION unsigned char * editormalloc(int size){ | |
77 | +unsigned char * editormalloc(int size){ | |
78 | 78 | //配列RAM[]内にサイズsizeの領域を確保し、先頭アドレスを返す |
79 | 79 | //確保できない場合は、エラー表示し動作停止 |
80 | 80 | unsigned char *p; |
@@ -93,7 +93,7 @@ void wait60thsec(unsigned short n){ | ||
93 | 93 | while(drawcount!=n) asm(WAIT); |
94 | 94 | } |
95 | 95 | |
96 | -OBJECTSECTION unsigned int bpixtopos(_tbuf *bp,unsigned int ix){ | |
96 | +unsigned int bpixtopos(_tbuf *bp,unsigned int ix){ | |
97 | 97 | // テキストバッファ上の位置からテキスト全体の先頭から何文字目かを返す |
98 | 98 | // bp:テキストバッファポインタ |
99 | 99 | // ix:bp->Bufの先頭からの文字数 |
@@ -108,7 +108,7 @@ OBJECTSECTION unsigned int bpixtopos(_tbuf *bp,unsigned int ix){ | ||
108 | 108 | } |
109 | 109 | return pos+ix; |
110 | 110 | } |
111 | -OBJECTSECTION _tbuf * postobpix(int pos,unsigned short *pix){ | |
111 | +_tbuf * postobpix(int pos,unsigned short *pix){ | |
112 | 112 | // テキスト全体の先頭からpos文字目のテキストバッファ上の位置を返す |
113 | 113 | // 戻り値 テキストバッファポインタ |
114 | 114 | // *pix(戻り値):戻り値テキストバッファの先頭からの位置(ポインタ渡し) |
@@ -127,7 +127,7 @@ OBJECTSECTION _tbuf * postobpix(int pos,unsigned short *pix){ | ||
127 | 127 | *pix=pos; |
128 | 128 | return bp; |
129 | 129 | } |
130 | -OBJECTSECTION _tbuf * linetobpix(int line,unsigned short *pix){ | |
130 | +_tbuf * linetobpix(int line,unsigned short *pix){ | |
131 | 131 | // テキスト全体の先頭からline行目のテキストバッファ上の位置を返す |
132 | 132 | // 戻り値 テキストバッファポインタ |
133 | 133 | // *pix(戻り値):戻り値テキストバッファの先頭からの位置(ポインタ渡し) |
@@ -157,7 +157,7 @@ OBJECTSECTION _tbuf * linetobpix(int line,unsigned short *pix){ | ||
157 | 157 | return bp2; |
158 | 158 | } |
159 | 159 | |
160 | -OBJECTSECTION _tbuf * newTBuf(_tbuf *prev){ | |
160 | +_tbuf * newTBuf(_tbuf *prev){ | |
161 | 161 | // 新しいテキストバッファ1行を生成 |
162 | 162 | // prev:挿入先の行(prevの後ろに追加) |
163 | 163 | // 戻り値 生成したバッファへのポインタ、生成できない場合NULL |
@@ -180,7 +180,7 @@ OBJECTSECTION _tbuf * newTBuf(_tbuf *prev){ | ||
180 | 180 | return bp; |
181 | 181 | } |
182 | 182 | |
183 | -OBJECTSECTION _tbuf * deleteTBuf(_tbuf *bp){ | |
183 | +_tbuf * deleteTBuf(_tbuf *bp){ | |
184 | 184 | // テキストバッファの削除 |
185 | 185 | // bp:削除する行のポインタ |
186 | 186 | // 戻り値 削除前の次のバッファへのポインタ、ない場合NULL |
@@ -226,7 +226,7 @@ UNDOBUFSIZE | ||
226 | 226 | UNDO_CONTDEL,繰り返し数,消去文字列,開始位置,繰り返し数,UNDO_CONTDEL |
227 | 227 | */ |
228 | 228 | |
229 | -OBJECTSECTION void pushundomem(unsigned char c){ | |
229 | +void pushundomem(unsigned char c){ | |
230 | 230 | // アンドゥ用メモリの先頭に1バイトを貯める |
231 | 231 | // 空きがなくなった場合、最後尾の1命令分を無効化 |
232 | 232 | unsigned char *p; |
@@ -267,12 +267,12 @@ OBJECTSECTION void pushundomem(unsigned char c){ | ||
267 | 267 | if(undobuf_top>=undobuf+UNDOBUFSIZE) undobuf_top-=UNDOBUFSIZE; |
268 | 268 | undobuf_used++; |
269 | 269 | } |
270 | -OBJECTSECTION void pushundomem2(unsigned short w){ | |
270 | +void pushundomem2(unsigned short w){ | |
271 | 271 | // アンドゥバッファに2バイト貯める、下位、上位の順 |
272 | 272 | pushundomem((unsigned char)w); |
273 | 273 | pushundomem(w>>8); |
274 | 274 | } |
275 | -OBJECTSECTION unsigned char popundomem(){ | |
275 | +unsigned char popundomem(){ | |
276 | 276 | // アンドゥバッファから1バイト読み出し、先頭を1つ戻す |
277 | 277 | // 戻り値:読み出したコード |
278 | 278 | undobuf_top--; |
@@ -280,7 +280,7 @@ OBJECTSECTION unsigned char popundomem(){ | ||
280 | 280 | undobuf_used--; |
281 | 281 | return *undobuf_top; |
282 | 282 | } |
283 | -OBJECTSECTION unsigned short popundomem2(){ | |
283 | +unsigned short popundomem2(){ | |
284 | 284 | // アンドゥバッファから2バイト読み出し |
285 | 285 | // 戻り値:読み出した2バイトコード |
286 | 286 | unsigned short w; |
@@ -288,7 +288,7 @@ OBJECTSECTION unsigned short popundomem2(){ | ||
288 | 288 | w+=popundomem(); |
289 | 289 | return w; |
290 | 290 | } |
291 | -OBJECTSECTION void setundobuf(int com,_tbuf *bp,unsigned short ix,unsigned char c,unsigned short n){ | |
291 | +void setundobuf(int com,_tbuf *bp,unsigned short ix,unsigned char c,unsigned short n){ | |
292 | 292 | //アンドゥバッファにデータをセットする |
293 | 293 | //com:コマンド 1:1文字削除、2:1文字上書き、3:1文字挿入、4:連続削除、5:連続挿入開始 |
294 | 294 | //bp,ix:バッファ上の実行場所(カーソル位置) |
@@ -324,7 +324,7 @@ OBJECTSECTION void setundobuf(int com,_tbuf *bp,unsigned short ix,unsigned char | ||
324 | 324 | } |
325 | 325 | } |
326 | 326 | |
327 | -OBJECTSECTION int insertchar(_tbuf *bp,unsigned int ix,unsigned char c,int undo){ | |
327 | +int insertchar(_tbuf *bp,unsigned int ix,unsigned char c,int undo){ | |
328 | 328 | //テキストバッファbpの先頭からixバイトの位置にcを挿入 |
329 | 329 | //undo 0:通常(アンドゥバッファに格納する)、1:連続挿入中、2:アンドゥ中 |
330 | 330 | //戻り値 成功:0、不正または容量オーバー:-1、空きがあるはずなのに失敗:1 |
@@ -362,7 +362,7 @@ OBJECTSECTION int insertchar(_tbuf *bp,unsigned int ix,unsigned char c,int undo) | ||
362 | 362 | return 0; |
363 | 363 | } |
364 | 364 | |
365 | -OBJECTSECTION int overwritechar(_tbuf *bp,unsigned int ix,unsigned char c,int undo){ | |
365 | +int overwritechar(_tbuf *bp,unsigned int ix,unsigned char c,int undo){ | |
366 | 366 | //テキストバッファbpの先頭からixバイトの位置をcで上書き |
367 | 367 | //undo 0:通常(アンドゥバッファに格納する)、1:連続中、2:アンドゥ中 |
368 | 368 | //戻り値 成功:0、不正または容量オーバー:-1、空きがあるはずなのに失敗:1 |
@@ -383,7 +383,7 @@ OBJECTSECTION int overwritechar(_tbuf *bp,unsigned int ix,unsigned char c,int un | ||
383 | 383 | return 0; |
384 | 384 | } |
385 | 385 | |
386 | -OBJECTSECTION void deletechar(_tbuf *bp,unsigned int ix,int undo){ | |
386 | +void deletechar(_tbuf *bp,unsigned int ix,int undo){ | |
387 | 387 | //テキストバッファbpの先頭からixバイトの位置の1バイト削除 |
388 | 388 | //undo -1:通常BackSpace(アンドゥバッファに格納する) |
389 | 389 | // 0:通常DELETE(アンドゥバッファに格納する)、1:連続中、2:アンドゥ中 |
@@ -407,7 +407,7 @@ OBJECTSECTION void deletechar(_tbuf *bp,unsigned int ix,int undo){ | ||
407 | 407 | if(bp->next==NULL) return; //全体の最後の場合、何もしない |
408 | 408 | deletechar(bp->next,0,undo); //次の行の先頭文字を削除 |
409 | 409 | } |
410 | -OBJECTSECTION int gabagecollect1(void){ | |
410 | +int gabagecollect1(void){ | |
411 | 411 | //断片化されたテキストバッファの隙間を埋めるガベージコレクション |
412 | 412 | //カーソルの前と後ろそれぞれ探索して最初の1バイト分のみ実施 |
413 | 413 | //戻り値 1バイトでも移動した場合:1、なかった場合:0 |
@@ -476,11 +476,11 @@ OBJECTSECTION int gabagecollect1(void){ | ||
476 | 476 | if(bp->n == 0) deleteTBuf(bp); |
477 | 477 | return f; |
478 | 478 | } |
479 | -OBJECTSECTION void gabagecollect2(void){ | |
479 | +void gabagecollect2(void){ | |
480 | 480 | // 変化がなくなるまで1バイト分のガベージコレクションを呼び出し |
481 | 481 | while(gabagecollect1()) ; |
482 | 482 | } |
483 | -OBJECTSECTION void inittextbuf(void){ | |
483 | +void inittextbuf(void){ | |
484 | 484 | // テキストバッファの初期化 |
485 | 485 | _tbuf *bp; |
486 | 486 | for(bp=TextBuffer;bp<TextBuffer+TBUFMAXLINE;bp++) bp->prev=NULL; //未使用バッファ化 |
@@ -492,7 +492,7 @@ OBJECTSECTION void inittextbuf(void){ | ||
492 | 492 | undobuf_top=undobuf; |
493 | 493 | undobuf_used=0; |
494 | 494 | } |
495 | -OBJECTSECTION void redraw(){ | |
495 | +void redraw(){ | |
496 | 496 | //画面の再描画 |
497 | 497 | unsigned char *vp; |
498 | 498 | _tbuf *bp,*bp1,*bp2; |
@@ -576,7 +576,7 @@ OBJECTSECTION void redraw(){ | ||
576 | 576 | } |
577 | 577 | } |
578 | 578 | |
579 | -OBJECTSECTION void cursor_left(void){ | |
579 | +void cursor_left(void){ | |
580 | 580 | //カーソルを1つ前に移動 |
581 | 581 | //出力:下記変数を移動先の値に変更 |
582 | 582 | //cursorbp,cursorix バッファ上のカーソル位置 |
@@ -687,7 +687,7 @@ OBJECTSECTION void cursor_left(void){ | ||
687 | 687 | disptopbp=bp; |
688 | 688 | disptopix=ix; |
689 | 689 | } |
690 | -OBJECTSECTION void cursor_right(void){ | |
690 | +void cursor_right(void){ | |
691 | 691 | //カーソルを1つ後ろに移動 |
692 | 692 | //出力:下記変数を移動先の値に変更 |
693 | 693 | //cursorbp,cursorix バッファ上のカーソル位置 |
@@ -746,7 +746,7 @@ OBJECTSECTION void cursor_right(void){ | ||
746 | 746 | disptopbp=bp; |
747 | 747 | disptopix=ix; |
748 | 748 | } |
749 | -OBJECTSECTION void cursor_up(void){ | |
749 | +void cursor_up(void){ | |
750 | 750 | //カーソルを1つ上に移動 |
751 | 751 | //出力:下記変数を移動先の値に変更 |
752 | 752 | //cursorbp,cursorix バッファ上のカーソル位置 |
@@ -853,7 +853,7 @@ OBJECTSECTION void cursor_up(void){ | ||
853 | 853 | disptopbp=bp; |
854 | 854 | disptopix=ix; |
855 | 855 | } |
856 | -OBJECTSECTION void cursor_down(void){ | |
856 | +void cursor_down(void){ | |
857 | 857 | //カーソルを1つ下に移動 |
858 | 858 | //出力:下記変数を移動先の値に変更 |
859 | 859 | //cursorbp,cursorix バッファ上のカーソル位置 |
@@ -925,7 +925,7 @@ OBJECTSECTION void cursor_down(void){ | ||
925 | 925 | disptopbp=bp; |
926 | 926 | disptopix=ix; |
927 | 927 | } |
928 | -OBJECTSECTION void cursor_home(void){ | |
928 | +void cursor_home(void){ | |
929 | 929 | //カーソルを行先頭に移動 |
930 | 930 | //出力:下記変数を移動先の値に変更 |
931 | 931 | //cursorbp,cursorix バッファ上のカーソル位置 |
@@ -946,7 +946,7 @@ OBJECTSECTION void cursor_home(void){ | ||
946 | 946 | } |
947 | 947 | cx2=0; |
948 | 948 | } |
949 | -OBJECTSECTION void cursor_end(void){ | |
949 | +void cursor_end(void){ | |
950 | 950 | //カーソルを行末に移動 |
951 | 951 | //出力:下記変数を移動先の値に変更 |
952 | 952 | //cursorbp,cursorix バッファ上のカーソル位置 |
@@ -970,7 +970,7 @@ OBJECTSECTION void cursor_end(void){ | ||
970 | 970 | } |
971 | 971 | cx2=cx; |
972 | 972 | } |
973 | -OBJECTSECTION void cursor_pageup(void){ | |
973 | +void cursor_pageup(void){ | |
974 | 974 | //PageUpキー |
975 | 975 | //最上行が最下行になるまでスクロール |
976 | 976 | //出力:下記変数を移動先の値に変更 |
@@ -996,7 +996,7 @@ OBJECTSECTION void cursor_pageup(void){ | ||
996 | 996 | //元のY座標までカーソルを下に移動、1行も動かなかった場合は最上行に留まる |
997 | 997 | if(i>0) while(cy<cy_old) cursor_down(); |
998 | 998 | } |
999 | -OBJECTSECTION void cursor_pagedown(void){ | |
999 | +void cursor_pagedown(void){ | |
1000 | 1000 | //PageDownキー |
1001 | 1001 | //最下行が最上行になるまでスクロール |
1002 | 1002 | //出力:下記変数を移動先の値に変更 |
@@ -1028,7 +1028,7 @@ OBJECTSECTION void cursor_pagedown(void){ | ||
1028 | 1028 | //下端からさらに移動した行数分、カーソルを上に移動、1行も動かなかった場合は最下行に留まる |
1029 | 1029 | if(i>0) while(cy>cy_old) cursor_up(); |
1030 | 1030 | } |
1031 | -OBJECTSECTION void cursor_top(void){ | |
1031 | +void cursor_top(void){ | |
1032 | 1032 | //カーソルをテキストバッファの先頭に移動 |
1033 | 1033 | cursorbp=TBufstart; |
1034 | 1034 | cursorix=0; |
@@ -1041,7 +1041,7 @@ OBJECTSECTION void cursor_top(void){ | ||
1041 | 1041 | line_no=1; |
1042 | 1042 | } |
1043 | 1043 | |
1044 | -OBJECTSECTION int countarea(void){ | |
1044 | +int countarea(void){ | |
1045 | 1045 | //テキストバッファの指定範囲の文字数をカウント |
1046 | 1046 | //範囲は(cursorbp,cursorix)と(cursorbp1,cursorix1)で指定 |
1047 | 1047 | //後ろ側の一つ前の文字までをカウント |
@@ -1076,7 +1076,7 @@ OBJECTSECTION int countarea(void){ | ||
1076 | 1076 | } |
1077 | 1077 | } |
1078 | 1078 | } |
1079 | -OBJECTSECTION void deletearea_len(_tbuf *bp,unsigned int ix,int n,int undo){ | |
1079 | +void deletearea_len(_tbuf *bp,unsigned int ix,int n,int undo){ | |
1080 | 1080 | //テキストバッファの指定位置から複数文字削除 |
1081 | 1081 | //bp,ix:削除開始位置 |
1082 | 1082 | //n:削除する文字数 |
@@ -1115,7 +1115,7 @@ OBJECTSECTION void deletearea_len(_tbuf *bp,unsigned int ix,int n,int undo){ | ||
1115 | 1115 | n--; |
1116 | 1116 | } |
1117 | 1117 | } |
1118 | -OBJECTSECTION void deletearea(void){ | |
1118 | +void deletearea(void){ | |
1119 | 1119 | //テキストバッファの指定範囲を削除 |
1120 | 1120 | //範囲は(cursorbp,cursorix)と(cursorbp1,cursorix1)で指定 |
1121 | 1121 | //後ろ側の一つ前の文字までを削除 |
@@ -1150,7 +1150,7 @@ OBJECTSECTION void deletearea(void){ | ||
1150 | 1150 | pushundomem2(n); |
1151 | 1151 | pushundomem(UNDO_CONTDEL); |
1152 | 1152 | } |
1153 | -OBJECTSECTION void clipcopy(void){ | |
1153 | +void clipcopy(void){ | |
1154 | 1154 | // 選択範囲をクリップボードにコピー |
1155 | 1155 | _tbuf *bp1,*bp2; |
1156 | 1156 | int ix1,ix2; |
@@ -1186,7 +1186,7 @@ OBJECTSECTION void clipcopy(void){ | ||
1186 | 1186 | } |
1187 | 1187 | } |
1188 | 1188 | } |
1189 | -OBJECTSECTION void clippaste(void){ | |
1189 | +void clippaste(void){ | |
1190 | 1190 | // クリップボードから貼り付け |
1191 | 1191 | int n,i; |
1192 | 1192 | unsigned char *p; |
@@ -1206,7 +1206,7 @@ OBJECTSECTION void clippaste(void){ | ||
1206 | 1206 | p++; |
1207 | 1207 | } |
1208 | 1208 | } |
1209 | -OBJECTSECTION void movecursor(int pos){ | |
1209 | +void movecursor(int pos){ | |
1210 | 1210 | // カーソルを現在の位置から任意の位置に移動 |
1211 | 1211 | // pos:移動したいテキストバッファ先頭からのバイト位置 |
1212 | 1212 | int pos2,d; |
@@ -1226,7 +1226,7 @@ OBJECTSECTION void movecursor(int pos){ | ||
1226 | 1226 | } |
1227 | 1227 | } |
1228 | 1228 | } |
1229 | -OBJECTSECTION void undoexec(){ | |
1229 | +void undoexec(){ | |
1230 | 1230 | //アンドゥ実行 |
1231 | 1231 | unsigned char c,c1; |
1232 | 1232 | _tbuf *bp; |
@@ -1286,7 +1286,7 @@ OBJECTSECTION void undoexec(){ | ||
1286 | 1286 | } |
1287 | 1287 | } |
1288 | 1288 | |
1289 | -OBJECTSECTION void set_areamode(){ | |
1289 | +void set_areamode(){ | |
1290 | 1290 | //範囲選択モード開始時のカーソル開始位置グローバル変数設定 |
1291 | 1291 | cursorbp1=cursorbp; |
1292 | 1292 | cursorix1=cursorix; |
@@ -1294,7 +1294,7 @@ OBJECTSECTION void set_areamode(){ | ||
1294 | 1294 | cy1=cy; |
1295 | 1295 | line_no1=line_no; |
1296 | 1296 | } |
1297 | -OBJECTSECTION void save_cursor(void){ | |
1297 | +void save_cursor(void){ | |
1298 | 1298 | //カーソル関連グローバル変数を一時避難 |
1299 | 1299 | cursorbp_t=cursorbp; |
1300 | 1300 | cursorix_t=cursorix; |
@@ -1304,7 +1304,7 @@ OBJECTSECTION void save_cursor(void){ | ||
1304 | 1304 | cy_t=cy; |
1305 | 1305 | line_no_t=line_no; |
1306 | 1306 | } |
1307 | -OBJECTSECTION void restore_cursor(void){ | |
1307 | +void restore_cursor(void){ | |
1308 | 1308 | //カーソル関連グローバル変数を一時避難場所から戻す |
1309 | 1309 | cursorbp=cursorbp_t; |
1310 | 1310 | cursorix=cursorix_t; |
@@ -1315,7 +1315,7 @@ OBJECTSECTION void restore_cursor(void){ | ||
1315 | 1315 | line_no=line_no_t; |
1316 | 1316 | } |
1317 | 1317 | |
1318 | -OBJECTSECTION int filesystemretry(){ | |
1318 | +int filesystemretry(){ | |
1319 | 1319 | // SDファイルシステムの再初期化確認と実施 |
1320 | 1320 | // SDファイルへの保存や読み込み時にファイルエラーが発生した場合に呼び出す |
1321 | 1321 | // 戻り値 0:初期化成功、-1:成功することなくEscapeで抜けた |
@@ -1337,7 +1337,7 @@ OBJECTSECTION int filesystemretry(){ | ||
1337 | 1337 | } |
1338 | 1338 | } |
1339 | 1339 | |
1340 | -OBJECTSECTION int sdfilecopy(char *sourcefile,char *distfile){ | |
1340 | +int sdfilecopy(char *sourcefile,char *distfile){ | |
1341 | 1341 | // SDカード上のファイルをコピー |
1342 | 1342 | // soucefile:コピー元ファイル名 |
1343 | 1343 | // distfile:コピー先ファイル名 |
@@ -1370,7 +1370,7 @@ OBJECTSECTION int sdfilecopy(char *sourcefile,char *distfile){ | ||
1370 | 1370 | FSfclose(dfp); |
1371 | 1371 | return er; |
1372 | 1372 | } |
1373 | -OBJECTSECTION int savetextfile(char *filename){ | |
1373 | +int savetextfile(char *filename){ | |
1374 | 1374 | // テキストバッファをテキストファイルに書き込み |
1375 | 1375 | // 書き込み成功で0、失敗でエラーコード(負数)を返す |
1376 | 1376 | FSFILE *fp; |
@@ -1414,7 +1414,7 @@ OBJECTSECTION int savetextfile(char *filename){ | ||
1414 | 1414 | FSfclose(fp); |
1415 | 1415 | return er; |
1416 | 1416 | } |
1417 | -OBJECTSECTION int loadtextfile(char *filename){ | |
1417 | +int loadtextfile(char *filename){ | |
1418 | 1418 | // テキストファイルをテキストバッファに読み込み |
1419 | 1419 | // 読み込み成功で0、失敗でエラーコード(負数)を返す |
1420 | 1420 | FSFILE *fp; |
@@ -1463,7 +1463,7 @@ OBJECTSECTION int loadtextfile(char *filename){ | ||
1463 | 1463 | } |
1464 | 1464 | return er; |
1465 | 1465 | } |
1466 | -OBJECTSECTION int overwritecheck(char *fn){ | |
1466 | +int overwritecheck(char *fn){ | |
1467 | 1467 | // ファイルの上書き確認 |
1468 | 1468 | // ファイルの存在をチェックし、存在する場合キーボードから上書き確認する |
1469 | 1469 | // fn:ファイル名へのポインタ |
@@ -1483,7 +1483,7 @@ OBJECTSECTION int overwritecheck(char *fn){ | ||
1483 | 1483 | if(vk==VK_ESCAPE) return -1; |
1484 | 1484 | } |
1485 | 1485 | } |
1486 | -OBJECTSECTION void printfilename(unsigned char x,unsigned char y,int f,int num_dir){ | |
1486 | +void printfilename(unsigned char x,unsigned char y,int f,int num_dir){ | |
1487 | 1487 | // x,yの位置にファイル名またはディレクトリ名を表示 |
1488 | 1488 | |
1489 | 1489 | if(f==-2){ |
@@ -1509,7 +1509,7 @@ OBJECTSECTION void printfilename(unsigned char x,unsigned char y,int f,int num_d | ||
1509 | 1509 | printstr(filenames[f]); |
1510 | 1510 | } |
1511 | 1511 | } |
1512 | -OBJECTSECTION int select_dir_file(int filenum,int num_dir, unsigned char* msg){ | |
1512 | +int select_dir_file(int filenum,int num_dir, unsigned char* msg){ | |
1513 | 1513 | // filenames[]配列に読み込まれたファイルまたはディレクトリを画面表示しキーボードで選択する |
1514 | 1514 | // filenum:ファイル+ディレクトリ数 |
1515 | 1515 | // num_dir:ディレクトリ数(filenames[]は先頭からnum_dir-1までがディレクトリ) |
@@ -1665,7 +1665,7 @@ OBJECTSECTION int select_dir_file(int filenum,int num_dir, unsigned char* msg){ | ||
1665 | 1665 | } |
1666 | 1666 | } |
1667 | 1667 | } |
1668 | -OBJECTSECTION int getfilelist(int *p_num_dir){ | |
1668 | +int getfilelist(int *p_num_dir){ | |
1669 | 1669 | // カレントディレクトリでのディレクトリ、.BAS、.TXT、.INIファイル一覧を読み込む |
1670 | 1670 | // *p_num_dir:ディレクトリ数を返す |
1671 | 1671 | // filenames[]:ファイル名およびディレクトリ名一覧 |
@@ -1729,7 +1729,7 @@ OBJECTSECTION int getfilelist(int *p_num_dir){ | ||
1729 | 1729 | } |
1730 | 1730 | return filenum; |
1731 | 1731 | } |
1732 | -OBJECTSECTION void save_as(int ow){ | |
1732 | +void save_as(int ow){ | |
1733 | 1733 | // 現在のテキストバッファの内容をSDカードに保存 |
1734 | 1734 | // ow 0:名前を付けて保存 1:上書き保存 |
1735 | 1735 | // ファイル名はグローバル変数currentfile[] |
@@ -1817,7 +1817,7 @@ OBJECTSECTION void save_as(int ow){ | ||
1817 | 1817 | } |
1818 | 1818 | } |
1819 | 1819 | |
1820 | -OBJECTSECTION void newtext(void){ | |
1820 | +void newtext(void){ | |
1821 | 1821 | // 新規テキスト作成 |
1822 | 1822 | unsigned char vk; |
1823 | 1823 | if(edited && num){ |
@@ -1841,7 +1841,7 @@ OBJECTSECTION void newtext(void){ | ||
1841 | 1841 | currentfile[0]=0; //作業中ファイル名クリア |
1842 | 1842 | } |
1843 | 1843 | |
1844 | -OBJECTSECTION void msra(void){ | |
1844 | +void msra(void){ | |
1845 | 1845 | // Make Self-Running Application (自己実行アプリケーションの作成) |
1846 | 1846 | // 最初にソースファイルを名前を付けて保存 |
1847 | 1847 | // 次にBASICシステムのHEXファイルをソースファイル名の拡張子をHEXにした名前でコピー |
@@ -1852,7 +1852,8 @@ OBJECTSECTION void msra(void){ | ||
1852 | 1852 | setcursor(0,0,COLOR_NORMALTEXT); |
1853 | 1853 | printstr("Make Self-Running Application\n\n"); |
1854 | 1854 | printstr("(Work on Root Directory)\n"); |
1855 | - | |
1855 | +// MOS: delete region not required | |
1856 | +/* | |
1856 | 1857 | //カレントディレクトリを変数cwdpathにコピー |
1857 | 1858 | while(1){ |
1858 | 1859 | if(FSgetcwd(cwdpath,PATHNAMEMAX)) break; |
@@ -1872,30 +1873,44 @@ OBJECTSECTION void msra(void){ | ||
1872 | 1873 | pd=tempfile; |
1873 | 1874 | while(*ps!=0) *pd++=*ps++; |
1874 | 1875 | *pd=0; |
1875 | - | |
1876 | +//*/ | |
1876 | 1877 | while(1){ |
1877 | 1878 | setcursorcolor(COLOR_NORMALTEXT); |
1878 | - printstr("Input File Name (xxx.BAS)\n"); | |
1879 | +// MOS: modification | |
1880 | + printstr("Input File Name (xxx.HEX)\n"); | |
1881 | +// printstr("Input File Name (xxx.BAS)\n"); | |
1882 | + | |
1879 | 1883 | if(lineinput(tempfile,8+1+3)<0){ |
1880 | 1884 | //ESCキーが押された |
1881 | - FSchdir(cwdpath); //カレントディレクトリを元に戻す | |
1885 | +// MOS: delete region not required | |
1886 | +// FSchdir(cwdpath); //カレントディレクトリを元に戻す | |
1882 | 1887 | return; |
1883 | 1888 | } |
1884 | 1889 | ps=tempfile; |
1885 | 1890 | while(*ps!='.' && *ps!=0) ps++; |
1886 | 1891 | if(ps+4>=tempfile+13 || |
1887 | 1892 | *ps!='.' || |
1888 | - (*(ps+1)!='b' && *(ps+1)!='B') || | |
1889 | - (*(ps+2)!='a' && *(ps+2)!='A') || | |
1890 | - (*(ps+3)!='s' && *(ps+3)!='S') || | |
1893 | +// MOS: modification | |
1894 | + (*(ps+1)!='h' && *(ps+1)!='H') || | |
1895 | + (*(ps+2)!='e' && *(ps+2)!='E') || | |
1896 | + (*(ps+3)!='x' && *(ps+3)!='X') || | |
1897 | +// (*(ps+1)!='b' && *(ps+1)!='B') || | |
1898 | +// (*(ps+2)!='a' && *(ps+2)!='A') || | |
1899 | +// (*(ps+3)!='s' && *(ps+3)!='S') || | |
1891 | 1900 | *(ps+4)!=0){ |
1892 | 1901 | setcursorcolor(COLOR_ERRORTEXT); |
1893 | - printstr("File Name Must Be xxx.BAS\n"); | |
1902 | +// MOS: modification | |
1903 | + printstr("File Name Must Be xxx.HEX\n"); | |
1904 | +// printstr("File Name Must Be xxx.BAS\n"); | |
1894 | 1905 | continue; |
1895 | 1906 | } |
1896 | 1907 | if(overwritecheck(tempfile)) continue; |
1897 | - printstr("Writing BASIC File\n"); | |
1898 | - er=savetextfile(tempfile); //ファイル保存、er:エラーコード | |
1908 | +// MOS: modification | |
1909 | + printstr("Writing HEX File\n"); | |
1910 | +// printstr("Writing BASIC File\n"); | |
1911 | +// MOS: modification | |
1912 | + er=create_self_running_hex(tempfile); //ファイル保存、er:エラーコード | |
1913 | +// er=savetextfile(tempfile); //ファイル保存、er:エラーコード | |
1899 | 1914 | if(er==0) break; |
1900 | 1915 | setcursorcolor(COLOR_ERRORTEXT); |
1901 | 1916 | if(er==ERR_CANTFILEOPEN) printstr("Bad File Name or File Error\n"); |
@@ -1911,6 +1926,8 @@ OBJECTSECTION void msra(void){ | ||
1911 | 1926 | } |
1912 | 1927 | } |
1913 | 1928 | printstr("OK\n\n"); |
1929 | +// MOS: delete region not required | |
1930 | +/* | |
1914 | 1931 | FSremove(TEMPFILENAME); //実行時に生成する一時ファイルを削除 |
1915 | 1932 | //tempfileからcurrentfileにコピーして終了 |
1916 | 1933 | ps=tempfile; |
@@ -1946,12 +1963,13 @@ OBJECTSECTION void msra(void){ | ||
1946 | 1963 | else if(er==ERR_CANTWRITEFILE){ |
1947 | 1964 | printstr("Write Error\n"); |
1948 | 1965 | } |
1966 | +//*/ | |
1949 | 1967 | setcursorcolor(COLOR_NORMALTEXT); |
1950 | 1968 | printstr((unsigned char *)Message1);// Hit Any Key |
1951 | 1969 | inputchar(); //1文字入力待ち |
1952 | 1970 | return; |
1953 | 1971 | } |
1954 | -OBJECTSECTION int fileload(void){ | |
1972 | +int fileload(void){ | |
1955 | 1973 | // SDカードからファイルを選択して読み込み |
1956 | 1974 | // currenfile[]にファイル名を記憶 |
1957 | 1975 | // 対象ファイル拡張子 BASおよびTXT |
@@ -2047,16 +2065,16 @@ OBJECTSECTION int fileload(void){ | ||
2047 | 2065 | } |
2048 | 2066 | } |
2049 | 2067 | } |
2050 | -OBJECTSECTION void changewidth(void){ | |
2068 | +void changewidth(void){ | |
2051 | 2069 | // 30文字モードと40文字モードの切り替え |
2052 | 2070 | if(twidth==WIDTH_X1) set_width(1); |
2053 | 2071 | else set_width(0); |
2054 | 2072 | cursor_top(); //カーソルをテキストバッファの先頭に設定 |
2055 | 2073 | redraw(); //再描画 |
2056 | 2074 | } |
2057 | -OBJECTSECTION void run(int test){ | |
2075 | +void run(int test){ | |
2058 | 2076 | //KM-BASICコンパイル&実行 |
2059 | -// test 0:コンパイルと実行、0以外:コンパイルのみで終了 | |
2077 | +// test 0:コンパイルと実行、1:コンパイルのみで終了、2:コンパイルの後、HEXファイルを作製 | |
2060 | 2078 | int er,er2; |
2061 | 2079 | FSFILE *fp; |
2062 | 2080 | unsigned int disptoppos,cursorpos; |
@@ -2132,7 +2150,18 @@ OBJECTSECTION void run(int test){ | ||
2132 | 2150 | // Enable Break key |
2133 | 2151 | g_disable_break=0; |
2134 | 2152 | //KM-BASIC実行 |
2135 | - er2=runbasic(TEMPFILENAME,test); | |
2153 | +// MOS: modification | |
2154 | + switch(test){ | |
2155 | + case 2: | |
2156 | + er2=runbasic(TEMPFILENAME,1); | |
2157 | + break; | |
2158 | + case 0: | |
2159 | + case 1: | |
2160 | + default: | |
2161 | + er2=runbasic(TEMPFILENAME,test); | |
2162 | + break; | |
2163 | + } | |
2164 | +// er2=runbasic(TEMPFILENAME,test); | |
2136 | 2165 | |
2137 | 2166 | stopPCG();//システムフォントに戻す |
2138 | 2167 | setcursorcolor(COLOR_NORMALTEXT); |
@@ -2176,6 +2205,12 @@ OBJECTSECTION void run(int test){ | ||
2176 | 2205 | FSremove(WORKDIRFILE); //パス名保存ファイル削除 |
2177 | 2206 | break; |
2178 | 2207 | } |
2208 | +// MOS: insertion | |
2209 | + if (2==test && !er2) { | |
2210 | + // Create HEX file as Self Running Apprication | |
2211 | + msra(); | |
2212 | + } | |
2213 | +//*/ | |
2179 | 2214 | while(1){ |
2180 | 2215 | //カレントディレクトリを元に戻す |
2181 | 2216 | if(FSchdir(cwdpath)){ |
@@ -2224,7 +2259,7 @@ OBJECTSECTION void run(int test){ | ||
2224 | 2259 | edited=edited1; |
2225 | 2260 | FSremove(TEMPFILENAME); |
2226 | 2261 | } |
2227 | -OBJECTSECTION void displaybottomline(void){ | |
2262 | +void displaybottomline(void){ | |
2228 | 2263 | //エディター画面最下行の表示 |
2229 | 2264 | unsigned char *p; |
2230 | 2265 | unsigned char c; |
@@ -2259,7 +2294,7 @@ OBJECTSECTION void displaybottomline(void){ | ||
2259 | 2294 | cursor=p; //カーソル位置戻し |
2260 | 2295 | cursorcolor=c; |
2261 | 2296 | } |
2262 | -OBJECTSECTION void normal_code_process(unsigned char k){ | |
2297 | +void normal_code_process(unsigned char k){ | |
2263 | 2298 | // 通常文字入力処理 |
2264 | 2299 | // k:入力された文字コード |
2265 | 2300 | int i; |
@@ -2286,7 +2321,7 @@ OBJECTSECTION void normal_code_process(unsigned char k){ | ||
2286 | 2321 | if(i==0) cursor_right();//画面上、バッファ上のカーソル位置を1つ後ろに移動 |
2287 | 2322 | } |
2288 | 2323 | } |
2289 | -OBJECTSECTION void control_code_process(unsigned char k,unsigned char sh){ | |
2324 | +void control_code_process(unsigned char k,unsigned char sh){ | |
2290 | 2325 | // 制御文字入力処理 |
2291 | 2326 | // k:制御文字の仮想キーコード |
2292 | 2327 | // sh:シフト関連キー状態 |
@@ -2459,7 +2494,9 @@ OBJECTSECTION void control_code_process(unsigned char k,unsigned char sh){ | ||
2459 | 2494 | break; |
2460 | 2495 | case VK_F2: //F2キー |
2461 | 2496 | if(num==0) break; |
2462 | - if(sh & CHK_SHIFT) msra(); //create direct running file | |
2497 | +// MOS: modification | |
2498 | + if(sh & CHK_SHIFT) run(2); //create direct running file | |
2499 | +// if(sh & CHK_SHIFT) msra(); //create direct running file | |
2463 | 2500 | else save_as(0); //ファイル名を付けて保存 |
2464 | 2501 | break; |
2465 | 2502 | case VK_F3: //F3キー |
@@ -2476,7 +2513,7 @@ OBJECTSECTION void control_code_process(unsigned char k,unsigned char sh){ | ||
2476 | 2513 | break; |
2477 | 2514 | } |
2478 | 2515 | } |
2479 | -OBJECTSECTION void texteditor(void){ | |
2516 | +void texteditor(void){ | |
2480 | 2517 | //テキストエディター本体 |
2481 | 2518 | unsigned char k1,k2,sh; |
2482 | 2519 | FSFILE *fp; |
@@ -6,8 +6,9 @@ | ||
6 | 6 | */ |
7 | 7 | |
8 | 8 | #define CPU_CLOCK_HZ (g_use_graphic ? 53693175 : 57272720) |
9 | -#define PERSISTENT_RAM_SIZE (1024*52) | |
10 | -#define OBJECTSECTION_ADDRESS 0x9D033000 | |
9 | +#define PERSISTENT_RAM_SIZE (1024*52) // 0xD000 | |
10 | +#define MACHIKANIA_OBJ_ADDRESS (0x9D040000 - (0xd000)) | |
11 | +#define MACHIKANIA_OBJ_INFO (MACHIKANIA_OBJ_ADDRESS-16) | |
11 | 12 | |
12 | 13 | int readbuttons(); |
13 | 14 | void scroll(int x, int y); |
@@ -42,6 +42,10 @@ const char* g_err_str[]={ | ||
42 | 42 | "Invalid in class file", |
43 | 43 | "INIT method does not exist", |
44 | 44 | "ERR_OPTION_CLASSCODE", |
45 | + "ERR_COMPILE_CLIB", | |
46 | + "C library not found", | |
47 | + "HEX file syntax error", | |
48 | + "Class or C library not found", | |
45 | 49 | }; |
46 | 50 | |
47 | 51 | char* resolve_label(int s6){ |
@@ -13,10 +13,12 @@ | ||
13 | 13 | #include "api.h" |
14 | 14 | #include "compiler.h" |
15 | 15 | |
16 | -static FSFILE* g_fhandle; | |
17 | -static char* g_fbuff; | |
18 | -static int g_size; | |
19 | -static int g_filepoint; | |
16 | +// Variables used for file handling, shared with the other components | |
17 | +// Note that only one file can be open | |
18 | +FSFILE* g_fhandle; | |
19 | +char* g_fbuff; | |
20 | +int g_size; | |
21 | +int g_filepoint; | |
20 | 22 | |
21 | 23 | char* init_file(char* buff,char* appname){ |
22 | 24 | // Open file |
@@ -87,6 +89,8 @@ char* compile_file(){ | ||
87 | 89 | char* err; |
88 | 90 | // Read first 512 bytes |
89 | 91 | read_file(512); |
92 | + // Skip BOM (UTF-8) if exists | |
93 | + if (0xEF==g_source[0] && 0xBB==g_source[1] && 0xBF==g_source[2]) g_srcpos=3; | |
90 | 94 | // Compile line by line |
91 | 95 | while (g_size==512) { |
92 | 96 | err=compile_line(); |
@@ -147,7 +151,7 @@ int compile_and_link_file(char* buff,char* appname){ | ||
147 | 151 | err=compile_file(); |
148 | 152 | close_file(); |
149 | 153 | |
150 | - // If compiling a class file is required, do it. | |
154 | + // If compiling a class file or a clib is required, do it. | |
151 | 155 | if (err==ERR_COMPILE_CLASS) { |
152 | 156 | j=g_compiling_class; |
153 | 157 | i=compile_and_link_class(buff, g_class); |
@@ -155,6 +159,11 @@ int compile_and_link_file(char* buff,char* appname){ | ||
155 | 159 | if (i) return i; |
156 | 160 | // Continue compiling current file from the beginning. |
157 | 161 | continue; |
162 | + } else if (err==ERR_COMPILE_CLIB) { | |
163 | + err=useclib_begin(buff); | |
164 | + // Continue compiling current file from the beginning. | |
165 | + if (err) break; | |
166 | + continue; | |
158 | 167 | } |
159 | 168 | break; |
160 | 169 | } |
@@ -239,7 +248,7 @@ int compile_and_link_class(char* buff,int class){ | ||
239 | 248 | // Restore current dirctory |
240 | 249 | cmpdata_reset(); |
241 | 250 | while(record=cmpdata_find(CMPDATA_TEMP)){ |
242 | - if (cwd_id=(record[0]&0xffff)) break; | |
251 | + if ((record[0]&0xffff)==cwd_id) break; | |
243 | 252 | } |
244 | 253 | if (!record) break; |
245 | 254 | FSchdir((char*)(&record[1])); |
@@ -293,4 +302,4 @@ int compile_and_link_main_file(char* buff,char* appname){ | ||
293 | 302 | to use the same long var name in different files (note that g_long_name_var_num is not reseted after |
294 | 303 | compiling each class code). |
295 | 304 | */ |
296 | -} | |
\ No newline at end of file | ||
305 | +} |
@@ -9,6 +9,13 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "./compiler.h" |
13 | 20 | #include "stdlib.h" |
14 | 21 |
@@ -9,10 +9,17 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "compiler.h" |
13 | 20 | #include "api.h" |
14 | 21 | |
15 | -OBJECTSECTION char* music_function(){ | |
22 | +char* music_function(){ | |
16 | 23 | char* err; |
17 | 24 | next_position(); |
18 | 25 | if (g_source[g_srcpos]==')') { |
@@ -26,26 +33,26 @@ OBJECTSECTION char* music_function(){ | ||
26 | 33 | return 0; |
27 | 34 | } |
28 | 35 | |
29 | -OBJECTSECTION char* read_function(){ | |
36 | +char* read_function(){ | |
30 | 37 | // This function is not valid in class file. |
31 | 38 | if (g_compiling_class) return ERR_INVALID_CLASS; |
32 | 39 | call_lib_code(LIB_READ); |
33 | 40 | return 0; |
34 | 41 | } |
35 | 42 | |
36 | -OBJECTSECTION char* cread_function(){ | |
43 | +char* cread_function(){ | |
37 | 44 | call_lib_code(LIB_CREAD); |
38 | 45 | return 0; |
39 | 46 | } |
40 | 47 | |
41 | -OBJECTSECTION char* gosub_function(){ | |
48 | +char* gosub_function(){ | |
42 | 49 | // Check if garbage collection has been done. |
43 | 50 | // This check is required because the used temporary area would be changed |
44 | 51 | // in sub routine. |
45 | 52 | if (g_temp_area_used) return ERR_GOSUB_ASH; |
46 | 53 | return gosub_statement(); |
47 | 54 | } |
48 | -OBJECTSECTION char* strncmp_function(){ | |
55 | +char* strncmp_function(){ | |
49 | 56 | char* err; |
50 | 57 | err=get_string(); |
51 | 58 | if (err) return err; |
@@ -67,7 +74,7 @@ OBJECTSECTION char* strncmp_function(){ | ||
67 | 74 | g_object[g_objpos++]=0x27BD0008; // addiu sp,sp,8 |
68 | 75 | return 0; |
69 | 76 | } |
70 | -OBJECTSECTION char* len_function(){ | |
77 | +char* len_function(){ | |
71 | 78 | char* err; |
72 | 79 | err=get_string(); |
73 | 80 | if (err) return err; |
@@ -81,7 +88,7 @@ OBJECTSECTION char* len_function(){ | ||
81 | 88 | return 0; |
82 | 89 | } |
83 | 90 | |
84 | -OBJECTSECTION char* asc_function(){ | |
91 | +char* asc_function(){ | |
85 | 92 | char* err; |
86 | 93 | err=get_string(); |
87 | 94 | if (err) return err; |
@@ -90,7 +97,7 @@ OBJECTSECTION char* asc_function(){ | ||
90 | 97 | return 0; |
91 | 98 | } |
92 | 99 | |
93 | -OBJECTSECTION char* val_function(){ | |
100 | +char* val_function(){ | |
94 | 101 | char* err; |
95 | 102 | err=get_string(); |
96 | 103 | if (err) return err; |
@@ -98,7 +105,7 @@ OBJECTSECTION char* val_function(){ | ||
98 | 105 | return 0; |
99 | 106 | } |
100 | 107 | |
101 | -OBJECTSECTION char* peek_function_sub(int bits){ | |
108 | +char* peek_function_sub(int bits){ | |
102 | 109 | char* err; |
103 | 110 | err=get_value(); |
104 | 111 | if (err) return err; |
@@ -118,7 +125,7 @@ OBJECTSECTION char* peek_function_sub(int bits){ | ||
118 | 125 | return 0; |
119 | 126 | } |
120 | 127 | |
121 | -OBJECTSECTION char* sgn_function(){ | |
128 | +char* sgn_function(){ | |
122 | 129 | char* err; |
123 | 130 | err=get_value(); |
124 | 131 | if (err) return err; |
@@ -132,7 +139,7 @@ OBJECTSECTION char* sgn_function(){ | ||
132 | 139 | return 0; |
133 | 140 | } |
134 | 141 | |
135 | -OBJECTSECTION char* abs_function(){ | |
142 | +char* abs_function(){ | |
136 | 143 | char* err; |
137 | 144 | err=get_value(); |
138 | 145 | if (err) return err; |
@@ -143,7 +150,7 @@ OBJECTSECTION char* abs_function(){ | ||
143 | 150 | return 0; |
144 | 151 | } |
145 | 152 | |
146 | -OBJECTSECTION char* not_function(){ | |
153 | +char* not_function(){ | |
147 | 154 | char* err; |
148 | 155 | err=get_value(); |
149 | 156 | if (err) return err; |
@@ -152,19 +159,19 @@ OBJECTSECTION char* not_function(){ | ||
152 | 159 | return 0; |
153 | 160 | } |
154 | 161 | |
155 | -OBJECTSECTION char* rnd_function(){ | |
162 | +char* rnd_function(){ | |
156 | 163 | call_lib_code(LIB_RND); |
157 | 164 | return 0; |
158 | 165 | } |
159 | 166 | |
160 | -OBJECTSECTION char* chr_function(void){ | |
167 | +char* chr_function(void){ | |
161 | 168 | char* err; |
162 | 169 | err=get_value(); |
163 | 170 | if (err) return err; |
164 | 171 | call_lib_code(LIB_CHR); |
165 | 172 | return 0; |
166 | 173 | } |
167 | -OBJECTSECTION char* hex_function(void){ | |
174 | +char* hex_function(void){ | |
168 | 175 | char* err; |
169 | 176 | err=get_value(); |
170 | 177 | if (err) return err; |
@@ -191,7 +198,7 @@ OBJECTSECTION char* hex_function(void){ | ||
191 | 198 | return 0; |
192 | 199 | } |
193 | 200 | |
194 | -OBJECTSECTION char* dec_function(void){ | |
201 | +char* dec_function(void){ | |
195 | 202 | char* err; |
196 | 203 | err=get_value(); |
197 | 204 | if (err) return err; |
@@ -199,7 +206,7 @@ OBJECTSECTION char* dec_function(void){ | ||
199 | 206 | return 0; |
200 | 207 | } |
201 | 208 | |
202 | -OBJECTSECTION char* keys_function(void){ | |
209 | +char* keys_function(void){ | |
203 | 210 | char* err; |
204 | 211 | next_position(); |
205 | 212 | if (g_source[g_srcpos]==')') { |
@@ -213,7 +220,7 @@ OBJECTSECTION char* keys_function(void){ | ||
213 | 220 | return 0; |
214 | 221 | } |
215 | 222 | |
216 | -OBJECTSECTION char* tvram_function(void){ | |
223 | +char* tvram_function(void){ | |
217 | 224 | char* err; |
218 | 225 | int i; |
219 | 226 | next_position(); |
@@ -235,17 +242,17 @@ OBJECTSECTION char* tvram_function(void){ | ||
235 | 242 | return 0; |
236 | 243 | } |
237 | 244 | |
238 | -OBJECTSECTION char* drawcount_function(void){ | |
245 | +char* drawcount_function(void){ | |
239 | 246 | call_lib_code(LIB_DRAWCOUNT); |
240 | 247 | return 0; |
241 | 248 | } |
242 | 249 | |
243 | -OBJECTSECTION char* input_function(void){ | |
250 | +char* input_function(void){ | |
244 | 251 | call_lib_code(LIB_INPUT); |
245 | 252 | return 0; |
246 | 253 | } |
247 | 254 | |
248 | -OBJECTSECTION char* inkey_function(void){ | |
255 | +char* inkey_function(void){ | |
249 | 256 | char* err; |
250 | 257 | next_position(); |
251 | 258 | if (g_source[g_srcpos]==')') { |
@@ -259,11 +266,11 @@ OBJECTSECTION char* inkey_function(void){ | ||
259 | 266 | return 0; |
260 | 267 | } |
261 | 268 | |
262 | -OBJECTSECTION char* args_function(void){ | |
269 | +char* args_function(void){ | |
263 | 270 | return args_function_main(); |
264 | 271 | } |
265 | 272 | |
266 | -OBJECTSECTION char* system_function(void){ | |
273 | +char* system_function(void){ | |
267 | 274 | char* err; |
268 | 275 | err=get_value(); |
269 | 276 | if (err) return err; |
@@ -272,7 +279,7 @@ OBJECTSECTION char* system_function(void){ | ||
272 | 279 | return 0; |
273 | 280 | } |
274 | 281 | |
275 | -OBJECTSECTION char* sprintf_function(void){ | |
282 | +char* sprintf_function(void){ | |
276 | 283 | char* err; |
277 | 284 | err=get_string(); |
278 | 285 | if (err) return err; |
@@ -292,7 +299,7 @@ OBJECTSECTION char* sprintf_function(void){ | ||
292 | 299 | return 0; |
293 | 300 | } |
294 | 301 | |
295 | -OBJECTSECTION char* floatstr_function(void){ | |
302 | +char* floatstr_function(void){ | |
296 | 303 | char* err; |
297 | 304 | err=get_float(); |
298 | 305 | if (err) return err; |
@@ -303,7 +310,7 @@ OBJECTSECTION char* floatstr_function(void){ | ||
303 | 310 | return 0; |
304 | 311 | } |
305 | 312 | |
306 | -OBJECTSECTION char* floatsharp_function(void){ | |
313 | +char* floatsharp_function(void){ | |
307 | 314 | char* err; |
308 | 315 | err=get_value(); |
309 | 316 | if (err) return err; |
@@ -311,7 +318,7 @@ OBJECTSECTION char* floatsharp_function(void){ | ||
311 | 318 | return 0; |
312 | 319 | } |
313 | 320 | |
314 | -OBJECTSECTION char* valsharp_function(void){ | |
321 | +char* valsharp_function(void){ | |
315 | 322 | char* err; |
316 | 323 | err=get_string(); |
317 | 324 | if (err) return err; |
@@ -319,7 +326,7 @@ OBJECTSECTION char* valsharp_function(void){ | ||
319 | 326 | return 0; |
320 | 327 | } |
321 | 328 | |
322 | -OBJECTSECTION char* int_function(void){ | |
329 | +char* int_function(void){ | |
323 | 330 | char* err; |
324 | 331 | err=get_float(); |
325 | 332 | if (err) return err; |
@@ -327,22 +334,22 @@ OBJECTSECTION char* int_function(void){ | ||
327 | 334 | return 0; |
328 | 335 | } |
329 | 336 | |
330 | -OBJECTSECTION char* fseek_function(){ | |
337 | +char* fseek_function(){ | |
331 | 338 | call_lib_code(LIB_FILE | FUNC_FTELL); |
332 | 339 | return 0; |
333 | 340 | } |
334 | 341 | |
335 | -OBJECTSECTION char* flen_function(){ | |
342 | +char* flen_function(){ | |
336 | 343 | call_lib_code(LIB_FILE | FUNC_FLEN); |
337 | 344 | return 0; |
338 | 345 | } |
339 | 346 | |
340 | -OBJECTSECTION char* fgetc_function(){ | |
347 | +char* fgetc_function(){ | |
341 | 348 | call_lib_code(LIB_FILE | FUNC_FGETC); |
342 | 349 | return 0; |
343 | 350 | } |
344 | 351 | |
345 | -OBJECTSECTION char* finput_function(){ | |
352 | +char* finput_function(){ | |
346 | 353 | char* err; |
347 | 354 | next_position(); |
348 | 355 | if (g_source[g_srcpos]!=')') { |
@@ -357,12 +364,12 @@ OBJECTSECTION char* finput_function(){ | ||
357 | 364 | return 0; |
358 | 365 | } |
359 | 366 | |
360 | -OBJECTSECTION char* feof_function(){ | |
367 | +char* feof_function(){ | |
361 | 368 | call_lib_code(LIB_FILE | FUNC_FEOF); |
362 | 369 | return 0; |
363 | 370 | } |
364 | 371 | |
365 | -OBJECTSECTION char* playwave_function(){ | |
372 | +char* playwave_function(){ | |
366 | 373 | char* err; |
367 | 374 | next_position(); |
368 | 375 | if (g_source[g_srcpos]!=')') { |
@@ -378,7 +385,7 @@ OBJECTSECTION char* playwave_function(){ | ||
378 | 385 | return 0; |
379 | 386 | } |
380 | 387 | |
381 | -OBJECTSECTION char* setdir_function(){ | |
388 | +char* setdir_function(){ | |
382 | 389 | char* err; |
383 | 390 | err=get_string(); |
384 | 391 | if (err) return err; |
@@ -386,21 +393,21 @@ OBJECTSECTION char* setdir_function(){ | ||
386 | 393 | return 0; |
387 | 394 | } |
388 | 395 | |
389 | -OBJECTSECTION char* getdir_function(){ | |
396 | +char* getdir_function(){ | |
390 | 397 | call_lib_code(LIB_GETDIR); |
391 | 398 | return 0; |
392 | 399 | } |
393 | 400 | |
394 | -OBJECTSECTION char* exec_function(){ | |
401 | +char* exec_function(){ | |
395 | 402 | return exec_statement(); |
396 | 403 | } |
397 | 404 | |
398 | -OBJECTSECTION char* readkey_function(){ | |
405 | +char* readkey_function(){ | |
399 | 406 | call_lib_code(LIB_READKEY); |
400 | 407 | return 0; |
401 | 408 | } |
402 | 409 | |
403 | -OBJECTSECTION char* float_constant(float val){ | |
410 | +char* float_constant(float val){ | |
404 | 411 | volatile int i; |
405 | 412 | ((float*)(&i))[0]=val; |
406 | 413 | if (i&0xFFFF0000) { |
@@ -416,7 +423,7 @@ OBJECTSECTION char* float_constant(float val){ | ||
416 | 423 | return 0; |
417 | 424 | } |
418 | 425 | |
419 | -OBJECTSECTION char* float_1param_function(enum functions func){ | |
426 | +char* float_1param_function(enum functions func){ | |
420 | 427 | char* err; |
421 | 428 | err=get_float(); |
422 | 429 | if (err) return err; |
@@ -424,7 +431,7 @@ OBJECTSECTION char* float_1param_function(enum functions func){ | ||
424 | 431 | return 0; |
425 | 432 | } |
426 | 433 | |
427 | -OBJECTSECTION char* float_2param_function(enum functions func){ | |
434 | +char* float_2param_function(enum functions func){ | |
428 | 435 | char* err; |
429 | 436 | err=get_float(); |
430 | 437 | if (err) return err; |
@@ -444,7 +451,7 @@ OBJECTSECTION char* float_2param_function(enum functions func){ | ||
444 | 451 | return 0; |
445 | 452 | } |
446 | 453 | |
447 | -OBJECTSECTION char* float_function(void){ | |
454 | +char* float_function(void){ | |
448 | 455 | char* err; |
449 | 456 | if (nextCodeIs("FLOAT#(")) { |
450 | 457 | err=floatsharp_function(); |
@@ -494,12 +501,17 @@ OBJECTSECTION char* float_function(void){ | ||
494 | 501 | err=gosub_function(); |
495 | 502 | } else if (nextCodeIs("ARGS#(")) { |
496 | 503 | err=args_function(); |
504 | + } else if (nextCodeIs("CLIB#(")) { | |
505 | + err=clib_statement(); | |
497 | 506 | } else if (nextCodeIs("PI#")) { |
498 | 507 | return float_constant(3.141593); |
499 | 508 | } else { |
500 | 509 | // Check if static method of a class |
501 | 510 | err=static_method('#'); |
502 | - //return ERR_SYNTAX; | |
511 | + if (err==ERR_NO_CLASS) { | |
512 | + err=clib_method('#'); | |
513 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
514 | + } | |
503 | 515 | } |
504 | 516 | if (err) return err; |
505 | 517 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -520,11 +532,12 @@ static const void* str_func_list[]={ | ||
520 | 532 | "SYSTEM$(",system_function, |
521 | 533 | "FINPUT$(",finput_function, |
522 | 534 | "GETDIR$(",getdir_function, |
535 | + "CLIB$(",clib_statement, | |
523 | 536 | // Additional functions follow |
524 | 537 | ADDITIONAL_STR_FUNCTIONS |
525 | 538 | }; |
526 | 539 | |
527 | -OBJECTSECTION char* str_function(void){ | |
540 | +char* str_function(void){ | |
528 | 541 | char* err; |
529 | 542 | int i; |
530 | 543 | char* (*f)(); |
@@ -539,7 +552,10 @@ OBJECTSECTION char* str_function(void){ | ||
539 | 552 | } else { |
540 | 553 | // Check if static method of a class |
541 | 554 | err=static_method('$'); |
542 | - //return ERR_SYNTAX; | |
555 | + if (err==ERR_NO_CLASS) { | |
556 | + err=clib_method('$'); | |
557 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
558 | + } | |
543 | 559 | } |
544 | 560 | if (err) return err; |
545 | 561 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -549,23 +565,23 @@ OBJECTSECTION char* str_function(void){ | ||
549 | 565 | |
550 | 566 | // Aliases follow |
551 | 567 | |
552 | -OBJECTSECTION char* peek_function(){ | |
568 | +char* peek_function(){ | |
553 | 569 | return peek_function_sub(8); |
554 | 570 | } |
555 | 571 | |
556 | -OBJECTSECTION char* peek16_function(){ | |
572 | +char* peek16_function(){ | |
557 | 573 | return peek_function_sub(16); |
558 | 574 | } |
559 | 575 | |
560 | -OBJECTSECTION char* peek32_function(){ | |
576 | +char* peek32_function(){ | |
561 | 577 | return peek_function_sub(32); |
562 | 578 | } |
563 | 579 | |
564 | -OBJECTSECTION char* gcolor_function(){ | |
580 | +char* gcolor_function(){ | |
565 | 581 | return graphic_statement(FUNC_GCOLOR); |
566 | 582 | } |
567 | 583 | |
568 | -OBJECTSECTION char* fopen_function(){ | |
584 | +char* fopen_function(){ | |
569 | 585 | return fopen_statement_main(FUNC_FOPEN); |
570 | 586 | } |
571 | 587 |
@@ -609,11 +625,12 @@ static const void* int_func_list[]={ | ||
609 | 625 | "EXEC(",exec_function, |
610 | 626 | "CORETIMER(",coretimer_function, |
611 | 627 | "READKEY(",readkey_function, |
628 | + "CLIB(",clib_statement, | |
612 | 629 | // Additional functions follow |
613 | 630 | ADDITIONAL_INT_FUNCTIONS |
614 | 631 | }; |
615 | 632 | |
616 | -OBJECTSECTION char* function(void){ | |
633 | +char* function(void){ | |
617 | 634 | char* err; |
618 | 635 | int i; |
619 | 636 | char* (*f)(); |
@@ -626,9 +643,12 @@ OBJECTSECTION char* function(void){ | ||
626 | 643 | f=int_func_list[i+1]; |
627 | 644 | err=f(); |
628 | 645 | } else { |
629 | - // Check if static method of a class | |
646 | + // Check if static method of a class of clib | |
630 | 647 | err=static_method(0); |
631 | - //return ERR_SYNTAX; | |
648 | + if (err==ERR_NO_CLASS) { | |
649 | + err=clib_method(0); | |
650 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
651 | + } | |
632 | 652 | } |
633 | 653 | if (err) return err; |
634 | 654 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -12,8 +12,12 @@ | ||
12 | 12 | #include "compiler.h" |
13 | 13 | #include "main.h" |
14 | 14 | |
15 | -// Flag (NOP assembly) to use OBJECTSECTION for object. | |
16 | -const __attribute__((address(OBJECTSECTION_ADDRESS))) int g_objectsection=0; | |
15 | +// Store g_object/g_objpos values for MOS at jest before MACHIKANIA_OBJ_ADDRESS. | |
16 | +// When these values are 0, MOS code is not loaded. | |
17 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-16))) _reserved1_mos=0; | |
18 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-12))) _reserved2_mos=0; | |
19 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-8))) g_object_mos=0; | |
20 | +const volatile int __attribute__((address(MACHIKANIA_OBJ_ADDRESS-4))) g_objpos_mos=0; | |
17 | 21 | |
18 | 22 | // Contain the valus of $gp and $s6 (GPR of MIPS32) |
19 | 23 | int g_gp; |
@@ -98,5 +102,11 @@ unsigned char g_num_classes; | ||
98 | 102 | // OPTION FASTFIELD |
99 | 103 | char g_option_fastfield; |
100 | 104 | |
105 | +// Flag if file system has been initialized | |
106 | +char g_fs_valid; | |
107 | + | |
108 | +// Result of reading a HEX file line | |
109 | +HEXLINE g_hexline; | |
110 | + | |
101 | 111 | // General purpose integer used for asigning value with pointer |
102 | 112 | int g_temp; |
@@ -779,6 +779,11 @@ int lib_file(enum functions func, int a0, int a1, int v0){ | ||
779 | 779 | int i; |
780 | 780 | int buff[1]; |
781 | 781 | char* str; |
782 | + | |
783 | + // Immediately return if file system is invalid. | |
784 | + // See also "case LIB_FILE:" in _call_library(). | |
785 | + if (!g_fs_valid) return v0; | |
786 | + | |
782 | 787 | if (activefhandle) fhandle=s_fhandle[activefhandle-1]; |
783 | 788 | switch(func){ |
784 | 789 | case FUNC_FINIT: |
@@ -1011,6 +1016,7 @@ int _call_library(int a0,int a1,int v0,enum libs a3){ | ||
1011 | 1016 | scroll(g_libparams[1],v0); |
1012 | 1017 | return v0; |
1013 | 1018 | case LIB_FILE: |
1019 | + if (!g_fs_valid) err_str("File System not initialized"); | |
1014 | 1020 | return lib_file((enum functions)(a3 & FUNC_MASK),g_libparams[1],g_libparams[2],v0); |
1015 | 1021 | case LIB_KEYS: |
1016 | 1022 | return lib_keys(v0); |
@@ -157,6 +157,7 @@ int searchinittext(char *s){ | ||
157 | 157 | void readinifile(void){ |
158 | 158 | FSFILE *fp; |
159 | 159 | char inittext[9]; |
160 | + if (!g_fs_valid) return; | |
160 | 161 | |
161 | 162 | fp=FSfopen(INIFILE,"r"); |
162 | 163 | if(fp==NULL) return; |
@@ -203,6 +204,7 @@ void printhex32(unsigned int d){ | ||
203 | 204 | |
204 | 205 | int main(void){ |
205 | 206 | char *appname,*s; |
207 | + int use_editor; | |
206 | 208 | |
207 | 209 | if(DEVCFG1 & 0x8000){ |
208 | 210 | // Set Clock switching enabled and reset |
@@ -234,6 +236,17 @@ int main(void){ | ||
234 | 236 | // Show blue screen if exception before soft reset. |
235 | 237 | blue_screen(); |
236 | 238 | |
239 | + // 実行中HEXファイル名がHEXFILEと一致するかどうか | |
240 | + use_editor=0; | |
241 | + appname=(char*)FILENAME_FLASH_ADDRESS; | |
242 | + s=HEXFILE; | |
243 | + while(*s++==*appname++) { | |
244 | + if(*s==0) { | |
245 | + //テキストエディター呼び出し | |
246 | + use_editor=1; | |
247 | + break; | |
248 | + } | |
249 | + } | |
237 | 250 | printstr("MachiKania BASIC System\n"); |
238 | 251 | printstr(" Ver "SYSVER1" "SYSVER2" by KENKEN\n"); |
239 | 252 | printstr("BASIC Compiler "BASVER"\n"); |
@@ -241,16 +254,26 @@ int main(void){ | ||
241 | 254 | //SDカードファイルシステム初期化 |
242 | 255 | setcursorcolor(COLOR_NORMALTEXT); |
243 | 256 | printstr("Init File System..."); |
244 | - // Initialize the File System | |
245 | - if(FSInit()==FALSE){ //ファイルシステム初期化 | |
246 | - //エラーの場合停止 | |
247 | - setcursorcolor(COLOR_ERRORTEXT); | |
248 | - printstr("\nFile System Error\n"); | |
249 | - printstr("Insert Correct Card\n"); | |
250 | - printstr("And Reset\n"); | |
251 | - while(1) asm("wait"); | |
257 | + g_fs_valid=FSInit(); //ファイルシステム初期化 | |
258 | + if(g_fs_valid==FALSE){ | |
259 | + if (use_editor || !g_objpos_mos) { | |
260 | + // Editorモードの場合、及び、BASファイル読み込みモードの場合 | |
261 | + //エラーの場合停止 | |
262 | + setcursorcolor(COLOR_ERRORTEXT); | |
263 | + printstr("\nFile System Error\n"); | |
264 | + printstr("Insert Correct Card\n"); | |
265 | + printstr("And Reset\n"); | |
266 | + while(1) asm("wait"); | |
267 | + } else { | |
268 | + // MOSモードの場合は、あと二回、トライ | |
269 | + // エラー表示の後、続ける | |
270 | + g_fs_valid=FSInit(); | |
271 | + if(g_fs_valid==FALSE) g_fs_valid=FSInit(); | |
272 | + } | |
252 | 273 | } |
253 | - printstr("OK\n"); | |
274 | + if (g_fs_valid) printstr("OK\n"); | |
275 | + else printstr("Failed\n"); | |
276 | + | |
254 | 277 | lockkey=2; // NumLockキーオン |
255 | 278 | keytype=0; // 日本語キーボード |
256 | 279 | readinifile(); //INIファイル読み込み |
@@ -264,20 +287,23 @@ int main(void){ | ||
264 | 287 | wait60thsec(60); //1秒待ち |
265 | 288 | |
266 | 289 | // 実行中HEXファイル名がHEXFILEと一致した場合はエディタ起動 |
267 | - appname=(char*)FILENAME_FLASH_ADDRESS; | |
268 | - s=HEXFILE; | |
269 | - while(*s++==*appname++) if(*s==0) texteditor(); //テキストエディター呼び出し | |
290 | + if(use_editor) texteditor(); //テキストエディター呼び出し | |
270 | 291 | |
271 | - // 実行中HEXファイル名の「.HEX」を「.BAS」に置き換えてBASファイルを実行 | |
272 | - appname=(char*)FILENAME_FLASH_ADDRESS; | |
273 | - s=tempfile; | |
274 | - while(*appname!='.') *s++=*appname++; | |
275 | - appname=".BAS"; | |
276 | - while(*appname!=0) *s++=*appname++; | |
277 | - *s=0; | |
278 | - // buttonmode(); //ボタン有効化 | |
279 | 292 | g_disable_break=1; // Breakキー無効化 |
280 | - runbasic(tempfile,0); | |
293 | + // buttonmode(); //ボタン有効化 | |
294 | + if (g_objpos_mos) { | |
295 | + // MOSからコードをコピーして実行 | |
296 | + runbasic(0,2); | |
297 | + } else { | |
298 | + // 実行中HEXファイル名の「.HEX」を「.BAS」に置き換えてBASファイルを実行 | |
299 | + appname=(char*)FILENAME_FLASH_ADDRESS; | |
300 | + s=tempfile; | |
301 | + while(*appname!='.') *s++=*appname++; | |
302 | + appname=".BAS"; | |
303 | + while(*appname!=0) *s++=*appname++; | |
304 | + *s=0; | |
305 | + runbasic(tempfile,0); | |
306 | + } | |
281 | 307 | while(1) asm(WAIT); |
282 | 308 | } |
283 | 309 |
@@ -7,8 +7,9 @@ | ||
7 | 7 | |
8 | 8 | #define ZOEA |
9 | 9 | #define SYSVER1 "Zoea" |
10 | -#define SYSVER2 "1.3" | |
11 | -#define BASVER "KM-1208" | |
10 | +#define SYSVER2 "1.4" | |
11 | +#define SYSVERI 0x0140 | |
12 | +#define BASVER "KM-1209" | |
12 | 13 | |
13 | 14 | #define INIFILE "MACHIKAZ.INI" // 初期設定ファイル |
14 | 15 | #define HEXFILE "MACHIKAZ.HEX" // 実行中HEXファイル名がこれと一致した場合はエディタ起動 |
@@ -100,6 +100,7 @@ var namearray=[ | ||
100 | 100 | 'CHR', |
101 | 101 | 'CIRCLE', |
102 | 102 | 'CLEAR', |
103 | + 'CLIB', | |
103 | 104 | 'CLS', |
104 | 105 | 'COLOR', |
105 | 106 | 'COS', |
@@ -32,10 +32,14 @@ char* printdec(int num){ | ||
32 | 32 | } |
33 | 33 | } |
34 | 34 | |
35 | -int runbasic(char *appname,int test){ | |
35 | +#define RUNMODE_COMPILE_AND_RUN 0 | |
36 | +#define RUNMODE_COMPILE_ONLY 1 | |
37 | +#define RUNMODE_COPY_AND_RUN 2 | |
38 | + | |
39 | +int runbasic(char *appname,int mode){ | |
36 | 40 | // BASICソースのコンパイルと実行 |
37 | 41 | // appname 実行するBASICソースファイル |
38 | -// test 0:コンパイルと実行、0以外:コンパイルのみで終了 | |
42 | +// mode 0:コンパイルと実行、1:コンパイルのみで終了、2:コンパイル済みオブジェクトを実行 | |
39 | 43 | // |
40 | 44 | // 戻り値 |
41 | 45 | // 0:正常終了 |
@@ -57,16 +61,18 @@ int runbasic(char *appname,int test){ | ||
57 | 61 | // Clear object area |
58 | 62 | for(i=0;i<RAMSIZE/4;i++) g_object[i]=0x00000000; |
59 | 63 | |
60 | - // Check file error | |
61 | - err=init_file(buff,appname); | |
62 | - if (err) { | |
63 | - setcursorcolor(COLOR_ERRORTEXT); | |
64 | - printstr("Can't Open "); | |
65 | - printstr(appname); | |
66 | - printchar('\n'); | |
67 | - return -1; | |
64 | + if (mode!=RUNMODE_COPY_AND_RUN) { | |
65 | + // Check file error | |
66 | + err=init_file(buff,appname); | |
67 | + if (err) { | |
68 | + setcursorcolor(COLOR_ERRORTEXT); | |
69 | + printstr("Can't Open "); | |
70 | + printstr(appname); | |
71 | + printchar('\n'); | |
72 | + return -1; | |
73 | + } | |
74 | + close_file(); | |
68 | 75 | } |
69 | - close_file(); | |
70 | 76 | |
71 | 77 | // Initialize parameters |
72 | 78 | g_pcg_font=0; |
@@ -75,7 +81,6 @@ int runbasic(char *appname,int test){ | ||
75 | 81 | clearscreen(); |
76 | 82 | setcursor(0,0,7); |
77 | 83 | g_long_name_var_num=0; |
78 | - cmpdata_init(); | |
79 | 84 | |
80 | 85 | // Initialize music system |
81 | 86 | init_music(); |
@@ -85,13 +90,24 @@ int runbasic(char *appname,int test){ | ||
85 | 90 | |
86 | 91 | printstr("Compiling..."); |
87 | 92 | |
88 | - // Compile the file | |
89 | - i=compile_and_link_main_file(buff,appname); | |
90 | - if (i) return i; | |
91 | - | |
93 | + if (mode==RUNMODE_COPY_AND_RUN) { | |
94 | + // Copy the object from MOS | |
95 | + appname=(char*)MACHIKANIA_OBJ_ADDRESS; | |
96 | + for(i=0;i<RAMSIZE;i++) RAM[i]=appname[i]; | |
97 | + // Set g_object/g_objpos for library functions like lib_read(). | |
98 | + // The g_object/g_objpos values are stoared just before MOS. | |
99 | + g_object=(int*)g_object_mos; | |
100 | + g_objpos=g_objpos_mos; | |
101 | + } else { | |
102 | + // Initialize compiler | |
103 | + cmpdata_init(); | |
104 | + // Compile the file | |
105 | + i=compile_and_link_main_file(buff,appname); | |
106 | + if (i) return i; | |
107 | + } | |
92 | 108 | // All done |
93 | 109 | printstr("done\n"); |
94 | - if(test) return 0; //コンパイルのみの場合 | |
110 | + if(mode==RUNMODE_COMPILE_ONLY) return 0; //コンパイルのみの場合 | |
95 | 111 | wait60thsec(15); |
96 | 112 | |
97 | 113 | // Initialize the other parameters |
@@ -131,3 +147,114 @@ int runbasic(char *appname,int test){ | ||
131 | 147 | |
132 | 148 | return 0; |
133 | 149 | } |
150 | + | |
151 | +int create_self_running_hex(char* hexfilename){ | |
152 | + int i,j,fpos; | |
153 | + FSFILE* dst_file; | |
154 | + char* buff; | |
155 | + char* err; | |
156 | + unsigned int* object; | |
157 | + unsigned int addr,adjust; | |
158 | + unsigned int data[4]; | |
159 | + // Set buffer positions | |
160 | + buff=(char*)&(RAM[RAMSIZE-512]); | |
161 | + // Open original and destination HEX files. | |
162 | + if (hex_init_file(buff,HEXFILE)) return -1; | |
163 | + dst_file=FSfopen(hexfilename,"w"); | |
164 | + if (!dst_file) { | |
165 | + hex_close_file(); | |
166 | + return -1; | |
167 | + } | |
168 | + // Copy the HEX file from original MachiKania, except for MOS. | |
169 | + addr=0; | |
170 | + fpos=0; | |
171 | + while(1) { | |
172 | + if (0==((fpos++)&0x3ff)) { | |
173 | + // Indicator works every 1024 lines | |
174 | + printchar('.'); | |
175 | + } | |
176 | + err=hex_read_line(); | |
177 | + if (err) break; | |
178 | + // Determine type and current address. | |
179 | + // If address is OK, write it to destination. | |
180 | + if (g_hexline.type==1) { | |
181 | + // EOF | |
182 | + break; | |
183 | + } else if (g_hexline.type==4) { | |
184 | + // extended linear address | |
185 | + addr=g_hexline.data[0]; | |
186 | + addr=addr<<8; | |
187 | + addr|=g_hexline.data[1]; | |
188 | + addr=addr<<16; | |
189 | + // Highest bit will be 1 for 0x9D0xxxxx instead of 0x1D0xxxxx | |
190 | + addr|=0x80000000; | |
191 | + // Write this anyway | |
192 | + err=hex_write(dst_file); | |
193 | + if (err) break; | |
194 | + } else if (g_hexline.type==0) { | |
195 | + // data | |
196 | + addr&=0xffff0000; | |
197 | + addr|=g_hexline.address; | |
198 | + // Write this line if not in MOS | |
199 | + if (addr<MACHIKANIA_OBJ_INFO || FILENAME_FLASH_ADDRESS<=addr) { | |
200 | + err=hex_write(dst_file); | |
201 | + if (err) break; | |
202 | + } | |
203 | + } else { | |
204 | + // Unknown type | |
205 | + err=ERR_HEX_ERROR; | |
206 | + break; | |
207 | + } | |
208 | + } | |
209 | + hex_close_file(); | |
210 | + if (err) { | |
211 | + FSfclose(dst_file); | |
212 | + printstr(err); | |
213 | + return -1; | |
214 | + } | |
215 | + // Save MACHIKANIA_OBJ_INFO | |
216 | + addr=MACHIKANIA_OBJ_INFO; | |
217 | + err=hex_write_address(dst_file,addr>>16); | |
218 | + if (!err) { | |
219 | + data[2]=(int)g_object; | |
220 | + data[3]=(int)g_objpos; | |
221 | + err=hex_write_data_16(dst_file,addr&0xffff,&data[0]); | |
222 | + } | |
223 | + if (err) { | |
224 | + FSfclose(dst_file); | |
225 | + printstr(err); | |
226 | + return -1; | |
227 | + } | |
228 | + // Add MOS. Adjustment is for changing address from RAM area to MOS. | |
229 | + addr=-1; | |
230 | + object=(unsigned int*)(&RAM[0]); | |
231 | + adjust=(unsigned int)MACHIKANIA_OBJ_ADDRESS-(unsigned int)object; | |
232 | + while(object<(unsigned int*)(&g_object[g_objpos])){ | |
233 | + if (0==((fpos++)&0x3ff)) { | |
234 | + // Indicator works every 1024 lines | |
235 | + printchar('.'); | |
236 | + } | |
237 | + if ((0x7fff0000 & ((unsigned int)object+adjust)) != addr) { | |
238 | + // Construct a hex line for providing Extended linear addres | |
239 | + addr=0x7fff0000 & ((unsigned int)object+adjust); | |
240 | + err=hex_write_address(dst_file,addr>>16); | |
241 | + if (err) break; | |
242 | + } | |
243 | + // Construct a hex line for data | |
244 | + err=hex_write_data_16(dst_file,((unsigned int)object+adjust)&0xffff,object); | |
245 | + if (err) break; | |
246 | + // All OK for these 4 words (16 bytes). | |
247 | + object+=4; | |
248 | + err=0; | |
249 | + } | |
250 | + if (err) { | |
251 | + FSfclose(dst_file); | |
252 | + printstr(err); | |
253 | + return -1; | |
254 | + } | |
255 | + // All done. Write EOF | |
256 | + err=hex_write_eof(dst_file); | |
257 | + FSfclose(dst_file); | |
258 | + if (err) return -1; | |
259 | + return 0; | |
260 | +} |
@@ -12,6 +12,7 @@ | ||
12 | 12 | var filearray=[ |
13 | 13 | 'args.c', |
14 | 14 | 'class.c', |
15 | + 'clib.c', | |
15 | 16 | 'cmpdata.c', |
16 | 17 | 'compiler.c', |
17 | 18 | 'debug.c', |
@@ -21,6 +22,7 @@ var filearray=[ | ||
21 | 22 | 'float.c', |
22 | 23 | 'function.c', |
23 | 24 | 'globalvars.c', |
25 | + 'hexfile.c', | |
24 | 26 | 'library.c', |
25 | 27 | 'linker.c', |
26 | 28 | 'memory.c', |
@@ -36,6 +38,7 @@ var filearray=[ | ||
36 | 38 | 'reservednames.js', |
37 | 39 | 'sharedfiles.js', |
38 | 40 | 'class.txt', |
41 | + 'clib.txt', | |
39 | 42 | ]; |
40 | 43 | |
41 | 44 | var WshShell = WScript.CreateObject("WScript.Shell"); |
@@ -9,10 +9,17 @@ | ||
9 | 9 | This file is shared by Megalopa and Zoea |
10 | 10 | */ |
11 | 11 | |
12 | +/* | |
13 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
14 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
15 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
16 | + See the MOS definition in liker script. | |
17 | +*/ | |
18 | + | |
12 | 19 | #include "api.h" |
13 | 20 | #include "compiler.h" |
14 | 21 | |
15 | -OBJECTSECTION char* rem_statement(){ | |
22 | +char* rem_statement(){ | |
16 | 23 | if (g_source[g_srcpos-4]<0x20) { |
17 | 24 | // This line contains only "REM" statement |
18 | 25 | // Delete $s6-setting command if exists. |
@@ -24,7 +31,7 @@ OBJECTSECTION char* rem_statement(){ | ||
24 | 31 | return 0; |
25 | 32 | } |
26 | 33 | |
27 | -OBJECTSECTION char* sound_statement(){ | |
34 | +char* sound_statement(){ | |
28 | 35 | char *err; |
29 | 36 | err=get_label(); |
30 | 37 | if (err) return err; |
@@ -62,7 +69,7 @@ OBJECTSECTION char* sound_statement(){ | ||
62 | 69 | call_lib_code(LIB_SOUND); |
63 | 70 | return 0; |
64 | 71 | } |
65 | -OBJECTSECTION char* music_statement(){ | |
72 | +char* music_statement(){ | |
66 | 73 | char *err; |
67 | 74 | err=get_string(); |
68 | 75 | if (err) return err; |
@@ -88,7 +95,7 @@ OBJECTSECTION char* music_statement(){ | ||
88 | 95 | return 0; |
89 | 96 | } |
90 | 97 | |
91 | -OBJECTSECTION char* exec_statement(){ | |
98 | +char* exec_statement(){ | |
92 | 99 | char *err; |
93 | 100 | char b1; |
94 | 101 | int i,prevpos; |
@@ -123,7 +130,7 @@ OBJECTSECTION char* exec_statement(){ | ||
123 | 130 | return 0; |
124 | 131 | } |
125 | 132 | |
126 | -OBJECTSECTION char* cdata_statement(){ | |
133 | +char* cdata_statement(){ | |
127 | 134 | // 0x00000020, 0x00000021, 0x00000022, and 0x00000023 (add/addu/sub/subu zero,zero,zero) |
128 | 135 | // are the sign of data region |
129 | 136 | int beginpos,prevpos; |
@@ -191,7 +198,7 @@ OBJECTSECTION char* cdata_statement(){ | ||
191 | 198 | return 0; |
192 | 199 | } |
193 | 200 | |
194 | -OBJECTSECTION char* data_statement(){ | |
201 | +char* data_statement(){ | |
195 | 202 | // 0x00000020, 0x00000021, 0x00000022, and 0x00000023 (add/addu/sub/subu zero,zero,zero) |
196 | 203 | // are the sign of data region |
197 | 204 | int i,prevpos; |
@@ -232,12 +239,12 @@ OBJECTSECTION char* data_statement(){ | ||
232 | 239 | } |
233 | 240 | } |
234 | 241 | |
235 | -OBJECTSECTION char* clear_statement(){ | |
242 | +char* clear_statement(){ | |
236 | 243 | call_lib_code(LIB_CLEAR); |
237 | 244 | return 0; |
238 | 245 | } |
239 | 246 | |
240 | -OBJECTSECTION char* poke_statement_sub(int bits){ | |
247 | +char* poke_statement_sub(int bits){ | |
241 | 248 | char* err; |
242 | 249 | err=get_value(); |
243 | 250 | if (err) return err; |
@@ -266,7 +273,7 @@ OBJECTSECTION char* poke_statement_sub(int bits){ | ||
266 | 273 | return 0; |
267 | 274 | } |
268 | 275 | |
269 | -OBJECTSECTION char* dim_statement(){ | |
276 | +char* dim_statement(){ | |
270 | 277 | char* err; |
271 | 278 | char b1; |
272 | 279 | int i; |
@@ -309,7 +316,7 @@ OBJECTSECTION char* dim_statement(){ | ||
309 | 316 | return 0; |
310 | 317 | } |
311 | 318 | |
312 | -OBJECTSECTION char* label_statement(){ | |
319 | +char* label_statement(){ | |
313 | 320 | char* err; |
314 | 321 | char b1; |
315 | 322 | b1=g_source[g_srcpos]; |
@@ -329,7 +336,7 @@ OBJECTSECTION char* label_statement(){ | ||
329 | 336 | return 0; |
330 | 337 | } |
331 | 338 | |
332 | -OBJECTSECTION char* restore_statement(){ | |
339 | +char* restore_statement(){ | |
333 | 340 | char* err; |
334 | 341 | // This statement is not valid in class file. |
335 | 342 | if (g_compiling_class) return ERR_INVALID_CLASS; |
@@ -351,7 +358,7 @@ OBJECTSECTION char* restore_statement(){ | ||
351 | 358 | return 0; |
352 | 359 | } |
353 | 360 | |
354 | -OBJECTSECTION char* gosub_statement_sub(){ | |
361 | +char* gosub_statement_sub(){ | |
355 | 362 | char* err; |
356 | 363 | err=get_label(); |
357 | 364 | if (err) return err; |
@@ -388,7 +395,7 @@ OBJECTSECTION char* gosub_statement_sub(){ | ||
388 | 395 | return 0; |
389 | 396 | } |
390 | 397 | |
391 | -OBJECTSECTION char* gosub_statement(){ | |
398 | +char* gosub_statement(){ | |
392 | 399 | char* err; |
393 | 400 | int opos,spos,stack; |
394 | 401 | // Skip label first (see below) |
@@ -417,7 +424,7 @@ OBJECTSECTION char* gosub_statement(){ | ||
417 | 424 | return 0; |
418 | 425 | } |
419 | 426 | |
420 | -OBJECTSECTION char* return_statement(){ | |
427 | +char* return_statement(){ | |
421 | 428 | char* err; |
422 | 429 | char b1; |
423 | 430 | next_position(); |
@@ -435,7 +442,7 @@ OBJECTSECTION char* return_statement(){ | ||
435 | 442 | return 0; |
436 | 443 | } |
437 | 444 | |
438 | -OBJECTSECTION char* goto_statement(){ | |
445 | +char* goto_statement(){ | |
439 | 446 | char* err; |
440 | 447 | err=get_label(); |
441 | 448 | if (err) return err; |
@@ -458,7 +465,7 @@ OBJECTSECTION char* goto_statement(){ | ||
458 | 465 | return 0; |
459 | 466 | } |
460 | 467 | |
461 | -OBJECTSECTION char* if_statement(){ | |
468 | +char* if_statement(){ | |
462 | 469 | char* err; |
463 | 470 | int prevpos,bpos; |
464 | 471 | // Get value. |
@@ -537,7 +544,7 @@ OBJECTSECTION char* if_statement(){ | ||
537 | 544 | return 0; |
538 | 545 | } |
539 | 546 | |
540 | -OBJECTSECTION char* elseif_statement(void){ | |
547 | +char* elseif_statement(void){ | |
541 | 548 | // Multiple line mode |
542 | 549 | char* err; |
543 | 550 | g_object[g_objpos++]=0x08160100; // breakif (see linker) |
@@ -560,7 +567,7 @@ OBJECTSECTION char* elseif_statement(void){ | ||
560 | 567 | |
561 | 568 | } |
562 | 569 | |
563 | -OBJECTSECTION char* else_statement(void){ | |
570 | +char* else_statement(void){ | |
564 | 571 | // Multiple line mode |
565 | 572 | g_object[g_objpos++]=0x08160100; // breakif (see linker) |
566 | 573 | g_object[g_objpos++]=0x30008000; // nop (see linker) |
@@ -575,7 +582,7 @@ OBJECTSECTION char* else_statement(void){ | ||
575 | 582 | return 0; |
576 | 583 | } |
577 | 584 | |
578 | -OBJECTSECTION char* endif_statement(void){ | |
585 | +char* endif_statement(void){ | |
579 | 586 | // Multiple line mode |
580 | 587 | g_object[g_objpos++]=0x30008000; // nop (see linker) |
581 | 588 | g_object[g_objpos++]=0x30008000; // nop (see linker) |
@@ -589,7 +596,7 @@ OBJECTSECTION char* endif_statement(void){ | ||
589 | 596 | return 0; |
590 | 597 | } |
591 | 598 | |
592 | -OBJECTSECTION char* end_statement(void){ | |
599 | +char* end_statement(void){ | |
593 | 600 | int i; |
594 | 601 | i=(int)&g_end_addr; |
595 | 602 | i-=g_gp; |
@@ -600,7 +607,7 @@ OBJECTSECTION char* end_statement(void){ | ||
600 | 607 | return 0; |
601 | 608 | } |
602 | 609 | |
603 | -OBJECTSECTION char* let_dim_sub(int i){ | |
610 | +char* let_dim_sub(int i){ | |
604 | 611 | char* err; |
605 | 612 | g_srcpos++; |
606 | 613 | err=get_value(); |
@@ -626,7 +633,7 @@ OBJECTSECTION char* let_dim_sub(int i){ | ||
626 | 633 | return 0; |
627 | 634 | }; |
628 | 635 | |
629 | -OBJECTSECTION char* let_statement(){ | |
636 | +char* let_statement(){ | |
630 | 637 | char* err; |
631 | 638 | char b2,b3; |
632 | 639 | int i,spos,opos; |
@@ -718,7 +725,7 @@ OBJECTSECTION char* let_statement(){ | ||
718 | 725 | return 0; |
719 | 726 | } |
720 | 727 | |
721 | -OBJECTSECTION char* print_statement_main(enum libs lib_printstr, enum libs lib_string){ | |
728 | +char* print_statement_main(enum libs lib_printstr, enum libs lib_string){ | |
722 | 729 | char* err; |
723 | 730 | char b1; |
724 | 731 | int i; |
@@ -773,21 +780,21 @@ OBJECTSECTION char* print_statement_main(enum libs lib_printstr, enum libs lib_s | ||
773 | 780 | return 0; |
774 | 781 | } |
775 | 782 | |
776 | -OBJECTSECTION char* break_statement(){ | |
783 | +char* break_statement(){ | |
777 | 784 | check_obj_space(2); |
778 | 785 | g_object[g_objpos++]=0x08160000; // j xxxx (See link() function) |
779 | 786 | g_object[g_objpos++]=0x00000000; // nop |
780 | 787 | return 0; |
781 | 788 | } |
782 | 789 | |
783 | -OBJECTSECTION char* continue_statement(){ | |
790 | +char* continue_statement(){ | |
784 | 791 | check_obj_space(2); |
785 | 792 | g_object[g_objpos++]=0x08160008; // j xxxx (See link() function) |
786 | 793 | g_object[g_objpos++]=0x00000000; // nop |
787 | 794 | return 0; |
788 | 795 | } |
789 | 796 | |
790 | -OBJECTSECTION char* for_statement(){ | |
797 | +char* for_statement(){ | |
791 | 798 | char* err; |
792 | 799 | // char b1; |
793 | 800 | int i; |
@@ -852,7 +859,7 @@ OBJECTSECTION char* for_statement(){ | ||
852 | 859 | return 0; |
853 | 860 | } |
854 | 861 | |
855 | -OBJECTSECTION char* next_statement(){ | |
862 | +char* next_statement(){ | |
856 | 863 | // Return to address stored in 4($sp) |
857 | 864 | // while set $v0 to 8($sp) (see for_statement) |
858 | 865 | // Following assembly must be 4 words. |
@@ -865,7 +872,7 @@ OBJECTSECTION char* next_statement(){ | ||
865 | 872 | return 0; |
866 | 873 | } |
867 | 874 | |
868 | -OBJECTSECTION char* do_statement(){ | |
875 | +char* do_statement(){ | |
869 | 876 | char* err; |
870 | 877 | // Usage of stack: |
871 | 878 | // 4(sp): Address to return to in "DO" statement. |
@@ -899,7 +906,7 @@ OBJECTSECTION char* do_statement(){ | ||
899 | 906 | } |
900 | 907 | } |
901 | 908 | |
902 | -OBJECTSECTION char* loop_statement(){ | |
909 | +char* loop_statement(){ | |
903 | 910 | char* err; |
904 | 911 | int opos; |
905 | 912 | opos=g_objpos; |
@@ -928,7 +935,7 @@ OBJECTSECTION char* loop_statement(){ | ||
928 | 935 | return 0; |
929 | 936 | } |
930 | 937 | |
931 | -OBJECTSECTION char* while_statement(){ | |
938 | +char* while_statement(){ | |
932 | 939 | char* err; |
933 | 940 | check_obj_space(3); |
934 | 941 | g_object[g_objpos++]=0x04130001; // bgezall zero,label1: |
@@ -944,7 +951,7 @@ OBJECTSECTION char* while_statement(){ | ||
944 | 951 | // label2: |
945 | 952 | } |
946 | 953 | |
947 | -OBJECTSECTION char* wend_statement(){ | |
954 | +char* wend_statement(){ | |
948 | 955 | check_obj_space(4); |
949 | 956 | g_object[g_objpos++]=0x8FBF0004; // lw ra,4(sp) |
950 | 957 | g_object[g_objpos++]=0x03E00008; // jr ra |
@@ -954,7 +961,7 @@ OBJECTSECTION char* wend_statement(){ | ||
954 | 961 | return 0; |
955 | 962 | } |
956 | 963 | |
957 | -OBJECTSECTION char* param4_statement(enum libs lib){ | |
964 | +char* param4_statement(enum libs lib){ | |
958 | 965 | // lib is either LIB_PALETTE or LIB_GPALETTE |
959 | 966 | // PALETTE N,R,G,B |
960 | 967 | char* err; |
@@ -989,7 +996,7 @@ OBJECTSECTION char* param4_statement(enum libs lib){ | ||
989 | 996 | return 0; |
990 | 997 | } |
991 | 998 | |
992 | -OBJECTSECTION char* param3_statement(enum libs lib){ | |
999 | +char* param3_statement(enum libs lib){ | |
993 | 1000 | char* err; |
994 | 1001 | // Get 1st parameter |
995 | 1002 | err=get_value(); |
@@ -1015,17 +1022,17 @@ OBJECTSECTION char* param3_statement(enum libs lib){ | ||
1015 | 1022 | return 0; |
1016 | 1023 | } |
1017 | 1024 | |
1018 | -OBJECTSECTION char* bgcolor_statement(){ | |
1025 | +char* bgcolor_statement(){ | |
1019 | 1026 | // BGCOLOR R,G,B |
1020 | 1027 | return param3_statement(LIB_BGCOLOR); |
1021 | 1028 | } |
1022 | 1029 | |
1023 | -OBJECTSECTION char* pcg_statement(){ | |
1030 | +char* pcg_statement(){ | |
1024 | 1031 | // PCG ASCII,D1,D2 |
1025 | 1032 | return param3_statement(LIB_PCG); |
1026 | 1033 | } |
1027 | 1034 | |
1028 | -OBJECTSECTION char* usepcg_statement(){ | |
1035 | +char* usepcg_statement(){ | |
1029 | 1036 | int objpos=g_objpos; |
1030 | 1037 | if (get_value()) { |
1031 | 1038 | // Getting integer failed. |
@@ -1039,7 +1046,7 @@ OBJECTSECTION char* usepcg_statement(){ | ||
1039 | 1046 | return 0; |
1040 | 1047 | } |
1041 | 1048 | |
1042 | -OBJECTSECTION char* usegraphic_statement(){ | |
1049 | +char* usegraphic_statement(){ | |
1043 | 1050 | int objpos=g_objpos; |
1044 | 1051 | if (get_value()) { |
1045 | 1052 | // Getting integer failed. |
@@ -1053,17 +1060,17 @@ OBJECTSECTION char* usegraphic_statement(){ | ||
1053 | 1060 | return 0; |
1054 | 1061 | } |
1055 | 1062 | |
1056 | -OBJECTSECTION char* cls_statement(){ | |
1063 | +char* cls_statement(){ | |
1057 | 1064 | call_lib_code(LIB_CLS); |
1058 | 1065 | return 0; |
1059 | 1066 | } |
1060 | 1067 | |
1061 | -OBJECTSECTION char* gcls_statement(){ | |
1068 | +char* gcls_statement(){ | |
1062 | 1069 | call_lib_code(LIB_GCLS); |
1063 | 1070 | return 0; |
1064 | 1071 | } |
1065 | 1072 | |
1066 | -OBJECTSECTION char* color_statement(){ | |
1073 | +char* color_statement(){ | |
1067 | 1074 | char* err; |
1068 | 1075 | err=get_value(); |
1069 | 1076 | if (err) return err; |
@@ -1071,7 +1078,7 @@ OBJECTSECTION char* color_statement(){ | ||
1071 | 1078 | return 0; |
1072 | 1079 | } |
1073 | 1080 | |
1074 | -OBJECTSECTION char* gcolor_statement(){ | |
1081 | +char* gcolor_statement(){ | |
1075 | 1082 | char* err; |
1076 | 1083 | err=get_value(); |
1077 | 1084 | if (err) return err; |
@@ -1079,7 +1086,7 @@ OBJECTSECTION char* gcolor_statement(){ | ||
1079 | 1086 | return 0; |
1080 | 1087 | } |
1081 | 1088 | |
1082 | -OBJECTSECTION char* param2_statement(enum libs lib){ | |
1089 | +char* param2_statement(enum libs lib){ | |
1083 | 1090 | char* err; |
1084 | 1091 | // Get 1st |
1085 | 1092 | err=get_value(); |
@@ -1098,7 +1105,7 @@ OBJECTSECTION char* param2_statement(enum libs lib){ | ||
1098 | 1105 | return 0; |
1099 | 1106 | } |
1100 | 1107 | |
1101 | -OBJECTSECTION char* system_statement(){ | |
1108 | +char* system_statement(){ | |
1102 | 1109 | // SYSTEM X,Y |
1103 | 1110 | char* err; |
1104 | 1111 | // Get 1st |
@@ -1119,17 +1126,17 @@ OBJECTSECTION char* system_statement(){ | ||
1119 | 1126 | return 0; |
1120 | 1127 | } |
1121 | 1128 | |
1122 | -OBJECTSECTION char* cursor_statement(){ | |
1129 | +char* cursor_statement(){ | |
1123 | 1130 | // CURSOR X,Y |
1124 | 1131 | return param2_statement(LIB_CURSOR); |
1125 | 1132 | } |
1126 | 1133 | |
1127 | -OBJECTSECTION char* scroll_statement(){ | |
1134 | +char* scroll_statement(){ | |
1128 | 1135 | // SCROLL X,Y |
1129 | 1136 | return param2_statement(LIB_SCROLL); |
1130 | 1137 | } |
1131 | 1138 | |
1132 | -OBJECTSECTION char* drawcount_statement(){ | |
1139 | +char* drawcount_statement(){ | |
1133 | 1140 | char* err; |
1134 | 1141 | err=get_value(); |
1135 | 1142 | if (err) return err; |
@@ -1137,7 +1144,7 @@ OBJECTSECTION char* drawcount_statement(){ | ||
1137 | 1144 | return 0; |
1138 | 1145 | } |
1139 | 1146 | |
1140 | -OBJECTSECTION char* wait_statement(){ | |
1147 | +char* wait_statement(){ | |
1141 | 1148 | char* err; |
1142 | 1149 | err=get_value(); |
1143 | 1150 | if (err) return err; |
@@ -1145,7 +1152,7 @@ OBJECTSECTION char* wait_statement(){ | ||
1145 | 1152 | return 0; |
1146 | 1153 | } |
1147 | 1154 | |
1148 | -OBJECTSECTION char* width_statement(){ | |
1155 | +char* width_statement(){ | |
1149 | 1156 | char* err; |
1150 | 1157 | err=get_value(); |
1151 | 1158 | if (err) return err; |
@@ -1153,7 +1160,7 @@ OBJECTSECTION char* width_statement(){ | ||
1153 | 1160 | return 0; |
1154 | 1161 | } |
1155 | 1162 | |
1156 | -OBJECTSECTION char* var_statement_sub(int a0, int a1){ | |
1163 | +char* var_statement_sub(int a0, int a1){ | |
1157 | 1164 | // Construct parameter-setting scripts |
1158 | 1165 | if (a0&0xffff0000) { |
1159 | 1166 | check_obj_space(1); |
@@ -1184,7 +1191,7 @@ OBJECTSECTION char* var_statement_sub(int a0, int a1){ | ||
1184 | 1191 | return 0; |
1185 | 1192 | } |
1186 | 1193 | |
1187 | -OBJECTSECTION char* var_statement(){ | |
1194 | +char* var_statement(){ | |
1188 | 1195 | char* err; |
1189 | 1196 | int i,j,a0,a1; |
1190 | 1197 | static int prevpos; |
@@ -1243,7 +1250,7 @@ OBJECTSECTION char* var_statement(){ | ||
1243 | 1250 | } |
1244 | 1251 | |
1245 | 1252 | |
1246 | -OBJECTSECTION char* graphic_statement(enum functions func){ | |
1253 | +char* graphic_statement(enum functions func){ | |
1247 | 1254 | /* |
1248 | 1255 | PSET X1,Y1[,C] |
1249 | 1256 | LINE X1,Y1,X2,Y2[,C] |
@@ -1376,7 +1383,7 @@ OBJECTSECTION char* graphic_statement(enum functions func){ | ||
1376 | 1383 | return 0; |
1377 | 1384 | } |
1378 | 1385 | |
1379 | -OBJECTSECTION char* fopen_statement_main(enum functions func){ | |
1386 | +char* fopen_statement_main(enum functions func){ | |
1380 | 1387 | // func is either FUNC_FOPENST or FUNC_FOPEN |
1381 | 1388 | char* err; |
1382 | 1389 | // Get 1st |
@@ -1408,7 +1415,7 @@ OBJECTSECTION char* fopen_statement_main(enum functions func){ | ||
1408 | 1415 | return 0; |
1409 | 1416 | } |
1410 | 1417 | |
1411 | -OBJECTSECTION char* file_statement(){ | |
1418 | +char* file_statement(){ | |
1412 | 1419 | char* err; |
1413 | 1420 | err=get_value(); |
1414 | 1421 | if (err) return err; |
@@ -1416,7 +1423,7 @@ OBJECTSECTION char* file_statement(){ | ||
1416 | 1423 | return 0; |
1417 | 1424 | } |
1418 | 1425 | |
1419 | -OBJECTSECTION char* fclose_statement(){ | |
1426 | +char* fclose_statement(){ | |
1420 | 1427 | char* err; |
1421 | 1428 | int orgpos=g_srcpos; |
1422 | 1429 | if (endOfStatement()) { |
@@ -1435,25 +1442,25 @@ OBJECTSECTION char* fclose_statement(){ | ||
1435 | 1442 | |
1436 | 1443 | TODO: candidates to add: |
1437 | 1444 | |
1438 | -int FSattrib (FSFILE * file, unsigned char attributes); | |
1445 | +// int FSattrib (FSFILE * file, unsigned char attributes); | |
1439 | 1446 | int FSrename (const char * fileName, FSFILE * fo); |
1440 | 1447 | int FSmkdir (char * path); |
1441 | 1448 | int FSrmdir (char * path, unsigned char rmsubdirs); |
1442 | -int SetClockVars (unsigned int year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second); | |
1449 | +// int SetClockVars (unsigned int year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second); | |
1443 | 1450 | int FindFirst (const char * fileName, unsigned int attr, SearchRec * rec); |
1444 | 1451 | int FindNext (SearchRec * rec); |
1445 | 1452 | |
1446 | 1453 | */ |
1447 | 1454 | |
1448 | -OBJECTSECTION char* fget_statement(){ | |
1455 | +char* fget_statement(){ | |
1449 | 1456 | return param2_statement(LIB_FILE | FUNC_FGET); |
1450 | 1457 | } |
1451 | 1458 | |
1452 | -OBJECTSECTION char* fput_statement(){ | |
1459 | +char* fput_statement(){ | |
1453 | 1460 | return param2_statement(LIB_FILE | FUNC_FPUT); |
1454 | 1461 | } |
1455 | 1462 | |
1456 | -OBJECTSECTION char* fseek_statement(){ | |
1463 | +char* fseek_statement(){ | |
1457 | 1464 | char* err; |
1458 | 1465 | err=get_value(); |
1459 | 1466 | if (err) return err; |
@@ -1461,7 +1468,7 @@ OBJECTSECTION char* fseek_statement(){ | ||
1461 | 1468 | return 0; |
1462 | 1469 | } |
1463 | 1470 | |
1464 | -OBJECTSECTION char* fputc_statement(){ | |
1471 | +char* fputc_statement(){ | |
1465 | 1472 | char* err; |
1466 | 1473 | err=get_value(); |
1467 | 1474 | if (err) return err; |
@@ -1469,7 +1476,7 @@ OBJECTSECTION char* fputc_statement(){ | ||
1469 | 1476 | return 0; |
1470 | 1477 | } |
1471 | 1478 | |
1472 | -OBJECTSECTION char* fremove_statement(){ | |
1479 | +char* fremove_statement(){ | |
1473 | 1480 | char* err; |
1474 | 1481 | err=get_string(); |
1475 | 1482 | if (err) return err; |
@@ -1477,7 +1484,7 @@ OBJECTSECTION char* fremove_statement(){ | ||
1477 | 1484 | return 0; |
1478 | 1485 | } |
1479 | 1486 | |
1480 | -OBJECTSECTION char* usevar_statement(){ | |
1487 | +char* usevar_statement(){ | |
1481 | 1488 | char* err; |
1482 | 1489 | int i; |
1483 | 1490 | do { |
@@ -1497,7 +1504,7 @@ OBJECTSECTION char* usevar_statement(){ | ||
1497 | 1504 | return 0; |
1498 | 1505 | } |
1499 | 1506 | |
1500 | -OBJECTSECTION char* playwave_statement(){ | |
1507 | +char* playwave_statement(){ | |
1501 | 1508 | char* err; |
1502 | 1509 | err=get_string(); |
1503 | 1510 | if (err) return err; |
@@ -1520,7 +1527,7 @@ OBJECTSECTION char* playwave_statement(){ | ||
1520 | 1527 | return 0; |
1521 | 1528 | } |
1522 | 1529 | |
1523 | -OBJECTSECTION char* useclass_statement(){ | |
1530 | +char* useclass_statement(){ | |
1524 | 1531 | char* err; |
1525 | 1532 | int i; |
1526 | 1533 | int* cmpdata; |
@@ -1556,7 +1563,7 @@ OBJECTSECTION char* useclass_statement(){ | ||
1556 | 1563 | return 0; |
1557 | 1564 | } |
1558 | 1565 | |
1559 | -OBJECTSECTION char* setdir_statement(){ | |
1566 | +char* setdir_statement(){ | |
1560 | 1567 | char* err; |
1561 | 1568 | err=get_string(); |
1562 | 1569 | if (err) return err; |
@@ -1564,7 +1571,7 @@ OBJECTSECTION char* setdir_statement(){ | ||
1564 | 1571 | return 0; |
1565 | 1572 | } |
1566 | 1573 | |
1567 | -OBJECTSECTION char* option_statement(){ | |
1574 | +char* option_statement(){ | |
1568 | 1575 | while(1){ |
1569 | 1576 | next_position(); |
1570 | 1577 | if (nextCodeIs("NOLINENUM")) { |
@@ -1594,7 +1601,7 @@ OBJECTSECTION char* option_statement(){ | ||
1594 | 1601 | return 0; |
1595 | 1602 | } |
1596 | 1603 | |
1597 | -OBJECTSECTION char* idle_statement(){ | |
1604 | +char* idle_statement(){ | |
1598 | 1605 | check_obj_space(2); |
1599 | 1606 | g_object[g_objpos++]=0x42000020; // wait |
1600 | 1607 | return 0; |
@@ -1609,67 +1616,67 @@ OBJECTSECTION char* idle_statement(){ | ||
1609 | 1616 | |
1610 | 1617 | // Aliases follow |
1611 | 1618 | |
1612 | -OBJECTSECTION char* poke_statement(){ | |
1619 | +char* poke_statement(){ | |
1613 | 1620 | return poke_statement_sub(8); |
1614 | 1621 | } |
1615 | 1622 | |
1616 | -OBJECTSECTION char* poke16_statement(){ | |
1623 | +char* poke16_statement(){ | |
1617 | 1624 | return poke_statement_sub(16); |
1618 | 1625 | } |
1619 | 1626 | |
1620 | -OBJECTSECTION char* poke32_statement(){ | |
1627 | +char* poke32_statement(){ | |
1621 | 1628 | return poke_statement_sub(32); |
1622 | 1629 | } |
1623 | 1630 | |
1624 | -OBJECTSECTION char* palette_statement(){ | |
1631 | +char* palette_statement(){ | |
1625 | 1632 | return param4_statement(LIB_PALETTE); |
1626 | 1633 | } |
1627 | 1634 | |
1628 | -OBJECTSECTION char* gpalette_statement(){ | |
1635 | +char* gpalette_statement(){ | |
1629 | 1636 | return param4_statement(LIB_GPALETTE); |
1630 | 1637 | } |
1631 | 1638 | |
1632 | -OBJECTSECTION char* print_statement(){ | |
1639 | +char* print_statement(){ | |
1633 | 1640 | return print_statement_main(LIB_PRINTSTR,LIB_STRING); |
1634 | 1641 | } |
1635 | 1642 | |
1636 | -OBJECTSECTION char* pset_statement(){ | |
1643 | +char* pset_statement(){ | |
1637 | 1644 | return graphic_statement(FUNC_PSET); |
1638 | 1645 | } |
1639 | 1646 | |
1640 | -OBJECTSECTION char* line_statement(){ | |
1647 | +char* line_statement(){ | |
1641 | 1648 | return graphic_statement(FUNC_LINE); |
1642 | 1649 | } |
1643 | 1650 | |
1644 | -OBJECTSECTION char* boxfill_statement(){ | |
1651 | +char* boxfill_statement(){ | |
1645 | 1652 | return graphic_statement(FUNC_BOXFILL); |
1646 | 1653 | } |
1647 | 1654 | |
1648 | -OBJECTSECTION char* circle_statement(){ | |
1655 | +char* circle_statement(){ | |
1649 | 1656 | return graphic_statement(FUNC_CIRCLE); |
1650 | 1657 | } |
1651 | 1658 | |
1652 | -OBJECTSECTION char* circlefill_statement(){ | |
1659 | +char* circlefill_statement(){ | |
1653 | 1660 | return graphic_statement(FUNC_CIRCLEFILL); |
1654 | 1661 | } |
1655 | 1662 | |
1656 | -OBJECTSECTION char* gprint_statement(){ | |
1663 | +char* gprint_statement(){ | |
1657 | 1664 | return graphic_statement(FUNC_GPRINT); |
1658 | 1665 | } |
1659 | 1666 | |
1660 | -OBJECTSECTION char* putbmp_statement(){ | |
1667 | +char* putbmp_statement(){ | |
1661 | 1668 | return graphic_statement(FUNC_PUTBMP); |
1662 | 1669 | } |
1663 | 1670 | |
1664 | -OBJECTSECTION char* point_statement(){ | |
1671 | +char* point_statement(){ | |
1665 | 1672 | return graphic_statement(FUNC_POINT); |
1666 | 1673 | } |
1667 | 1674 | |
1668 | -OBJECTSECTION char* fopen_statement(){ | |
1675 | +char* fopen_statement(){ | |
1669 | 1676 | return fopen_statement_main(FUNC_FOPENST); |
1670 | 1677 | } |
1671 | 1678 | |
1672 | -OBJECTSECTION char* fprint_statement(){ | |
1679 | +char* fprint_statement(){ | |
1673 | 1680 | return print_statement_main(LIB_FILE | FUNC_FPRINTSTR,LIB_FILE | FUNC_FSTRING); |
1674 | 1681 | } |
1675 | 1682 |
@@ -1754,11 +1761,13 @@ static const void* statement_list[]={ | ||
1754 | 1761 | "INTERRUPT ",interrupt_statement, |
1755 | 1762 | "IDLE",idle_statement, |
1756 | 1763 | "CORETIMER",coretimer_statement, |
1764 | + "USECLIB",useclib_statement, | |
1765 | + "CLIB",clib_statement, | |
1757 | 1766 | // List of additional statements follows |
1758 | 1767 | ADDITIONAL_STATEMENTS |
1759 | 1768 | }; |
1760 | 1769 | |
1761 | -OBJECTSECTION char* statement(void){ | |
1770 | +char* statement(void){ | |
1762 | 1771 | char* err; |
1763 | 1772 | int prevpos; |
1764 | 1773 | int i; |
@@ -15,6 +15,13 @@ | ||
15 | 15 | char* simple_string(void); |
16 | 16 | */ |
17 | 17 | |
18 | +/* | |
19 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
20 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
21 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
22 | + See the MOS definition in liker script. | |
23 | +*/ | |
24 | + | |
18 | 25 | #include "api.h" |
19 | 26 | #include "compiler.h" |
20 | 27 |
@@ -13,6 +13,13 @@ | ||
13 | 13 | Public function is only get_value(). |
14 | 14 | */ |
15 | 15 | |
16 | +/* | |
17 | + All the code from this file will be assigned in MachiKania Object Section (MOS). | |
18 | + MOS will be replaced by BASIC object when constructing self-running HEX file. | |
19 | + Therefore, DO NOT place any run-time routine/romdata in this file. | |
20 | + See the MOS definition in liker script. | |
21 | +*/ | |
22 | + | |
16 | 23 | #include "compiler.h" |
17 | 24 | |
18 | 25 | char* get_value(); |
@@ -32,6 +32,7 @@ static const int reserved_var_names[]={ | ||
32 | 32 | 0x0001129b, /*CHR*/ |
33 | 33 | 0x0e7f3303, /*CIRCLE*/ |
34 | 34 | 0x0067525f, /*CLEAR*/ |
35 | + 0x0003c489, /*CLIB*/ | |
35 | 36 | 0x00011330, /*CLS*/ |
36 | 37 | 0x0069cb6b, /*COLOR*/ |
37 | 38 | 0x0001139f, /*COS*/ |
@@ -194,6 +195,18 @@ int check_var_name(){ | ||
194 | 195 | return i; |
195 | 196 | } |
196 | 197 | |
198 | +int str_to_name_int(char* str){ | |
199 | + int i; | |
200 | + char* src=g_source; | |
201 | + int pos=g_srcpos; | |
202 | + g_source=str; | |
203 | + g_srcpos=0; | |
204 | + i=check_var_name(); | |
205 | + g_source=src; | |
206 | + g_srcpos=pos; | |
207 | + return i; | |
208 | +} | |
209 | + | |
197 | 210 | /* |
198 | 211 | int get_var_number(); |
199 | 212 | This function returns variable number that can be used as the index of $s8 |