aboutsummaryrefslogtreecommitdiff
path: root/src_c/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src_c/arch')
-rw-r--r--src_c/arch/avr8.c63
-rw-r--r--src_c/arch/avr8.h30
-rw-r--r--src_c/arch/posix.c54
-rw-r--r--src_c/arch/posix.h30
4 files changed, 177 insertions, 0 deletions
diff --git a/src_c/arch/avr8.c b/src_c/arch/avr8.c
new file mode 100644
index 0000000..cbc454b
--- /dev/null
+++ b/src_c/arch/avr8.c
@@ -0,0 +1,63 @@
+#include "avr8.h"
+#include <avr/io.h>
+
+#define MEM_SIZE 0x01c0
+#define UART_BAUD 9600
+
+
+static lsp_int16_t avr8_getchar(lsp_in_stream_t *s) {
+ while (!(UCSR0A & (1 << 7)))
+ ;
+ return UDR0;
+}
+
+
+static lsp_int16_t avr8_putchar(lsp_out_stream_t *s, lsp_int16_t c) {
+ while (!(UCSR0A & (1 << 5)))
+ ;
+ UDR0 = c;
+}
+
+
+static lsp_uint8_t avr8_mem[sizeof(lsp_mem_t) + MEM_SIZE * sizeof(lsp_cell_t)];
+
+static lsp_in_stream_t avr8_in_stream;
+
+static lsp_out_stream_t avr8_out_stream;
+
+
+void lsp_arch_avr8_init() {
+ UBRR0 = F_CPU / 16 / UART_BAUD - 1;
+ UCSR0B |= _BV(TXEN0) | _BV(RXEN0);
+}
+
+
+lsp_mem_t *lsp_arch_avr8_create_mem() {
+ lsp_mem_t *m = (void *)avr8_mem;
+ if (lsp_mem_init(m, MEM_SIZE) != LSP_SUCCESS)
+ return NULL;
+ return m;
+}
+
+
+void lsp_arch_avr8_free_mem(lsp_mem_t *m) {}
+
+
+lsp_in_stream_t *lsp_arch_avr8_create_in_stream() {
+ lsp_in_stream_t *s = &avr8_in_stream;
+ lsp_in_stream_init(s, avr8_getchar);
+ return s;
+}
+
+
+void lsp_arch_avr8_free_in_stream(lsp_in_stream_t *s) {}
+
+
+lsp_out_stream_t *lsp_arch_avr8_create_out_stream() {
+ lsp_out_stream_t *s = &avr8_out_stream;
+ lsp_out_stream_init(s, avr8_putchar);
+ return s;
+}
+
+
+void lsp_arch_avr8_free_out_stream(lsp_out_stream_t *s) {}
diff --git a/src_c/arch/avr8.h b/src_c/arch/avr8.h
new file mode 100644
index 0000000..351ee14
--- /dev/null
+++ b/src_c/arch/avr8.h
@@ -0,0 +1,30 @@
+#ifndef LISP16_ARCH_AVR8_H
+#define LISP16_ARCH_AVR8_H
+
+#include "../mem.h"
+#include "../stream.h"
+
+#define LSP_ARCH_INIT lsp_arch_avr8_init
+
+#define LSP_ARCH_CREATE_MEM lsp_arch_avr8_create_mem
+#define LSP_ARCH_FREE_MEM lsp_arch_avr8_free_mem
+
+#define LSP_ARCH_CREATE_IN_STREAM lsp_arch_avr8_create_in_stream
+#define LSP_ARCH_FREE_IN_STREAM lsp_arch_avr8_free_in_stream
+
+#define LSP_ARCH_CREATE_OUT_STREAM lsp_arch_avr8_create_out_stream
+#define LSP_ARCH_FREE_OUT_STREAM lsp_arch_avr8_free_out_stream
+
+
+void lsp_arch_avr8_init();
+
+lsp_mem_t *lsp_arch_avr8_create_mem();
+void lsp_arch_avr8_free_mem(lsp_mem_t *m);
+
+lsp_in_stream_t *lsp_arch_avr8_create_in_stream();
+void lsp_arch_avr8_free_in_stream(lsp_in_stream_t *s);
+
+lsp_out_stream_t *lsp_arch_avr8_create_out_stream();
+void lsp_arch_avr8_free_out_stream(lsp_out_stream_t *s);
+
+#endif
diff --git a/src_c/arch/posix.c b/src_c/arch/posix.c
new file mode 100644
index 0000000..19e33a1
--- /dev/null
+++ b/src_c/arch/posix.c
@@ -0,0 +1,54 @@
+#include "posix.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MEM_SIZE 0x4000
+
+
+static lsp_int16_t posix_getchar(lsp_in_stream_t *s) {
+ int c = getchar();
+ if (c == EOF)
+ return LSP_EOF;
+ return c;
+}
+
+
+static lsp_int16_t posix_putchar(lsp_out_stream_t *s, lsp_int16_t c) {
+ return putchar(c);
+}
+
+
+void lsp_arch_posix_init() {}
+
+
+lsp_mem_t *lsp_arch_posix_create_mem() {
+ lsp_mem_t *m = malloc(sizeof(lsp_mem_t) + sizeof(lsp_cell_t) * MEM_SIZE);
+ if (lsp_mem_init(m, MEM_SIZE) != LSP_SUCCESS) {
+ free(m);
+ return NULL;
+ }
+ return m;
+}
+
+
+void lsp_arch_posix_free_mem(lsp_mem_t *m) { free(m); }
+
+
+lsp_in_stream_t *lsp_arch_posix_create_in_stream() {
+ lsp_in_stream_t *s = malloc(sizeof(lsp_in_stream_t));
+ lsp_in_stream_init(s, posix_getchar);
+ return s;
+}
+
+
+void lsp_arch_posix_free_in_stream(lsp_in_stream_t *s) { free(s); }
+
+
+lsp_out_stream_t *lsp_arch_posix_create_out_stream() {
+ lsp_out_stream_t *s = malloc(sizeof(lsp_out_stream_t));
+ lsp_out_stream_init(s, posix_putchar);
+ return s;
+}
+
+
+void lsp_arch_posix_free_out_stream(lsp_out_stream_t *s) { free(s); }
diff --git a/src_c/arch/posix.h b/src_c/arch/posix.h
new file mode 100644
index 0000000..5716c0a
--- /dev/null
+++ b/src_c/arch/posix.h
@@ -0,0 +1,30 @@
+#ifndef LISP16_ARCH_POSIX_H
+#define LISP16_ARCH_POSIX_H
+
+#include "../mem.h"
+#include "../stream.h"
+
+#define LSP_ARCH_INIT lsp_arch_posix_init
+
+#define LSP_ARCH_CREATE_MEM lsp_arch_posix_create_mem
+#define LSP_ARCH_FREE_MEM lsp_arch_posix_free_mem
+
+#define LSP_ARCH_CREATE_IN_STREAM lsp_arch_posix_create_in_stream
+#define LSP_ARCH_FREE_IN_STREAM lsp_arch_posix_free_in_stream
+
+#define LSP_ARCH_CREATE_OUT_STREAM lsp_arch_posix_create_out_stream
+#define LSP_ARCH_FREE_OUT_STREAM lsp_arch_posix_free_out_stream
+
+
+void lsp_arch_posix_init();
+
+lsp_mem_t *lsp_arch_posix_create_mem();
+void lsp_arch_posix_free_mem(lsp_mem_t *m);
+
+lsp_in_stream_t *lsp_arch_posix_create_in_stream();
+void lsp_arch_posix_free_in_stream(lsp_in_stream_t *s);
+
+lsp_out_stream_t *lsp_arch_posix_create_out_stream();
+void lsp_arch_posix_free_out_stream(lsp_out_stream_t *s);
+
+#endif