BASIC compiler/interpreter for PIC32MX/MZ-80K
Revisão | 1865a0625fca40494883b376c88ef51f18961e88 (tree) |
---|---|
Hora | 2019-06-02 17:36:37 |
Autor | Katsumi <kmorimatsu@sour...> |
Commiter | Katsumi |
Debug for loading correct length of CLIB. Store $gp when interrupt.
@@ -47,6 +47,13 @@ void* CLIBINIT clib_init(void*** data){ | ||
47 | 47 | return (void*)&clibdata[0]; |
48 | 48 | } |
49 | 49 | |
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 | + | |
50 | 57 | // Function to get g_data in $v0 |
51 | 58 | void*** __attribute__((section("clib_g_data"))) clib_g_data(){ return g_data; } |
52 | 59 |
@@ -97,122 +104,93 @@ void*** __attribute__((section("clib_g_data"))) clib_g_data(){ return g_data; } | ||
97 | 104 | asm volatile("jr $v0") |
98 | 105 | |
99 | 106 | // 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) | |
102 | 108 | { machikania_function("$a1","4","0"); } |
103 | 109 | |
104 | 110 | // 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) | |
107 | 112 | { machikania_function("$a1","4","4"); } |
108 | 113 | |
109 | 114 | // Video functions |
110 | -void __attribute__((section("start_composite"))) | |
111 | -clib_start_composite(void*** data) | |
115 | +void clib_start_composite(void*** data) | |
112 | 116 | { machikania_function("$a0","12","0"); } |
113 | 117 | |
114 | -void __attribute__((section("stop_composite"))) | |
115 | -clib_stop_composite(void*** data) | |
118 | +void clib_stop_composite(void*** data) | |
116 | 119 | { machikania_function("$a0","12","4"); } |
117 | 120 | |
118 | -void __attribute__((section("printchar"))) | |
119 | -clib_printchar(unsigned char n,void*** data) | |
121 | +void clib_printchar(unsigned char n,void*** data) | |
120 | 122 | { machikania_function("$a1","12","8"); } |
121 | 123 | |
122 | -void __attribute__((section("printstr"))) | |
123 | -clib_printstr(unsigned char *s,void*** data) | |
124 | +void clib_printstr(unsigned char *s,void*** data) | |
124 | 125 | { machikania_function("$a1","12","12"); } |
125 | 126 | |
126 | -void __attribute__((section("printnum"))) | |
127 | -clib_printnum(unsigned int n,void*** data) | |
127 | +void clib_printnum(unsigned int n,void*** data) | |
128 | 128 | { machikania_function("$a1","12","16"); } |
129 | 129 | |
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) | |
132 | 131 | { machikania_function("$a2","12","20"); } |
133 | 132 | |
134 | -void __attribute__((section("cls"))) | |
135 | -clib_cls(void*** data) | |
133 | +void clib_cls(void*** data) | |
136 | 134 | { machikania_function("$a0","12","24"); } |
137 | 135 | |
138 | -void __attribute__((section("vramscroll"))) | |
139 | -clib_vramscroll(void*** data) | |
136 | +void clib_vramscroll(void*** data) | |
140 | 137 | { machikania_function("$a0","12","28"); } |
141 | 138 | |
142 | -void __attribute__((section("setcursorcolor"))) | |
143 | -clib_setcursorcolor(unsigned char c,void*** data) | |
139 | +void clib_setcursorcolor(unsigned char c,void*** data) | |
144 | 140 | { machikania_function("$a1","12","32"); } |
145 | 141 | |
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) | |
148 | 143 | { machikania_function("$a3","12","36"); } |
149 | 144 | |
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) | |
152 | 146 | { machikania_function_sp("16","12","40"); } |
153 | 147 | |
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) | |
156 | 149 | { machikania_function("$a3","12","44"); } |
157 | 150 | |
158 | 151 | // 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) | |
161 | 153 | { machikania_function("$a3","16","0"); } |
162 | 154 | |
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) | |
165 | 156 | { machikania_function_sp("20","16","4"); } |
166 | 157 | |
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) | |
169 | 159 | { machikania_function_sp("16","16","8"); } |
170 | 160 | |
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) | |
173 | 162 | { machikania_function_sp("20","16","12"); } |
174 | 163 | |
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) | |
177 | 165 | { machikania_function_sp("16","16","16"); } |
178 | 166 | |
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) | |
181 | 168 | { machikania_function_sp("16","16","20"); } |
182 | 169 | |
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) | |
185 | 171 | { machikania_function_sp("16","16","24"); } |
186 | 172 | |
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) | |
189 | 174 | { machikania_function_sp("20","16","28"); } |
190 | 175 | |
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) | |
193 | 177 | { machikania_function_sp("20","16","32"); } |
194 | 178 | |
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) | |
197 | 180 | { machikania_function_sp("20","16","36"); } |
198 | 181 | |
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) | |
201 | 183 | { machikania_function_sp("20","16","40"); } |
202 | 184 | |
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) | |
205 | 186 | { machikania_function_sp("24","16","44"); } |
206 | 187 | |
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) | |
209 | 189 | { machikania_function("$a2","16","48"); } |
210 | 190 | |
211 | 191 | // Keyboard functions |
212 | -unsigned char __attribute__((section("shiftkeys"))) | |
213 | -clib_shiftkeys(void*** data) | |
192 | +unsigned char clib_shiftkeys(void*** data) | |
214 | 193 | { machikania_function("$a0","20","0"); } |
215 | 194 | |
216 | -unsigned char __attribute__((section("ps2readkey"))) | |
217 | -clib_ps2readkey(void*** data) | |
195 | +unsigned char clib_ps2readkey(void*** data) | |
218 | 196 | { machikania_function("$a0","20","4"); } |
@@ -18,12 +18,18 @@ extern const void* const functions[]; | ||
18 | 18 | |
19 | 19 | // Prototypes |
20 | 20 | /* |
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. | |
24 | 24 | */ |
25 | 25 | void init(void); |
26 | 26 | |
27 | +/* | |
28 | + * void* adjustment(void); | |
29 | + * Use this function to determine the adjustment value of const pointers. | |
30 | + */ | |
31 | +void* adjustment(void); | |
32 | + | |
27 | 33 | // Variable used in clib.c |
28 | 34 | extern void*** g_data; |
29 | 35 |
@@ -103,8 +103,8 @@ _GEN_EXCPT_ADDR = _ebase_address + 0x180; | ||
103 | 103 | MEMORY |
104 | 104 | { |
105 | 105 | 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) | |
108 | 108 | kseg0_boot_mem : ORIGIN = (0x9D006000+0x1000+0x490), LENGTH = 0 /* dummy */ |
109 | 109 | exception_mem : ORIGIN = 0x9D006000, LENGTH = 0x1000 |
110 | 110 | kseg1_boot_mem : ORIGIN = (0x9D006000+0x1000), LENGTH = 0x490 |
@@ -110,38 +110,38 @@ ${OBJECTDIR}/clib.o: clib.c nbproject/Makefile-${CND_CONF}.mk | ||
110 | 110 | @${MKDIR} "${OBJECTDIR}" |
111 | 111 | @${RM} ${OBJECTDIR}/clib.o.d |
112 | 112 | @${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 | |
114 | 114 | |
115 | 115 | ${OBJECTDIR}/example.o: example.c nbproject/Makefile-${CND_CONF}.mk |
116 | 116 | @${MKDIR} "${OBJECTDIR}" |
117 | 117 | @${RM} ${OBJECTDIR}/example.o.d |
118 | 118 | @${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 | |
120 | 120 | |
121 | 121 | ${OBJECTDIR}/sdfsio370f.o: sdfsio370f.c nbproject/Makefile-${CND_CONF}.mk |
122 | 122 | @${MKDIR} "${OBJECTDIR}" |
123 | 123 | @${RM} ${OBJECTDIR}/sdfsio370f.o.d |
124 | 124 | @${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 | |
126 | 126 | |
127 | 127 | else |
128 | 128 | ${OBJECTDIR}/clib.o: clib.c nbproject/Makefile-${CND_CONF}.mk |
129 | 129 | @${MKDIR} "${OBJECTDIR}" |
130 | 130 | @${RM} ${OBJECTDIR}/clib.o.d |
131 | 131 | @${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 | |
133 | 133 | |
134 | 134 | ${OBJECTDIR}/example.o: example.c nbproject/Makefile-${CND_CONF}.mk |
135 | 135 | @${MKDIR} "${OBJECTDIR}" |
136 | 136 | @${RM} ${OBJECTDIR}/example.o.d |
137 | 137 | @${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 | |
139 | 139 | |
140 | 140 | ${OBJECTDIR}/sdfsio370f.o: sdfsio370f.c nbproject/Makefile-${CND_CONF}.mk |
141 | 141 | @${MKDIR} "${OBJECTDIR}" |
142 | 142 | @${RM} ${OBJECTDIR}/sdfsio370f.o.d |
143 | 143 | @${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 | |
145 | 145 | |
146 | 146 | endif |
147 | 147 |
@@ -1,8 +1,8 @@ | ||
1 | 1 | # |
2 | -#Tue May 21 13:54:07 PDT 2019 | |
2 | +#Sat Jun 01 16:04:38 PDT 2019 | |
3 | 3 | default.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=f2639e8ffe4e3a80ef2cdaeba61da340 |
4 | 4 | default.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.42\\bin |
5 | -configurations-xml=2f3193434ad25f263dc0e914df895fd6 | |
5 | +configurations-xml=0f7d9f26d39451c027590563406c3f79 | |
6 | 6 | com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=52742b11d992fb0dd234edfb95066b34 |
7 | 7 | default.languagetoolchain.version=1.42 |
8 | 8 | host.platform=windows |
@@ -76,7 +76,7 @@ | ||
76 | 76 | <property key="extra-include-directories" value=""/> |
77 | 77 | <property key="generate-16-bit-code" value="false"/> |
78 | 78 | <property key="generate-micro-compressed-code" value="false"/> |
79 | - <property key="isolate-each-function" value="false"/> | |
79 | + <property key="isolate-each-function" value="true"/> | |
80 | 80 | <property key="make-warnings-into-errors" value="false"/> |
81 | 81 | <property key="optimization-level" value="-O1"/> |
82 | 82 | <property key="place-data-into-section" value="false"/> |
@@ -6,6 +6,7 @@ | ||
6 | 6 | <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/clib.h</file> |
7 | 7 | <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/clib.c</file> |
8 | 8 | <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> | |
9 | 10 | <file>file:/C:/Users/kmorimatsu/Documents/At%20Home/PIC/PIC32/PIC32MX370F512H/clib/clib.X/example.c</file> |
10 | 11 | </group> |
11 | 12 | </open-files> |
@@ -24,36 +24,36 @@ void clib_g_data(); | ||
24 | 24 | asm volatile("lw $gp,0($v1)");\ |
25 | 25 | asm volatile("jalr $v0") |
26 | 26 | |
27 | -int __attribute__((section("FSInit"))) FSInit(void) | |
27 | +int FSInit(void) | |
28 | 28 | { machikania_file("0"); } |
29 | -FSFILE * __attribute__((section("FSfopen"))) FSfopen (const char * fileName, const char *mode) | |
29 | +FSFILE * FSfopen (const char * fileName, const char *mode) | |
30 | 30 | { machikania_file("4"); } |
31 | -int __attribute__((section("FSfclose"))) FSfclose(FSFILE *fo) | |
31 | +int FSfclose(FSFILE *fo) | |
32 | 32 | { 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) | |
34 | 34 | { 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) | |
36 | 36 | { machikania_file("16"); } |
37 | -int __attribute__((section("FSfeof"))) FSfeof( FSFILE * stream ) | |
37 | +int FSfeof( FSFILE * stream ) | |
38 | 38 | { machikania_file("20"); } |
39 | -long __attribute__((section("FSftell"))) FSftell (FSFILE * fo) | |
39 | +long FSftell (FSFILE * fo) | |
40 | 40 | { machikania_file("24"); } |
41 | -int __attribute__((section("FSfseek"))) FSfseek(FSFILE *stream, long offset, int whence) | |
41 | +int FSfseek(FSFILE *stream, long offset, int whence) | |
42 | 42 | { machikania_file("28"); } |
43 | -void __attribute__((section("FSrewind"))) FSrewind (FSFILE * fo) | |
43 | +void FSrewind (FSFILE * fo) | |
44 | 44 | { 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) | |
46 | 46 | { machikania_file("36"); } |
47 | -int __attribute__((section("FindNext"))) FindNext (SearchRec * rec) | |
47 | +int FindNext (SearchRec * rec) | |
48 | 48 | { machikania_file("40"); } |
49 | -int __attribute__((section("FSmkdir"))) FSmkdir (char * path) | |
49 | +int FSmkdir (char * path) | |
50 | 50 | { machikania_file("44"); } |
51 | -char * __attribute__((section("FSgetcwd"))) FSgetcwd (char * path, int numchars) | |
51 | +char * FSgetcwd (char * path, int numchars) | |
52 | 52 | { machikania_file("48"); } |
53 | -int __attribute__((section("FSchdir"))) FSchdir (char * path) | |
53 | +int FSchdir (char * path) | |
54 | 54 | { machikania_file("52"); } |
55 | -int __attribute__((section("FSremove"))) FSremove (const char * fileName) | |
55 | +int FSremove (const char * fileName) | |
56 | 56 | { machikania_file("56"); } |
57 | -int __attribute__((section("FSrename"))) FSrename (const char * fileName, FSFILE * fo) | |
57 | +int FSrename (const char * fileName, FSFILE * fo) | |
58 | 58 | { machikania_file("60"); } |
59 | 59 |
@@ -192,7 +192,7 @@ char* clib_main(){ | ||
192 | 192 | if (addr<0x00100000) { |
193 | 193 | // Address is valid only when <0x00100000 (in the RAM) |
194 | 194 | if (addr<begin) begin=addr; |
195 | - if (end<addr && addr<0x000fffff) { | |
195 | + if (end<=addr) { | |
196 | 196 | end=addr+g_hexline.size; |
197 | 197 | } |
198 | 198 | } |
@@ -58,9 +58,11 @@ example.c | ||
58 | 58 | Compiler Toochains: XC32 (v1.42以降) |
59 | 59 | Categories: xc32-gcc |
60 | 60 | Additinal options: -mgen-pie-static |
61 | + Option categories: General | |
62 | + Isolate each function in a section: チェックを入れる | |
61 | 63 | Option categories: Optimization |
62 | 64 | optimization-level: 1 |
63 | - Generated Command Line: -g -O1 | |
65 | + Generated Command Line: -g -ffunction-sections -O1 | |
64 | 66 | Categories: xc32-ld |
65 | 67 | Additional options: --no-data-init |
66 | 68 | Option categories: General |
@@ -579,3 +579,28 @@ extern int g_int_vector[]; | ||
579 | 579 | |
580 | 580 | // Check if within RAM |
581 | 581 | #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") |
@@ -234,9 +234,7 @@ static const char initext[]= | ||
234 | 234 | |
235 | 235 | static const char bastext[]= |
236 | 236 | "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" | |
240 | 238 | "\n" |
241 | 239 | "\n" |
242 | 240 | "\n" |
@@ -260,42 +258,52 @@ static const char class2text[]= | ||
260 | 258 | |
261 | 259 | static const char hextext[]= |
262 | 260 | ":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" | |
267 | 265 | ":088040000800e0032000bd2749\n" |
268 | 266 | ":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" | |
272 | 295 | ":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" | |
285 | 298 | ":020000040000fa\n" |
286 | -":1081040048656c6c6f20576f726c6421000000002e\n" | |
287 | -":108114005468697320697320612074657374000066\n" | |
288 | -":10812400434c494220746573742e000054455354e3\n" | |
289 | -":048134000000000047\n" | |
299 | +":1081bc00d08100a04001000080000000e08100a000\n" | |
300 | +":0481cc0000000000af\n" | |
290 | 301 | ":020000040000fa\n" |
291 | -":108138000000a38c0c00a28c0c00428c08004000ac\n" | |
292 | -":0c81480000007c8c0800e0030000000038\n" | |
302 | +":1081d0001880828f0000428c0800e00323102203e5\n" | |
293 | 303 | ":020000040000fa\n" |
294 | -":108154000000838c0c00828c1800428c08004000c4\n" | |
295 | -":0c81640000007c8c0800e003000000001c\n" | |
304 | +":0c81e000488100a0508100a000000000b9\n" | |
296 | 305 | ":020000040000fa\n" |
297 | -":108170004001000080000000808100a0000000009d\n" | |
298 | -":0c818000308100a0d08000a000000000b2\n" | |
306 | +":0881ec000800e00300000000a0\n" | |
299 | 307 | ":00000001FF\n" |
300 | 308 | ; |
301 | 309 |
@@ -108,5 +108,9 @@ char g_fs_valid; | ||
108 | 108 | // Result of reading a HEX file line |
109 | 109 | HEXLINE g_hexline; |
110 | 110 | |
111 | +// Stack to store $gp | |
112 | +void* g_gp_stack[8]; | |
113 | +void* g_gp_stack_pointer=&g_gp_stack[0]; | |
114 | + | |
111 | 115 | // General purpose integer used for asigning value with pointer |
112 | 116 | int g_temp; |
@@ -89,6 +89,9 @@ void lib_serial(int baud, int parity, int bsize){ | ||
89 | 89 | #pragma interrupt uartint IPL3SOFT vector 31 |
90 | 90 | void uartint(){ |
91 | 91 | int err; |
92 | + // Push and restore $gp | |
93 | + push_restore_gp(); | |
94 | + | |
92 | 95 | IFS1bits.U1RXIF=0; |
93 | 96 | while(U1STAbits.URXDA){ |
94 | 97 | // Fill into the buffer while RX data is available |
@@ -103,6 +106,8 @@ void uartint(){ | ||
103 | 106 | g_serial_buff_write_pos++; |
104 | 107 | if (g_serial_buff_size<=g_serial_buff_write_pos) g_serial_buff_write_pos=0; |
105 | 108 | } |
109 | + // Pop $gp | |
110 | + pop_gp(); | |
106 | 111 | } |
107 | 112 | |
108 | 113 | void lib_serialout(int data){ |
@@ -222,9 +222,9 @@ file_038=interface\keyinput.h | ||
222 | 222 | file_039=interface\lib_video_megalopa.h |
223 | 223 | file_040=interface\ps2keyboard.h |
224 | 224 | 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 | |
228 | 228 | file_045=app_p32MX370F512H.ld |
229 | 229 | file_046=help.txt |
230 | 230 | file_047=reservednames.js |
@@ -97,11 +97,15 @@ void stop_timer(){ | ||
97 | 97 | #pragma interrupt T1Handler IPL2SOFT vector 4 |
98 | 98 | #endif |
99 | 99 | void T1Handler(void){ |
100 | + // Push and restore $gp | |
101 | + push_restore_gp(); | |
100 | 102 | g_timer++; |
101 | 103 | // Clear Timer1 interrupt flag |
102 | 104 | IFS0bits.T1IF=0; |
103 | 105 | // Raise TIMER interrupt flag |
104 | 106 | raise_interrupt_flag(INTERRUPT_TIMER); |
107 | + // Pop $gp | |
108 | + pop_gp(); | |
105 | 109 | } |
106 | 110 | |
107 | 111 | void lib_usetimer(int usec){ |
@@ -178,10 +182,14 @@ char* timer_function(){ | ||
178 | 182 | |
179 | 183 | #pragma interrupt CTHandler IPL2SOFT vector 0 |
180 | 184 | void CTHandler(void){ |
185 | + // Push and restore $gp | |
186 | + push_restore_gp(); | |
181 | 187 | // Clear CT interrupt flag |
182 | 188 | IFS0bits.CTIF=0; |
183 | 189 | // Raise TIMER interrupt flag |
184 | 190 | raise_interrupt_flag(INTERRUPT_CORETIMER); |
191 | + // Pop $gp | |
192 | + pop_gp(); | |
185 | 193 | } |
186 | 194 | |
187 | 195 | char* coretimer_function(){ |
@@ -238,6 +246,8 @@ void CS1Handler(void){ | ||
238 | 246 | asm volatile("#":::"s7"); |
239 | 247 | asm volatile("#":::"fp"); |
240 | 248 | asm volatile("#":::"ra"); |
249 | + // Push and restore $gp | |
250 | + push_restore_gp(); | |
241 | 251 | while(g_interrupt_flags){ |
242 | 252 | for(i=0;i<NUM_INTERRUPT_TYPES;i++){ |
243 | 253 | if (g_interrupt_flags & (1<<i)) { |
@@ -247,6 +257,8 @@ void CS1Handler(void){ | ||
247 | 257 | } |
248 | 258 | } |
249 | 259 | IFS0bits.CS1IF=0; |
260 | + // Pop $gp | |
261 | + pop_gp(); | |
250 | 262 | } |
251 | 263 | |
252 | 264 | void lib_interrupt_main(int itype, int address){ |
@@ -338,6 +350,9 @@ const int* g_keystatus=(int*)&ps2keystatus[0]; | ||
338 | 350 | #pragma interrupt CS0Handler IPL3SOFT vector 1 |
339 | 351 | void CS0Handler(void){ |
340 | 352 | int keys; |
353 | + // Push and restore $gp | |
354 | + push_restore_gp(); | |
355 | + | |
341 | 356 | IFS0bits.CS0IF=0; |
342 | 357 | // Call music function |
343 | 358 | if (g_music_active) musicint(); |
@@ -366,4 +381,6 @@ void CS0Handler(void){ | ||
366 | 381 | if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY); |
367 | 382 | } |
368 | 383 | } |
384 | + // Pop $gp | |
385 | + pop_gp(); | |
369 | 386 | } |