• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

BASIC compiler/interpreter for PIC32MX/MZ-80K


コミットメタ情報

リビジョン1097fa880c989ed1259667ec25aab57935aa8b0f (tree)
日時2019-05-25 03:49:31
作者Katsumi <kmorimatsu@sour...>
コミッターKatsumi

ログメッセージ

CLIB and MOS for Zoea/Protozoea.

変更サマリ

差分

--- a/mips/protozoea/App_32MX170F256B.ld
+++ b/mips/protozoea/App_32MX170F256B.ld
@@ -104,7 +104,9 @@ _GEN_EXCPT_ADDR = _ebase_address + 0x180;
104104 *************************************************************************/
105105 MEMORY
106106 {
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 */
108110 exception_mem : ORIGIN = 0x9D006000, LENGTH = 0x1000 /* Interrupt vector table */
109111 debug_exec_mem : ORIGIN = 0x9FC00490, LENGTH = 0x760
110112 kseg0_boot_mem : ORIGIN = 0x9D006000, LENGTH = 0x0 /* This memory region is dummy */
@@ -139,6 +141,27 @@ SECTIONS
139141 }
140142 SECTIONS
141143 {
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+
142165 /* Boot Sections */
143166 .reset _RESET_ADDR :
144167 {
--- a/mips/protozoea/class.c
+++ b/mips/protozoea/class.c
@@ -876,7 +876,8 @@ char* static_method(char type){
876876 char* err;
877877 int* data;
878878 int record[3];
879- int i,opos,method,stack;
879+ int i,spos,opos,method,stack;
880+ spos=g_srcpos;
880881 next_position();
881882 // Check class name
882883 i=check_var_name();
@@ -891,12 +892,15 @@ char* static_method(char type){
891892 break;
892893 }
893894 }
895+ if (i) {
896+ g_srcpos=spos;
897+ return ERR_NO_CLASS;
898+ }
894899 // Check '::'
895900 if (g_source[g_srcpos]!=':') return ERR_SYNTAX;
896901 g_srcpos++;
897902 if (g_source[g_srcpos]!=':') return ERR_SYNTAX;
898903 g_srcpos++;
899- if (i) return ERR_NO_CLASS;
900904 data=(int*)data[2];
901905 // Check method
902906 i=check_var_name();
--- a/mips/protozoea/cmpdata.c
+++ b/mips/protozoea/cmpdata.c
@@ -9,6 +9,13 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "compiler.h"
1320
1421 /*
--- a/mips/protozoea/compiler.h
+++ b/mips/protozoea/compiler.h
@@ -40,6 +40,14 @@
4040 // RAM size used for object and heap
4141 #define RAMSIZE (PERSISTENT_RAM_SIZE-EXCEPTION_DATA_SIZE)
4242
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+
4351 /* Enums */
4452 enum variable{
4553 VAR_INTEGER,
@@ -187,6 +195,8 @@ enum functions{
187195 };
188196
189197 /* Global vars (see globalvers.c) */
198+extern const volatile int g_object_mos;
199+extern const volatile int g_objpos_mos;
190200 extern int g_intconst;
191201 extern char g_valueisconst;
192202 extern unsigned int g_rnd_seed;
@@ -228,6 +238,8 @@ extern int g_class;
228238 extern int g_compiling_class;
229239 extern unsigned char g_num_classes;
230240 extern char g_option_fastfield;
241+extern HEXLINE g_hexline;
242+extern char g_fs_valid;
231243 extern int g_temp;
232244
233245 /* Prototypes */
@@ -247,6 +259,7 @@ char* compile_file();
247259 int compile_and_link_file(char* buff,char* appname);
248260 int compile_and_link_main_file(char* buff,char* appname);
249261 int compile_and_link_class(char* buff,int class);
262+int create_self_running_hex(char* hexfilename);
250263
251264 void err_break(void);
252265 void err_music(char* str);
@@ -340,6 +353,7 @@ int* cmpdata_findfirst(unsigned char type);
340353 void cmpdata_delete(int* record);
341354
342355 int check_var_name();
356+int str_to_name_int(char* str);
343357 int get_var_number();
344358 int search_var_name(int nameint);
345359 char* register_var_name(int nameint);
@@ -384,6 +398,23 @@ char* coretimer_statement();
384398 char* coretimer_function();
385399 char* interrupt_statement();
386400
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+
387418 /* Error messages */
388419 #define ERR_SYNTAX (char*)(g_err_str[0])
389420 #define ERR_NE_BINARY (char*)(g_err_str[1])
@@ -415,6 +446,10 @@ char* interrupt_statement();
415446 #define ERR_INVALID_CLASS (char*)(g_err_str[27])
416447 #define ERR_NO_INIT (char*)(g_err_str[28])
417448 #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])
418453
419454 /* compile data type numbers */
420455 #define CMPDATA_RESERVED 0
@@ -425,6 +460,8 @@ char* interrupt_statement();
425460 #define CMPDATA_UNSOLVED 5
426461 #define CMPDATA_TEMP 6
427462 #define CMPDATA_FASTFIELD 7
463+#define CMPDATA_USECLIB 8
464+#define CMPDATA_CLIBFUNC 9
428465 // Sub types follow
429466 #define CMPTYPE_PUBLIC_FIELD 0
430467 #define CMPTYPE_PRIVATE_FIELD 1
@@ -485,13 +522,15 @@ char* interrupt_statement();
485522 } while (0)
486523
487524 #define ASM_NOP 0x00000000
525+#define ASM_ADDU_A0_SP_ZERO 0x03A02021
488526 #define ASM_ADDU_A0_V0_ZERO 0x00402021
489527 #define ASM_ADDU_A1_V0_ZERO 0x00402821
490528 #define ASM_ADDU_A2_V0_ZERO 0x00403021
491529 #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
495534
496535 // Interrupt macros
497536 // 32 different type interruptions are possible
--- a/mips/protozoea/debug.c
+++ b/mips/protozoea/debug.c
@@ -34,6 +34,7 @@ static const char initext[];
3434 static const char bastext[];
3535 static const char class1text[];
3636 static const char class2text[];
37+static const char hextext[];
3738
3839 static char* readtext;
3940 static int filepos;
@@ -130,6 +131,9 @@ FSFILE* FSfopen(const char * fileName, const char *mode){
130131 } else if (fileName[i+1]=='I' && fileName[i+2]=='N' && fileName[i+3]=='I') {
131132 // INI file
132133 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];
133137 } else if (fileName[i+1]=='B' && fileName[i+2]=='A' && fileName[i+3]=='S') {
134138 // Select BAS file
135139 if (fileName[i-6]=='C' && fileName[i-5]=='L' && fileName[i-4]=='A' &&
@@ -184,6 +188,7 @@ long FSftell (FSFILE * fo){
184188 return 0;
185189 }
186190 int FSfseek(FSFILE *stream, long offset, int whence){
191+ filepos=offset;
187192 return 0;
188193 }
189194 /*
@@ -228,12 +233,10 @@ static const char initext[]=
228233 "#PRINT\n";
229234
230235 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"
237240 "\n"
238241 "\n"
239242 "\n"
@@ -255,6 +258,47 @@ static const char class2text[]=
255258 "\n"
256259 "\n";
257260
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+
258302 /*
259303 Test function for constructing assemblies from C codes.
260304 */
@@ -285,6 +329,15 @@ int _debug_test(int a0, int a1, int a2, int a3, int param4, int param5){
285329 return a2+a3;
286330 }
287331
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+
288341 /*
289342 Break point used for debugging object code.
290343
--- a/mips/protozoea/envspecific.c
+++ b/mips/protozoea/envspecific.c
@@ -240,9 +240,9 @@ int lib_system(int a0, int a1 ,int v0, int a3, int g_gcolor, int g_prev_x, int g
240240 case 200:
241241 // ON/OFF monitor
242242 if (v0) {
243-// start_composite();
243+ start_composite();
244244 } else {
245-// stop_composite();
245+ stop_composite();
246246 }
247247 break;
248248 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
250250 }
251251 return 0;
252252 }
253+
254+// Do nothing in following functions.
255+unsigned char shiftkeys(){ return 0; }
256+void start_composite(){}
257+void stop_composite(){}
--- a/mips/protozoea/envspecific.h
+++ b/mips/protozoea/envspecific.h
@@ -6,7 +6,9 @@
66 */
77
88 #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)
1012
1113 int readbuttons();
1214 void scroll(int x, int y);
--- a/mips/protozoea/error.c
+++ b/mips/protozoea/error.c
@@ -42,6 +42,10 @@ const char* g_err_str[]={
4242 "Invalid in class file",
4343 "INIT method does not exist",
4444 "ERR_OPTION_CLASSCODE",
45+ "ERR_COMPILE_CLIB",
46+ "C library not found",
47+ "HEX file syntax error",
48+ "Class or C library not found",
4549 };
4650
4751 char* resolve_label(int s6){
--- a/mips/protozoea/file.c
+++ b/mips/protozoea/file.c
@@ -13,10 +13,12 @@
1313 #include "api.h"
1414 #include "compiler.h"
1515
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;
2022
2123 char* init_file(char* buff,char* appname){
2224 // Open file
@@ -87,6 +89,8 @@ char* compile_file(){
8789 char* err;
8890 // Read first 512 bytes
8991 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;
9094 // Compile line by line
9195 while (g_size==512) {
9296 err=compile_line();
@@ -147,7 +151,7 @@ int compile_and_link_file(char* buff,char* appname){
147151 err=compile_file();
148152 close_file();
149153
150- // If compiling a class file is required, do it.
154+ // If compiling a class file or a clib is required, do it.
151155 if (err==ERR_COMPILE_CLASS) {
152156 j=g_compiling_class;
153157 i=compile_and_link_class(buff, g_class);
@@ -155,6 +159,11 @@ int compile_and_link_file(char* buff,char* appname){
155159 if (i) return i;
156160 // Continue compiling current file from the beginning.
157161 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;
158167 }
159168 break;
160169 }
@@ -239,7 +248,7 @@ int compile_and_link_class(char* buff,int class){
239248 // Restore current dirctory
240249 cmpdata_reset();
241250 while(record=cmpdata_find(CMPDATA_TEMP)){
242- if (cwd_id=(record[0]&0xffff)) break;
251+ if ((record[0]&0xffff)==cwd_id) break;
243252 }
244253 if (!record) break;
245254 FSchdir((char*)(&record[1]));
@@ -293,4 +302,4 @@ int compile_and_link_main_file(char* buff,char* appname){
293302 to use the same long var name in different files (note that g_long_name_var_num is not reseted after
294303 compiling each class code).
295304 */
296-}
\ No newline at end of file
305+}
--- a/mips/protozoea/float.c
+++ b/mips/protozoea/float.c
@@ -9,6 +9,13 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "./compiler.h"
1320 #include "stdlib.h"
1421
--- a/mips/protozoea/function.c
+++ b/mips/protozoea/function.c
@@ -9,6 +9,13 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "compiler.h"
1320 #include "api.h"
1421
@@ -494,12 +501,17 @@ char* float_function(void){
494501 err=gosub_function();
495502 } else if (nextCodeIs("ARGS#(")) {
496503 err=args_function();
504+ } else if (nextCodeIs("CLIB#(")) {
505+ err=clib_statement();
497506 } else if (nextCodeIs("PI#")) {
498507 return float_constant(3.141593);
499508 } else {
500509 // Check if static method of a class
501510 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+ }
503515 }
504516 if (err) return err;
505517 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
@@ -520,6 +532,7 @@ static const void* str_func_list[]={
520532 "SYSTEM$(",system_function,
521533 "FINPUT$(",finput_function,
522534 "GETDIR$(",getdir_function,
535+ "CLIB$(",clib_statement,
523536 // Additional functions follow
524537 ADDITIONAL_STR_FUNCTIONS
525538 };
@@ -539,7 +552,10 @@ char* str_function(void){
539552 } else {
540553 // Check if static method of a class
541554 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+ }
543559 }
544560 if (err) return err;
545561 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
@@ -609,6 +625,7 @@ static const void* int_func_list[]={
609625 "EXEC(",exec_function,
610626 "CORETIMER(",coretimer_function,
611627 "READKEY(",readkey_function,
628+ "CLIB(",clib_statement,
612629 // Additional functions follow
613630 ADDITIONAL_INT_FUNCTIONS
614631 };
@@ -626,9 +643,12 @@ char* function(void){
626643 f=int_func_list[i+1];
627644 err=f();
628645 } else {
629- // Check if static method of a class
646+ // Check if static method of a class of clib
630647 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+ }
632652 }
633653 if (err) return err;
634654 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
--- a/mips/protozoea/globalvars.c
+++ b/mips/protozoea/globalvars.c
@@ -12,6 +12,13 @@
1212 #include "compiler.h"
1313 #include "main.h"
1414
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+
1522 // Contain the valus of $gp and $s6 (GPR of MIPS32)
1623 int g_gp;
1724 int g_s6;
@@ -95,5 +102,11 @@ unsigned char g_num_classes;
95102 // OPTION FASTFIELD
96103 char g_option_fastfield;
97104
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+
98111 // General purpose integer used for asigning value with pointer
99112 int g_temp;
--- a/mips/protozoea/interface/ps2keyboard.h
+++ b/mips/protozoea/interface/ps2keyboard.h
@@ -161,8 +161,7 @@ extern unsigned char lockkey; //
161161 extern unsigned char keytype; // キーボードの種類。0:日本語109キー、1:英語104キー
162162
163163 //int ps2init(); // PS/2ライブラリ関連初期化。正常終了0、エラーで-1を返す
164-//unsigned char shiftkeys(); // SHIFT関連キーの押下状態を返す
165-#define shiftkeys() 0 // SHIFT関連キーの押下状態を返す
164+unsigned char shiftkeys(); // SHIFT関連キーの押下状態を返す(常にゼロを返す)
166165 unsigned char ps2readkey();
167166 // 入力された1つのキーのキーコードをグローバル変数vkeyに格納(押されていなければ0を返す)
168167 // 下位8ビット:キーコード
--- a/mips/protozoea/interface/videoout.h
+++ b/mips/protozoea/interface/videoout.h
@@ -51,8 +51,8 @@ extern unsigned char *fontp;
5151 extern unsigned char twidth; //テキスト1行文字数(30 or 40)
5252 extern unsigned int bgcolor; // バックグランドカラー
5353
54-//void start_composite(void); //カラーコンポジット出力開始
55-//void stop_composite(void); //カラーコンポジット出力停止
54+void start_composite(void); //カラーコンポジット出力開始(なにもしない)
55+void stop_composite(void); //カラーコンポジット出力停止(なにもしない)
5656 //void init_composite(void); //カラーコンポジット出力初期化
5757 void clearscreen(void); //テキスト画面クリア
5858 void set_palette(unsigned char n,unsigned char b,unsigned char r,unsigned char g); //テキストパレット設定
--- a/mips/protozoea/library.c
+++ b/mips/protozoea/library.c
@@ -779,6 +779,11 @@ int lib_file(enum functions func, int a0, int a1, int v0){
779779 int i;
780780 int buff[1];
781781 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+
782787 if (activefhandle) fhandle=s_fhandle[activefhandle-1];
783788 switch(func){
784789 case FUNC_FINIT:
@@ -1011,6 +1016,7 @@ int _call_library(int a0,int a1,int v0,enum libs a3){
10111016 scroll(g_libparams[1],v0);
10121017 return v0;
10131018 case LIB_FILE:
1019+ if (!g_fs_valid) err_str("File System not initialized");
10141020 return lib_file((enum functions)(a3 & FUNC_MASK),g_libparams[1],g_libparams[2],v0);
10151021 case LIB_KEYS:
10161022 return lib_keys(v0);
--- a/mips/protozoea/main.c
+++ b/mips/protozoea/main.c
@@ -146,6 +146,7 @@ int searchinittext(char *s){
146146 void readinifile(void){
147147 FSFILE *fp;
148148 char inittext[9];
149+ if (!g_fs_valid) return;
149150
150151 fp=FSfopen(INIFILE,"r");
151152 if(fp==NULL) return;
@@ -192,6 +193,7 @@ void printhex32(unsigned int d){
192193
193194 int main(void){
194195 char *appname,*s;
196+ int use_editor;
195197
196198 if(DEVCFG1 & 0x8000){
197199 // Set Clock switching enabled and reset
@@ -230,6 +232,18 @@ int main(void){
230232 // Show blue screen if exception before soft reset.
231233 blue_screen();
232234
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+
233247 printstr("MachiKania BASIC System\n");
234248 printstr(" Ver "SYSVER1" "SYSVER2" by KENKEN\n");
235249 printstr("BASIC Compiler "BASVER"\n");
@@ -237,34 +251,46 @@ int main(void){
237251 //SDカードファイルシステム初期化
238252 setcursorcolor(COLOR_NORMALTEXT);
239253 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+ }
248270 }
249- printstr("OK\n");
271+ if (g_fs_valid) printstr("OK\n");
272+ else printstr("Failed\n");
250273 readinifile(); //INIファイル読み込み
251274
252275 wait60thsec(60); //1秒待ち
253276
254277 // 実行中HEXファイル名がHEXFILEと一致した場合はエディタ起動
255- appname=(char*)FILENAME_FLASH_ADDRESS;
256- s=HEXFILE;
257- while(*s++==*appname++) if(*s==0) texteditor(); //テキストエディター呼び出し
278+ if(use_editor) texteditor(); //テキストエディター呼び出し
258279
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(); //ボタン有効化
267280 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+ }
269295 while(1) asm(WAIT);
270296 }
--- a/mips/protozoea/main.h
+++ b/mips/protozoea/main.h
@@ -6,8 +6,9 @@
66 */
77
88 #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"
1112
1213 #define INIFILE "MACHILCD.INI" // 初期設定ファイル
1314 #define HEXFILE "MACHILCD.HEX" // 実行中HEXファイル名がこれと一致した場合はエディタ起動
--- a/mips/protozoea/protozoea.mcp
+++ b/mips/protozoea/protozoea.mcp
@@ -69,6 +69,9 @@ file_041=.
6969 file_042=.
7070 file_043=.
7171 file_044=.
72+file_045=.
73+file_046=.
74+file_047=.
7275 [GENERATED_FILES]
7376 file_000=no
7477 file_001=no
@@ -115,6 +118,9 @@ file_041=no
115118 file_042=no
116119 file_043=no
117120 file_044=no
121+file_045=no
122+file_046=no
123+file_047=no
118124 [OTHER_FILES]
119125 file_000=no
120126 file_001=no
@@ -157,10 +163,13 @@ file_037=no
157163 file_038=no
158164 file_039=no
159165 file_040=no
160-file_041=yes
161-file_042=yes
166+file_041=no
167+file_042=no
162168 file_043=yes
163169 file_044=yes
170+file_045=yes
171+file_046=yes
172+file_047=yes
164173 [FILE_INFO]
165174 file_000=args.c
166175 file_001=class.c
@@ -190,23 +199,26 @@ file_024=varname.c
190199 file_025=interface\graphlib.c
191200 file_026=interface\keyinput.c
192201 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
210222 [SUITE_INFO]
211223 suite_guid={62D235D8-2DB2-49CD-AF24-5489A6015337}
212224 suite_state=
--- a/mips/protozoea/reservednames.js
+++ b/mips/protozoea/reservednames.js
@@ -100,6 +100,7 @@ var namearray=[
100100 'CHR',
101101 'CIRCLE',
102102 'CLEAR',
103+ 'CLIB',
103104 'CLS',
104105 'COLOR',
105106 'COS',
--- a/mips/protozoea/run.c
+++ b/mips/protozoea/run.c
@@ -32,10 +32,14 @@ char* printdec(int num){
3232 }
3333 }
3434
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){
3640 // BASICソースのコンパイルと実行
3741 // appname 実行するBASICソースファイル
38-// test 0:コンパイルと実行、0以外:コンパイルのみで終了
42+// mode 0:コンパイルと実行、1:コンパイルのみで終了、2:コンパイル済みオブジェクトを実行
3943 //
4044 // 戻り値
4145 //  0:正常終了
@@ -57,16 +61,18 @@ int runbasic(char *appname,int test){
5761 // Clear object area
5862 for(i=0;i<RAMSIZE/4;i++) g_object[i]=0x00000000;
5963
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();
6875 }
69- close_file();
7076
7177 // Initialize parameters
7278 g_pcg_font=0;
@@ -75,7 +81,6 @@ int runbasic(char *appname,int test){
7581 clearscreen();
7682 setcursor(0,0,7);
7783 g_long_name_var_num=0;
78- cmpdata_init();
7984
8085 // Initialize music system
8186 init_music();
@@ -85,13 +90,24 @@ int runbasic(char *appname,int test){
8590
8691 printstr("Compiling...");
8792
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+ }
92108 // All done
93109 printstr("done\n");
94- if(test) return 0; //コンパイルのみの場合
110+ if(mode==RUNMODE_COMPILE_ONLY) return 0; //コンパイルのみの場合
95111 wait60thsec(15);
96112
97113 // Initialize the other parameters
@@ -131,3 +147,114 @@ int runbasic(char *appname,int test){
131147
132148 return 0;
133149 }
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+}
--- a/mips/protozoea/sharedfiles.js
+++ b/mips/protozoea/sharedfiles.js
@@ -12,6 +12,7 @@
1212 var filearray=[
1313 'args.c',
1414 'class.c',
15+ 'clib.c',
1516 'cmpdata.c',
1617 'compiler.c',
1718 'debug.c',
@@ -21,6 +22,7 @@ var filearray=[
2122 'float.c',
2223 'function.c',
2324 'globalvars.c',
25+ 'hexfile.c',
2426 'library.c',
2527 'linker.c',
2628 'memory.c',
@@ -36,6 +38,7 @@ var filearray=[
3638 'reservednames.js',
3739 'sharedfiles.js',
3840 'class.txt',
41+ 'clib.txt',
3942 ];
4043
4144 var WshShell = WScript.CreateObject("WScript.Shell");
--- a/mips/protozoea/statement.c
+++ b/mips/protozoea/statement.c
@@ -9,6 +9,13 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "api.h"
1320 #include "compiler.h"
1421
@@ -1435,11 +1442,11 @@ char* fclose_statement(){
14351442
14361443 TODO: candidates to add:
14371444
1438-int FSattrib (FSFILE * file, unsigned char attributes);
1445+// int FSattrib (FSFILE * file, unsigned char attributes);
14391446 int FSrename (const char * fileName, FSFILE * fo);
14401447 int FSmkdir (char * path);
14411448 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);
14431450 int FindFirst (const char * fileName, unsigned int attr, SearchRec * rec);
14441451 int FindNext (SearchRec * rec);
14451452
@@ -1754,6 +1761,8 @@ static const void* statement_list[]={
17541761 "INTERRUPT ",interrupt_statement,
17551762 "IDLE",idle_statement,
17561763 "CORETIMER",coretimer_statement,
1764+ "USECLIB",useclib_statement,
1765+ "CLIB",clib_statement,
17571766 // List of additional statements follows
17581767 ADDITIONAL_STATEMENTS
17591768 };
--- a/mips/protozoea/string.c
+++ b/mips/protozoea/string.c
@@ -15,6 +15,13 @@
1515 char* simple_string(void);
1616 */
1717
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+
1825 #include "api.h"
1926 #include "compiler.h"
2027
--- a/mips/protozoea/value.c
+++ b/mips/protozoea/value.c
@@ -13,6 +13,13 @@
1313 Public function is only get_value().
1414 */
1515
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+
1623 #include "compiler.h"
1724
1825 char* get_value();
--- a/mips/protozoea/varname.c
+++ b/mips/protozoea/varname.c
@@ -32,6 +32,7 @@ static const int reserved_var_names[]={
3232 0x0001129b, /*CHR*/
3333 0x0e7f3303, /*CIRCLE*/
3434 0x0067525f, /*CLEAR*/
35+ 0x0003c489, /*CLIB*/
3536 0x00011330, /*CLS*/
3637 0x0069cb6b, /*COLOR*/
3738 0x0001139f, /*COS*/
@@ -194,6 +195,18 @@ int check_var_name(){
194195 return i;
195196 }
196197
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+
197210 /*
198211 int get_var_number();
199212 This function returns variable number that can be used as the index of $s8
--- a/mips/zoea/App_32MX170F256B.ld
+++ b/mips/zoea/App_32MX170F256B.ld
@@ -105,7 +105,7 @@ _GEN_EXCPT_ADDR = _ebase_address + 0x180;
105105 MEMORY
106106 {
107107 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 */
109109 exception_mem : ORIGIN = 0x9D006000, LENGTH = 0x1000 /* Interrupt vector table */
110110 debug_exec_mem : ORIGIN = 0x9FC00490, LENGTH = 0x760
111111 kseg0_boot_mem : ORIGIN = 0x9D006000, LENGTH = 0x0 /* This memory region is dummy */
@@ -119,18 +119,6 @@ MEMORY
119119 configsfrs : ORIGIN = 0xBFC00BF0, LENGTH = 0x10
120120 }
121121
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-
134122 /*************************************************************************
135123 * Configuration-word sections. Map the config-pragma input sections to
136124 * absolute-address output sections.
@@ -152,6 +140,27 @@ SECTIONS
152140 }
153141 SECTIONS
154142 {
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+
155164 /* Boot Sections */
156165 .reset _RESET_ADDR :
157166 {
--- a/mips/zoea/basic.mcp
+++ b/mips/zoea/basic.mcp
@@ -69,6 +69,9 @@ file_041=.
6969 file_042=.
7070 file_043=.
7171 file_044=.
72+file_045=.
73+file_046=.
74+file_047=.
7275 [GENERATED_FILES]
7376 file_000=no
7477 file_001=no
@@ -115,6 +118,9 @@ file_041=no
115118 file_042=no
116119 file_043=no
117120 file_044=no
121+file_045=no
122+file_046=no
123+file_047=no
118124 [OTHER_FILES]
119125 file_000=no
120126 file_001=no
@@ -156,11 +162,14 @@ file_036=no
156162 file_037=no
157163 file_038=no
158164 file_039=no
159-file_040=yes
160-file_041=yes
165+file_040=no
166+file_041=no
161167 file_042=yes
162168 file_043=yes
163169 file_044=yes
170+file_045=yes
171+file_046=yes
172+file_047=yes
164173 [FILE_INFO]
165174 file_000=compiler.c
166175 file_001=editor.c
@@ -188,25 +197,28 @@ file_022=class.c
188197 file_023=args.c
189198 file_024=timer.c
190199 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
210222 [SUITE_INFO]
211223 suite_guid={62D235D8-2DB2-49CD-AF24-5489A6015337}
212224 suite_state=
--- a/mips/zoea/class.c
+++ b/mips/zoea/class.c
@@ -876,7 +876,8 @@ char* static_method(char type){
876876 char* err;
877877 int* data;
878878 int record[3];
879- int i,opos,method,stack;
879+ int i,spos,opos,method,stack;
880+ spos=g_srcpos;
880881 next_position();
881882 // Check class name
882883 i=check_var_name();
@@ -891,12 +892,15 @@ char* static_method(char type){
891892 break;
892893 }
893894 }
895+ if (i) {
896+ g_srcpos=spos;
897+ return ERR_NO_CLASS;
898+ }
894899 // Check '::'
895900 if (g_source[g_srcpos]!=':') return ERR_SYNTAX;
896901 g_srcpos++;
897902 if (g_source[g_srcpos]!=':') return ERR_SYNTAX;
898903 g_srcpos++;
899- if (i) return ERR_NO_CLASS;
900904 data=(int*)data[2];
901905 // Check method
902906 i=check_var_name();
--- a/mips/zoea/cmpdata.c
+++ b/mips/zoea/cmpdata.c
@@ -9,6 +9,13 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "compiler.h"
1320
1421 /*
--- a/mips/zoea/compiler.h
+++ b/mips/zoea/compiler.h
@@ -40,6 +40,14 @@
4040 // RAM size used for object and heap
4141 #define RAMSIZE (PERSISTENT_RAM_SIZE-EXCEPTION_DATA_SIZE)
4242
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+
4351 /* Enums */
4452 enum variable{
4553 VAR_INTEGER,
@@ -187,6 +195,8 @@ enum functions{
187195 };
188196
189197 /* Global vars (see globalvers.c) */
198+extern const volatile int g_object_mos;
199+extern const volatile int g_objpos_mos;
190200 extern int g_intconst;
191201 extern char g_valueisconst;
192202 extern unsigned int g_rnd_seed;
@@ -228,6 +238,8 @@ extern int g_class;
228238 extern int g_compiling_class;
229239 extern unsigned char g_num_classes;
230240 extern char g_option_fastfield;
241+extern HEXLINE g_hexline;
242+extern char g_fs_valid;
231243 extern int g_temp;
232244
233245 /* Prototypes */
@@ -247,6 +259,7 @@ char* compile_file();
247259 int compile_and_link_file(char* buff,char* appname);
248260 int compile_and_link_main_file(char* buff,char* appname);
249261 int compile_and_link_class(char* buff,int class);
262+int create_self_running_hex(char* hexfilename);
250263
251264 void err_break(void);
252265 void err_music(char* str);
@@ -340,6 +353,7 @@ int* cmpdata_findfirst(unsigned char type);
340353 void cmpdata_delete(int* record);
341354
342355 int check_var_name();
356+int str_to_name_int(char* str);
343357 int get_var_number();
344358 int search_var_name(int nameint);
345359 char* register_var_name(int nameint);
@@ -384,6 +398,23 @@ char* coretimer_statement();
384398 char* coretimer_function();
385399 char* interrupt_statement();
386400
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+
387418 /* Error messages */
388419 #define ERR_SYNTAX (char*)(g_err_str[0])
389420 #define ERR_NE_BINARY (char*)(g_err_str[1])
@@ -415,6 +446,10 @@ char* interrupt_statement();
415446 #define ERR_INVALID_CLASS (char*)(g_err_str[27])
416447 #define ERR_NO_INIT (char*)(g_err_str[28])
417448 #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])
418453
419454 /* compile data type numbers */
420455 #define CMPDATA_RESERVED 0
@@ -425,6 +460,8 @@ char* interrupt_statement();
425460 #define CMPDATA_UNSOLVED 5
426461 #define CMPDATA_TEMP 6
427462 #define CMPDATA_FASTFIELD 7
463+#define CMPDATA_USECLIB 8
464+#define CMPDATA_CLIBFUNC 9
428465 // Sub types follow
429466 #define CMPTYPE_PUBLIC_FIELD 0
430467 #define CMPTYPE_PRIVATE_FIELD 1
@@ -451,9 +488,6 @@ char* interrupt_statement();
451488
452489 /* Macros */
453490
454-// For object section
455-#define OBJECTSECTION __attribute__((section(".machikania_object")))
456-
457491 // Lables as 31 bit integer
458492 #define LABEL_INIT 0x0008727b
459493
@@ -488,13 +522,15 @@ char* interrupt_statement();
488522 } while (0)
489523
490524 #define ASM_NOP 0x00000000
525+#define ASM_ADDU_A0_SP_ZERO 0x03A02021
491526 #define ASM_ADDU_A0_V0_ZERO 0x00402021
492527 #define ASM_ADDU_A1_V0_ZERO 0x00402821
493528 #define ASM_ADDU_A2_V0_ZERO 0x00403021
494529 #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
498534
499535 // Interrupt macros
500536 // 32 different type interruptions are possible
--- a/mips/zoea/debug.c
+++ b/mips/zoea/debug.c
@@ -34,6 +34,7 @@ static const char initext[];
3434 static const char bastext[];
3535 static const char class1text[];
3636 static const char class2text[];
37+static const char hextext[];
3738
3839 static char* readtext;
3940 static int filepos;
@@ -130,6 +131,9 @@ FSFILE* FSfopen(const char * fileName, const char *mode){
130131 } else if (fileName[i+1]=='I' && fileName[i+2]=='N' && fileName[i+3]=='I') {
131132 // INI file
132133 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];
133137 } else if (fileName[i+1]=='B' && fileName[i+2]=='A' && fileName[i+3]=='S') {
134138 // Select BAS file
135139 if (fileName[i-6]=='C' && fileName[i-5]=='L' && fileName[i-4]=='A' &&
@@ -184,6 +188,7 @@ long FSftell (FSFILE * fo){
184188 return 0;
185189 }
186190 int FSfseek(FSFILE *stream, long offset, int whence){
191+ filepos=offset;
187192 return 0;
188193 }
189194 /*
@@ -228,12 +233,10 @@ static const char initext[]=
228233 "#PRINT\n";
229234
230235 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"
237240 "\n"
238241 "\n"
239242 "\n"
@@ -255,6 +258,47 @@ static const char class2text[]=
255258 "\n"
256259 "\n";
257260
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+
258302 /*
259303 Test function for constructing assemblies from C codes.
260304 */
@@ -285,6 +329,15 @@ int _debug_test(int a0, int a1, int a2, int a3, int param4, int param5){
285329 return a2+a3;
286330 }
287331
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+
288341 /*
289342 Break point used for debugging object code.
290343
--- a/mips/zoea/editor.c
+++ b/mips/zoea/editor.c
@@ -74,7 +74,7 @@ const unsigned char Message2[]="File System Error\n";
7474 const unsigned char Message3[]="Retry:[Enter] / Quit:[ESC]\n";
7575 const unsigned char ROOTDIR[]="\\";
7676
77-OBJECTSECTION unsigned char * editormalloc(int size){
77+unsigned char * editormalloc(int size){
7878 //配列RAM[]内にサイズsizeの領域を確保し、先頭アドレスを返す
7979 //確保できない場合は、エラー表示し動作停止
8080 unsigned char *p;
@@ -93,7 +93,7 @@ void wait60thsec(unsigned short n){
9393 while(drawcount!=n) asm(WAIT);
9494 }
9595
96-OBJECTSECTION unsigned int bpixtopos(_tbuf *bp,unsigned int ix){
96+unsigned int bpixtopos(_tbuf *bp,unsigned int ix){
9797 // テキストバッファ上の位置からテキスト全体の先頭から何文字目かを返す
9898 // bp:テキストバッファポインタ
9999 // ix:bp->Bufの先頭からの文字数
@@ -108,7 +108,7 @@ OBJECTSECTION unsigned int bpixtopos(_tbuf *bp,unsigned int ix){
108108 }
109109 return pos+ix;
110110 }
111-OBJECTSECTION _tbuf * postobpix(int pos,unsigned short *pix){
111+_tbuf * postobpix(int pos,unsigned short *pix){
112112 // テキスト全体の先頭からpos文字目のテキストバッファ上の位置を返す
113113 // 戻り値 テキストバッファポインタ
114114 // *pix(戻り値):戻り値テキストバッファの先頭からの位置(ポインタ渡し)
@@ -127,7 +127,7 @@ OBJECTSECTION _tbuf * postobpix(int pos,unsigned short *pix){
127127 *pix=pos;
128128 return bp;
129129 }
130-OBJECTSECTION _tbuf * linetobpix(int line,unsigned short *pix){
130+_tbuf * linetobpix(int line,unsigned short *pix){
131131 // テキスト全体の先頭からline行目のテキストバッファ上の位置を返す
132132 // 戻り値 テキストバッファポインタ
133133 // *pix(戻り値):戻り値テキストバッファの先頭からの位置(ポインタ渡し)
@@ -157,7 +157,7 @@ OBJECTSECTION _tbuf * linetobpix(int line,unsigned short *pix){
157157 return bp2;
158158 }
159159
160-OBJECTSECTION _tbuf * newTBuf(_tbuf *prev){
160+_tbuf * newTBuf(_tbuf *prev){
161161 // 新しいテキストバッファ1行を生成
162162 // prev:挿入先の行(prevの後ろに追加)
163163 // 戻り値 生成したバッファへのポインタ、生成できない場合NULL
@@ -180,7 +180,7 @@ OBJECTSECTION _tbuf * newTBuf(_tbuf *prev){
180180 return bp;
181181 }
182182
183-OBJECTSECTION _tbuf * deleteTBuf(_tbuf *bp){
183+_tbuf * deleteTBuf(_tbuf *bp){
184184 // テキストバッファの削除
185185 // bp:削除する行のポインタ
186186 // 戻り値 削除前の次のバッファへのポインタ、ない場合NULL
@@ -226,7 +226,7 @@ UNDOBUFSIZE
226226  UNDO_CONTDEL,繰り返し数,消去文字列,開始位置,繰り返し数,UNDO_CONTDEL
227227 */
228228
229-OBJECTSECTION void pushundomem(unsigned char c){
229+void pushundomem(unsigned char c){
230230 // アンドゥ用メモリの先頭に1バイトを貯める
231231 // 空きがなくなった場合、最後尾の1命令分を無効化
232232 unsigned char *p;
@@ -267,12 +267,12 @@ OBJECTSECTION void pushundomem(unsigned char c){
267267 if(undobuf_top>=undobuf+UNDOBUFSIZE) undobuf_top-=UNDOBUFSIZE;
268268 undobuf_used++;
269269 }
270-OBJECTSECTION void pushundomem2(unsigned short w){
270+void pushundomem2(unsigned short w){
271271 // アンドゥバッファに2バイト貯める、下位、上位の順
272272 pushundomem((unsigned char)w);
273273 pushundomem(w>>8);
274274 }
275-OBJECTSECTION unsigned char popundomem(){
275+unsigned char popundomem(){
276276 // アンドゥバッファから1バイト読み出し、先頭を1つ戻す
277277 // 戻り値:読み出したコード
278278 undobuf_top--;
@@ -280,7 +280,7 @@ OBJECTSECTION unsigned char popundomem(){
280280 undobuf_used--;
281281 return *undobuf_top;
282282 }
283-OBJECTSECTION unsigned short popundomem2(){
283+unsigned short popundomem2(){
284284 // アンドゥバッファから2バイト読み出し
285285 // 戻り値:読み出した2バイトコード
286286 unsigned short w;
@@ -288,7 +288,7 @@ OBJECTSECTION unsigned short popundomem2(){
288288 w+=popundomem();
289289 return w;
290290 }
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){
292292 //アンドゥバッファにデータをセットする
293293 //com:コマンド 1:1文字削除、2:1文字上書き、3:1文字挿入、4:連続削除、5:連続挿入開始
294294 //bp,ix:バッファ上の実行場所(カーソル位置)
@@ -324,7 +324,7 @@ OBJECTSECTION void setundobuf(int com,_tbuf *bp,unsigned short ix,unsigned char
324324 }
325325 }
326326
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){
328328 //テキストバッファbpの先頭からixバイトの位置にcを挿入
329329 //undo 0:通常(アンドゥバッファに格納する)、1:連続挿入中、2:アンドゥ中
330330 //戻り値 成功:0、不正または容量オーバー:-1、空きがあるはずなのに失敗:1
@@ -362,7 +362,7 @@ OBJECTSECTION int insertchar(_tbuf *bp,unsigned int ix,unsigned char c,int undo)
362362 return 0;
363363 }
364364
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){
366366 //テキストバッファbpの先頭からixバイトの位置をcで上書き
367367 //undo 0:通常(アンドゥバッファに格納する)、1:連続中、2:アンドゥ中
368368 //戻り値 成功:0、不正または容量オーバー:-1、空きがあるはずなのに失敗:1
@@ -383,7 +383,7 @@ OBJECTSECTION int overwritechar(_tbuf *bp,unsigned int ix,unsigned char c,int un
383383 return 0;
384384 }
385385
386-OBJECTSECTION void deletechar(_tbuf *bp,unsigned int ix,int undo){
386+void deletechar(_tbuf *bp,unsigned int ix,int undo){
387387 //テキストバッファbpの先頭からixバイトの位置の1バイト削除
388388 //undo -1:通常BackSpace(アンドゥバッファに格納する)
389389 // 0:通常DELETE(アンドゥバッファに格納する)、1:連続中、2:アンドゥ中
@@ -407,7 +407,7 @@ OBJECTSECTION void deletechar(_tbuf *bp,unsigned int ix,int undo){
407407 if(bp->next==NULL) return; //全体の最後の場合、何もしない
408408 deletechar(bp->next,0,undo); //次の行の先頭文字を削除
409409 }
410-OBJECTSECTION int gabagecollect1(void){
410+int gabagecollect1(void){
411411 //断片化されたテキストバッファの隙間を埋めるガベージコレクション
412412 //カーソルの前と後ろそれぞれ探索して最初の1バイト分のみ実施
413413 //戻り値 1バイトでも移動した場合:1、なかった場合:0
@@ -476,11 +476,11 @@ OBJECTSECTION int gabagecollect1(void){
476476 if(bp->n == 0) deleteTBuf(bp);
477477 return f;
478478 }
479-OBJECTSECTION void gabagecollect2(void){
479+void gabagecollect2(void){
480480 // 変化がなくなるまで1バイト分のガベージコレクションを呼び出し
481481 while(gabagecollect1()) ;
482482 }
483-OBJECTSECTION void inittextbuf(void){
483+void inittextbuf(void){
484484 // テキストバッファの初期化
485485 _tbuf *bp;
486486 for(bp=TextBuffer;bp<TextBuffer+TBUFMAXLINE;bp++) bp->prev=NULL; //未使用バッファ化
@@ -492,7 +492,7 @@ OBJECTSECTION void inittextbuf(void){
492492 undobuf_top=undobuf;
493493 undobuf_used=0;
494494 }
495-OBJECTSECTION void redraw(){
495+void redraw(){
496496 //画面の再描画
497497 unsigned char *vp;
498498 _tbuf *bp,*bp1,*bp2;
@@ -576,7 +576,7 @@ OBJECTSECTION void redraw(){
576576 }
577577 }
578578
579-OBJECTSECTION void cursor_left(void){
579+void cursor_left(void){
580580 //カーソルを1つ前に移動
581581 //出力:下記変数を移動先の値に変更
582582 //cursorbp,cursorix バッファ上のカーソル位置
@@ -687,7 +687,7 @@ OBJECTSECTION void cursor_left(void){
687687 disptopbp=bp;
688688 disptopix=ix;
689689 }
690-OBJECTSECTION void cursor_right(void){
690+void cursor_right(void){
691691 //カーソルを1つ後ろに移動
692692 //出力:下記変数を移動先の値に変更
693693 //cursorbp,cursorix バッファ上のカーソル位置
@@ -746,7 +746,7 @@ OBJECTSECTION void cursor_right(void){
746746 disptopbp=bp;
747747 disptopix=ix;
748748 }
749-OBJECTSECTION void cursor_up(void){
749+void cursor_up(void){
750750 //カーソルを1つ上に移動
751751 //出力:下記変数を移動先の値に変更
752752 //cursorbp,cursorix バッファ上のカーソル位置
@@ -853,7 +853,7 @@ OBJECTSECTION void cursor_up(void){
853853 disptopbp=bp;
854854 disptopix=ix;
855855 }
856-OBJECTSECTION void cursor_down(void){
856+void cursor_down(void){
857857 //カーソルを1つ下に移動
858858 //出力:下記変数を移動先の値に変更
859859 //cursorbp,cursorix バッファ上のカーソル位置
@@ -925,7 +925,7 @@ OBJECTSECTION void cursor_down(void){
925925 disptopbp=bp;
926926 disptopix=ix;
927927 }
928-OBJECTSECTION void cursor_home(void){
928+void cursor_home(void){
929929 //カーソルを行先頭に移動
930930 //出力:下記変数を移動先の値に変更
931931 //cursorbp,cursorix バッファ上のカーソル位置
@@ -946,7 +946,7 @@ OBJECTSECTION void cursor_home(void){
946946 }
947947 cx2=0;
948948 }
949-OBJECTSECTION void cursor_end(void){
949+void cursor_end(void){
950950 //カーソルを行末に移動
951951 //出力:下記変数を移動先の値に変更
952952 //cursorbp,cursorix バッファ上のカーソル位置
@@ -970,7 +970,7 @@ OBJECTSECTION void cursor_end(void){
970970 }
971971 cx2=cx;
972972 }
973-OBJECTSECTION void cursor_pageup(void){
973+void cursor_pageup(void){
974974 //PageUpキー
975975 //最上行が最下行になるまでスクロール
976976 //出力:下記変数を移動先の値に変更
@@ -996,7 +996,7 @@ OBJECTSECTION void cursor_pageup(void){
996996 //元のY座標までカーソルを下に移動、1行も動かなかった場合は最上行に留まる
997997 if(i>0) while(cy<cy_old) cursor_down();
998998 }
999-OBJECTSECTION void cursor_pagedown(void){
999+void cursor_pagedown(void){
10001000 //PageDownキー
10011001 //最下行が最上行になるまでスクロール
10021002 //出力:下記変数を移動先の値に変更
@@ -1028,7 +1028,7 @@ OBJECTSECTION void cursor_pagedown(void){
10281028 //下端からさらに移動した行数分、カーソルを上に移動、1行も動かなかった場合は最下行に留まる
10291029 if(i>0) while(cy>cy_old) cursor_up();
10301030 }
1031-OBJECTSECTION void cursor_top(void){
1031+void cursor_top(void){
10321032 //カーソルをテキストバッファの先頭に移動
10331033 cursorbp=TBufstart;
10341034 cursorix=0;
@@ -1041,7 +1041,7 @@ OBJECTSECTION void cursor_top(void){
10411041 line_no=1;
10421042 }
10431043
1044-OBJECTSECTION int countarea(void){
1044+int countarea(void){
10451045 //テキストバッファの指定範囲の文字数をカウント
10461046 //範囲は(cursorbp,cursorix)と(cursorbp1,cursorix1)で指定
10471047 //後ろ側の一つ前の文字までをカウント
@@ -1076,7 +1076,7 @@ OBJECTSECTION int countarea(void){
10761076 }
10771077 }
10781078 }
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){
10801080 //テキストバッファの指定位置から複数文字削除
10811081 //bp,ix:削除開始位置
10821082 //n:削除する文字数
@@ -1115,7 +1115,7 @@ OBJECTSECTION void deletearea_len(_tbuf *bp,unsigned int ix,int n,int undo){
11151115 n--;
11161116 }
11171117 }
1118-OBJECTSECTION void deletearea(void){
1118+void deletearea(void){
11191119 //テキストバッファの指定範囲を削除
11201120 //範囲は(cursorbp,cursorix)と(cursorbp1,cursorix1)で指定
11211121 //後ろ側の一つ前の文字までを削除
@@ -1150,7 +1150,7 @@ OBJECTSECTION void deletearea(void){
11501150 pushundomem2(n);
11511151 pushundomem(UNDO_CONTDEL);
11521152 }
1153-OBJECTSECTION void clipcopy(void){
1153+void clipcopy(void){
11541154 // 選択範囲をクリップボードにコピー
11551155 _tbuf *bp1,*bp2;
11561156 int ix1,ix2;
@@ -1186,7 +1186,7 @@ OBJECTSECTION void clipcopy(void){
11861186 }
11871187 }
11881188 }
1189-OBJECTSECTION void clippaste(void){
1189+void clippaste(void){
11901190 // クリップボードから貼り付け
11911191 int n,i;
11921192 unsigned char *p;
@@ -1206,7 +1206,7 @@ OBJECTSECTION void clippaste(void){
12061206 p++;
12071207 }
12081208 }
1209-OBJECTSECTION void movecursor(int pos){
1209+void movecursor(int pos){
12101210 // カーソルを現在の位置から任意の位置に移動
12111211 // pos:移動したいテキストバッファ先頭からのバイト位置
12121212 int pos2,d;
@@ -1226,7 +1226,7 @@ OBJECTSECTION void movecursor(int pos){
12261226 }
12271227 }
12281228 }
1229-OBJECTSECTION void undoexec(){
1229+void undoexec(){
12301230 //アンドゥ実行
12311231 unsigned char c,c1;
12321232 _tbuf *bp;
@@ -1286,7 +1286,7 @@ OBJECTSECTION void undoexec(){
12861286 }
12871287 }
12881288
1289-OBJECTSECTION void set_areamode(){
1289+void set_areamode(){
12901290 //範囲選択モード開始時のカーソル開始位置グローバル変数設定
12911291 cursorbp1=cursorbp;
12921292 cursorix1=cursorix;
@@ -1294,7 +1294,7 @@ OBJECTSECTION void set_areamode(){
12941294 cy1=cy;
12951295 line_no1=line_no;
12961296 }
1297-OBJECTSECTION void save_cursor(void){
1297+void save_cursor(void){
12981298 //カーソル関連グローバル変数を一時避難
12991299 cursorbp_t=cursorbp;
13001300 cursorix_t=cursorix;
@@ -1304,7 +1304,7 @@ OBJECTSECTION void save_cursor(void){
13041304 cy_t=cy;
13051305 line_no_t=line_no;
13061306 }
1307-OBJECTSECTION void restore_cursor(void){
1307+void restore_cursor(void){
13081308 //カーソル関連グローバル変数を一時避難場所から戻す
13091309 cursorbp=cursorbp_t;
13101310 cursorix=cursorix_t;
@@ -1315,7 +1315,7 @@ OBJECTSECTION void restore_cursor(void){
13151315 line_no=line_no_t;
13161316 }
13171317
1318-OBJECTSECTION int filesystemretry(){
1318+int filesystemretry(){
13191319 // SDファイルシステムの再初期化確認と実施
13201320 // SDファイルへの保存や読み込み時にファイルエラーが発生した場合に呼び出す
13211321 // 戻り値 0:初期化成功、-1:成功することなくEscapeで抜けた
@@ -1337,7 +1337,7 @@ OBJECTSECTION int filesystemretry(){
13371337 }
13381338 }
13391339
1340-OBJECTSECTION int sdfilecopy(char *sourcefile,char *distfile){
1340+int sdfilecopy(char *sourcefile,char *distfile){
13411341 // SDカード上のファイルをコピー
13421342 // soucefile:コピー元ファイル名
13431343 // distfile:コピー先ファイル名
@@ -1370,7 +1370,7 @@ OBJECTSECTION int sdfilecopy(char *sourcefile,char *distfile){
13701370 FSfclose(dfp);
13711371 return er;
13721372 }
1373-OBJECTSECTION int savetextfile(char *filename){
1373+int savetextfile(char *filename){
13741374 // テキストバッファをテキストファイルに書き込み
13751375 // 書き込み成功で0、失敗でエラーコード(負数)を返す
13761376 FSFILE *fp;
@@ -1414,7 +1414,7 @@ OBJECTSECTION int savetextfile(char *filename){
14141414 FSfclose(fp);
14151415 return er;
14161416 }
1417-OBJECTSECTION int loadtextfile(char *filename){
1417+int loadtextfile(char *filename){
14181418 // テキストファイルをテキストバッファに読み込み
14191419 // 読み込み成功で0、失敗でエラーコード(負数)を返す
14201420 FSFILE *fp;
@@ -1463,7 +1463,7 @@ OBJECTSECTION int loadtextfile(char *filename){
14631463 }
14641464 return er;
14651465 }
1466-OBJECTSECTION int overwritecheck(char *fn){
1466+int overwritecheck(char *fn){
14671467 // ファイルの上書き確認
14681468 // ファイルの存在をチェックし、存在する場合キーボードから上書き確認する
14691469 // fn:ファイル名へのポインタ
@@ -1483,7 +1483,7 @@ OBJECTSECTION int overwritecheck(char *fn){
14831483 if(vk==VK_ESCAPE) return -1;
14841484 }
14851485 }
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){
14871487 // x,yの位置にファイル名またはディレクトリ名を表示
14881488
14891489 if(f==-2){
@@ -1509,7 +1509,7 @@ OBJECTSECTION void printfilename(unsigned char x,unsigned char y,int f,int num_d
15091509 printstr(filenames[f]);
15101510 }
15111511 }
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){
15131513 // filenames[]配列に読み込まれたファイルまたはディレクトリを画面表示しキーボードで選択する
15141514 // filenum:ファイル+ディレクトリ数
15151515 // num_dir:ディレクトリ数(filenames[]は先頭からnum_dir-1までがディレクトリ)
@@ -1665,7 +1665,7 @@ OBJECTSECTION int select_dir_file(int filenum,int num_dir, unsigned char* msg){
16651665 }
16661666 }
16671667 }
1668-OBJECTSECTION int getfilelist(int *p_num_dir){
1668+int getfilelist(int *p_num_dir){
16691669 // カレントディレクトリでのディレクトリ、.BAS、.TXT、.INIファイル一覧を読み込む
16701670 // *p_num_dir:ディレクトリ数を返す
16711671 // filenames[]:ファイル名およびディレクトリ名一覧
@@ -1729,7 +1729,7 @@ OBJECTSECTION int getfilelist(int *p_num_dir){
17291729 }
17301730 return filenum;
17311731 }
1732-OBJECTSECTION void save_as(int ow){
1732+void save_as(int ow){
17331733 // 現在のテキストバッファの内容をSDカードに保存
17341734 // ow 0:名前を付けて保存  1:上書き保存
17351735 // ファイル名はグローバル変数currentfile[]
@@ -1817,7 +1817,7 @@ OBJECTSECTION void save_as(int ow){
18171817 }
18181818 }
18191819
1820-OBJECTSECTION void newtext(void){
1820+void newtext(void){
18211821 // 新規テキスト作成
18221822 unsigned char vk;
18231823 if(edited && num){
@@ -1841,7 +1841,7 @@ OBJECTSECTION void newtext(void){
18411841 currentfile[0]=0; //作業中ファイル名クリア
18421842 }
18431843
1844-OBJECTSECTION void msra(void){
1844+void msra(void){
18451845 // Make Self-Running Application (自己実行アプリケーションの作成)
18461846 // 最初にソースファイルを名前を付けて保存
18471847 // 次にBASICシステムのHEXファイルをソースファイル名の拡張子をHEXにした名前でコピー
@@ -1852,7 +1852,8 @@ OBJECTSECTION void msra(void){
18521852 setcursor(0,0,COLOR_NORMALTEXT);
18531853 printstr("Make Self-Running Application\n\n");
18541854 printstr("(Work on Root Directory)\n");
1855-
1855+// MOS: delete region not required
1856+/*
18561857 //カレントディレクトリを変数cwdpathにコピー
18571858 while(1){
18581859 if(FSgetcwd(cwdpath,PATHNAMEMAX)) break;
@@ -1872,30 +1873,44 @@ OBJECTSECTION void msra(void){
18721873 pd=tempfile;
18731874 while(*ps!=0) *pd++=*ps++;
18741875 *pd=0;
1875-
1876+//*/
18761877 while(1){
18771878 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+
18791883 if(lineinput(tempfile,8+1+3)<0){
18801884 //ESCキーが押された
1881- FSchdir(cwdpath); //カレントディレクトリを元に戻す
1885+// MOS: delete region not required
1886+// FSchdir(cwdpath); //カレントディレクトリを元に戻す
18821887 return;
18831888 }
18841889 ps=tempfile;
18851890 while(*ps!='.' && *ps!=0) ps++;
18861891 if(ps+4>=tempfile+13 ||
18871892 *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') ||
18911900 *(ps+4)!=0){
18921901 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");
18941905 continue;
18951906 }
18961907 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:エラーコード
18991914 if(er==0) break;
19001915 setcursorcolor(COLOR_ERRORTEXT);
19011916 if(er==ERR_CANTFILEOPEN) printstr("Bad File Name or File Error\n");
@@ -1911,6 +1926,8 @@ OBJECTSECTION void msra(void){
19111926 }
19121927 }
19131928 printstr("OK\n\n");
1929+// MOS: delete region not required
1930+/*
19141931 FSremove(TEMPFILENAME); //実行時に生成する一時ファイルを削除
19151932 //tempfileからcurrentfileにコピーして終了
19161933 ps=tempfile;
@@ -1946,12 +1963,13 @@ OBJECTSECTION void msra(void){
19461963 else if(er==ERR_CANTWRITEFILE){
19471964 printstr("Write Error\n");
19481965 }
1966+//*/
19491967 setcursorcolor(COLOR_NORMALTEXT);
19501968 printstr((unsigned char *)Message1);// Hit Any Key
19511969 inputchar(); //1文字入力待ち
19521970 return;
19531971 }
1954-OBJECTSECTION int fileload(void){
1972+int fileload(void){
19551973 // SDカードからファイルを選択して読み込み
19561974 // currenfile[]にファイル名を記憶
19571975 // 対象ファイル拡張子 BASおよびTXT
@@ -2047,16 +2065,16 @@ OBJECTSECTION int fileload(void){
20472065 }
20482066 }
20492067 }
2050-OBJECTSECTION void changewidth(void){
2068+void changewidth(void){
20512069 // 30文字モードと40文字モードの切り替え
20522070 if(twidth==WIDTH_X1) set_width(1);
20532071 else set_width(0);
20542072 cursor_top(); //カーソルをテキストバッファの先頭に設定
20552073 redraw(); //再描画
20562074 }
2057-OBJECTSECTION void run(int test){
2075+void run(int test){
20582076 //KM-BASICコンパイル&実行
2059-// test 0:コンパイルと実行、0以外:コンパイルのみで終了
2077+// test 0:コンパイルと実行、1:コンパイルのみで終了、2:コンパイルの後、HEXファイルを作製
20602078 int er,er2;
20612079 FSFILE *fp;
20622080 unsigned int disptoppos,cursorpos;
@@ -2132,7 +2150,18 @@ OBJECTSECTION void run(int test){
21322150 // Enable Break key
21332151 g_disable_break=0;
21342152 //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);
21362165
21372166 stopPCG();//システムフォントに戻す
21382167 setcursorcolor(COLOR_NORMALTEXT);
@@ -2176,6 +2205,12 @@ OBJECTSECTION void run(int test){
21762205 FSremove(WORKDIRFILE); //パス名保存ファイル削除
21772206 break;
21782207 }
2208+// MOS: insertion
2209+ if (2==test && !er2) {
2210+ // Create HEX file as Self Running Apprication
2211+ msra();
2212+ }
2213+//*/
21792214 while(1){
21802215 //カレントディレクトリを元に戻す
21812216 if(FSchdir(cwdpath)){
@@ -2224,7 +2259,7 @@ OBJECTSECTION void run(int test){
22242259 edited=edited1;
22252260 FSremove(TEMPFILENAME);
22262261 }
2227-OBJECTSECTION void displaybottomline(void){
2262+void displaybottomline(void){
22282263 //エディター画面最下行の表示
22292264 unsigned char *p;
22302265 unsigned char c;
@@ -2259,7 +2294,7 @@ OBJECTSECTION void displaybottomline(void){
22592294 cursor=p; //カーソル位置戻し
22602295 cursorcolor=c;
22612296 }
2262-OBJECTSECTION void normal_code_process(unsigned char k){
2297+void normal_code_process(unsigned char k){
22632298 // 通常文字入力処理
22642299 // k:入力された文字コード
22652300 int i;
@@ -2286,7 +2321,7 @@ OBJECTSECTION void normal_code_process(unsigned char k){
22862321 if(i==0) cursor_right();//画面上、バッファ上のカーソル位置を1つ後ろに移動
22872322 }
22882323 }
2289-OBJECTSECTION void control_code_process(unsigned char k,unsigned char sh){
2324+void control_code_process(unsigned char k,unsigned char sh){
22902325 // 制御文字入力処理
22912326 // k:制御文字の仮想キーコード
22922327 // sh:シフト関連キー状態
@@ -2459,7 +2494,9 @@ OBJECTSECTION void control_code_process(unsigned char k,unsigned char sh){
24592494 break;
24602495 case VK_F2: //F2キー
24612496 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
24632500 else save_as(0); //ファイル名を付けて保存
24642501 break;
24652502 case VK_F3: //F3キー
@@ -2476,7 +2513,7 @@ OBJECTSECTION void control_code_process(unsigned char k,unsigned char sh){
24762513 break;
24772514 }
24782515 }
2479-OBJECTSECTION void texteditor(void){
2516+void texteditor(void){
24802517 //テキストエディター本体
24812518 unsigned char k1,k2,sh;
24822519 FSFILE *fp;
--- a/mips/zoea/envspecific.h
+++ b/mips/zoea/envspecific.h
@@ -6,8 +6,9 @@
66 */
77
88 #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)
1112
1213 int readbuttons();
1314 void scroll(int x, int y);
--- a/mips/zoea/error.c
+++ b/mips/zoea/error.c
@@ -42,6 +42,10 @@ const char* g_err_str[]={
4242 "Invalid in class file",
4343 "INIT method does not exist",
4444 "ERR_OPTION_CLASSCODE",
45+ "ERR_COMPILE_CLIB",
46+ "C library not found",
47+ "HEX file syntax error",
48+ "Class or C library not found",
4549 };
4650
4751 char* resolve_label(int s6){
--- a/mips/zoea/file.c
+++ b/mips/zoea/file.c
@@ -13,10 +13,12 @@
1313 #include "api.h"
1414 #include "compiler.h"
1515
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;
2022
2123 char* init_file(char* buff,char* appname){
2224 // Open file
@@ -87,6 +89,8 @@ char* compile_file(){
8789 char* err;
8890 // Read first 512 bytes
8991 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;
9094 // Compile line by line
9195 while (g_size==512) {
9296 err=compile_line();
@@ -147,7 +151,7 @@ int compile_and_link_file(char* buff,char* appname){
147151 err=compile_file();
148152 close_file();
149153
150- // If compiling a class file is required, do it.
154+ // If compiling a class file or a clib is required, do it.
151155 if (err==ERR_COMPILE_CLASS) {
152156 j=g_compiling_class;
153157 i=compile_and_link_class(buff, g_class);
@@ -155,6 +159,11 @@ int compile_and_link_file(char* buff,char* appname){
155159 if (i) return i;
156160 // Continue compiling current file from the beginning.
157161 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;
158167 }
159168 break;
160169 }
@@ -239,7 +248,7 @@ int compile_and_link_class(char* buff,int class){
239248 // Restore current dirctory
240249 cmpdata_reset();
241250 while(record=cmpdata_find(CMPDATA_TEMP)){
242- if (cwd_id=(record[0]&0xffff)) break;
251+ if ((record[0]&0xffff)==cwd_id) break;
243252 }
244253 if (!record) break;
245254 FSchdir((char*)(&record[1]));
@@ -293,4 +302,4 @@ int compile_and_link_main_file(char* buff,char* appname){
293302 to use the same long var name in different files (note that g_long_name_var_num is not reseted after
294303 compiling each class code).
295304 */
296-}
\ No newline at end of file
305+}
--- a/mips/zoea/float.c
+++ b/mips/zoea/float.c
@@ -9,6 +9,13 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "./compiler.h"
1320 #include "stdlib.h"
1421
--- a/mips/zoea/function.c
+++ b/mips/zoea/function.c
@@ -9,10 +9,17 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "compiler.h"
1320 #include "api.h"
1421
15-OBJECTSECTION char* music_function(){
22+char* music_function(){
1623 char* err;
1724 next_position();
1825 if (g_source[g_srcpos]==')') {
@@ -26,26 +33,26 @@ OBJECTSECTION char* music_function(){
2633 return 0;
2734 }
2835
29-OBJECTSECTION char* read_function(){
36+char* read_function(){
3037 // This function is not valid in class file.
3138 if (g_compiling_class) return ERR_INVALID_CLASS;
3239 call_lib_code(LIB_READ);
3340 return 0;
3441 }
3542
36-OBJECTSECTION char* cread_function(){
43+char* cread_function(){
3744 call_lib_code(LIB_CREAD);
3845 return 0;
3946 }
4047
41-OBJECTSECTION char* gosub_function(){
48+char* gosub_function(){
4249 // Check if garbage collection has been done.
4350 // This check is required because the used temporary area would be changed
4451 // in sub routine.
4552 if (g_temp_area_used) return ERR_GOSUB_ASH;
4653 return gosub_statement();
4754 }
48-OBJECTSECTION char* strncmp_function(){
55+char* strncmp_function(){
4956 char* err;
5057 err=get_string();
5158 if (err) return err;
@@ -67,7 +74,7 @@ OBJECTSECTION char* strncmp_function(){
6774 g_object[g_objpos++]=0x27BD0008; // addiu sp,sp,8
6875 return 0;
6976 }
70-OBJECTSECTION char* len_function(){
77+char* len_function(){
7178 char* err;
7279 err=get_string();
7380 if (err) return err;
@@ -81,7 +88,7 @@ OBJECTSECTION char* len_function(){
8188 return 0;
8289 }
8390
84-OBJECTSECTION char* asc_function(){
91+char* asc_function(){
8592 char* err;
8693 err=get_string();
8794 if (err) return err;
@@ -90,7 +97,7 @@ OBJECTSECTION char* asc_function(){
9097 return 0;
9198 }
9299
93-OBJECTSECTION char* val_function(){
100+char* val_function(){
94101 char* err;
95102 err=get_string();
96103 if (err) return err;
@@ -98,7 +105,7 @@ OBJECTSECTION char* val_function(){
98105 return 0;
99106 }
100107
101-OBJECTSECTION char* peek_function_sub(int bits){
108+char* peek_function_sub(int bits){
102109 char* err;
103110 err=get_value();
104111 if (err) return err;
@@ -118,7 +125,7 @@ OBJECTSECTION char* peek_function_sub(int bits){
118125 return 0;
119126 }
120127
121-OBJECTSECTION char* sgn_function(){
128+char* sgn_function(){
122129 char* err;
123130 err=get_value();
124131 if (err) return err;
@@ -132,7 +139,7 @@ OBJECTSECTION char* sgn_function(){
132139 return 0;
133140 }
134141
135-OBJECTSECTION char* abs_function(){
142+char* abs_function(){
136143 char* err;
137144 err=get_value();
138145 if (err) return err;
@@ -143,7 +150,7 @@ OBJECTSECTION char* abs_function(){
143150 return 0;
144151 }
145152
146-OBJECTSECTION char* not_function(){
153+char* not_function(){
147154 char* err;
148155 err=get_value();
149156 if (err) return err;
@@ -152,19 +159,19 @@ OBJECTSECTION char* not_function(){
152159 return 0;
153160 }
154161
155-OBJECTSECTION char* rnd_function(){
162+char* rnd_function(){
156163 call_lib_code(LIB_RND);
157164 return 0;
158165 }
159166
160-OBJECTSECTION char* chr_function(void){
167+char* chr_function(void){
161168 char* err;
162169 err=get_value();
163170 if (err) return err;
164171 call_lib_code(LIB_CHR);
165172 return 0;
166173 }
167-OBJECTSECTION char* hex_function(void){
174+char* hex_function(void){
168175 char* err;
169176 err=get_value();
170177 if (err) return err;
@@ -191,7 +198,7 @@ OBJECTSECTION char* hex_function(void){
191198 return 0;
192199 }
193200
194-OBJECTSECTION char* dec_function(void){
201+char* dec_function(void){
195202 char* err;
196203 err=get_value();
197204 if (err) return err;
@@ -199,7 +206,7 @@ OBJECTSECTION char* dec_function(void){
199206 return 0;
200207 }
201208
202-OBJECTSECTION char* keys_function(void){
209+char* keys_function(void){
203210 char* err;
204211 next_position();
205212 if (g_source[g_srcpos]==')') {
@@ -213,7 +220,7 @@ OBJECTSECTION char* keys_function(void){
213220 return 0;
214221 }
215222
216-OBJECTSECTION char* tvram_function(void){
223+char* tvram_function(void){
217224 char* err;
218225 int i;
219226 next_position();
@@ -235,17 +242,17 @@ OBJECTSECTION char* tvram_function(void){
235242 return 0;
236243 }
237244
238-OBJECTSECTION char* drawcount_function(void){
245+char* drawcount_function(void){
239246 call_lib_code(LIB_DRAWCOUNT);
240247 return 0;
241248 }
242249
243-OBJECTSECTION char* input_function(void){
250+char* input_function(void){
244251 call_lib_code(LIB_INPUT);
245252 return 0;
246253 }
247254
248-OBJECTSECTION char* inkey_function(void){
255+char* inkey_function(void){
249256 char* err;
250257 next_position();
251258 if (g_source[g_srcpos]==')') {
@@ -259,11 +266,11 @@ OBJECTSECTION char* inkey_function(void){
259266 return 0;
260267 }
261268
262-OBJECTSECTION char* args_function(void){
269+char* args_function(void){
263270 return args_function_main();
264271 }
265272
266-OBJECTSECTION char* system_function(void){
273+char* system_function(void){
267274 char* err;
268275 err=get_value();
269276 if (err) return err;
@@ -272,7 +279,7 @@ OBJECTSECTION char* system_function(void){
272279 return 0;
273280 }
274281
275-OBJECTSECTION char* sprintf_function(void){
282+char* sprintf_function(void){
276283 char* err;
277284 err=get_string();
278285 if (err) return err;
@@ -292,7 +299,7 @@ OBJECTSECTION char* sprintf_function(void){
292299 return 0;
293300 }
294301
295-OBJECTSECTION char* floatstr_function(void){
302+char* floatstr_function(void){
296303 char* err;
297304 err=get_float();
298305 if (err) return err;
@@ -303,7 +310,7 @@ OBJECTSECTION char* floatstr_function(void){
303310 return 0;
304311 }
305312
306-OBJECTSECTION char* floatsharp_function(void){
313+char* floatsharp_function(void){
307314 char* err;
308315 err=get_value();
309316 if (err) return err;
@@ -311,7 +318,7 @@ OBJECTSECTION char* floatsharp_function(void){
311318 return 0;
312319 }
313320
314-OBJECTSECTION char* valsharp_function(void){
321+char* valsharp_function(void){
315322 char* err;
316323 err=get_string();
317324 if (err) return err;
@@ -319,7 +326,7 @@ OBJECTSECTION char* valsharp_function(void){
319326 return 0;
320327 }
321328
322-OBJECTSECTION char* int_function(void){
329+char* int_function(void){
323330 char* err;
324331 err=get_float();
325332 if (err) return err;
@@ -327,22 +334,22 @@ OBJECTSECTION char* int_function(void){
327334 return 0;
328335 }
329336
330-OBJECTSECTION char* fseek_function(){
337+char* fseek_function(){
331338 call_lib_code(LIB_FILE | FUNC_FTELL);
332339 return 0;
333340 }
334341
335-OBJECTSECTION char* flen_function(){
342+char* flen_function(){
336343 call_lib_code(LIB_FILE | FUNC_FLEN);
337344 return 0;
338345 }
339346
340-OBJECTSECTION char* fgetc_function(){
347+char* fgetc_function(){
341348 call_lib_code(LIB_FILE | FUNC_FGETC);
342349 return 0;
343350 }
344351
345-OBJECTSECTION char* finput_function(){
352+char* finput_function(){
346353 char* err;
347354 next_position();
348355 if (g_source[g_srcpos]!=')') {
@@ -357,12 +364,12 @@ OBJECTSECTION char* finput_function(){
357364 return 0;
358365 }
359366
360-OBJECTSECTION char* feof_function(){
367+char* feof_function(){
361368 call_lib_code(LIB_FILE | FUNC_FEOF);
362369 return 0;
363370 }
364371
365-OBJECTSECTION char* playwave_function(){
372+char* playwave_function(){
366373 char* err;
367374 next_position();
368375 if (g_source[g_srcpos]!=')') {
@@ -378,7 +385,7 @@ OBJECTSECTION char* playwave_function(){
378385 return 0;
379386 }
380387
381-OBJECTSECTION char* setdir_function(){
388+char* setdir_function(){
382389 char* err;
383390 err=get_string();
384391 if (err) return err;
@@ -386,21 +393,21 @@ OBJECTSECTION char* setdir_function(){
386393 return 0;
387394 }
388395
389-OBJECTSECTION char* getdir_function(){
396+char* getdir_function(){
390397 call_lib_code(LIB_GETDIR);
391398 return 0;
392399 }
393400
394-OBJECTSECTION char* exec_function(){
401+char* exec_function(){
395402 return exec_statement();
396403 }
397404
398-OBJECTSECTION char* readkey_function(){
405+char* readkey_function(){
399406 call_lib_code(LIB_READKEY);
400407 return 0;
401408 }
402409
403-OBJECTSECTION char* float_constant(float val){
410+char* float_constant(float val){
404411 volatile int i;
405412 ((float*)(&i))[0]=val;
406413 if (i&0xFFFF0000) {
@@ -416,7 +423,7 @@ OBJECTSECTION char* float_constant(float val){
416423 return 0;
417424 }
418425
419-OBJECTSECTION char* float_1param_function(enum functions func){
426+char* float_1param_function(enum functions func){
420427 char* err;
421428 err=get_float();
422429 if (err) return err;
@@ -424,7 +431,7 @@ OBJECTSECTION char* float_1param_function(enum functions func){
424431 return 0;
425432 }
426433
427-OBJECTSECTION char* float_2param_function(enum functions func){
434+char* float_2param_function(enum functions func){
428435 char* err;
429436 err=get_float();
430437 if (err) return err;
@@ -444,7 +451,7 @@ OBJECTSECTION char* float_2param_function(enum functions func){
444451 return 0;
445452 }
446453
447-OBJECTSECTION char* float_function(void){
454+char* float_function(void){
448455 char* err;
449456 if (nextCodeIs("FLOAT#(")) {
450457 err=floatsharp_function();
@@ -494,12 +501,17 @@ OBJECTSECTION char* float_function(void){
494501 err=gosub_function();
495502 } else if (nextCodeIs("ARGS#(")) {
496503 err=args_function();
504+ } else if (nextCodeIs("CLIB#(")) {
505+ err=clib_statement();
497506 } else if (nextCodeIs("PI#")) {
498507 return float_constant(3.141593);
499508 } else {
500509 // Check if static method of a class
501510 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+ }
503515 }
504516 if (err) return err;
505517 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
@@ -520,11 +532,12 @@ static const void* str_func_list[]={
520532 "SYSTEM$(",system_function,
521533 "FINPUT$(",finput_function,
522534 "GETDIR$(",getdir_function,
535+ "CLIB$(",clib_statement,
523536 // Additional functions follow
524537 ADDITIONAL_STR_FUNCTIONS
525538 };
526539
527-OBJECTSECTION char* str_function(void){
540+char* str_function(void){
528541 char* err;
529542 int i;
530543 char* (*f)();
@@ -539,7 +552,10 @@ OBJECTSECTION char* str_function(void){
539552 } else {
540553 // Check if static method of a class
541554 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+ }
543559 }
544560 if (err) return err;
545561 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
@@ -549,23 +565,23 @@ OBJECTSECTION char* str_function(void){
549565
550566 // Aliases follow
551567
552-OBJECTSECTION char* peek_function(){
568+char* peek_function(){
553569 return peek_function_sub(8);
554570 }
555571
556-OBJECTSECTION char* peek16_function(){
572+char* peek16_function(){
557573 return peek_function_sub(16);
558574 }
559575
560-OBJECTSECTION char* peek32_function(){
576+char* peek32_function(){
561577 return peek_function_sub(32);
562578 }
563579
564-OBJECTSECTION char* gcolor_function(){
580+char* gcolor_function(){
565581 return graphic_statement(FUNC_GCOLOR);
566582 }
567583
568-OBJECTSECTION char* fopen_function(){
584+char* fopen_function(){
569585 return fopen_statement_main(FUNC_FOPEN);
570586 }
571587
@@ -609,11 +625,12 @@ static const void* int_func_list[]={
609625 "EXEC(",exec_function,
610626 "CORETIMER(",coretimer_function,
611627 "READKEY(",readkey_function,
628+ "CLIB(",clib_statement,
612629 // Additional functions follow
613630 ADDITIONAL_INT_FUNCTIONS
614631 };
615632
616-OBJECTSECTION char* function(void){
633+char* function(void){
617634 char* err;
618635 int i;
619636 char* (*f)();
@@ -626,9 +643,12 @@ OBJECTSECTION char* function(void){
626643 f=int_func_list[i+1];
627644 err=f();
628645 } else {
629- // Check if static method of a class
646+ // Check if static method of a class of clib
630647 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+ }
632652 }
633653 if (err) return err;
634654 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
--- a/mips/zoea/globalvars.c
+++ b/mips/zoea/globalvars.c
@@ -12,8 +12,12 @@
1212 #include "compiler.h"
1313 #include "main.h"
1414
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;
1721
1822 // Contain the valus of $gp and $s6 (GPR of MIPS32)
1923 int g_gp;
@@ -98,5 +102,11 @@ unsigned char g_num_classes;
98102 // OPTION FASTFIELD
99103 char g_option_fastfield;
100104
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+
101111 // General purpose integer used for asigning value with pointer
102112 int g_temp;
--- a/mips/zoea/library.c
+++ b/mips/zoea/library.c
@@ -779,6 +779,11 @@ int lib_file(enum functions func, int a0, int a1, int v0){
779779 int i;
780780 int buff[1];
781781 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+
782787 if (activefhandle) fhandle=s_fhandle[activefhandle-1];
783788 switch(func){
784789 case FUNC_FINIT:
@@ -1011,6 +1016,7 @@ int _call_library(int a0,int a1,int v0,enum libs a3){
10111016 scroll(g_libparams[1],v0);
10121017 return v0;
10131018 case LIB_FILE:
1019+ if (!g_fs_valid) err_str("File System not initialized");
10141020 return lib_file((enum functions)(a3 & FUNC_MASK),g_libparams[1],g_libparams[2],v0);
10151021 case LIB_KEYS:
10161022 return lib_keys(v0);
--- a/mips/zoea/main.c
+++ b/mips/zoea/main.c
@@ -157,6 +157,7 @@ int searchinittext(char *s){
157157 void readinifile(void){
158158 FSFILE *fp;
159159 char inittext[9];
160+ if (!g_fs_valid) return;
160161
161162 fp=FSfopen(INIFILE,"r");
162163 if(fp==NULL) return;
@@ -203,6 +204,7 @@ void printhex32(unsigned int d){
203204
204205 int main(void){
205206 char *appname,*s;
207+ int use_editor;
206208
207209 if(DEVCFG1 & 0x8000){
208210 // Set Clock switching enabled and reset
@@ -234,6 +236,17 @@ int main(void){
234236 // Show blue screen if exception before soft reset.
235237 blue_screen();
236238
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+ }
237250 printstr("MachiKania BASIC System\n");
238251 printstr(" Ver "SYSVER1" "SYSVER2" by KENKEN\n");
239252 printstr("BASIC Compiler "BASVER"\n");
@@ -241,16 +254,26 @@ int main(void){
241254 //SDカードファイルシステム初期化
242255 setcursorcolor(COLOR_NORMALTEXT);
243256 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+ }
252273 }
253- printstr("OK\n");
274+ if (g_fs_valid) printstr("OK\n");
275+ else printstr("Failed\n");
276+
254277 lockkey=2; // NumLockキーオン
255278 keytype=0; // 日本語キーボード
256279 readinifile(); //INIファイル読み込み
@@ -264,20 +287,23 @@ int main(void){
264287 wait60thsec(60); //1秒待ち
265288
266289 // 実行中HEXファイル名がHEXFILEと一致した場合はエディタ起動
267- appname=(char*)FILENAME_FLASH_ADDRESS;
268- s=HEXFILE;
269- while(*s++==*appname++) if(*s==0) texteditor(); //テキストエディター呼び出し
290+ if(use_editor) texteditor(); //テキストエディター呼び出し
270291
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(); //ボタン有効化
279292 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+ }
281307 while(1) asm(WAIT);
282308 }
283309
--- a/mips/zoea/main.h
+++ b/mips/zoea/main.h
@@ -7,8 +7,9 @@
77
88 #define ZOEA
99 #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"
1213
1314 #define INIFILE "MACHIKAZ.INI" // 初期設定ファイル
1415 #define HEXFILE "MACHIKAZ.HEX" // 実行中HEXファイル名がこれと一致した場合はエディタ起動
--- a/mips/zoea/reservednames.js
+++ b/mips/zoea/reservednames.js
@@ -100,6 +100,7 @@ var namearray=[
100100 'CHR',
101101 'CIRCLE',
102102 'CLEAR',
103+ 'CLIB',
103104 'CLS',
104105 'COLOR',
105106 'COS',
--- a/mips/zoea/run.c
+++ b/mips/zoea/run.c
@@ -32,10 +32,14 @@ char* printdec(int num){
3232 }
3333 }
3434
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){
3640 // BASICソースのコンパイルと実行
3741 // appname 実行するBASICソースファイル
38-// test 0:コンパイルと実行、0以外:コンパイルのみで終了
42+// mode 0:コンパイルと実行、1:コンパイルのみで終了、2:コンパイル済みオブジェクトを実行
3943 //
4044 // 戻り値
4145 //  0:正常終了
@@ -57,16 +61,18 @@ int runbasic(char *appname,int test){
5761 // Clear object area
5862 for(i=0;i<RAMSIZE/4;i++) g_object[i]=0x00000000;
5963
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();
6875 }
69- close_file();
7076
7177 // Initialize parameters
7278 g_pcg_font=0;
@@ -75,7 +81,6 @@ int runbasic(char *appname,int test){
7581 clearscreen();
7682 setcursor(0,0,7);
7783 g_long_name_var_num=0;
78- cmpdata_init();
7984
8085 // Initialize music system
8186 init_music();
@@ -85,13 +90,24 @@ int runbasic(char *appname,int test){
8590
8691 printstr("Compiling...");
8792
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+ }
92108 // All done
93109 printstr("done\n");
94- if(test) return 0; //コンパイルのみの場合
110+ if(mode==RUNMODE_COMPILE_ONLY) return 0; //コンパイルのみの場合
95111 wait60thsec(15);
96112
97113 // Initialize the other parameters
@@ -131,3 +147,114 @@ int runbasic(char *appname,int test){
131147
132148 return 0;
133149 }
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+}
--- a/mips/zoea/sharedfiles.js
+++ b/mips/zoea/sharedfiles.js
@@ -12,6 +12,7 @@
1212 var filearray=[
1313 'args.c',
1414 'class.c',
15+ 'clib.c',
1516 'cmpdata.c',
1617 'compiler.c',
1718 'debug.c',
@@ -21,6 +22,7 @@ var filearray=[
2122 'float.c',
2223 'function.c',
2324 'globalvars.c',
25+ 'hexfile.c',
2426 'library.c',
2527 'linker.c',
2628 'memory.c',
@@ -36,6 +38,7 @@ var filearray=[
3638 'reservednames.js',
3739 'sharedfiles.js',
3840 'class.txt',
41+ 'clib.txt',
3942 ];
4043
4144 var WshShell = WScript.CreateObject("WScript.Shell");
--- a/mips/zoea/statement.c
+++ b/mips/zoea/statement.c
@@ -9,10 +9,17 @@
99 This file is shared by Megalopa and Zoea
1010 */
1111
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+
1219 #include "api.h"
1320 #include "compiler.h"
1421
15-OBJECTSECTION char* rem_statement(){
22+char* rem_statement(){
1623 if (g_source[g_srcpos-4]<0x20) {
1724 // This line contains only "REM" statement
1825 // Delete $s6-setting command if exists.
@@ -24,7 +31,7 @@ OBJECTSECTION char* rem_statement(){
2431 return 0;
2532 }
2633
27-OBJECTSECTION char* sound_statement(){
34+char* sound_statement(){
2835 char *err;
2936 err=get_label();
3037 if (err) return err;
@@ -62,7 +69,7 @@ OBJECTSECTION char* sound_statement(){
6269 call_lib_code(LIB_SOUND);
6370 return 0;
6471 }
65-OBJECTSECTION char* music_statement(){
72+char* music_statement(){
6673 char *err;
6774 err=get_string();
6875 if (err) return err;
@@ -88,7 +95,7 @@ OBJECTSECTION char* music_statement(){
8895 return 0;
8996 }
9097
91-OBJECTSECTION char* exec_statement(){
98+char* exec_statement(){
9299 char *err;
93100 char b1;
94101 int i,prevpos;
@@ -123,7 +130,7 @@ OBJECTSECTION char* exec_statement(){
123130 return 0;
124131 }
125132
126-OBJECTSECTION char* cdata_statement(){
133+char* cdata_statement(){
127134 // 0x00000020, 0x00000021, 0x00000022, and 0x00000023 (add/addu/sub/subu zero,zero,zero)
128135 // are the sign of data region
129136 int beginpos,prevpos;
@@ -191,7 +198,7 @@ OBJECTSECTION char* cdata_statement(){
191198 return 0;
192199 }
193200
194-OBJECTSECTION char* data_statement(){
201+char* data_statement(){
195202 // 0x00000020, 0x00000021, 0x00000022, and 0x00000023 (add/addu/sub/subu zero,zero,zero)
196203 // are the sign of data region
197204 int i,prevpos;
@@ -232,12 +239,12 @@ OBJECTSECTION char* data_statement(){
232239 }
233240 }
234241
235-OBJECTSECTION char* clear_statement(){
242+char* clear_statement(){
236243 call_lib_code(LIB_CLEAR);
237244 return 0;
238245 }
239246
240-OBJECTSECTION char* poke_statement_sub(int bits){
247+char* poke_statement_sub(int bits){
241248 char* err;
242249 err=get_value();
243250 if (err) return err;
@@ -266,7 +273,7 @@ OBJECTSECTION char* poke_statement_sub(int bits){
266273 return 0;
267274 }
268275
269-OBJECTSECTION char* dim_statement(){
276+char* dim_statement(){
270277 char* err;
271278 char b1;
272279 int i;
@@ -309,7 +316,7 @@ OBJECTSECTION char* dim_statement(){
309316 return 0;
310317 }
311318
312-OBJECTSECTION char* label_statement(){
319+char* label_statement(){
313320 char* err;
314321 char b1;
315322 b1=g_source[g_srcpos];
@@ -329,7 +336,7 @@ OBJECTSECTION char* label_statement(){
329336 return 0;
330337 }
331338
332-OBJECTSECTION char* restore_statement(){
339+char* restore_statement(){
333340 char* err;
334341 // This statement is not valid in class file.
335342 if (g_compiling_class) return ERR_INVALID_CLASS;
@@ -351,7 +358,7 @@ OBJECTSECTION char* restore_statement(){
351358 return 0;
352359 }
353360
354-OBJECTSECTION char* gosub_statement_sub(){
361+char* gosub_statement_sub(){
355362 char* err;
356363 err=get_label();
357364 if (err) return err;
@@ -388,7 +395,7 @@ OBJECTSECTION char* gosub_statement_sub(){
388395 return 0;
389396 }
390397
391-OBJECTSECTION char* gosub_statement(){
398+char* gosub_statement(){
392399 char* err;
393400 int opos,spos,stack;
394401 // Skip label first (see below)
@@ -417,7 +424,7 @@ OBJECTSECTION char* gosub_statement(){
417424 return 0;
418425 }
419426
420-OBJECTSECTION char* return_statement(){
427+char* return_statement(){
421428 char* err;
422429 char b1;
423430 next_position();
@@ -435,7 +442,7 @@ OBJECTSECTION char* return_statement(){
435442 return 0;
436443 }
437444
438-OBJECTSECTION char* goto_statement(){
445+char* goto_statement(){
439446 char* err;
440447 err=get_label();
441448 if (err) return err;
@@ -458,7 +465,7 @@ OBJECTSECTION char* goto_statement(){
458465 return 0;
459466 }
460467
461-OBJECTSECTION char* if_statement(){
468+char* if_statement(){
462469 char* err;
463470 int prevpos,bpos;
464471 // Get value.
@@ -537,7 +544,7 @@ OBJECTSECTION char* if_statement(){
537544 return 0;
538545 }
539546
540-OBJECTSECTION char* elseif_statement(void){
547+char* elseif_statement(void){
541548 // Multiple line mode
542549 char* err;
543550 g_object[g_objpos++]=0x08160100; // breakif (see linker)
@@ -560,7 +567,7 @@ OBJECTSECTION char* elseif_statement(void){
560567
561568 }
562569
563-OBJECTSECTION char* else_statement(void){
570+char* else_statement(void){
564571 // Multiple line mode
565572 g_object[g_objpos++]=0x08160100; // breakif (see linker)
566573 g_object[g_objpos++]=0x30008000; // nop (see linker)
@@ -575,7 +582,7 @@ OBJECTSECTION char* else_statement(void){
575582 return 0;
576583 }
577584
578-OBJECTSECTION char* endif_statement(void){
585+char* endif_statement(void){
579586 // Multiple line mode
580587 g_object[g_objpos++]=0x30008000; // nop (see linker)
581588 g_object[g_objpos++]=0x30008000; // nop (see linker)
@@ -589,7 +596,7 @@ OBJECTSECTION char* endif_statement(void){
589596 return 0;
590597 }
591598
592-OBJECTSECTION char* end_statement(void){
599+char* end_statement(void){
593600 int i;
594601 i=(int)&g_end_addr;
595602 i-=g_gp;
@@ -600,7 +607,7 @@ OBJECTSECTION char* end_statement(void){
600607 return 0;
601608 }
602609
603-OBJECTSECTION char* let_dim_sub(int i){
610+char* let_dim_sub(int i){
604611 char* err;
605612 g_srcpos++;
606613 err=get_value();
@@ -626,7 +633,7 @@ OBJECTSECTION char* let_dim_sub(int i){
626633 return 0;
627634 };
628635
629-OBJECTSECTION char* let_statement(){
636+char* let_statement(){
630637 char* err;
631638 char b2,b3;
632639 int i,spos,opos;
@@ -718,7 +725,7 @@ OBJECTSECTION char* let_statement(){
718725 return 0;
719726 }
720727
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){
722729 char* err;
723730 char b1;
724731 int i;
@@ -773,21 +780,21 @@ OBJECTSECTION char* print_statement_main(enum libs lib_printstr, enum libs lib_s
773780 return 0;
774781 }
775782
776-OBJECTSECTION char* break_statement(){
783+char* break_statement(){
777784 check_obj_space(2);
778785 g_object[g_objpos++]=0x08160000; // j xxxx (See link() function)
779786 g_object[g_objpos++]=0x00000000; // nop
780787 return 0;
781788 }
782789
783-OBJECTSECTION char* continue_statement(){
790+char* continue_statement(){
784791 check_obj_space(2);
785792 g_object[g_objpos++]=0x08160008; // j xxxx (See link() function)
786793 g_object[g_objpos++]=0x00000000; // nop
787794 return 0;
788795 }
789796
790-OBJECTSECTION char* for_statement(){
797+char* for_statement(){
791798 char* err;
792799 // char b1;
793800 int i;
@@ -852,7 +859,7 @@ OBJECTSECTION char* for_statement(){
852859 return 0;
853860 }
854861
855-OBJECTSECTION char* next_statement(){
862+char* next_statement(){
856863 // Return to address stored in 4($sp)
857864 // while set $v0 to 8($sp) (see for_statement)
858865 // Following assembly must be 4 words.
@@ -865,7 +872,7 @@ OBJECTSECTION char* next_statement(){
865872 return 0;
866873 }
867874
868-OBJECTSECTION char* do_statement(){
875+char* do_statement(){
869876 char* err;
870877 // Usage of stack:
871878 // 4(sp): Address to return to in "DO" statement.
@@ -899,7 +906,7 @@ OBJECTSECTION char* do_statement(){
899906 }
900907 }
901908
902-OBJECTSECTION char* loop_statement(){
909+char* loop_statement(){
903910 char* err;
904911 int opos;
905912 opos=g_objpos;
@@ -928,7 +935,7 @@ OBJECTSECTION char* loop_statement(){
928935 return 0;
929936 }
930937
931-OBJECTSECTION char* while_statement(){
938+char* while_statement(){
932939 char* err;
933940 check_obj_space(3);
934941 g_object[g_objpos++]=0x04130001; // bgezall zero,label1:
@@ -944,7 +951,7 @@ OBJECTSECTION char* while_statement(){
944951 // label2:
945952 }
946953
947-OBJECTSECTION char* wend_statement(){
954+char* wend_statement(){
948955 check_obj_space(4);
949956 g_object[g_objpos++]=0x8FBF0004; // lw ra,4(sp)
950957 g_object[g_objpos++]=0x03E00008; // jr ra
@@ -954,7 +961,7 @@ OBJECTSECTION char* wend_statement(){
954961 return 0;
955962 }
956963
957-OBJECTSECTION char* param4_statement(enum libs lib){
964+char* param4_statement(enum libs lib){
958965 // lib is either LIB_PALETTE or LIB_GPALETTE
959966 // PALETTE N,R,G,B
960967 char* err;
@@ -989,7 +996,7 @@ OBJECTSECTION char* param4_statement(enum libs lib){
989996 return 0;
990997 }
991998
992-OBJECTSECTION char* param3_statement(enum libs lib){
999+char* param3_statement(enum libs lib){
9931000 char* err;
9941001 // Get 1st parameter
9951002 err=get_value();
@@ -1015,17 +1022,17 @@ OBJECTSECTION char* param3_statement(enum libs lib){
10151022 return 0;
10161023 }
10171024
1018-OBJECTSECTION char* bgcolor_statement(){
1025+char* bgcolor_statement(){
10191026 // BGCOLOR R,G,B
10201027 return param3_statement(LIB_BGCOLOR);
10211028 }
10221029
1023-OBJECTSECTION char* pcg_statement(){
1030+char* pcg_statement(){
10241031 // PCG ASCII,D1,D2
10251032 return param3_statement(LIB_PCG);
10261033 }
10271034
1028-OBJECTSECTION char* usepcg_statement(){
1035+char* usepcg_statement(){
10291036 int objpos=g_objpos;
10301037 if (get_value()) {
10311038 // Getting integer failed.
@@ -1039,7 +1046,7 @@ OBJECTSECTION char* usepcg_statement(){
10391046 return 0;
10401047 }
10411048
1042-OBJECTSECTION char* usegraphic_statement(){
1049+char* usegraphic_statement(){
10431050 int objpos=g_objpos;
10441051 if (get_value()) {
10451052 // Getting integer failed.
@@ -1053,17 +1060,17 @@ OBJECTSECTION char* usegraphic_statement(){
10531060 return 0;
10541061 }
10551062
1056-OBJECTSECTION char* cls_statement(){
1063+char* cls_statement(){
10571064 call_lib_code(LIB_CLS);
10581065 return 0;
10591066 }
10601067
1061-OBJECTSECTION char* gcls_statement(){
1068+char* gcls_statement(){
10621069 call_lib_code(LIB_GCLS);
10631070 return 0;
10641071 }
10651072
1066-OBJECTSECTION char* color_statement(){
1073+char* color_statement(){
10671074 char* err;
10681075 err=get_value();
10691076 if (err) return err;
@@ -1071,7 +1078,7 @@ OBJECTSECTION char* color_statement(){
10711078 return 0;
10721079 }
10731080
1074-OBJECTSECTION char* gcolor_statement(){
1081+char* gcolor_statement(){
10751082 char* err;
10761083 err=get_value();
10771084 if (err) return err;
@@ -1079,7 +1086,7 @@ OBJECTSECTION char* gcolor_statement(){
10791086 return 0;
10801087 }
10811088
1082-OBJECTSECTION char* param2_statement(enum libs lib){
1089+char* param2_statement(enum libs lib){
10831090 char* err;
10841091 // Get 1st
10851092 err=get_value();
@@ -1098,7 +1105,7 @@ OBJECTSECTION char* param2_statement(enum libs lib){
10981105 return 0;
10991106 }
11001107
1101-OBJECTSECTION char* system_statement(){
1108+char* system_statement(){
11021109 // SYSTEM X,Y
11031110 char* err;
11041111 // Get 1st
@@ -1119,17 +1126,17 @@ OBJECTSECTION char* system_statement(){
11191126 return 0;
11201127 }
11211128
1122-OBJECTSECTION char* cursor_statement(){
1129+char* cursor_statement(){
11231130 // CURSOR X,Y
11241131 return param2_statement(LIB_CURSOR);
11251132 }
11261133
1127-OBJECTSECTION char* scroll_statement(){
1134+char* scroll_statement(){
11281135 // SCROLL X,Y
11291136 return param2_statement(LIB_SCROLL);
11301137 }
11311138
1132-OBJECTSECTION char* drawcount_statement(){
1139+char* drawcount_statement(){
11331140 char* err;
11341141 err=get_value();
11351142 if (err) return err;
@@ -1137,7 +1144,7 @@ OBJECTSECTION char* drawcount_statement(){
11371144 return 0;
11381145 }
11391146
1140-OBJECTSECTION char* wait_statement(){
1147+char* wait_statement(){
11411148 char* err;
11421149 err=get_value();
11431150 if (err) return err;
@@ -1145,7 +1152,7 @@ OBJECTSECTION char* wait_statement(){
11451152 return 0;
11461153 }
11471154
1148-OBJECTSECTION char* width_statement(){
1155+char* width_statement(){
11491156 char* err;
11501157 err=get_value();
11511158 if (err) return err;
@@ -1153,7 +1160,7 @@ OBJECTSECTION char* width_statement(){
11531160 return 0;
11541161 }
11551162
1156-OBJECTSECTION char* var_statement_sub(int a0, int a1){
1163+char* var_statement_sub(int a0, int a1){
11571164 // Construct parameter-setting scripts
11581165 if (a0&0xffff0000) {
11591166 check_obj_space(1);
@@ -1184,7 +1191,7 @@ OBJECTSECTION char* var_statement_sub(int a0, int a1){
11841191 return 0;
11851192 }
11861193
1187-OBJECTSECTION char* var_statement(){
1194+char* var_statement(){
11881195 char* err;
11891196 int i,j,a0,a1;
11901197 static int prevpos;
@@ -1243,7 +1250,7 @@ OBJECTSECTION char* var_statement(){
12431250 }
12441251
12451252
1246-OBJECTSECTION char* graphic_statement(enum functions func){
1253+char* graphic_statement(enum functions func){
12471254 /*
12481255 PSET X1,Y1[,C]
12491256 LINE X1,Y1,X2,Y2[,C]
@@ -1376,7 +1383,7 @@ OBJECTSECTION char* graphic_statement(enum functions func){
13761383 return 0;
13771384 }
13781385
1379-OBJECTSECTION char* fopen_statement_main(enum functions func){
1386+char* fopen_statement_main(enum functions func){
13801387 // func is either FUNC_FOPENST or FUNC_FOPEN
13811388 char* err;
13821389 // Get 1st
@@ -1408,7 +1415,7 @@ OBJECTSECTION char* fopen_statement_main(enum functions func){
14081415 return 0;
14091416 }
14101417
1411-OBJECTSECTION char* file_statement(){
1418+char* file_statement(){
14121419 char* err;
14131420 err=get_value();
14141421 if (err) return err;
@@ -1416,7 +1423,7 @@ OBJECTSECTION char* file_statement(){
14161423 return 0;
14171424 }
14181425
1419-OBJECTSECTION char* fclose_statement(){
1426+char* fclose_statement(){
14201427 char* err;
14211428 int orgpos=g_srcpos;
14221429 if (endOfStatement()) {
@@ -1435,25 +1442,25 @@ OBJECTSECTION char* fclose_statement(){
14351442
14361443 TODO: candidates to add:
14371444
1438-int FSattrib (FSFILE * file, unsigned char attributes);
1445+// int FSattrib (FSFILE * file, unsigned char attributes);
14391446 int FSrename (const char * fileName, FSFILE * fo);
14401447 int FSmkdir (char * path);
14411448 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);
14431450 int FindFirst (const char * fileName, unsigned int attr, SearchRec * rec);
14441451 int FindNext (SearchRec * rec);
14451452
14461453 */
14471454
1448-OBJECTSECTION char* fget_statement(){
1455+char* fget_statement(){
14491456 return param2_statement(LIB_FILE | FUNC_FGET);
14501457 }
14511458
1452-OBJECTSECTION char* fput_statement(){
1459+char* fput_statement(){
14531460 return param2_statement(LIB_FILE | FUNC_FPUT);
14541461 }
14551462
1456-OBJECTSECTION char* fseek_statement(){
1463+char* fseek_statement(){
14571464 char* err;
14581465 err=get_value();
14591466 if (err) return err;
@@ -1461,7 +1468,7 @@ OBJECTSECTION char* fseek_statement(){
14611468 return 0;
14621469 }
14631470
1464-OBJECTSECTION char* fputc_statement(){
1471+char* fputc_statement(){
14651472 char* err;
14661473 err=get_value();
14671474 if (err) return err;
@@ -1469,7 +1476,7 @@ OBJECTSECTION char* fputc_statement(){
14691476 return 0;
14701477 }
14711478
1472-OBJECTSECTION char* fremove_statement(){
1479+char* fremove_statement(){
14731480 char* err;
14741481 err=get_string();
14751482 if (err) return err;
@@ -1477,7 +1484,7 @@ OBJECTSECTION char* fremove_statement(){
14771484 return 0;
14781485 }
14791486
1480-OBJECTSECTION char* usevar_statement(){
1487+char* usevar_statement(){
14811488 char* err;
14821489 int i;
14831490 do {
@@ -1497,7 +1504,7 @@ OBJECTSECTION char* usevar_statement(){
14971504 return 0;
14981505 }
14991506
1500-OBJECTSECTION char* playwave_statement(){
1507+char* playwave_statement(){
15011508 char* err;
15021509 err=get_string();
15031510 if (err) return err;
@@ -1520,7 +1527,7 @@ OBJECTSECTION char* playwave_statement(){
15201527 return 0;
15211528 }
15221529
1523-OBJECTSECTION char* useclass_statement(){
1530+char* useclass_statement(){
15241531 char* err;
15251532 int i;
15261533 int* cmpdata;
@@ -1556,7 +1563,7 @@ OBJECTSECTION char* useclass_statement(){
15561563 return 0;
15571564 }
15581565
1559-OBJECTSECTION char* setdir_statement(){
1566+char* setdir_statement(){
15601567 char* err;
15611568 err=get_string();
15621569 if (err) return err;
@@ -1564,7 +1571,7 @@ OBJECTSECTION char* setdir_statement(){
15641571 return 0;
15651572 }
15661573
1567-OBJECTSECTION char* option_statement(){
1574+char* option_statement(){
15681575 while(1){
15691576 next_position();
15701577 if (nextCodeIs("NOLINENUM")) {
@@ -1594,7 +1601,7 @@ OBJECTSECTION char* option_statement(){
15941601 return 0;
15951602 }
15961603
1597-OBJECTSECTION char* idle_statement(){
1604+char* idle_statement(){
15981605 check_obj_space(2);
15991606 g_object[g_objpos++]=0x42000020; // wait
16001607 return 0;
@@ -1609,67 +1616,67 @@ OBJECTSECTION char* idle_statement(){
16091616
16101617 // Aliases follow
16111618
1612-OBJECTSECTION char* poke_statement(){
1619+char* poke_statement(){
16131620 return poke_statement_sub(8);
16141621 }
16151622
1616-OBJECTSECTION char* poke16_statement(){
1623+char* poke16_statement(){
16171624 return poke_statement_sub(16);
16181625 }
16191626
1620-OBJECTSECTION char* poke32_statement(){
1627+char* poke32_statement(){
16211628 return poke_statement_sub(32);
16221629 }
16231630
1624-OBJECTSECTION char* palette_statement(){
1631+char* palette_statement(){
16251632 return param4_statement(LIB_PALETTE);
16261633 }
16271634
1628-OBJECTSECTION char* gpalette_statement(){
1635+char* gpalette_statement(){
16291636 return param4_statement(LIB_GPALETTE);
16301637 }
16311638
1632-OBJECTSECTION char* print_statement(){
1639+char* print_statement(){
16331640 return print_statement_main(LIB_PRINTSTR,LIB_STRING);
16341641 }
16351642
1636-OBJECTSECTION char* pset_statement(){
1643+char* pset_statement(){
16371644 return graphic_statement(FUNC_PSET);
16381645 }
16391646
1640-OBJECTSECTION char* line_statement(){
1647+char* line_statement(){
16411648 return graphic_statement(FUNC_LINE);
16421649 }
16431650
1644-OBJECTSECTION char* boxfill_statement(){
1651+char* boxfill_statement(){
16451652 return graphic_statement(FUNC_BOXFILL);
16461653 }
16471654
1648-OBJECTSECTION char* circle_statement(){
1655+char* circle_statement(){
16491656 return graphic_statement(FUNC_CIRCLE);
16501657 }
16511658
1652-OBJECTSECTION char* circlefill_statement(){
1659+char* circlefill_statement(){
16531660 return graphic_statement(FUNC_CIRCLEFILL);
16541661 }
16551662
1656-OBJECTSECTION char* gprint_statement(){
1663+char* gprint_statement(){
16571664 return graphic_statement(FUNC_GPRINT);
16581665 }
16591666
1660-OBJECTSECTION char* putbmp_statement(){
1667+char* putbmp_statement(){
16611668 return graphic_statement(FUNC_PUTBMP);
16621669 }
16631670
1664-OBJECTSECTION char* point_statement(){
1671+char* point_statement(){
16651672 return graphic_statement(FUNC_POINT);
16661673 }
16671674
1668-OBJECTSECTION char* fopen_statement(){
1675+char* fopen_statement(){
16691676 return fopen_statement_main(FUNC_FOPENST);
16701677 }
16711678
1672-OBJECTSECTION char* fprint_statement(){
1679+char* fprint_statement(){
16731680 return print_statement_main(LIB_FILE | FUNC_FPRINTSTR,LIB_FILE | FUNC_FSTRING);
16741681 }
16751682
@@ -1754,11 +1761,13 @@ static const void* statement_list[]={
17541761 "INTERRUPT ",interrupt_statement,
17551762 "IDLE",idle_statement,
17561763 "CORETIMER",coretimer_statement,
1764+ "USECLIB",useclib_statement,
1765+ "CLIB",clib_statement,
17571766 // List of additional statements follows
17581767 ADDITIONAL_STATEMENTS
17591768 };
17601769
1761-OBJECTSECTION char* statement(void){
1770+char* statement(void){
17621771 char* err;
17631772 int prevpos;
17641773 int i;
--- a/mips/zoea/string.c
+++ b/mips/zoea/string.c
@@ -15,6 +15,13 @@
1515 char* simple_string(void);
1616 */
1717
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+
1825 #include "api.h"
1926 #include "compiler.h"
2027
--- a/mips/zoea/value.c
+++ b/mips/zoea/value.c
@@ -13,6 +13,13 @@
1313 Public function is only get_value().
1414 */
1515
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+
1623 #include "compiler.h"
1724
1825 char* get_value();
--- a/mips/zoea/varname.c
+++ b/mips/zoea/varname.c
@@ -32,6 +32,7 @@ static const int reserved_var_names[]={
3232 0x0001129b, /*CHR*/
3333 0x0e7f3303, /*CIRCLE*/
3434 0x0067525f, /*CLEAR*/
35+ 0x0003c489, /*CLIB*/
3536 0x00011330, /*CLS*/
3637 0x0069cb6b, /*COLOR*/
3738 0x0001139f, /*COS*/
@@ -194,6 +195,18 @@ int check_var_name(){
194195 return i;
195196 }
196197
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+
197210 /*
198211 int get_var_number();
199212 This function returns variable number that can be used as the index of $s8