;;; -*- Mode:LISP; Base:10 -*-

(defvar file-array (make-array (* 1000 1024) :type :art-8b))

(defvar read-count)

(defconst max-unix-block-number (* 20. 25. 800.))	;heads * sectors * cylinders

(defun c-read-file-into-array (file ar &optional (size (array-length ar)))
  (with-open-file (s file :raw t)
    (do ((i 0 (1+ i))
	 (ch (send s :tyi) (send s :tyi)))
	((or (null ch)
	     (= i size))
	 i)
      (aset ch ar i)
      (setq read-count (1+ i)))))

(defun copy-sdu-root ()
  (get-sdu-part)
  (if (= read-count 1024000)
      (write-array-to-disk)))

(defun get-sdu-part ()
  (c-read-file-into-array "drac://dev//l//s205" file-array))

(defun write-array-to-disk ()
  (dotimes (i 1000)
    (let ((ba (make-array 1024			;i'th block of file-array
			 :type :art-8b
			 :displaced-to file-array
			 :displaced-index-offset (* i 1024))))
      (disk-write-block ba (+ 23 i)))))

(defconst disk-unit 0)
(defvar unix-rqb nil)

(defun disk-read-block (buf-array block-number)
  "read disk relative to cyl 0"
  (if (null unix-rqb)
      (setq unix-rqb (si:get-disk-rqb)))
  (disk-read-hook unix-rqb disk-unit block-number)
  (copy-array-contents (si:rqb-8-bit-buffer unix-rqb) buf-array))

(defun disk-read-hook (rqb unit block-number)
  "hook for si:disk-read-physical"
  (if (and (>= block-number 0)
	   (< block-number max-unix-block-number))
      (si:disk-read-physical rqb unit block-number)
    (ferror nil "disk-read-hook called with block-number ~d." block-number)))

(defun disk-write-block (buf-array block-number)
  "write disk relative to cyl 0"
  (if (null unix-rqb)
      (setq unix-rqb (si:get-disk-rqb)))
  (copy-array-contents buf-array (si:rqb-8-bit-buffer unix-rqb))
  (disk-write-hook unix-rqb disk-unit block-number))

(defun disk-write-hook (rqb unit block-number)
  "hook for si:disk-write-physical"
  (if (and (>= block-number 0)
	   (< block-number max-unix-block-number))
      (si:disk-write-physical rqb unit block-number)
    (ferror nil "disk-write-hook called with block-number ~d." block-number)))
