diff options
Diffstat (limited to 'module/system/vm/core.scm')
-rw-r--r-- | module/system/vm/core.scm | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/module/system/vm/core.scm b/module/system/vm/core.scm index 79e73c0dc..1f7d7ed61 100644 --- a/module/system/vm/core.scm +++ b/module/system/vm/core.scm @@ -33,37 +33,48 @@ (module-obarray (current-module))))) ;;; -;;; Bootcode interface +;;; Dumpcode interface ;;; -(export make-bootcode bootcode? bootcode-version - bootcode-nlocs bootcode-nexts bootcode-bytecode) +(export make-dumpcode dumpcode? dumpcode-version + dumpcode-nlocs dumpcode-nexts dumpcode-bytecode + load-dumpcode save-dumpcode) -(define *bootcode-cookie* (string-append "\0GBC-" (vm-version))) +(define *dumpcode-cookie* (string-append "\0GBC-" (vm-version))) -(define (make-bootcode nlocs nexts bytes) - (string-append *bootcode-cookie* +(define (make-dumpcode nlocs nexts bytes) + (string-append *dumpcode-cookie* (integer->bytes nlocs) (integer->bytes nexts) bytes)) -(define (bootcode? x) +(define (dumpcode? x) (and (string? x) (> (string-length x) 10) (string=? (substring x 1 4) "GBC"))) -(define (bootcode-version x) +(define (dumpcode-version x) (substring x 5 8)) -(define (bootcode-nlocs x) +(define (dumpcode-nlocs x) (bytes->integer x 8)) -(define (bootcode-nexts x) +(define (dumpcode-nexts x) (bytes->integer x 9)) -(define (bootcode-bytecode x) +(define (dumpcode-bytecode x) (substring x 10)) +(define (load-dumpcode file) + (let ((bytes (make-uniform-vector (stat:size (stat file)) #\a))) + (call-with-input-file file + (lambda (p) (uniform-vector-read! bytes p))) + bytes)) + +(define (save-dumpcode dump file) + (call-with-output-file file + (lambda (out) (uniform-vector-write bytes out)))) + (define (integer->bytes n) (string (integer->char n))) |