From 8275c9cac1e610c00bb4a9af3c9f41dcd783c8a7 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Wed, 21 Mar 2018 12:20:44 -0400 Subject: [PATCH] various fixes; new interpreter library --- include/clock.h | 1 - include/display.h | 41 ++++++++++++++++- include/display_draw.h | 49 ++++++++++++++++++++ include/it | 2 +- include/script.h | 2 +- initrd/init | 102 ++++++++++++++++++++--------------------- libinterp.a | Bin 67130 -> 45614 bytes src/heap.c | 2 + src/main.c | 7 ++- src/script.c | 75 ++++++++++++++++-------------- 10 files changed, 186 insertions(+), 95 deletions(-) diff --git a/include/clock.h b/include/clock.h index 77ab7e9..c12c41e 100644 --- a/include/clock.h +++ b/include/clock.h @@ -10,7 +10,6 @@ /** * Sets HCLK (system clock) to 80MHz, the maximum. - * @param none */ extern void clock_init(void); diff --git a/include/display.h b/include/display.h index 6004f19..55f6974 100644 --- a/include/display.h +++ b/include/display.h @@ -1,18 +1,55 @@ +/* + * @file display.h + * Display library for ILI9481 display. + */ + #ifndef DISPLAY_H_ #define DISPLAY_H_ #include +/** + * The screen's width, in pixels. + */ #define LCD_WIDTH 480 -#define LCD_HEIGHT 320 -#define COLOR_MAX 31 +/** + * The screen's height, in pixels. + */ +#define LCD_HEIGHT 320 +/** + * Returns the color integer for the given RGB values. + * Converts 8RGB to 5-6-5. + * @param r red value, 0-255 + * @param g green value, 0-255 + * @param b blue value, 0-255 + * @return the 5-6-5 color value + */ uint16_t dsp_color(uint8_t r, uint8_t g, uint8_t b); +/** + * Sets the direction of IO, for reading or writing to the screen. + * @param mode INPUT or OUPUT (defined in gpio.h) + */ void dsp_dmode(int mode); + +/** + * Writes the command byte to the display. + * @param data the command to write + */ void dsp_write_cmd(uint8_t data); + +/** + * Writes the data byte to the display. + * @param data the data to write + */ void dsp_write_data(uint8_t data); + +/** + * Reads a byte of data from the display. + * @return the data byte + */ uint8_t dsp_read_data(void); void dsp_set_addr(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); diff --git a/include/display_draw.h b/include/display_draw.h index 823c697..9d86437 100644 --- a/include/display_draw.h +++ b/include/display_draw.h @@ -1,16 +1,65 @@ +/** + * @file display_draw.h + * Provides functions for drawing to the display + */ + #ifndef DISPLAY_DRAW_H_ #define DISPLAY_DRAW_H_ #include +/** + * Starts the task for a blinking text cursor. + */ void dsp_cursoron(void); +/** + * Sets the chosen pixel to the given color. + * @param x x-coord of the pixel + * @param y y-coord of the pixel + * @param color the color to use (5-6-5) + */ void dsp_pixel(int x, int y, uint16_t color); + +/** + * Draws a line between the two coordinates. + * @param x start x-coord + * @param y start y-coord + * @param i end x-coord + * @param j end y-coord + * @param color the color to use (5-6-5) + */ void dsp_line(int x, int y, int i, int j, uint16_t color); + +/** + * Draws a rectangle with the given dimensions. + * @param x top left x-coord + * @param y top left y-coord + * @param w width of the rectangle + * @param h height of the rectangle + * @param color the color to use (5-6-5) + */ void dsp_rect(int x, int y, int w, int h, uint16_t color); +/** + * Sets the text cursor's position, in characters NOT pixels. + * @param x text column to move to + * @param y text row to move to + */ void dsp_cpos(int x, int y); + +/** + * Sets the pixel offset of the text cursor. + * @param x x-pixel offset from (0, 0) + * @param y y-pixel offset from (0, 0) + */ void dsp_coff(int x, int y); + +/** + * Puts a string to the screen. Text position if kept track of internally, so + * multiple calls will print the strings in one line. + * @param s the string to print + */ void dsp_puts(const char *s); #endif // DISPLAY_DRAW_H_ diff --git a/include/it b/include/it index 7c2b8d4..a9d20d8 120000 --- a/include/it +++ b/include/it @@ -1 +1 @@ -../../interpreter \ No newline at end of file +../../interpreter3 \ No newline at end of file diff --git a/include/script.h b/include/script.h index 7901c9c..ab5fa7e 100644 --- a/include/script.h +++ b/include/script.h @@ -12,6 +12,6 @@ * Loads the library for the given interpreter. * @param it the interpreter to use */ -void script_loadlib(interpreter *it); +void script_loadlib(instance *it); #endif // SCRIPT_H_ diff --git a/initrd/init b/initrd/init index 4908747..3379d81 100644 --- a/initrd/init +++ b/initrd/init @@ -1,69 +1,67 @@ # graph area -set plotx 50 -set ploty 50 -set plotw 380 -set ploth 220 -set cx (plotx + (plotw / 2)) -set cy (ploty + (ploth / 2)) +plotx = 50 +ploty = 50 +plotw = 380 +ploth = 220 +cx = plotx + plotw / 2 +cy = ploty + ploth / 2 # graph range -set xmin (0 - 10) -set xmax 10 -set ymin (0 - 10) -set ymax 10 +xmin = 0 - 10 +xmax = 10 +ymin = 0 - 10 +ymax = 10 -set xinc (plotw / (xmax - xmin)) -set yinc (ploth / (ymax - ymin)) +xinc = plotw / (xmax - xmin) +yinc = ploth / (ymax - ymin) -color 3 3 3 > mlines +mlines = color(3, 3, 3) -# print axis +func(makegrid) { + rect(plotx, ploty, plotw, ploth, 0) -func makegrid - rect plotx ploty plotw ploth 0 + x = plotx + while (x <= plotx + plotw) { + line(x, ploty, x, ploty + ploth, mlines) + x = x + xinc + } - set x plotx - do - line x ploty x (ploty + ploth) mlines - set x (x + xinc) - while (x <= plotx + plotw) + y = ploty + while (y <= ploty + ploth) { + line(plotx, y, plotx + plotw, y, mlines) + y = y + yinc + } - 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 + line(cx, ploty, cx, ploty + ploth, 32767) + line(plotx, cy, plotx + plotw, cy, 32767) +} # # BIG LOOP - ask for equ, graph it # -makegrid -set clearcmd "clear" -do - rect 0 0 480 40 - - print "f(x) = " - gets > Fx +makegrid() +clearcmd = "clear" +while (1) { + rect(0, 0, 480, 40, 0) + print("f(x) = ") + Fx = gets() - if (Fx == clearcmd) - makegrid - else + 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 + x = xmin + while (x < xmax) { + y = solve(Fx) + y = 0 - y + if ((y >= ymin) & (y <= ymax)) { + pixel(cx + x * xinc, cy + y * yinc, 511) + } + x = x + 1 / xinc + } + } + + ppos(0, 0) +} - ppos 0 0 -while (1) diff --git a/libinterp.a b/libinterp.a index 11ca083c3e1cf243d002cf66fcb3a122ca5e1f27..36331ee4f65c17c7a7de80ed64a464178598ee2c 100644 GIT binary patch literal 45614 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 diff --git a/src/heap.c b/src/heap.c index 52b5253..9a11cba 100644 --- a/src/heap.c +++ b/src/heap.c @@ -76,6 +76,8 @@ void free(void *buf) return; alloc_t *alloc = (alloc_t *)((uint8_t *)buf - sizeof(alloc_t)); + if (alloc->next != 0) + return; heap_used -= alloc->size; alloc->next = free_blocks; free_blocks = alloc; diff --git a/src/main.c b/src/main.c index 71ce68f..fc64edd 100644 --- a/src/main.c +++ b/src/main.c @@ -82,9 +82,8 @@ void kmain(void) void task_interpreter(void) { - interpreter it; - iinit(&it); - script_loadlib(&it); + instance *it = inewinstance(); + script_loadlib(it); char *s = initrd_getfile("init"); if (s == 0) { @@ -105,7 +104,7 @@ void task_interpreter(void) } strncpy(linebuf, s + prev, lc + 1); linebuf[lc] = '\0'; - ret = idoline(&it, linebuf); + ret = idoline(it, linebuf); if (ret < 0) break; prev = ++i; diff --git a/src/script.c b/src/script.c index 8fad2f3..1cd0d71 100644 --- a/src/script.c +++ b/src/script.c @@ -7,23 +7,25 @@ #include #include #include -#include +#include #include #include -int script_puts(interpreter *it); -int script_gets(interpreter *it); -int script_delay(interpreter *it); -int script_rect(interpreter *it); -int script_ppos(interpreter *it); -int script_line(interpreter *it); -int script_color(interpreter *it); -int script_rand(interpreter *it); -int script_getkey(interpreter *it); -int script_pixel(interpreter *it); - -void script_loadlib(interpreter *it) +#define igetarg_integer(it, n) ((int)igetarg(it, n)->value.f) + +int script_puts(instance *it); +int script_gets(instance *it); +int script_delay(instance *it); +int script_rect(instance *it); +int script_ppos(instance *it); +int script_line(instance *it); +int script_color(instance *it); +int script_rand(instance *it); +int script_getkey(instance *it); +int script_pixel(instance *it); + +void script_loadlib(instance *it) { inew_cfunc(it, "print", script_puts); inew_cfunc(it, "gets", script_gets); @@ -37,14 +39,20 @@ void script_loadlib(interpreter *it) inew_cfunc(it, "pixel", script_pixel); } -int script_puts(interpreter *it) +int script_puts(instance *it) { - const char *s = igetarg_string(it, 0); - dsp_puts(s); + variable *v = igetarg(it, 0); + if (v->type == NUMBER) { + char buf[33]; + snprintf(buf, 33, "%f", v->value.f); + dsp_puts(buf); + } else if (v->type == STRING) { + dsp_puts((const char *)v->value.p); + } return 0; } -int script_gets(interpreter *it) +int script_gets(instance *it) { char *s = malloc(64); char c[2] = {0, 0}; @@ -66,20 +74,19 @@ int script_gets(interpreter *it) s[index] = '\0'; variable *r = make_vars(0, s); - iret(it, r); + ipush(it, (uint32_t)r); free(s); - free(r); return 0; } -int script_delay(interpreter *it) +int script_delay(instance *it) { - int ms = igetarg_integer(it, 0); + int ms = (int)igetarg(it, 0)->value.f; delay(ms); return 0; } -int script_rect(interpreter *it) +int script_rect(instance *it) { dsp_rect(igetarg_integer(it, 0), igetarg_integer(it, 1), igetarg_integer(it, 2), igetarg_integer(it, 3), @@ -87,7 +94,7 @@ int script_rect(interpreter *it) return 0; } -int script_line(interpreter *it) +int script_line(instance *it) { int x = igetarg_integer(it, 0); int y = igetarg_integer(it, 1); @@ -98,42 +105,42 @@ int script_line(interpreter *it) return 0; } -int script_ppos(interpreter *it) +int script_ppos(instance *it) { dsp_cpos(0, 0); dsp_coff(igetarg_integer(it, 0), igetarg_integer(it, 1)); return 0; } -int script_color(interpreter *it) +int script_color(instance *it) { uint16_t c = dsp_color(igetarg_integer(it, 0), igetarg_integer(it, 1), igetarg_integer(it, 2)); - variable *v = make_varn(0, (float)c); - iret(it, v); + variable *v = make_varf(0, (float)c); + ipush(it, (uint32_t)v); free(v); return 0; } -int script_rand(interpreter *it) +int script_rand(instance *it) { unsigned int mod = igetarg_integer(it, 0); unsigned int val = random_get(); - variable *v = make_varn(0, (float)(mod % val)); - iret(it, v); + variable *v = make_varf(0, (float)(mod % val)); + ipush(it, (uint32_t)v); free(v); return 0; } -int script_getkey(interpreter *it) +int script_getkey(instance *it) { - variable *v = make_varn(0, (float)keypad_get()); - iret(it, v); + variable *v = make_varf(0, (float)keypad_get()); + ipush(it, (uint32_t)v); free(v); return 0; } -int script_pixel(interpreter *it) +int script_pixel(instance *it) { dsp_pixel(igetarg_integer(it, 0), igetarg_integer(it, 1), igetarg_integer(it, 2));