diff --git a/initrd/init b/initrd/init index 56e5212..a250822 100644 --- a/initrd/init +++ b/initrd/init @@ -1,12 +1,10 @@ -func Fx - ret (arg0 * arg0) -end - # graph area -set plotx 0 -set ploty 0 -set plotw 479 -set ploth 319 +set plotx 50 +set ploty 50 +set plotw 380 +set ploth 220 +set cx (plotx + (plotw / 2)) +set cy (ploty + (ploth / 2)) # graph range set xmin (0 - 10) @@ -17,21 +15,55 @@ set ymax 10 set xinc (plotw / (xmax - xmin)) set yinc (ploth / (ymax - ymin)) +color 3 3 3 > mlines + # print axis -line 240 0 240 319 32767 -line 0 160 479 160 32767 -# do function -set x xmin -set cx (plotx + (plotw / 2)) -set cy (ploty + (ploth / 2)) +func makegrid + rect plotx ploty plotw ploth 0 + + set x plotx + do + line x ploty x (ploty + ploth) mlines + set x (x + xinc) + while (x <= plotx + plotw) + + set y ploty + do + line plotx y (plotx + plotw) y mlines + set y (y + yinc) + while (y <= ploty + ploth) + + line cx ploty cx (ploty + ploth) 32767 + line plotx cy (plotx + plotw) cy 32767 +end + +# +# BIG LOOP - ask for equ, graph it +# + +makegrid +set clearcmd "clear" do - Fx x > y - set y (0 - y) - if ((y > ymin) & (y < ymax)) - pixel (cx + (x * xinc)) (cy + (y * yinc)) 511 + rect 0 0 480 40 + + print "f(x) = " + gets > Fx + + if (Fx == clearcmd) + makegrid + else + # do function + set x xmin + do + solve Fx > y + set y (0 - y) + if ((y > ymin) & (y < ymax)) + pixel (cx + x * xinc) (cy + y * yinc) 511 + end + set x (x + 1 / xinc) + while (x < xmax) end - set x (x + (1 / xinc)) -while (x < xmax) -print "Done." + ppos 0 0 +while (1) diff --git a/libinterp.a b/libinterp.a index a11013c..2d0400d 100644 Binary files a/libinterp.a and b/libinterp.a differ diff --git a/src/flash.c b/src/flash.c index 3027ec0..6b3ee00 100644 --- a/src/flash.c +++ b/src/flash.c @@ -35,7 +35,7 @@ void flash_init(void) SPI2->CR2 |= SPI_CR2_FRXTH; SPI2->CR1 |= SPI_CR1_SPE; - char buf[3]; + char buf[4]; buf[0] = READ; buf[1] = 0; buf[2] = 0; diff --git a/src/script.c b/src/script.c index c7b3614..495e409 100644 --- a/src/script.c +++ b/src/script.c @@ -10,6 +10,8 @@ #include #include +#include + int script_puts(interpreter *it); int script_gets(interpreter *it); int script_delay(interpreter *it); @@ -20,6 +22,7 @@ int script_color(interpreter *it); int script_rand(interpreter *it); int script_getkey(interpreter *it); int script_pixel(interpreter *it); +int script_solve(interpreter *it); void script_loadlib(interpreter *it) { @@ -33,14 +36,13 @@ void script_loadlib(interpreter *it) inew_cfunc(it, "rand", script_rand); inew_cfunc(it, "getkey", script_getkey); inew_cfunc(it, "pixel", script_pixel); + inew_cfunc(it, "solve", script_solve); } int script_puts(interpreter *it) { const char *s = igetarg_string(it, 0); dsp_puts(s); - //dsp_puts("\n"); - //asm("mov r0, %0; svc 2" :: "r" (s)); return 0; } @@ -58,9 +60,10 @@ int script_gets(interpreter *it) } while (s[index] != '\r' && index++ < 23); s[index] = '\0'; - variable *v = igetarg(it, 0); - v->valtype = STRING; - v->value.p = (uint32_t)s; + variable *r = make_vars(0, s); + iret(it, r); + free(s); + free(r); return 0; } @@ -131,3 +134,19 @@ int script_pixel(interpreter *it) igetarg_integer(it, 2)); return 0; } + +int script_solve(interpreter *it) +{ + const char *expr = igetarg_string(it, 0); + int len = strlen(expr); + char *buf = (char *)malloc(len + 2); + strcpy(buf, expr); + buf[len] = ')'; + buf[len + 1] = '\0'; + variable *r = idoexpr(it, buf); + if (r == 0) + r = make_varn(0, 0.0f); + iret(it, r); + free(r); + return 0; +}