2017-03-28 19:20:02 -04:00
|
|
|
(import (scheme base)
|
|
|
|
(scheme read)
|
2017-04-03 09:09:19 -04:00
|
|
|
(scheme write)
|
2017-04-03 11:02:00 -04:00
|
|
|
(only (picrin base) compile))
|
2017-03-23 09:47:55 -04:00
|
|
|
|
2017-04-03 11:02:00 -04:00
|
|
|
(define (generate-rom)
|
2017-03-23 09:47:55 -04:00
|
|
|
|
2017-04-03 09:09:19 -04:00
|
|
|
(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 ()
|
2017-04-03 11:02:00 -04:00
|
|
|
(write (compile (read))))))
|
2017-03-23 09:47:55 -04:00
|
|
|
|
2017-04-03 09:09:19 -04:00
|
|
|
(define (escape-string s)
|
|
|
|
(with-output-to-string
|
|
|
|
(lambda ()
|
|
|
|
(string-for-each
|
|
|
|
(lambda (c)
|
|
|
|
(case c
|
|
|
|
((#\\) (write-string "\\\\"))
|
|
|
|
((#\") (write-string "\\\""))
|
|
|
|
((#\newline) (write-string "\\n"))
|
|
|
|
(else (write-char c))))
|
|
|
|
s))))
|
2017-03-23 09:47:55 -04:00
|
|
|
|
2017-04-03 09:09:19 -04:00
|
|
|
(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")))))
|
2017-03-23 09:47:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
(for-each
|
|
|
|
(lambda (s) (display s) (newline))
|
|
|
|
`("#include \"picrin.h\""
|
|
|
|
"#include \"picrin/extra.h\""
|
|
|
|
""
|
|
|
|
"static const char boot_rom[][80] = {"
|
2017-04-03 11:02:00 -04:00
|
|
|
,(generate-rom)
|
2017-04-03 09:09:19 -04:00
|
|
|
"};"
|
|
|
|
""
|
|
|
|
"#if PIC_USE_LIBRARY"
|
|
|
|
"static const char boot_library_rom[][80] = {"
|
2017-04-03 11:02:00 -04:00
|
|
|
,(generate-rom)
|
2017-03-23 09:47:55 -04:00
|
|
|
"};"
|
2017-04-03 09:09:19 -04:00
|
|
|
"#endif"
|
2017-03-23 09:47:55 -04:00
|
|
|
""
|
|
|
|
"void"
|
|
|
|
"pic_boot(pic_state *pic)"
|
|
|
|
"{"
|
2017-04-03 10:39:30 -04:00
|
|
|
" pic_call(pic, pic_compile(pic, pic_read_cstr(pic, &boot_rom[0][0])), 0);"
|
2017-04-03 09:09:19 -04:00
|
|
|
"#if PIC_USE_LIBRARY"
|
2017-04-03 11:02:00 -04:00
|
|
|
" pic_call(pic, pic_compile(pic, pic_read_cstr(pic, &boot_library_rom[0][0])), 0);"
|
2017-04-03 09:09:19 -04:00
|
|
|
"#endif"
|
2017-03-23 09:47:55 -04:00
|
|
|
"}"))
|
|
|
|
|