• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

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

BASIC compiler/interpreter for PIC32MX/MZ-80K


Commit MetaInfo

Revision1865a0625fca40494883b376c88ef51f18961e88 (tree)
Time2019-06-02 17:36:37
AuthorKatsumi <kmorimatsu@sour...>
CommiterKatsumi

Log Message

Debug for loading correct length of CLIB. Store $gp when interrupt.

Change Summary

Incremental Difference

--- a/mips/clib/clib.c
+++ b/mips/clib/clib.c
@@ -47,6 +47,13 @@ void* CLIBINIT clib_init(void*** data){
4747 return (void*)&clibdata[0];
4848 }
4949
50+const void* const g_adjustment[]={ adjustment };
51+void* adjustment(void){
52+ asm volatile("la $v0,%0"::"i"(&g_adjustment[0]));
53+ asm volatile("lw $v0,0($v0)");
54+ asm volatile("subu $v0,$t9,$v0");
55+}
56+
5057 // Function to get g_data in $v0
5158 void*** __attribute__((section("clib_g_data"))) clib_g_data(){ return g_data; }
5259
@@ -97,122 +104,93 @@ void*** __attribute__((section("clib_g_data"))) clib_g_data(){ return g_data; }
97104 asm volatile("jr $v0")
98105
99106 // call lib_calloc_memory() function
100-void* __attribute__((section("clib_calloc")))
101-clib_calloc(int size, void*** g_data)
107+void* clib_calloc(int size, void*** g_data)
102108 { machikania_function("$a1","4","0"); }
103109
104110 // call lib_delete() function
105-void __attribute__((section("clib_free")))
106-clib_free(void* addr, void*** g_data)
111+void clib_free(void* addr, void*** g_data)
107112 { machikania_function("$a1","4","4"); }
108113
109114 // Video functions
110-void __attribute__((section("start_composite")))
111-clib_start_composite(void*** data)
115+void clib_start_composite(void*** data)
112116 { machikania_function("$a0","12","0"); }
113117
114-void __attribute__((section("stop_composite")))
115-clib_stop_composite(void*** data)
118+void clib_stop_composite(void*** data)
116119 { machikania_function("$a0","12","4"); }
117120
118-void __attribute__((section("printchar")))
119-clib_printchar(unsigned char n,void*** data)
121+void clib_printchar(unsigned char n,void*** data)
120122 { machikania_function("$a1","12","8"); }
121123
122-void __attribute__((section("printstr")))
123-clib_printstr(unsigned char *s,void*** data)
124+void clib_printstr(unsigned char *s,void*** data)
124125 { machikania_function("$a1","12","12"); }
125126
126-void __attribute__((section("printnum")))
127-clib_printnum(unsigned int n,void*** data)
127+void clib_printnum(unsigned int n,void*** data)
128128 { machikania_function("$a1","12","16"); }
129129
130-void __attribute__((section("printnum2")))
131-clib_printnum2(unsigned int n,unsigned char e,void*** data)
130+void clib_printnum2(unsigned int n,unsigned char e,void*** data)
132131 { machikania_function("$a2","12","20"); }
133132
134-void __attribute__((section("cls")))
135-clib_cls(void*** data)
133+void clib_cls(void*** data)
136134 { machikania_function("$a0","12","24"); }
137135
138-void __attribute__((section("vramscroll")))
139-clib_vramscroll(void*** data)
136+void clib_vramscroll(void*** data)
140137 { machikania_function("$a0","12","28"); }
141138
142-void __attribute__((section("setcursorcolor")))
143-clib_setcursorcolor(unsigned char c,void*** data)
139+void clib_setcursorcolor(unsigned char c,void*** data)
144140 { machikania_function("$a1","12","32"); }
145141
146-void __attribute__((section("setcursor")))
147-clib_setcursor(unsigned char x,unsigned char y,unsigned char c,void*** data)
142+void clib_setcursor(unsigned char x,unsigned char y,unsigned char c,void*** data)
148143 { machikania_function("$a3","12","36"); }
149144
150-void __attribute__((section("set_palette")))
151-clib_set_palette(unsigned char n,unsigned char b,unsigned char r,unsigned char g,void*** data)
145+void clib_set_palette(unsigned char n,unsigned char b,unsigned char r,unsigned char g,void*** data)
152146 { machikania_function_sp("16","12","40"); }
153147
154-void __attribute__((section("set_bgcolor")))
155-clib_set_bgcolor(unsigned char b,unsigned char r,unsigned char g,void*** data)
148+void clib_set_bgcolor(unsigned char b,unsigned char r,unsigned char g,void*** data)
156149 { machikania_function("$a3","12","44"); }
157150
158151 // Graphic functions
159-void __attribute__((section("g_pset")))
160-clib_g_pset(int x,int y,unsigned int c,void*** data)
152+void clib_g_pset(int x,int y,unsigned int c,void*** data)
161153 { machikania_function("$a3","16","0"); }
162154
163-void __attribute__((section("g_putbmpmn")))
164-clib_g_putbmpmn(int x,int y,char m,char n,const unsigned char bmp[],void*** data)
155+void clib_g_putbmpmn(int x,int y,char m,char n,const unsigned char bmp[],void*** data)
165156 { machikania_function_sp("20","16","4"); }
166157
167-void __attribute__((section("g_clrbmpmn")))
168-clib_g_clrbmpmn(int x,int y,char m,char n,void*** data)
158+void clib_g_clrbmpmn(int x,int y,char m,char n,void*** data)
169159 { machikania_function_sp("16","16","8"); }
170160
171-void __attribute__((section("g_gline")))
172-clib_g_gline(int x1,int y1,int x2,int y2,unsigned int c,void*** data)
161+void clib_g_gline(int x1,int y1,int x2,int y2,unsigned int c,void*** data)
173162 { machikania_function_sp("20","16","12"); }
174163
175-void __attribute__((section("g_hline")))
176-clib_g_hline(int x1,int x2,int y,unsigned int c,void*** data)
164+void clib_g_hline(int x1,int x2,int y,unsigned int c,void*** data)
177165 { machikania_function_sp("16","16","16"); }
178166
179-void __attribute__((section("g_circle")))
180-clib_g_circle(int x0,int y0,unsigned int r,unsigned int c,void*** data)
167+void clib_g_circle(int x0,int y0,unsigned int r,unsigned int c,void*** data)
181168 { machikania_function_sp("16","16","20"); }
182169
183-void __attribute__((section("g_circlefill")))
184-clib_g_circlefill(int x0,int y0,unsigned int r,unsigned int c,void*** data)
170+void clib_g_circlefill(int x0,int y0,unsigned int r,unsigned int c,void*** data)
185171 { machikania_function_sp("16","16","24"); }
186172
187-void __attribute__((section("g_boxfill")))
188-clib_g_boxfill(int x1,int y1,int x2,int y2,unsigned int c,void*** data)
173+void clib_g_boxfill(int x1,int y1,int x2,int y2,unsigned int c,void*** data)
189174 { machikania_function_sp("20","16","28"); }
190175
191-void __attribute__((section("g_putfont")))
192-clib_g_putfont(int x,int y,unsigned int c,int bc,unsigned char n,void*** data)
176+void clib_g_putfont(int x,int y,unsigned int c,int bc,unsigned char n,void*** data)
193177 { machikania_function_sp("20","16","32"); }
194178
195-void __attribute__((section("g_printstr")))
196-clib_g_printstr(int x,int y,unsigned int c,int bc,unsigned char *s,void*** data)
179+void clib_g_printstr(int x,int y,unsigned int c,int bc,unsigned char *s,void*** data)
197180 { machikania_function_sp("20","16","36"); }
198181
199-void __attribute__((section("g_printnum")))
200-clib_g_printnum(int x,int y,unsigned char c,int bc,unsigned int n,void*** data)
182+void clib_g_printnum(int x,int y,unsigned char c,int bc,unsigned int n,void*** data)
201183 { machikania_function_sp("20","16","40"); }
202184
203-void __attribute__((section("g_printnum2")))
204-clib_g_printnum2(int x,int y,unsigned char c,int bc,unsigned int n,unsigned char e,void*** data)
185+void clib_g_printnum2(int x,int y,unsigned char c,int bc,unsigned int n,unsigned char e,void*** data)
205186 { machikania_function_sp("24","16","44"); }
206187
207-unsigned int __attribute__((section("g_color")))
208-clib_g_color(int x,int y,void*** data)
188+unsigned int clib_g_color(int x,int y,void*** data)
209189 { machikania_function("$a2","16","48"); }
210190
211191 // Keyboard functions
212-unsigned char __attribute__((section("shiftkeys")))
213-clib_shiftkeys(void*** data)
192+unsigned char clib_shiftkeys(void*** data)
214193 { machikania_function("$a0","20","0"); }
215194
216-unsigned char __attribute__((section("ps2readkey")))
217-clib_ps2readkey(void*** data)
195+unsigned char clib_ps2readkey(void*** data)
218196 { machikania_function("$a0","20","4"); }
--- a/mips/clib/clib.h
+++ b/mips/clib/clib.h
@@ -18,12 +18,18 @@ extern const void* const functions[];
1818
1919 // Prototypes
2020 /*
21- init();
22- This function must be defined by user.
23- It will be called when initializing library.
21+ * void init(void);
22+ * This function must be defined by user.
23+ * It will be called when initializing library.
2424 */
2525 void init(void);
2626
27+/*
28+ * void* adjustment(void);
29+ * Use this function to determine the adjustment value of const pointers.
30+ */
31+void* adjustment(void);
32+
2733 // Variable used in clib.c
2834 extern void*** g_data;
2935
--- a/mips/clib/clib_p32MX370F512H.ld
+++ b/mips/clib/clib_p32MX370F512H.ld
@@ -103,8 +103,8 @@ _GEN_EXCPT_ADDR = _ebase_address + 0x180;
103103 MEMORY
104104 {
105105 kseg1_data_mem (w!x) : ORIGIN = (0xA0008000-0x080), LENGTH = 0x080
106- kseg2_program_mem (rx) : ORIGIN = (0xA0008000) , LENGTH = 0x050
107- kseg0_program_mem (rx) : ORIGIN = (0xA0008000+0x050), LENGTH = (0x18000-0x050)
106+ kseg2_program_mem (rx) : ORIGIN = (0xA0008000) , LENGTH = 0x080
107+ kseg0_program_mem (rx) : ORIGIN = (0xA0008000+0x080), LENGTH = (0x18000-0x080)
108108 kseg0_boot_mem : ORIGIN = (0x9D006000+0x1000+0x490), LENGTH = 0 /* dummy */
109109 exception_mem : ORIGIN = 0x9D006000, LENGTH = 0x1000
110110 kseg1_boot_mem : ORIGIN = (0x9D006000+0x1000), LENGTH = 0x490
--- a/mips/clib/nbproject/Makefile-default.mk
+++ b/mips/clib/nbproject/Makefile-default.mk
@@ -110,38 +110,38 @@ ${OBJECTDIR}/clib.o: clib.c nbproject/Makefile-${CND_CONF}.mk
110110 @${MKDIR} "${OBJECTDIR}"
111111 @${RM} ${OBJECTDIR}/clib.o.d
112112 @${RM} ${OBJECTDIR}/clib.o
113- @${FIXDEPS} "${OBJECTDIR}/clib.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_SIMULATOR=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -O1 -MMD -MF "${OBJECTDIR}/clib.o.d" -o ${OBJECTDIR}/clib.o clib.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
113+ @${FIXDEPS} "${OBJECTDIR}/clib.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_SIMULATOR=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -ffunction-sections -O1 -MMD -MF "${OBJECTDIR}/clib.o.d" -o ${OBJECTDIR}/clib.o clib.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
114114
115115 ${OBJECTDIR}/example.o: example.c nbproject/Makefile-${CND_CONF}.mk
116116 @${MKDIR} "${OBJECTDIR}"
117117 @${RM} ${OBJECTDIR}/example.o.d
118118 @${RM} ${OBJECTDIR}/example.o
119- @${FIXDEPS} "${OBJECTDIR}/example.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_SIMULATOR=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -O1 -MMD -MF "${OBJECTDIR}/example.o.d" -o ${OBJECTDIR}/example.o example.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
119+ @${FIXDEPS} "${OBJECTDIR}/example.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_SIMULATOR=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -ffunction-sections -O1 -MMD -MF "${OBJECTDIR}/example.o.d" -o ${OBJECTDIR}/example.o example.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
120120
121121 ${OBJECTDIR}/sdfsio370f.o: sdfsio370f.c nbproject/Makefile-${CND_CONF}.mk
122122 @${MKDIR} "${OBJECTDIR}"
123123 @${RM} ${OBJECTDIR}/sdfsio370f.o.d
124124 @${RM} ${OBJECTDIR}/sdfsio370f.o
125- @${FIXDEPS} "${OBJECTDIR}/sdfsio370f.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_SIMULATOR=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -O1 -MMD -MF "${OBJECTDIR}/sdfsio370f.o.d" -o ${OBJECTDIR}/sdfsio370f.o sdfsio370f.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
125+ @${FIXDEPS} "${OBJECTDIR}/sdfsio370f.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_SIMULATOR=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -ffunction-sections -O1 -MMD -MF "${OBJECTDIR}/sdfsio370f.o.d" -o ${OBJECTDIR}/sdfsio370f.o sdfsio370f.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
126126
127127 else
128128 ${OBJECTDIR}/clib.o: clib.c nbproject/Makefile-${CND_CONF}.mk
129129 @${MKDIR} "${OBJECTDIR}"
130130 @${RM} ${OBJECTDIR}/clib.o.d
131131 @${RM} ${OBJECTDIR}/clib.o
132- @${FIXDEPS} "${OBJECTDIR}/clib.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -O1 -MMD -MF "${OBJECTDIR}/clib.o.d" -o ${OBJECTDIR}/clib.o clib.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
132+ @${FIXDEPS} "${OBJECTDIR}/clib.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -ffunction-sections -O1 -MMD -MF "${OBJECTDIR}/clib.o.d" -o ${OBJECTDIR}/clib.o clib.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
133133
134134 ${OBJECTDIR}/example.o: example.c nbproject/Makefile-${CND_CONF}.mk
135135 @${MKDIR} "${OBJECTDIR}"
136136 @${RM} ${OBJECTDIR}/example.o.d
137137 @${RM} ${OBJECTDIR}/example.o
138- @${FIXDEPS} "${OBJECTDIR}/example.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -O1 -MMD -MF "${OBJECTDIR}/example.o.d" -o ${OBJECTDIR}/example.o example.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
138+ @${FIXDEPS} "${OBJECTDIR}/example.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -ffunction-sections -O1 -MMD -MF "${OBJECTDIR}/example.o.d" -o ${OBJECTDIR}/example.o example.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
139139
140140 ${OBJECTDIR}/sdfsio370f.o: sdfsio370f.c nbproject/Makefile-${CND_CONF}.mk
141141 @${MKDIR} "${OBJECTDIR}"
142142 @${RM} ${OBJECTDIR}/sdfsio370f.o.d
143143 @${RM} ${OBJECTDIR}/sdfsio370f.o
144- @${FIXDEPS} "${OBJECTDIR}/sdfsio370f.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -O1 -MMD -MF "${OBJECTDIR}/sdfsio370f.o.d" -o ${OBJECTDIR}/sdfsio370f.o sdfsio370f.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
144+ @${FIXDEPS} "${OBJECTDIR}/sdfsio370f.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -ffunction-sections -O1 -MMD -MF "${OBJECTDIR}/sdfsio370f.o.d" -o ${OBJECTDIR}/sdfsio370f.o sdfsio370f.c -DXPRJ_default=$(CND_CONF) -legacy-libc $(COMPARISON_BUILD) -mgen-pie-static
145145
146146 endif
147147
--- a/mips/clib/nbproject/Makefile-genesis.properties
+++ b/mips/clib/nbproject/Makefile-genesis.properties
@@ -1,8 +1,8 @@
11 #
2-#Tue May 21 13:54:07 PDT 2019
2+#Sat Jun 01 16:04:38 PDT 2019
33 default.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=f2639e8ffe4e3a80ef2cdaeba61da340
44 default.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.42\\bin
5-configurations-xml=2f3193434ad25f263dc0e914df895fd6
5+configurations-xml=0f7d9f26d39451c027590563406c3f79
66 com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=52742b11d992fb0dd234edfb95066b34
77 default.languagetoolchain.version=1.42
88 host.platform=windows
--- a/mips/clib/nbproject/configurations.xml
+++ b/mips/clib/nbproject/configurations.xml
@@ -76,7 +76,7 @@
7676 <property key="extra-include-directories" value=""/>
7777 <property key="generate-16-bit-code" value="false"/>
7878 <property key="generate-micro-compressed-code" value="false"/>
79- <property key="isolate-each-function" value="false"/>
79+ <property key="isolate-each-function" value="true"/>
8080 <property key="make-warnings-into-errors" value="false"/>
8181 <property key="optimization-level" value="-O1"/>
8282 <property key="place-data-into-section" value="false"/>
--- a/mips/clib/nbproject/private/private.xml
+++ b/mips/clib/nbproject/private/private.xml
@@ -6,6 +6,7 @@
66 <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/clib.h</file>
77 <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/clib.c</file>
88 <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/sdfsio370f.c</file>
9+ <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/clib_p32MX370F512H.ld</file>
910 <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/example.c</file>
1011 </group>
1112 </open-files>
--- a/mips/clib/sdfsio370f.c
+++ b/mips/clib/sdfsio370f.c
@@ -24,36 +24,36 @@ void clib_g_data();
2424 asm volatile("lw $gp,0($v1)");\
2525 asm volatile("jalr $v0")
2626
27-int __attribute__((section("FSInit"))) FSInit(void)
27+int FSInit(void)
2828 { machikania_file("0"); }
29-FSFILE * __attribute__((section("FSfopen"))) FSfopen (const char * fileName, const char *mode)
29+FSFILE * FSfopen (const char * fileName, const char *mode)
3030 { machikania_file("4"); }
31-int __attribute__((section("FSfclose"))) FSfclose(FSFILE *fo)
31+int FSfclose(FSFILE *fo)
3232 { machikania_file("8"); }
33-size_t __attribute__((section("FSfread"))) FSfread(void *ptr, size_t size, size_t n, FSFILE *stream)
33+size_t FSfread(void *ptr, size_t size, size_t n, FSFILE *stream)
3434 { machikania_file("12"); }
35-size_t __attribute__((section("FSfwrite"))) FSfwrite(const void *data_to_write, size_t size, size_t n, FSFILE *stream)
35+size_t FSfwrite(const void *data_to_write, size_t size, size_t n, FSFILE *stream)
3636 { machikania_file("16"); }
37-int __attribute__((section("FSfeof"))) FSfeof( FSFILE * stream )
37+int FSfeof( FSFILE * stream )
3838 { machikania_file("20"); }
39-long __attribute__((section("FSftell"))) FSftell (FSFILE * fo)
39+long FSftell (FSFILE * fo)
4040 { machikania_file("24"); }
41-int __attribute__((section("FSfseek"))) FSfseek(FSFILE *stream, long offset, int whence)
41+int FSfseek(FSFILE *stream, long offset, int whence)
4242 { machikania_file("28"); }
43-void __attribute__((section("FSrewind"))) FSrewind (FSFILE * fo)
43+void FSrewind (FSFILE * fo)
4444 { machikania_file("32"); }
45-int __attribute__((section("FindFirst"))) FindFirst (const char * fileName, unsigned int attr, SearchRec * rec)
45+int FindFirst (const char * fileName, unsigned int attr, SearchRec * rec)
4646 { machikania_file("36"); }
47-int __attribute__((section("FindNext"))) FindNext (SearchRec * rec)
47+int FindNext (SearchRec * rec)
4848 { machikania_file("40"); }
49-int __attribute__((section("FSmkdir"))) FSmkdir (char * path)
49+int FSmkdir (char * path)
5050 { machikania_file("44"); }
51-char * __attribute__((section("FSgetcwd"))) FSgetcwd (char * path, int numchars)
51+char * FSgetcwd (char * path, int numchars)
5252 { machikania_file("48"); }
53-int __attribute__((section("FSchdir"))) FSchdir (char * path)
53+int FSchdir (char * path)
5454 { machikania_file("52"); }
55-int __attribute__((section("FSremove"))) FSremove (const char * fileName)
55+int FSremove (const char * fileName)
5656 { machikania_file("56"); }
57-int __attribute__((section("FSrename"))) FSrename (const char * fileName, FSFILE * fo)
57+int FSrename (const char * fileName, FSFILE * fo)
5858 { machikania_file("60"); }
5959
--- a/mips/megalopa/clib.c
+++ b/mips/megalopa/clib.c
@@ -192,7 +192,7 @@ char* clib_main(){
192192 if (addr<0x00100000) {
193193 // Address is valid only when <0x00100000 (in the RAM)
194194 if (addr<begin) begin=addr;
195- if (end<addr && addr<0x000fffff) {
195+ if (end<=addr) {
196196 end=addr+g_hexline.size;
197197 }
198198 }
--- a/mips/megalopa/clib.txt
+++ b/mips/megalopa/clib.txt
@@ -58,9 +58,11 @@ example.c
5858 Compiler Toochains: XC32 (v1.42以降)
5959 Categories: xc32-gcc
6060 Additinal options: -mgen-pie-static
61+ Option categories: General
62+ Isolate each function in a section: チェックを入れる
6163 Option categories: Optimization
6264 optimization-level: 1
63- Generated Command Line: -g -O1
65+ Generated Command Line: -g -ffunction-sections -O1
6466 Categories: xc32-ld
6567 Additional options: --no-data-init
6668 Option categories: General
--- a/mips/megalopa/compiler.h
+++ b/mips/megalopa/compiler.h
@@ -579,3 +579,28 @@ extern int g_int_vector[];
579579
580580 // Check if within RAM
581581 #define withinRAM(x) ((&RAM[0])<=((char*)(x)) && ((char*)(x))<(&RAM[RAMSIZE]))
582+
583+// Macros to push, restore, and pop $gp for supporting CLIB
584+extern void* g_gp_stack_pointer;
585+
586+#define push_restore_gp() \
587+ asm volatile("la $v1,%0"::"i"((int)&g_gp_stack_pointer));\
588+ asm volatile("di");\
589+ asm volatile("ehb");\
590+ asm volatile("lw $v0,0($v1)");\
591+ asm volatile("sw $gp,0($v0)");\
592+ asm volatile("addiu $v0,$v0,4");\
593+ asm volatile("sw $v0,0($v1)");\
594+ asm volatile("ei");\
595+ asm volatile("la $v1,%0"::"i"((int)&g_gp));\
596+ asm volatile("lw $gp,0($v1)")
597+
598+#define pop_gp() \
599+ asm volatile("la $v1,%0"::"i"(0+(int)&g_gp_stack_pointer));\
600+ asm volatile("di");\
601+ asm volatile("ehb");\
602+ asm volatile("lw $v0,0($v1)");\
603+ asm volatile("addiu $v0,$v0,-4");\
604+ asm volatile("lw $gp,0($v0)");\
605+ asm volatile("sw $v0,0($v1)");\
606+ asm volatile("ei")
--- a/mips/megalopa/debug.c
+++ b/mips/megalopa/debug.c
@@ -234,9 +234,7 @@ static const char initext[]=
234234
235235 static const char bastext[]=
236236 "useclib TCLIB\n"
237-"print TCLIB::TEST$(0);\n"
238-"print clib$(TCLIB::TEST,1)\n"
239-"\n"
237+"print hex$(TCLIB::TEST(1))\n"
240238 "\n"
241239 "\n"
242240 "\n"
@@ -260,42 +258,52 @@ static const char class2text[]=
260258
261259 static const char hextext[]=
262260 ":020000040000fa\n"
263-":1080000000001c3c707f9c2721e09903e0ffbd2706\n"
264-":108010001c00bfaf1000bcaf030080101880828f1f\n"
265-":1080200005000010000044ac1c80998f09f8200363\n"
266-":10803000000000001000bc8f2080828f1c00bf8fca\n"
261+":1080000000001c3cf07e9c2721e09903e0ffbd2787\n"
262+":108010001c00bfaf1000bcaf030080101c80828f1b\n"
263+":1080200005000010000044ac2080998f09f820035f\n"
264+":10803000000000001000bc8f2480828f1c00bf8fc6\n"
267265 ":088040000800e0032000bd2749\n"
268266 ":020000040000fa\n"
269-":107f80000000000000000080ac7f00a0508000a036\n"
270-":107f9000708100a0548100a0000001a0388100a0e1\n"
271-":0c7fa000588000a000000000000000005d\n"
267+":107f00000000000000000080bc8100a0347f00a0c1\n"
268+":107f1000ec8100a0c08100a0d08100a0a08100a0c1\n"
269+":107f2000000001a0848100a0808000a0000000006b\n"
270+":047f3000000000004d\n"
271+":020000040000fa\n"
272+":1080800000001c3c707e9c2721e09903e0ffbd2787\n"
273+":108090001c00bfaf1800b0af1000bcaf06008010ce\n"
274+":1080a0001c80908f01000224120082102880998f7a\n"
275+":1080b000150000103080828f0000048e2c80998f74\n"
276+":1080c00009f82003000000001000bc8f3080848f6e\n"
277+":1080d0003c8184240000058e3480998f09f82003a8\n"
278+":1080e000000000001000bc8f3080828f070000105d\n"
279+":1080f0001c81422409f82003000000001000bc8ffe\n"
280+":10810000030000101c00bf8f2c8142241c00bf8f75\n"
281+":0c8110001800b08f0800e0032000bd271d\n"
282+":020000040000fa\n"
283+":10811c0048656c6c6f20576f726c64210000000016\n"
284+":10812c00546869732069732061207465737400004e\n"
285+":10813c00434c494220746573742e000054455354cb\n"
286+":04814c00000000002f\n"
287+":020000040000fa\n"
288+":1081500000001c3ca07d9c2721e09903e0ffbd2787\n"
289+":108160001c00bfaf1000bcaf3880998f09f8200306\n"
290+":10817000000000001000bc8f1c00bf8f0800e0034f\n"
291+":048180002000bd27f7\n"
292+":020000040000fa\n"
293+":108184000000a38c0c00a28c0c00428c0800400060\n"
294+":0c81940000007c8c0800e00300000000ec\n"
272295 ":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"
296+":1081a0000000838c0c00828c1800428c0800400078\n"
297+":0c81b00000007c8c0800e00300000000d0\n"
285298 ":020000040000fa\n"
286-":1081040048656c6c6f20576f726c6421000000002e\n"
287-":108114005468697320697320612074657374000066\n"
288-":10812400434c494220746573742e000054455354e3\n"
289-":048134000000000047\n"
299+":1081bc00d08100a04001000080000000e08100a000\n"
300+":0481cc0000000000af\n"
290301 ":020000040000fa\n"
291-":108138000000a38c0c00a28c0c00428c08004000ac\n"
292-":0c81480000007c8c0800e0030000000038\n"
302+":1081d0001880828f0000428c0800e00323102203e5\n"
293303 ":020000040000fa\n"
294-":108154000000838c0c00828c1800428c08004000c4\n"
295-":0c81640000007c8c0800e003000000001c\n"
304+":0c81e000488100a0508100a000000000b9\n"
296305 ":020000040000fa\n"
297-":108170004001000080000000808100a0000000009d\n"
298-":0c818000308100a0d08000a000000000b2\n"
306+":0881ec000800e00300000000a0\n"
299307 ":00000001FF\n"
300308 ;
301309
--- a/mips/megalopa/globalvars.c
+++ b/mips/megalopa/globalvars.c
@@ -108,5 +108,9 @@ char g_fs_valid;
108108 // Result of reading a HEX file line
109109 HEXLINE g_hexline;
110110
111+// Stack to store $gp
112+void* g_gp_stack[8];
113+void* g_gp_stack_pointer=&g_gp_stack[0];
114+
111115 // General purpose integer used for asigning value with pointer
112116 int g_temp;
--- a/mips/megalopa/io.c
+++ b/mips/megalopa/io.c
@@ -89,6 +89,9 @@ void lib_serial(int baud, int parity, int bsize){
8989 #pragma interrupt uartint IPL3SOFT vector 31
9090 void uartint(){
9191 int err;
92+ // Push and restore $gp
93+ push_restore_gp();
94+
9295 IFS1bits.U1RXIF=0;
9396 while(U1STAbits.URXDA){
9497 // Fill into the buffer while RX data is available
@@ -103,6 +106,8 @@ void uartint(){
103106 g_serial_buff_write_pos++;
104107 if (g_serial_buff_size<=g_serial_buff_write_pos) g_serial_buff_write_pos=0;
105108 }
109+ // Pop $gp
110+ pop_gp();
106111 }
107112
108113 void lib_serialout(int data){
--- a/mips/megalopa/megalopa.mcp
+++ b/mips/megalopa/megalopa.mcp
@@ -222,9 +222,9 @@ file_038=interface\keyinput.h
222222 file_039=interface\lib_video_megalopa.h
223223 file_040=interface\ps2keyboard.h
224224 file_041=interface\sdfsio370f.h
225-file_042=interface\lib_videoout_megalopa.X.a
226-file_043=interface\ps2keyboard370f.X.a
227-file_044=interface\sdfsio370fLib.X.a
225+file_042=interface\sdfsio370fLib.X.a
226+file_043=interface\lib_videoout_megalopa.X.a
227+file_044=interface\ps2keyboard370f.X.a
228228 file_045=app_p32MX370F512H.ld
229229 file_046=help.txt
230230 file_047=reservednames.js
--- a/mips/megalopa/timer.c
+++ b/mips/megalopa/timer.c
@@ -97,11 +97,15 @@ void stop_timer(){
9797 #pragma interrupt T1Handler IPL2SOFT vector 4
9898 #endif
9999 void T1Handler(void){
100+ // Push and restore $gp
101+ push_restore_gp();
100102 g_timer++;
101103 // Clear Timer1 interrupt flag
102104 IFS0bits.T1IF=0;
103105 // Raise TIMER interrupt flag
104106 raise_interrupt_flag(INTERRUPT_TIMER);
107+ // Pop $gp
108+ pop_gp();
105109 }
106110
107111 void lib_usetimer(int usec){
@@ -178,10 +182,14 @@ char* timer_function(){
178182
179183 #pragma interrupt CTHandler IPL2SOFT vector 0
180184 void CTHandler(void){
185+ // Push and restore $gp
186+ push_restore_gp();
181187 // Clear CT interrupt flag
182188 IFS0bits.CTIF=0;
183189 // Raise TIMER interrupt flag
184190 raise_interrupt_flag(INTERRUPT_CORETIMER);
191+ // Pop $gp
192+ pop_gp();
185193 }
186194
187195 char* coretimer_function(){
@@ -238,6 +246,8 @@ void CS1Handler(void){
238246 asm volatile("#":::"s7");
239247 asm volatile("#":::"fp");
240248 asm volatile("#":::"ra");
249+ // Push and restore $gp
250+ push_restore_gp();
241251 while(g_interrupt_flags){
242252 for(i=0;i<NUM_INTERRUPT_TYPES;i++){
243253 if (g_interrupt_flags & (1<<i)) {
@@ -247,6 +257,8 @@ void CS1Handler(void){
247257 }
248258 }
249259 IFS0bits.CS1IF=0;
260+ // Pop $gp
261+ pop_gp();
250262 }
251263
252264 void lib_interrupt_main(int itype, int address){
@@ -338,6 +350,9 @@ const int* g_keystatus=(int*)&ps2keystatus[0];
338350 #pragma interrupt CS0Handler IPL3SOFT vector 1
339351 void CS0Handler(void){
340352 int keys;
353+ // Push and restore $gp
354+ push_restore_gp();
355+
341356 IFS0bits.CS0IF=0;
342357 // Call music function
343358 if (g_music_active) musicint();
@@ -366,4 +381,6 @@ void CS0Handler(void){
366381 if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY);
367382 }
368383 }
384+ // Pop $gp
385+ pop_gp();
369386 }