BASIC compiler/interpreter for PIC32MX/MZ-80K (suspended)
Revision | 263 (tree) |
---|---|
Time | 2018-07-30 07:41:27 |
Author | kmorimatsu |
Import shared codes.
@@ -117,6 +117,7 @@ | ||
117 | 117 | LIB_WIDTH =LIB_STEP*47, |
118 | 118 | LIB_FILE =LIB_STEP*48, |
119 | 119 | LIB_PLAYWAVE =LIB_STEP*49, |
120 | + LIB_PLAYWAVEFUNC =LIB_STEP*50, | |
120 | 121 | LIB_DEBUG =LIB_STEP*127, |
121 | 122 | }; |
122 | 123 |
@@ -245,10 +246,11 @@ | ||
245 | 246 | |
246 | 247 | void set_sound(unsigned long* data, int flagsLR); |
247 | 248 | int musicRemaining(int flagsLR); |
249 | +int waveRemaining(int mode); | |
248 | 250 | void set_music(char* str, int flagsLR); |
249 | 251 | void stop_music(void); |
250 | 252 | void init_music(void); |
251 | -void play_wave(char* filename); | |
253 | +void play_wave(char* filename, int start); | |
252 | 254 | |
253 | 255 | char* statement(void); |
254 | 256 | char* gosub_statement(); |
@@ -271,6 +273,7 @@ | ||
271 | 273 | void* calloc_memory(int size, int var_num); |
272 | 274 | void move_to_perm_block(int var_num); |
273 | 275 | void move_from_perm_block(int var_num); |
276 | +int get_permanent_var_num(void); | |
274 | 277 | |
275 | 278 | char* link(void); |
276 | 279 | char* get_label(void); |
@@ -61,8 +61,6 @@ | ||
61 | 61 | |
62 | 62 | printstr("BASIC "BASVER"\n"); |
63 | 63 | wait60thsec(15); |
64 | - // Initialize music | |
65 | - init_music(); | |
66 | 64 | |
67 | 65 | printstr("Compiling..."); |
68 | 66 |
@@ -88,7 +86,6 @@ | ||
88 | 86 | // Work area (used for A-Z values) is next to the object code area. |
89 | 87 | start_program((void*)(&(RAM[0])),(void*)(&g_var_mem[0])); |
90 | 88 | printstr("\nOK\n"); |
91 | - set_graphmode(0); | |
92 | 89 | g_use_graphic=0; |
93 | 90 | |
94 | 91 | return 1; |
@@ -224,9 +221,7 @@ | ||
224 | 221 | |
225 | 222 | static const char bastext[]= |
226 | 223 | "CLS\n" |
227 | -"DIM S(512)\n" | |
228 | -"EXEC 0x8fdd0012, 0x27bd07fc\n" | |
229 | -"print s\n" | |
224 | +"print NOT(0);IN(0)\n" | |
230 | 225 | "\n"; |
231 | 226 | |
232 | 227 | /* |
@@ -15,11 +15,16 @@ | ||
15 | 15 | #define ps2init() not_ps2init_but_init_Timer1() |
16 | 16 | int not_ps2init_but_init_Timer1(); |
17 | 17 | |
18 | -// Do not use set_graphmode() | |
19 | -#define set_graphmode(m) (0) | |
20 | - | |
21 | 18 | // Do not use asm("wait") but use asm("nop") |
22 | 19 | #undef WAIT |
23 | 20 | #define WAIT "nop" |
24 | 21 | |
25 | 22 | #endif // __DEBUG |
23 | + | |
24 | +// key waiting macro | |
25 | + | |
26 | +#define debug_wait() lineinput((char*)&g_temp,3) | |
27 | +#define debug_wait_char(x) do {\ | |
28 | + printchar(x); \ | |
29 | + lineinput((char*)&g_temp,3);\ | |
30 | + } while(0) |
@@ -17,6 +17,16 @@ | ||
17 | 17 | For Zoea, disable PS/2 keyboard and enable tact switches, then read. |
18 | 18 | */ |
19 | 19 | |
20 | +void pre_run(){ | |
21 | + // TODO | |
22 | +} | |
23 | + | |
24 | +void post_run(){ | |
25 | + // Cool down | |
26 | + set_graphmode(0); | |
27 | + g_use_graphic=0; | |
28 | +} | |
29 | + | |
20 | 30 | int readbuttons(){ |
21 | 31 | // Enable tact switches |
22 | 32 | if (inPS2MODE()) { |
@@ -69,6 +69,9 @@ | ||
69 | 69 | void pre_end_addr(int s6){ |
70 | 70 | int i,j; |
71 | 71 | char str[7]; |
72 | + // Cool down the system | |
73 | + stop_music(); | |
74 | + // Resolve line and show it | |
72 | 75 | if (s6<0) s6=s6&0x7fffffff; |
73 | 76 | g_label=s6; |
74 | 77 | if (s6<65536) { |
@@ -90,6 +93,7 @@ | ||
90 | 93 | asm volatile("j pre_end_addr") |
91 | 94 | |
92 | 95 | void err_break(void){ |
96 | + stop_music(); | |
93 | 97 | printstr(ERR_BREAK); |
94 | 98 | end_exec(); |
95 | 99 | } |
@@ -362,6 +362,22 @@ | ||
362 | 362 | return 0; |
363 | 363 | } |
364 | 364 | |
365 | +char* playwave_function(){ | |
366 | + char* err; | |
367 | + next_position(); | |
368 | + if (g_source[g_srcpos]!=')') { | |
369 | + // Get param | |
370 | + err=get_value(); | |
371 | + if (err) return err; | |
372 | + } else { | |
373 | + // If parameter is omitted, use 0. | |
374 | + check_obj_space(1); | |
375 | + g_object[g_objpos++]=0x24020000; // addiu v0,zero,0 | |
376 | + } | |
377 | + call_lib_code(LIB_PLAYWAVEFUNC); | |
378 | + return 0; | |
379 | +} | |
380 | + | |
365 | 381 | char* float_constant(float val){ |
366 | 382 | volatile int i; |
367 | 383 | ((float*)(&i))[0]=val; |
@@ -545,6 +561,7 @@ | ||
545 | 561 | "FPUTC(",fputc_statement, |
546 | 562 | "FREMOVE(",fremove_statement, |
547 | 563 | "FEOF(",feof_function, |
564 | + "PLAYWAVE(",playwave_function, | |
548 | 565 | // Additional functions follow |
549 | 566 | ADDITIONAL_INT_FUNCTIONS |
550 | 567 | }; |
@@ -1005,8 +1005,10 @@ | ||
1005 | 1005 | set_music((char*)v0,a0); |
1006 | 1006 | return v0; |
1007 | 1007 | case LIB_PLAYWAVE: |
1008 | - play_wave((char*)v0); | |
1008 | + play_wave((char*)g_libparams[1],v0); | |
1009 | 1009 | return v0; |
1010 | + case LIB_PLAYWAVEFUNC: | |
1011 | + return waveRemaining(v0); | |
1010 | 1012 | case LIB_SETDRAWCOUNT: |
1011 | 1013 | drawcount=(v0&0x0000FFFF); |
1012 | 1014 | return v0; |
@@ -172,4 +172,13 @@ | ||
172 | 172 | g_var_pointer[var_num]=g_var_pointer[i]; |
173 | 173 | // Clear block |
174 | 174 | g_var_size[i]=0; |
175 | -} | |
\ No newline at end of file | ||
175 | +} | |
176 | + | |
177 | +int get_permanent_var_num(){ | |
178 | + int i; | |
179 | + for (i=ALLOC_PERM_BLOCK;i<ALLOC_BLOCK_NUM;i++) { | |
180 | + if (g_var_size[i]==0) return i; | |
181 | + } | |
182 | + err_no_block(); | |
183 | + return 0; | |
184 | +} |
@@ -12,8 +12,6 @@ | ||
12 | 12 | /* |
13 | 13 | Timer3: 1/32 prescaler, toggle mode : 894886.25 Hz |
14 | 14 | PR3=2047 <-> 437 Hz |
15 | - Timer4: 1/32 prescaler: 1789772.5 Hz | |
16 | - Timer4 29737 counts: 262 NTSC lines. | |
17 | 15 | */ |
18 | 16 | |
19 | 17 | /* |
@@ -88,7 +86,10 @@ | ||
88 | 86 | #define start_dma() T4CONSET=0x8000; DCH2CONSET=0x00000080; g_sound_mode=SOUND_MODE_WAVE |
89 | 87 | #define stop_dma() T4CONCLR=0x8000; DCH2CONCLR=0x00000080; g_sound_mode=SOUND_MODE_MUSIC |
90 | 88 | |
91 | - | |
89 | +int waveRemaining(int mode){ | |
90 | + // TODO | |
91 | + return 0; | |
92 | +} | |
92 | 93 | int musicRemaining(int flagsLR){ |
93 | 94 | // flagsLR is ignored |
94 | 95 | return (g_musicend-g_musicstart)&31; |
@@ -585,7 +586,8 @@ | ||
585 | 586 | DCH2CONSET=0x00000080; |
586 | 587 | } |
587 | 588 | |
588 | -void play_wave(char* filename){ | |
589 | +void play_wave(char* filename, int start){ | |
590 | + // TODO: Implement start parameter | |
589 | 591 | int i; |
590 | 592 | // Stop the previous play |
591 | 593 | T3CONCLR=0x8000; |
@@ -137,12 +137,33 @@ | ||
137 | 137 | 'WEND', |
138 | 138 | 'WHILE', |
139 | 139 | 'WIDTH', |
140 | + // For megalopa | |
141 | + '// For Megalopa', | |
142 | + 'OUT', | |
143 | + 'OUT8H', | |
144 | + 'OUT8L', | |
145 | + 'OUT16', | |
146 | + 'IN', | |
147 | + 'IN8H', | |
148 | + 'IN8L', | |
149 | + 'IN16', | |
150 | + 'ANALOG', | |
151 | + 'PWM', | |
152 | + 'SERIAL', | |
153 | + 'SPI', | |
154 | + 'SPIOUT', | |
155 | + 'SPIIN', | |
140 | 156 | ]; |
141 | 157 | var result=''; |
142 | 158 | for(key in namearray){ |
143 | 159 | var nameint='0000'+name2int(namearray[key]).toString(16); |
144 | 160 | nameint=nameint.substr(nameint.length-8); |
145 | - result+="\t0x"+nameint+", //"+namearray[key]+"\r\n"; | |
161 | + if (namearray[key].substr(0,2)=='//') { | |
162 | + // This is a comment | |
163 | + result+=namearray[key]+"\r\n"; | |
164 | + } else { | |
165 | + result+="\t0x"+nameint+", /*"+namearray[key]+"*/\r\n"; | |
166 | + } | |
146 | 167 | } |
147 | 168 | |
148 | 169 | var fso = new ActiveXObject("Scripting.FileSystemObject"); |
@@ -73,11 +73,12 @@ | ||
73 | 73 | g_long_name_var_num=0; |
74 | 74 | cmpdata_init(); |
75 | 75 | |
76 | - printstr("BASIC "BASVER"\n"); | |
77 | - wait60thsec(15); | |
78 | 76 | // Initialize music system |
79 | 77 | init_music(); |
80 | 78 | |
79 | + printstr("BASIC "BASVER"\n"); | |
80 | + wait60thsec(15); | |
81 | + | |
81 | 82 | printstr("Compiling..."); |
82 | 83 | |
83 | 84 | // Compile the file |
@@ -134,14 +135,17 @@ | ||
134 | 135 | // Assign memory |
135 | 136 | set_free_area((void*)(g_object+g_objpos),(void*)(&RAM[RAMSIZE])); |
136 | 137 | |
138 | + // Warm up environment | |
139 | + pre_run(); | |
140 | + | |
137 | 141 | // Execute program |
138 | 142 | // Start program from the beginning of RAM. |
139 | 143 | // Work area (used for A-Z values) is next to the object code area. |
140 | 144 | start_program((void*)(&(RAM[0])),(void*)(&g_var_mem[0])); |
141 | 145 | printstr("\nOK\n"); |
142 | - // Cool down | |
143 | - set_graphmode(0); | |
144 | - g_use_graphic=0; | |
146 | + | |
147 | + // Cool down environment | |
148 | + post_run(); | |
145 | 149 | lib_file(FUNC_FINIT,0,0,0); |
146 | 150 | |
147 | 151 | return 0; |
@@ -1450,7 +1450,22 @@ | ||
1450 | 1450 | char* err; |
1451 | 1451 | err=get_string(); |
1452 | 1452 | if (err) return err; |
1453 | + check_obj_space(2); | |
1454 | + g_object[g_objpos++]=0x27BDFFFC; // addiu sp,sp,-4 | |
1455 | + g_object[g_objpos++]=0xAFA20004; // sw v0,4(sp) | |
1456 | + if (g_source[g_srcpos]==',') { | |
1457 | + g_srcpos++; | |
1458 | + // Get 2nd | |
1459 | + err=get_value(); | |
1460 | + if (err) return err; | |
1461 | + } else { | |
1462 | + // If 2rd parameter is omitted, use 0. | |
1463 | + check_obj_space(1); | |
1464 | + g_object[g_objpos++]=0x24020000; // addiu v0,zero,0 | |
1465 | + } | |
1453 | 1466 | call_lib_code(LIB_PLAYWAVE); |
1467 | + check_obj_space(1); | |
1468 | + g_object[g_objpos++]=0x27BD0004; // addiu sp,sp,4 | |
1454 | 1469 | return 0; |
1455 | 1470 | } |
1456 | 1471 |