WIP: eval_rom in binary
This commit is contained in:
parent
89667cf994
commit
cfb732afaf
4
Makefile
4
Makefile
|
@ -34,7 +34,7 @@ include $(sort $(wildcard contrib/*/nitro.mk))
|
|||
bootstrap: bin/picrin-bootstrap
|
||||
|
||||
bin/picrin-bootstrap:
|
||||
test -f bin/picrin-bootstrap || { $(MAKE) -C lib lib/mini-picrin && mv lib/mini-picrin bin/picrin-bootstrap; }
|
||||
test -f bin/picrin-bootstrap || { $(MAKE) -C lib mini-picrin && mv lib/mini-picrin bin/picrin-bootstrap; }
|
||||
|
||||
lib/mini-picrin: FORCE
|
||||
$(MAKE) -C lib mini-picrin
|
||||
|
@ -45,7 +45,7 @@ lib/libpicrin.a: FORCE
|
|||
ext: lib/ext/eval.c
|
||||
|
||||
lib/ext/eval.c: piclib/eval.scm
|
||||
bin/picrin-bootstrap -c piclib/eval.scm | bin/picrin-bootstrap tools/mkeval.scm > lib/ext/eval.c
|
||||
bin/picrin-bootstrap -c eval_rom piclib/eval.scm | bin/picrin-bootstrap tools/mkeval.scm > lib/ext/eval.c
|
||||
|
||||
picrin: $(PICRIN_OBJS) $(CONTRIB_OBJS) ext lib/libpicrin.a
|
||||
$(CC) $(CFLAGS) -o $@ $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libpicrin.a $(LDFLAGS)
|
||||
|
|
6243
lib/ext/eval.c
6243
lib/ext/eval.c
File diff suppressed because it is too large
Load Diff
|
@ -9,12 +9,16 @@
|
|||
|
||||
static size_t offset = 0;
|
||||
|
||||
#define DUMP(c) do { printf("0x%02x, ", c); if (++offset == 12) { puts(""); offset = 0; } } while (0)
|
||||
|
||||
static void
|
||||
dump1(pic_state *pic, unsigned char c)
|
||||
{
|
||||
DUMP(c);
|
||||
printf("0x%02x,", c);
|
||||
if (++offset == 12) {
|
||||
puts("");
|
||||
offset = 0;
|
||||
} else {
|
||||
putchar(' ');
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -28,9 +28,6 @@
|
|||
# define PIC_USE_FILE 1
|
||||
#endif
|
||||
|
||||
#if !PIC_USE_READ && PIC_USE_EVAL
|
||||
# error PIC_USE_EVAL requires PIC_USE_READ
|
||||
#endif
|
||||
#if !PIC_USE_LIBC && PIC_USE_FILE
|
||||
# error PIC_USE_FILE requires PIC_USE_LIBC
|
||||
#endif
|
||||
|
|
|
@ -1,66 +1,24 @@
|
|||
(define (generate-rom)
|
||||
|
||||
(define open-output-string open-output-bytevector)
|
||||
(define (get-output-string port)
|
||||
(list->string (map integer->char (bytevector->list (get-output-bytevector port)))))
|
||||
|
||||
(define (with-output-to-string thunk)
|
||||
(let ((port (open-output-string)))
|
||||
(parameterize ((current-output-port port))
|
||||
(thunk)
|
||||
(let ((s (get-output-string port)))
|
||||
(close-port port)
|
||||
s))))
|
||||
|
||||
(define text
|
||||
(with-output-to-string
|
||||
(lambda ()
|
||||
(write (read)))))
|
||||
|
||||
(define (escape-string s)
|
||||
(with-output-to-string
|
||||
(lambda ()
|
||||
(string-for-each
|
||||
(lambda (c)
|
||||
(case c
|
||||
((#\\) (display "\\\\"))
|
||||
((#\") (display "\\\""))
|
||||
((#\newline) (display "\\n"))
|
||||
(else (display c))))
|
||||
s))))
|
||||
|
||||
(define (group-string i s)
|
||||
(let loop ((t s) (n (string-length s)) (acc '()))
|
||||
(if (= n 0)
|
||||
(reverse acc)
|
||||
(if (< n i)
|
||||
(loop "" 0 (cons t acc))
|
||||
(loop (string-copy t i) (- n i) (cons (string-copy t 0 i) acc))))))
|
||||
|
||||
(define lines (map escape-string (group-string 80 text)))
|
||||
|
||||
(let loop ((lines lines) (acc ""))
|
||||
(if (null? lines)
|
||||
acc
|
||||
(loop (cdr lines) (string-append acc "\"" (car lines) "\",\n")))))
|
||||
|
||||
|
||||
(for-each
|
||||
display
|
||||
`("#include \"picrin.h\"\n"
|
||||
"#include \"picrin/extra.h\"\n"
|
||||
"\n"
|
||||
"#if PIC_USE_EVAL\n"
|
||||
"static const char eval_rom[][80] = {\n"
|
||||
,(generate-rom)
|
||||
"};\n"
|
||||
"#endif\n"
|
||||
"#if PIC_USE_EVAL\n"))
|
||||
|
||||
(let loop ()
|
||||
(let ((c (read-u8)))
|
||||
(unless (eof-object? c)
|
||||
(write-u8 c)
|
||||
(loop))))
|
||||
|
||||
(for-each
|
||||
display
|
||||
`("#endif\n"
|
||||
"\n"
|
||||
"void\n"
|
||||
"pic_init_eval(pic_state *PIC_UNUSED(pic))\n"
|
||||
"{\n"
|
||||
"#if PIC_USE_EVAL\n"
|
||||
" pic_load_native(pic, &eval_rom[0][0]);\n"
|
||||
" pic_execute(pic, pic_deserialize(pic, eval_rom));\n"
|
||||
"#endif\n"
|
||||
"}\n"))
|
||||
|
||||
|
|
Loading…
Reference in New Issue