aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--initrd/init2
-rw-r--r--libinterp.abin65386 -> 67130 bytes
-rw-r--r--src/display_draw.c7
-rw-r--r--src/heap.c28
-rw-r--r--src/script.c30
-rw-r--r--src/stdlib.c40
-rw-r--r--src/stm32l4xx_it.c14
7 files changed, 82 insertions, 39 deletions
diff --git a/initrd/init b/initrd/init
index a250822..4908747 100644
--- a/initrd/init
+++ b/initrd/init
@@ -58,7 +58,7 @@ do
do
solve Fx > y
set y (0 - y)
- if ((y > ymin) & (y < ymax))
+ if ((y >= ymin) & (y <= ymax))
pixel (cx + x * xinc) (cy + y * yinc) 511
end
set x (x + 1 / xinc)
diff --git a/libinterp.a b/libinterp.a
index 2d0400d..11ca083 100644
--- a/libinterp.a
+++ b/libinterp.a
Binary files differ
diff --git a/src/display_draw.c b/src/display_draw.c
index 62578e3..f58dda7 100644
--- a/src/display_draw.c
+++ b/src/display_draw.c
@@ -39,10 +39,15 @@ void dsp_putchar(int c)
if (++cury == 12) {
UNLOCK;
dsp_rect(0, 0, LCD_WIDTH, LCD_HEIGHT, 0);
- LOCK;
cury = 0;
}
return;
+ } else if (c == '\b') {
+ if (curx > 0)
+ curx--;
+ UNLOCK;
+ dsp_rect(curxo + curx * 12, curyo + cury * 26, 12, 26, 0);
+ return;
}
unsigned int start = ((c - ' ') / 16 * 192 * 26 + (c % 16) * 12) * 2;
diff --git a/src/heap.c b/src/heap.c
index 92978b7..52b5253 100644
--- a/src/heap.c
+++ b/src/heap.c
@@ -1,7 +1,6 @@
#include <heap.h>
-#include <task.h>
-#define HEAP_ALIGN 16
+#define HEAP_ALIGN 4
typedef struct {
uint32_t size;
@@ -10,7 +9,7 @@ typedef struct {
static alloc_t *free_blocks;
static void *heap_end;
-static uint32_t heap_used;
+uint32_t heap_used;
void heap_init(void *buf)
{
@@ -21,17 +20,29 @@ void heap_init(void *buf)
void *malloc(uint32_t size)
{
- //task_hold(1);
size = (size + sizeof(alloc_t) + HEAP_ALIGN) & ~(HEAP_ALIGN - 1);
alloc_t *node = free_blocks;
alloc_t *prev = 0;
while (node != 0) {
if (node->size >= size) {
- if (prev != 0)
- prev->next = node->next;
- else
- free_blocks = node->next;
+ /*if (node->size > size + sizeof(alloc_t) + HEAP_ALIGN) {
+ alloc_t *rem = (alloc_t *)((uint8_t *)node +
+ sizeof(alloc_t) + size);
+ rem->size = node->size - size - sizeof(alloc_t);
+ rem->next = node->next;
+ if (prev != 0)
+ prev->next = rem;
+ else
+ free_blocks = rem;
+ node->size = size;
+ } else {*/
+ if (prev != 0)
+ prev->next = node->next;
+ else
+ free_blocks = node->next;
+ //}
+
node->next = 0;
heap_used += node->size;
return (void *)((uint8_t *)node + sizeof(alloc_t));
@@ -48,7 +59,6 @@ void *malloc(uint32_t size)
heap_end = (void *)((uint8_t *)heap_end + size);
heap_used += size;
- //task_hold(0);
return (void *)((uint8_t *)node + sizeof(alloc_t));
}
diff --git a/src/script.c b/src/script.c
index 495e409..8fad2f3 100644
--- a/src/script.c
+++ b/src/script.c
@@ -22,7 +22,6 @@ 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)
{
@@ -36,7 +35,6 @@ 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)
@@ -50,14 +48,21 @@ int script_gets(interpreter *it)
{
char *s = malloc(64);
char c[2] = {0, 0};
- uint16_t index = 0;
+ int index = 0;
do {
c[0] = serial_get();
s[index] = c[0];
- if (c[0] != '\r')
+ if (c[0] == '\b' || c[0] == 127) {
+ index--;
+ if (index > -1) {
+ dsp_puts("\b");
+ index--;
+ }
+ } else if (c[0] != '\r') {
dsp_puts(c);
- } while (s[index] != '\r' && index++ < 23);
+ }
+ } while (s[index] != '\r' && index++ < 63);
s[index] = '\0';
variable *r = make_vars(0, s);
@@ -135,18 +140,3 @@ int script_pixel(interpreter *it)
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;
-}
diff --git a/src/stdlib.c b/src/stdlib.c
index ec67ff3..e34d2a0 100644
--- a/src/stdlib.c
+++ b/src/stdlib.c
@@ -67,15 +67,49 @@ float strtof(const char *s, char **endptr)
{
(void)s;
(void)endptr;
- return 0.0f;
+
+ float res = 0.0f;
+ char neg = 0;
+ unsigned int i = 0;
+
+ if (s[0] == '-') {
+ neg = 1;
+ i++;
+ }
+
+ for (; isdigit(s[i]); i++) {
+ res *= 10.0f;
+ res += (s[i] - '0');
+ }
+
+ if (s[i] != '.')
+ goto end;
+
+ float div = 0.1f;
+ for (i++; isdigit(s[i]); i++) {
+ res += div * (s[i] - '0');
+ div /= 10.0f;
+ }
+
+end:
+ return (neg == 0) ? res : -res;
}
int atoi(const char *s)
{
+ unsigned int i = 0;
+ char neg = 0;
int n = 0;
- for (unsigned int i = 0; isdigit(s[i]); i++) {
+
+ if (s[0] == '-') {
+ neg = 1;
+ i = 1;
+ }
+
+ for (; isdigit(s[i]); i++) {
n *= 10;
n += s[i] - '0';
}
- return n;
+
+ return (neg == 0) ? n : -n;
}
diff --git a/src/stm32l4xx_it.c b/src/stm32l4xx_it.c
index e54a192..228dc67 100644
--- a/src/stm32l4xx_it.c
+++ b/src/stm32l4xx_it.c
@@ -12,12 +12,16 @@ void serial_puts(const char *s)
void perror(const char *s)
{
- //extern task_t *current;
+ extern uint32_t heap_used;
serial_puts(s);
- //char buf[200];
- //snprintf(buf, 200, "xPSR: %x\r\nPC: %x\r\nLR: %x\r\n", current->sp[0],
- // current->sp[1], current->sp[2]);
- //serial_puts(buf);
+
+ static char buf[200];
+ uint32_t *psp;
+ asm("mrs %0, psp" : "=r"(psp));
+
+ snprintf(buf, 200, "\r\nPC: %x\r\nLR: %x\r\nmemused: %db\r\n",
+ psp[6], psp[5], heap_used);
+ serial_puts(buf);
}
__attribute__ ((naked))