write-image.scm 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
  3. ; Writing out a Scheme 48 image
  4. (define (write-image file start-proc id-string)
  5. (if (not (= 0 (remainder bits-per-cell bits-per-io-byte)))
  6. (assertion-violation 'write-image "io-bytes to not fit evenly into cells"))
  7. (initialize-memory)
  8. (call-with-output-file file
  9. (lambda (port)
  10. (set-port-crlf?! port #f)
  11. (let ((start (transport start-proc)) ; transport the start-proc
  12. (false (transport #f)))
  13. (display id-string port)
  14. (newline port)
  15. (write-page port)
  16. (newline port)
  17. (display architecture-version port)
  18. (newline port)
  19. (display "0" port) ; image format; must be synchronized with
  20. ; IMAGE-FORMAT in image-util.scm
  21. (newline port)
  22. (boot-write-number bytes-per-cell port)
  23. (boot-write-number 0 port) ; newspace begin
  24. (boot-write-number (a-units->cells *hp*) port)
  25. (boot-write-number false port) ; symbol table
  26. (boot-write-number false port) ; imported bindings
  27. (boot-write-number false port) ; exported bindings
  28. (boot-write-number false port) ; resumer records
  29. (boot-write-number start port) ; start-proc
  30. (write-page port)
  31. (write-descriptor 1 port) ; endianness indicator
  32. (write-heap port)))) ; write out the heap
  33. )
  34. (define bits-per-io-byte 8) ; for writing images
  35. (define (write-page port)
  36. (write-char (ascii->char 12) port))
  37. (define io-byte-mask
  38. (low-bits -1 bits-per-io-byte))
  39. ;(define bits-per-cell -- defined in data.scm
  40. ; (* bits-per-byte bytes-per-cell))
  41. (define (big-endian-write-descriptor thing port)
  42. (let loop ((i (- bits-per-cell bits-per-io-byte)))
  43. (cond ((>= i 0)
  44. (write-byte (bitwise-and io-byte-mask
  45. (arithmetic-shift thing (- 0 i))) port)
  46. (loop (- i bits-per-io-byte))))))
  47. (define (little-endian-write-descriptor thing port)
  48. (let loop ((i 0))
  49. (cond ((< i bits-per-cell)
  50. (write-byte (bitwise-and io-byte-mask
  51. (arithmetic-shift thing (- 0 i))) port)
  52. (loop (+ i bits-per-io-byte))))))
  53. (define write-descriptor little-endian-write-descriptor)
  54. ;; writing characters as Unicode code points
  55. (define bits-per-scalar-value-unit
  56. (* bits-per-byte bytes-per-scalar-value-unit))
  57. (define (write-scalar-value scalar-value port)
  58. (let loop ((i 0))
  59. (cond ((< i bits-per-scalar-value-unit)
  60. (write-byte (bitwise-and io-byte-mask
  61. (arithmetic-shift scalar-value (- 0 i)))
  62. port)
  63. (loop (+ i bits-per-io-byte))))))
  64. (define (boot-write-number n port)
  65. (display n port)
  66. (newline port))