diff options
| author | bozo.kopic <bozo@kopic.xyz> | 2022-08-02 01:20:12 +0200 |
|---|---|---|
| committer | bozo.kopic <bozo@kopic.xyz> | 2022-09-25 02:40:23 +0200 |
| commit | 288727f09a1b3458c268497d111349e608c3f9fa (patch) | |
| tree | d62565249fa3c7127856c65405752572fc41aca9 /src_c/arch | |
Diffstat (limited to 'src_c/arch')
| -rw-r--r-- | src_c/arch/avr8.c | 63 | ||||
| -rw-r--r-- | src_c/arch/avr8.h | 30 | ||||
| -rw-r--r-- | src_c/arch/posix.c | 54 | ||||
| -rw-r--r-- | src_c/arch/posix.h | 30 |
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 |
